From 7257b0a648afbafcb30a90c466454549f294e70c Mon Sep 17 00:00:00 2001 From: Verox001 Date: Mon, 5 May 2025 21:29:51 +0200 Subject: [PATCH] Implemented 3D support and camera --- simulator/src/main.rs | 6 ++- solar_engine/src/application.rs | 2 + solar_engine/src/camera.rs | 2 +- solar_engine/src/input.rs | 82 ++++++++++++++------------------- solar_engine/src/state.rs | 14 ++++++ 5 files changed, 57 insertions(+), 49 deletions(-) diff --git a/simulator/src/main.rs b/simulator/src/main.rs index ef4f4b3..7f51b0c 100644 --- a/simulator/src/main.rs +++ b/simulator/src/main.rs @@ -71,7 +71,7 @@ pub async fn run() { state.set_instances(instances); }) - .on_input(move |_state, event| { + .on_input(move |state, event| { if event.state == KeyState::Pressed { return match event.key { Key::Period => { @@ -89,6 +89,10 @@ pub async fn run() { sim.reset_timewarp(); println!("Timewarp: {}", sim.get_timewarp()); } + Key::ArrowLeft => state.camera_mut().rotate_yaw_pitch(-5.0, 0.0), + Key::ArrowRight => state.camera_mut().rotate_yaw_pitch(5.0, 0.0), + Key::ArrowUp => state.camera_mut().zoom(-0.2), + Key::ArrowDown => state.camera_mut().zoom(0.2), _ => {} }; } diff --git a/solar_engine/src/application.rs b/solar_engine/src/application.rs index 5dd7997..1dd6faf 100644 --- a/solar_engine/src/application.rs +++ b/solar_engine/src/application.rs @@ -64,9 +64,11 @@ impl<'a> ApplicationHandler for StateApplication<'a> { self.state.as_mut().unwrap().render().unwrap(); } WindowEvent::KeyboardInput { event, .. } => { + println!("Keyboard input event: {:?}", event); if let Some(state) = self.state.as_mut() { if let Some(input_fn) = self.input_fn.as_mut() { let key_event = from_winit_input(&event, self.modifiers); + println!("Keyboard input: {:?}", key_event); input_fn(state, &key_event); } } diff --git a/solar_engine/src/camera.rs b/solar_engine/src/camera.rs index c9ca35b..823a300 100644 --- a/solar_engine/src/camera.rs +++ b/solar_engine/src/camera.rs @@ -35,7 +35,7 @@ impl Camera { let horizontal = Vector3::unit_y().cross(dir).normalize(); let vertical = horizontal.cross(dir).normalize(); - + let pitch_q = Quaternion::from_axis_angle(vertical, Rad(pitch.to_radians())); let yaw_q = Quaternion::from_axis_angle(Vector3::unit_y(), Rad(yaw.to_radians())); diff --git a/solar_engine/src/input.rs b/solar_engine/src/input.rs index 6d95a55..9ddc549 100644 --- a/solar_engine/src/input.rs +++ b/solar_engine/src/input.rs @@ -1,3 +1,4 @@ +use log::info; use winit::event::{ElementState, KeyEvent, Modifiers}; use winit::keyboard::{Key as WinitKey, ModifiersKeyState}; @@ -63,6 +64,7 @@ pub struct InputEvent { } pub fn from_winit_input(event: &KeyEvent, modifiers: Modifiers) -> InputEvent { + println!("Converting Winit key event: {:?}", event); InputEvent { key: map_winit_key(&event.logical_key), state: match event.state { @@ -85,6 +87,7 @@ pub fn from_winit_input(event: &KeyEvent, modifiers: Modifiers) -> InputEvent { pub fn map_winit_key(key: &WinitKey) -> Key { use Key::*; + use winit::keyboard::NamedKey; match key { WinitKey::Character(s) => match s.as_str() { "a" | "A" => A, @@ -137,53 +140,38 @@ pub fn map_winit_key(key: &WinitKey) -> Key { "=" => Equal, _ => Unknown, }, - WinitKey::Named(n) => match n.to_text().unwrap_or("") { - "ArrowUp" => ArrowUp, - "ArrowDown" => ArrowDown, - "ArrowLeft" => ArrowLeft, - "ArrowRight" => ArrowRight, - "Escape" => Escape, - "Enter" => Enter, - "Tab" => Tab, - "Space" => Space, - "Backspace" => Backspace, - "Insert" => Insert, - "Delete" => Delete, - "Home" => Home, - "End" => End, - "PageUp" => PageUp, - "PageDown" => PageDown, - "Shift" => Shift, - "Control" => Control, - "Alt" => Alt, - "Super" => Super, - "F1" => F1, - "F2" => F2, - "F3" => F3, - "F4" => F4, - "F5" => F5, - "F6" => F6, - "F7" => F7, - "F8" => F8, - "F9" => F9, - "F10" => F10, - "F11" => F11, - "F12" => F12, - "Numpad0" => Numpad0, - "Numpad1" => Numpad1, - "Numpad2" => Numpad2, - "Numpad3" => Numpad3, - "Numpad4" => Numpad4, - "Numpad5" => Numpad5, - "Numpad6" => Numpad6, - "Numpad7" => Numpad7, - "Numpad8" => Numpad8, - "Numpad9" => Numpad9, - "NumpadAdd" => NumpadAdd, - "NumpadSubtract" => NumpadSubtract, - "NumpadMultiply" => NumpadMultiply, - "NumpadDivide" => NumpadDivide, - "NumpadEnter" => NumpadEnter, + WinitKey::Named(named_key) => match named_key { + NamedKey::ArrowUp => ArrowUp, + NamedKey::ArrowDown => ArrowDown, + NamedKey::ArrowLeft => ArrowLeft, + NamedKey::ArrowRight => ArrowRight, + NamedKey::Escape => Escape, + NamedKey::Enter => Enter, + NamedKey::Tab => Tab, + NamedKey::Space => Space, + NamedKey::Backspace => Backspace, + NamedKey::Insert => Insert, + NamedKey::Delete => Delete, + NamedKey::Home => Home, + NamedKey::End => End, + NamedKey::PageUp => PageUp, + NamedKey::PageDown => PageDown, + NamedKey::Shift => Shift, + NamedKey::Control => Control, + NamedKey::Alt => Alt, + NamedKey::Super => Super, + NamedKey::F1 => F1, + NamedKey::F2 => F2, + NamedKey::F3 => F3, + NamedKey::F4 => F4, + NamedKey::F5 => F5, + NamedKey::F6 => F6, + NamedKey::F7 => F7, + NamedKey::F8 => F8, + NamedKey::F9 => F9, + NamedKey::F10 => F10, + NamedKey::F11 => F11, + NamedKey::F12 => F12, _ => Unknown, }, _ => Unknown, diff --git a/solar_engine/src/state.rs b/solar_engine/src/state.rs index 7444fb9..95233d2 100644 --- a/solar_engine/src/state.rs +++ b/solar_engine/src/state.rs @@ -327,6 +327,12 @@ impl<'a> State<'a> { }); let multisampled_view = multisampled_texture.create_view(&Default::default()); + let view_proj = self.camera.build_view_projection_matrix(); + let globals = Globals { + view_proj: view_proj.into(), + }; + self.queue.write_buffer(&self.global_buffer, 0, bytemuck::cast_slice(&[globals])); + let mut encoder = self.device.create_command_encoder(&wgpu::CommandEncoderDescriptor { label: Some("Render Encoder"), }); @@ -403,4 +409,12 @@ impl<'a> State<'a> { pub fn window(&self) -> &Window { &self.window } + + pub fn camera_mut(&mut self) -> &mut crate::camera::Camera { + &mut self.camera + } + + pub fn camera(&self) -> &crate::camera::Camera { + &self.camera + } } \ No newline at end of file