aboutsummaryrefslogtreecommitdiff
path: root/examples
diff options
context:
space:
mode:
authortcmal <me@aria.rip>2024-08-25 17:44:21 +0100
committertcmal <me@aria.rip>2024-08-25 17:44:21 +0100
commit95708732572431dc057a9fd71fa8bd8571a336a2 (patch)
tree3255e3407eb069c8124d41e1d6f60163b7c5091d /examples
parent9bceddef62c48b56e7b93a2ca19636e1ff6486cb (diff)
feat(all): start using an ECS
Diffstat (limited to 'examples')
-rw-r--r--examples/render-bsp/src/main.rs177
1 files changed, 34 insertions, 143 deletions
diff --git a/examples/render-bsp/src/main.rs b/examples/render-bsp/src/main.rs
index 112edd8..8278f1e 100644
--- a/examples/render-bsp/src/main.rs
+++ b/examples/render-bsp/src/main.rs
@@ -37,75 +37,13 @@ extern crate stockton_render;
extern crate stockton_types;
extern crate winit;
-use std::f32::consts::PI;
-use std::time::SystemTime;
-
-use winit::{
- event::{ElementState, Event, WindowEvent},
- event_loop::{ControlFlow, EventLoop},
- window::WindowBuilder,
-};
+use winit::{event::Event, event_loop::EventLoop, window::WindowBuilder};
use stockton_levels::{prelude::*, q3::Q3BSPFile};
-use stockton_render::Renderer;
-use stockton_types::{Vector2, Vector3, World};
-
-/// Movement speed, world units per second
-const SPEED: f32 = 100.0;
-
-/// Pixels required to rotate 90 degrees
-const PIXELS_PER_90D: f32 = 100.0;
-
-/// Sensitivity, derived from above
-const SENSITIVITY: f32 = PI / (2.0 * PIXELS_PER_90D);
-
-#[derive(Debug)]
-struct KeyState {
- pub up: bool,
- pub left: bool,
- pub right: bool,
- pub down: bool,
- pub inwards: bool,
- pub out: bool,
-}
-
-impl KeyState {
- pub fn new() -> KeyState {
- KeyState {
- up: false,
- left: false,
- right: false,
- down: false,
- inwards: false,
- out: false,
- }
- }
-
- /// Helper function to get our movement request as a normalized vector
- pub fn as_vector(&self) -> Vector3 {
- let mut vec = Vector3::new(0.0, 0.0, 0.0);
-
- if self.up {
- vec.y = 1.0;
- } else if self.down {
- vec.y = -1.0;
- }
-
- if self.right {
- vec.x = 1.0;
- } else if self.left {
- vec.x = -1.0;
- }
-
- if self.inwards {
- vec.z = 1.0;
- } else if self.out {
- vec.z = -1.0;
- }
-
- vec
- }
-}
+use stockton_render::{
+ do_render_system, window::process_window_events_system, Renderer, WindowEvent,
+};
+use stockton_types::Session;
fn main() {
// Initialise logger
@@ -129,89 +67,42 @@ fn main() {
let bsp: Q3BSPFile<Q3System> = bsp.unwrap();
let bsp: Q3BSPFile<VulkanSystem> = bsp.swizzle_to();
- // Load into a world and create the new renderer
- let world = World::new(bsp);
- let mut renderer = Renderer::new(world, &window).unwrap();
+ // Create the renderer
+ let (renderer, tx) = Renderer::new(&window, &bsp);
+ let new_control_flow = renderer.update_control_flow.clone();
+
+ // Load everything into the session
+ let mut session = Session::new(
+ move |resources| {
+ resources.insert(renderer);
+ resources.insert(bsp);
+ },
+ move |schedule| {
+ schedule
+ .add_system(process_window_events_system())
+ .add_thread_local(do_render_system::<Q3BSPFile<VulkanSystem>>());
+ },
+ );
// Done loading - This is our main loop.
-
- let mut last_update = SystemTime::now();
- let mut key_state = KeyState::new();
- let mut last_cursor_pos = Vector2::new(0.0, 0.0);
-
- // Keep rendering the world
+ // It just communicates events to the session and continuously ticks
event_loop.run(move |event, _, flow| {
- *flow = ControlFlow::Poll;
match event {
- Event::WindowEvent { event, .. } => match event {
- // Close when requested
- WindowEvent::CloseRequested => *flow = ControlFlow::Exit,
-
- WindowEvent::Resized(_) => {
- unsafe { renderer.context.handle_surface_change().unwrap() };
- }
-
- // Update our keystates
- WindowEvent::KeyboardInput { input, .. } => match input.scancode {
- // A
- 30 => key_state.left = input.state == ElementState::Pressed,
- // D
- 32 => key_state.right = input.state == ElementState::Pressed,
- // W (in)
- 17 => key_state.inwards = input.state == ElementState::Pressed,
- // S (out)
- 31 => key_state.out = input.state == ElementState::Pressed,
- // Space (up)
- 57 => key_state.up = input.state == ElementState::Pressed,
- // Ctrl (down)
- 42 => key_state.down = input.state == ElementState::Pressed,
- _ => (),
- },
-
- // Look around with mouse
- WindowEvent::CursorMoved { position, .. } => {
- // Don't do anything on the first frame
- if last_cursor_pos.x != 0.0 || last_cursor_pos.y == 0.0 {
- // Figure out how much to rotate by
- let x_offset = (position.x as f32 - last_cursor_pos.x) * SENSITIVITY;
- let y_offset = (position.y as f32 - last_cursor_pos.y) * SENSITIVITY;
-
- // Rotate
- renderer
- .context
- .rotate(Vector3::new(-y_offset, x_offset, 0.0));
- }
-
- // For tracking how much the mouse has moved
- last_cursor_pos.x = position.x as f32;
- last_cursor_pos.y = position.y as f32;
- }
- _ => (),
- },
-
- // Nothing new happened
Event::MainEventsCleared => {
- // Draw as many frames as we can
- // This isn't ideal, but it'll do for now.
- window.request_redraw()
+ window.request_redraw();
}
-
- // Redraw - either from above or resizing, etc
- Event::RedrawRequested(_) => {
- // Time since last frame drawn. Again, not ideal.
- let delta = last_update.elapsed().unwrap().as_secs_f32();
- last_update = SystemTime::now();
-
- // Move our camera if needed
- let delta_pos = key_state.as_vector() * delta * SPEED;
- if delta_pos.x != 0.0 || delta_pos.y != 0.0 || delta_pos.z != 0.0 {
- renderer.context.move_camera_relative(delta_pos);
- }
-
- // Render the frame
- renderer.render_frame().unwrap()
+ Event::RedrawRequested(_) => session.do_update(),
+ _ => {
+ tx.send(WindowEvent::from(&event)).unwrap();
}
- _ => (),
}
+
+ // Update the control flow if the session has requested it.
+ {
+ let new_control_flow = new_control_flow.read().unwrap();
+ if *new_control_flow != *flow {
+ *flow = *new_control_flow;
+ }
+ };
});
}