diff options
author | tcmal <me@aria.rip> | 2024-08-25 17:44:21 +0100 |
---|---|---|
committer | tcmal <me@aria.rip> | 2024-08-25 17:44:21 +0100 |
commit | 95708732572431dc057a9fd71fa8bd8571a336a2 (patch) | |
tree | 3255e3407eb069c8124d41e1d6f60163b7c5091d /examples | |
parent | 9bceddef62c48b56e7b93a2ca19636e1ff6486cb (diff) |
feat(all): start using an ECS
Diffstat (limited to 'examples')
-rw-r--r-- | examples/render-bsp/src/main.rs | 177 |
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; + } + }; }); } |