Implemented 3D support and camera

This commit is contained in:
Verox001 2025-05-05 21:29:51 +02:00
parent 08e49e1b22
commit 7257b0a648
5 changed files with 57 additions and 49 deletions

View File

@ -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),
_ => {}
};
}

View File

@ -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);
}
}

View File

@ -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()));

View File

@ -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,

View File

@ -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
}
}