From 9ba0852fa38b5617629216e9f4db9e8671afcaa6 Mon Sep 17 00:00:00 2001 From: Ilja Kartashov Date: Thu, 7 Nov 2024 11:08:18 +0100 Subject: [PATCH 1/4] Update loaders --- src/loaders.rs | 6 +++--- src/models/renderer.rs | 4 ---- 2 files changed, 3 insertions(+), 7 deletions(-) diff --git a/src/loaders.rs b/src/loaders.rs index 6d98c91..fc73967 100644 --- a/src/loaders.rs +++ b/src/loaders.rs @@ -26,10 +26,10 @@ pub struct ResourceFile { } /// Target asset inside of a resource to be loaded -#[derive(Eq, PartialEq, Hash, Clone)] +#[derive(Debug, Eq, PartialEq, Hash, Clone)] pub struct ResourceTarget { - type_id: std::any::TypeId, - name: String, + pub type_id: std::any::TypeId, + pub name: String, } impl ResourceFile { diff --git a/src/models/renderer.rs b/src/models/renderer.rs index c466f86..746702e 100644 --- a/src/models/renderer.rs +++ b/src/models/renderer.rs @@ -901,10 +901,6 @@ impl RenderModels { } // try to get mesh to store it in buffer if let Some(mesh) = assets.get(mesh_id) { - if mesh.indices::().is_some() { - panic!("Index buffer is not implemented yet"); - } - let vertex_data_and_skin_info = mesh .buffer::() .map(|vertex_data| { From 5b75e8525dd40fd515e6cef28653d83985398f59 Mon Sep 17 00:00:00 2001 From: Elias Kartashov Date: Thu, 14 Nov 2024 10:55:52 +0100 Subject: [PATCH 2/4] Add more logging and introduce default states --- src/lib.rs | 2 +- src/loaders.rs | 16 ++++++++++++++++ src/tasks.rs | 11 +++++++++++ src/tasks/context.rs | 5 +++++ src/tasks/scheduler.rs | 23 +++++++++++++++++++++++ src/tasks/task.rs | 11 +++++++++++ src/window.rs | 33 +++++++++++++++++++++++++-------- src/window/event.rs | 28 ++++++++++++++-------------- src/window/map.rs | 7 +++++-- 9 files changed, 111 insertions(+), 25 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index 62a7812..b5f476a 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -52,7 +52,7 @@ pub use world::{Entity, World}; /// Window API and input events pub mod window; -pub use window::{ReadInput, Window}; +pub use window::{Input, ReadInput, Window}; //pub use utils::{ Id }; diff --git a/src/loaders.rs b/src/loaders.rs index fc73967..00c7dd9 100644 --- a/src/loaders.rs +++ b/src/loaders.rs @@ -67,6 +67,22 @@ pub struct ResourceBundle { pub bundle: HashMap>>, } +impl ResourceBundle { + pub fn extract(&mut self, name: &str) -> Option { + let target = ResourceTarget { + type_id: std::any::TypeId::of::(), + name: String::from(name), + }; + self.bundle + .remove(&target) + .and_then(|asset| asset) + .map(|asset| unsafe { + let raw: *mut dyn Asset = Box::into_raw(asset); + *Box::from_raw(raw as *mut T) + }) + } +} + pub struct ResourceReport { pub resource: PathBuf, pub report: HashMap>, diff --git a/src/tasks.rs b/src/tasks.rs index 279f77d..f9b79d0 100644 --- a/src/tasks.rs +++ b/src/tasks.rs @@ -54,6 +54,17 @@ impl<'a> Scheduler<'a> { )) .expect("Message to be sent to Scheduler"); } + + /// Set state + pub fn push_state(&self, state: T) { + self.guard + .send(scheduler::Message::PushState( + std::any::TypeId::of::(), + std::any::type_name::().into(), + Box::new(state), + )) + .expect("Message to be sent to Scheduler"); + } } impl TaskManager { diff --git a/src/tasks/context.rs b/src/tasks/context.rs index c64dc2f..4a02cb8 100644 --- a/src/tasks/context.rs +++ b/src/tasks/context.rs @@ -402,6 +402,11 @@ impl Manager { } } + /// Pushes single boxed state into stack + pub fn push_state_slot(&mut self, state: StateSlot) { + self.states_stack.push(state); + } + /// Calculates providers graph pub unsafe fn calculate_providers( &mut self, diff --git a/src/tasks/scheduler.rs b/src/tasks/scheduler.rs index 5926bcb..df066d4 100644 --- a/src/tasks/scheduler.rs +++ b/src/tasks/scheduler.rs @@ -17,6 +17,8 @@ pub enum Message { Output(Task, Box), /// Store a new global context Store(TypeId, Box), + /// Push state for the global context + PushState(TypeId, String, Box), /// Register dependency type (with Name) Register(TypeId, String, usize), /// Provide dependency data for tasks @@ -104,6 +106,14 @@ pub fn spawn( Message::Store(type_id, ctx) => { context_manager.lock().unwrap().store_boxed(type_id, ctx); } + Message::PushState(id, name, data) => context_manager + .lock() + .unwrap() + .push_state_slot(context::StateSlot { + id, + name, + data: data.into(), + }), Message::Register(type_id, name, providers) => { context_manager .lock() @@ -145,12 +155,25 @@ pub fn spawn( let default_state = TypeId::of::<()>(); let current_state = ctx.current_state(); + log::debug!("current state: {:?}", current_state); if current_state != default_state { if let Some(tasks) = pool.select_for_state(&default_state) { + for task in tasks.iter() { + log::debug!( + "tasks for default state: {:?}", + pool.get(*task).and_then(|t| t.name()) + ); + } queue.extend_from_slice(tasks); } } if let Some(tasks) = pool.select_for_state(¤t_state) { + for task in tasks.iter() { + log::debug!( + "tasks for current state: {:?}", + pool.get(*task).and_then(|t| t.name()) + ); + } queue.extend_from_slice(tasks); } diff --git a/src/tasks/task.rs b/src/tasks/task.rs index 9328420..7388c4f 100644 --- a/src/tasks/task.rs +++ b/src/tasks/task.rs @@ -224,6 +224,12 @@ pub struct Slot { task: Option>, } +impl Slot { + pub fn name(&self) -> Option<&str> { + self.task.as_ref().map(|t| t.name()) + } +} + /// Tasks pool #[derive(Default)] pub struct Pool { @@ -245,6 +251,11 @@ impl Pool { self.tasks.contains_key(&id) } + /// Returns immutable reference for a task + pub fn get(&self, id: Id) -> Option<&Slot> { + self.tasks.get(&id) + } + /// Stores task in the `Pool` pub fn store(&mut self, task: Box) { let task_id = task.id(); diff --git a/src/window.rs b/src/window.rs index 23acf6e..890b804 100644 --- a/src/window.rs +++ b/src/window.rs @@ -1,12 +1,13 @@ mod input; -// mod map; pub mod event; +mod map; use std::sync::Arc; use std::time; pub use event::Event; +pub use input::Input; pub use input::ReadInput; use winit::event::StartCause; @@ -167,6 +168,8 @@ impl winit::application::ApplicationHandler for EventLoop { let submit_frame_task = graphics::SubmitFrame::default(); scheduler.add_task(submit_frame_task); + scheduler.add_task(input::ReadInput::default()); + app.startup(&scheduler, &mut display); // add Display context @@ -190,15 +193,29 @@ impl winit::application::ApplicationHandler for EventLoop { self.close_requested = true; } winit::event::WindowEvent::KeyboardInput { - event: - winit::event::KeyEvent { - logical_key: key, - state: winit::event::ElementState::Pressed, - .. - }, + device_id, + event, + is_synthetic, + } => { + let event = map::keyboard_input(device_id, &event, is_synthetic); + // TODO: map to window::Event and provide + self.task_manager.provide(event); + } + winit::event::WindowEvent::MouseWheel { + delta, + phase, + .. + } => { + panic!("input(MouseWheel): {delta:?} -> {phase:?}"); + // TODO: map to window::Event and provide + // self.task_manager.provide(event); + } + winit::event::WindowEvent::MouseInput { + state, + button, .. } => { - log::info!("input: {key:?}"); + panic!("input(MouseInput): {button:?} -> {state:?}"); // TODO: map to window::Event and provide // self.task_manager.provide(event); } diff --git a/src/window/event.rs b/src/window/event.rs index 64f6191..edc0f59 100644 --- a/src/window/event.rs +++ b/src/window/event.rs @@ -72,11 +72,11 @@ pub enum DragAndDrop { #[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] pub enum Button { /// Keyboard button - Key { + Keyboard { /// Button key code - key_code: Option, + key: KeyButton, /// Button scan code - scan_code: ScanCode, + code: ScanCode, }, /// Left mouse button MouseLeft, @@ -162,17 +162,17 @@ impl Modifiers { #[allow(missing_docs)] #[derive(Debug, Hash, Ord, PartialOrd, PartialEq, Eq, Clone, Copy)] #[repr(u32)] -pub enum KeyCode { - Key1, - Key2, - Key3, - Key4, - Key5, - Key6, - Key7, - Key8, - Key9, - Key0, +pub enum KeyButton { + Num1, + Num2, + Num3, + Num4, + Num5, + Num6, + Num7, + Num8, + Num9, + Num0, A, B, diff --git a/src/window/map.rs b/src/window/map.rs index 0d43499..686a1bd 100644 --- a/src/window/map.rs +++ b/src/window/map.rs @@ -1,5 +1,7 @@ use crate::window::event; +/* NOTE: older implementation. Keep it here for reference until final migration + * pub fn event(event: &winit::event::Event<()>) -> Option { let input_event = match event { winit::event::Event::WindowEvent { @@ -33,8 +35,9 @@ pub fn event(event: &winit::event::Event<()>) -> Option { }; Some(input_event) } +*/ -fn keyboard_input( +pub fn keyboard_input( _device_id: winit::event::DeviceId, event: &winit::event::KeyEvent, _is_synthetic: bool, @@ -45,7 +48,7 @@ fn keyboard_input( let scan_code = key_code as u32; if scan_code < (event::KeyCode::Unknown as u32) { ( - unsafe { Some(std::mem::transmute(key_code as u32)) }, + unsafe { Some(std::mem::transmute::(key_code)) }, scan_code, ) } else { From 9a1f2cea65348f03e467ce2ac2ea97c603c10a23 Mon Sep 17 00:00:00 2001 From: Ilja Kartashov Date: Wed, 20 Nov 2024 16:11:28 +0100 Subject: [PATCH 3/4] Backport old window events code --- src/tasks/context.rs | 12 +- src/tasks/scheduler.rs | 7 + src/window.rs | 74 +++-- src/window/event.rs | 616 ++++++++++++++++++++++++++++------------- src/window/input.rs | 4 +- src/window/map.rs | 369 ++++++++++++------------ 6 files changed, 675 insertions(+), 407 deletions(-) diff --git a/src/tasks/context.rs b/src/tasks/context.rs index 4a02cb8..71062df 100644 --- a/src/tasks/context.rs +++ b/src/tasks/context.rs @@ -309,13 +309,13 @@ impl Manager { pub fn match_dependencies(&self, dependencies: &Dependencies) -> Option { let mut result = dependencies.clone(); for (type_id, dependency) in dependencies.data.iter() { - let entry = match self.outputs.get(type_id) { + let dependency_output = match self.outputs.get(type_id) { Some(dependency) => dependency, None => { return None; } }; - let instances_len = entry.instances.len(); + let instances_len = dependency_output.instances.len(); match dependency { DependencyType::Any(index) => { if instances_len > 0 && *index < instances_len { @@ -328,7 +328,13 @@ impl Manager { } } DependencyType::All(count) => { - if *count == 0 && instances_len >= entry.providers { + log::debug!( + "All({:?}) && {} >= {}", + count, + instances_len, + dependency_output.providers + ); + if *count == 0 && instances_len >= dependency_output.providers { result .data .insert(*type_id, DependencyType::All(instances_len)); diff --git a/src/tasks/scheduler.rs b/src/tasks/scheduler.rs index df066d4..1c72b98 100644 --- a/src/tasks/scheduler.rs +++ b/src/tasks/scheduler.rs @@ -201,6 +201,13 @@ pub fn spawn( log::debug!("task({}): begin control", task.name()); if !task.is_scheduled() { log::debug!("task({}): not scheduled yet", task.name()); + if task.name() == "dotrix::window::input::ReadInput" { + log::debug!( + "task({}): not scheduled yet: {:?}", + task.name(), + task.dependencies() + ); + } if let Some(dependencies_state) = context_manager .lock() .unwrap() diff --git a/src/window.rs b/src/window.rs index 890b804..e403a36 100644 --- a/src/window.rs +++ b/src/window.rs @@ -1,7 +1,6 @@ mod input; pub mod event; -mod map; use std::sync::Arc; use std::time; @@ -75,6 +74,9 @@ impl EventLoop { .map(|fps_request| 1.0 / fps_request) .unwrap_or(0.0), ); + let task_manager = TaskManager::new::(workers); + task_manager.register::(0); + Self { application: Some(application), frame_duration, @@ -82,7 +84,7 @@ impl EventLoop { wait_cancelled: false, close_requested: false, window_instance: None, - task_manager: TaskManager::new::(workers), + task_manager, } } @@ -187,47 +189,58 @@ impl winit::application::ApplicationHandler for EventLoop { _window_id: winit::window::WindowId, event: winit::event::WindowEvent, ) { - log::info!("{event:?}"); match event { winit::event::WindowEvent::CloseRequested => { self.close_requested = true; } - winit::event::WindowEvent::KeyboardInput { - device_id, - event, - is_synthetic, - } => { - let event = map::keyboard_input(device_id, &event, is_synthetic); - // TODO: map to window::Event and provide - self.task_manager.provide(event); + winit::event::WindowEvent::KeyboardInput { event, .. } => { + let button = event::Button::from(&event); + let input_event = match event.state { + winit::event::ElementState::Pressed => event::Event::ButtonPress { + button, + text: event.text.as_ref().map(|smol_str| smol_str.to_string()), + }, + winit::event::ElementState::Released => event::Event::ButtonRelease { button }, + }; + self.task_manager.provide(input_event); } - winit::event::WindowEvent::MouseWheel { - delta, - phase, - .. - } => { - panic!("input(MouseWheel): {delta:?} -> {phase:?}"); - // TODO: map to window::Event and provide - // self.task_manager.provide(event); + winit::event::WindowEvent::MouseWheel { delta, .. } => { + let input_event = match delta { + winit::event::MouseScrollDelta::LineDelta(x, y) => event::MouseScroll::Lines { + horizontal: x, + vertical: y, + }, + winit::event::MouseScrollDelta::PixelDelta(position) => { + event::MouseScroll::Pixels { + horizontal: position.x, + vertical: position.y, + } + } + }; + self.task_manager.provide(input_event); } - winit::event::WindowEvent::MouseInput { - state, - button, - .. - } => { - panic!("input(MouseInput): {button:?} -> {state:?}"); - // TODO: map to window::Event and provide - // self.task_manager.provide(event); + winit::event::WindowEvent::MouseInput { state, button, .. } => { + let mouse_button = event::Button::from(&button); + let input_event = match state { + winit::event::ElementState::Pressed => event::Event::ButtonPress { + button: mouse_button, + text: None, + }, + winit::event::ElementState::Released => event::Event::ButtonRelease { + button: mouse_button, + }, + }; + self.task_manager.provide(input_event); } winit::event::WindowEvent::RedrawRequested => { if let Some(instance) = self.window_instance.as_ref() { instance.winit_window.pre_present_notify(); } - log::info!("Wait for presenter..."); + log::debug!("Wait for presenter..."); self.task_manager .wait_for::() .present(); - log::info!("...presented"); + log::debug!("...presented"); self.task_manager.run(); // Note: can be used for debug // fill::fill_window(window); @@ -245,12 +258,13 @@ impl winit::application::ApplicationHandler for EventLoop { } fn about_to_wait(&mut self, event_loop: &winit::event_loop::ActiveEventLoop) { - log::debug!( + /* log::debug!( "about_to_wait(request_redraw: {}, wait_cancelled: {}, close_requested: {})", self.request_redraw, self.wait_cancelled, self.close_requested, ); + */ // NOTE: to wait // event_loop.set_control_flow(winit::event_loop::ControlFlow::Wait), diff --git a/src/window/event.rs b/src/window/event.rs index edc0f59..599dda2 100644 --- a/src/window/event.rs +++ b/src/window/event.rs @@ -68,30 +68,6 @@ pub enum DragAndDrop { Canceled, } -/// Button press event -#[derive(Debug, Clone, Copy, Eq, PartialEq, Hash)] -pub enum Button { - /// Keyboard button - Keyboard { - /// Button key code - key: KeyButton, - /// Button scan code - code: ScanCode, - }, - /// Left mouse button - MouseLeft, - /// Right mouse button - MouseRight, - /// Middle mouse button - MouseMiddle, - /// Forward mouse button - Forward, - /// Back mouse button - Back, - /// Other mouse button represented by numeric code - MouseOther(u16), -} - /// Mouse scroll event #[derive(Debug, Clone, Copy, PartialEq)] pub enum MouseScroll { @@ -105,9 +81,9 @@ pub enum MouseScroll { /// Scroll delta in lines (usually for mouse) Lines { /// Horizontal offset - horizontal: f64, + horizontal: f32, /// Vertical offset - vertical: f64, + vertical: f32, }, } @@ -162,99 +138,91 @@ impl Modifiers { #[allow(missing_docs)] #[derive(Debug, Hash, Ord, PartialOrd, PartialEq, Eq, Clone, Copy)] #[repr(u32)] -pub enum KeyButton { - Num1, - Num2, - Num3, - Num4, - Num5, - Num6, - Num7, - Num8, - Num9, - Num0, - - A, - B, - C, - D, - E, - F, - G, - H, - I, - J, - K, - L, - M, - N, - O, - P, - Q, - R, - S, - T, - U, - V, - W, - X, - Y, - Z, - - Escape, - - F1, - F2, - F3, - F4, - F5, - F6, - F7, - F8, - F9, - F10, - F11, - F12, - F13, - F14, - F15, - F16, - F17, - F18, - F19, - F20, - F21, - F22, - F23, - F24, - - PrintScreen, - - ScrollLock, - - Pause, - - Insert, - Home, - Delete, - End, - PageDown, - PageUp, - - Left, - Up, - Right, - Down, - - Backspace, - Return, - Space, - - Compose, - - Caret, - - Numlock, +pub enum Button { + KeyboardBackquote, + KeyboardBackslash, + KeyboardBracketLeft, + KeyboardBracketRight, + KeyboardComma, + Keyboard0, + Keyboard1, + Keyboard2, + Keyboard3, + Keyboard4, + Keyboard5, + Keyboard6, + Keyboard7, + Keyboard8, + Keyboard9, + KeyboardEqual, + KeyboardIntlBackslash, + KeyboardIntlRo, + KeyboardIntlYen, + KeyboardA, + KeyboardB, + KeyboardC, + KeyboardD, + KeyboardE, + KeyboardF, + KeyboardG, + KeyboardH, + KeyboardI, + KeyboardJ, + KeyboardK, + KeyboardL, + KeyboardM, + KeyboardN, + KeyboardO, + KeyboardP, + KeyboardQ, + KeyboardR, + KeyboardS, + KeyboardT, + KeyboardU, + KeyboardV, + KeyboardW, + KeyboardX, + KeyboardY, + KeyboardZ, + KeyboardMinus, + KeyboardPeriod, + KeyboardQuote, + KeyboardSemicolon, + KeyboardSlash, + KeyboardAltLeft, + KeyboardAltRight, + KeyboardBackspace, + KeyboardCapsLock, + KeyboardContextMenu, + KeyboardControlLeft, + KeyboardControlRight, + KeyboardEnter, + KeyboardSuperLeft, + KeyboardSuperRight, + KeyboardShiftLeft, + KeyboardShiftRight, + KeyboardSpace, + KeyboardTab, + KeyboardConvert, + KeyboardKanaMode, + KeyboardLang1, + KeyboardLang2, + KeyboardLang3, + KeyboardLang4, + KeyboardLang5, + KeyboardNonConvert, + KeyboardDelete, + KeyboardEnd, + KeyboardHelp, + KeyboardHome, + KeyboardInsert, + KeyboardPageDown, + KeyboardPageUp, + KeyboardArrowDown, + KeyboardArrowLeft, + KeyboardArrowRight, + KeyboardArrowUp, + KeyboardNumLock, Numpad0, Numpad1, Numpad2, @@ -266,81 +234,355 @@ pub enum KeyButton { Numpad8, Numpad9, NumpadAdd, - NumpadDivide, - NumpadDecimal, + NumpadBackspace, + NumpadClear, + NumpadClearEntry, NumpadComma, + NumpadDecimal, + NumpadDivide, NumpadEnter, - NumpadEquals, + NumpadEqual, + NumpadHash, + NumpadMemoryAdd, + NumpadMemoryClear, + NumpadMemoryRecall, + NumpadMemoryStore, + NumpadMemorySubtract, NumpadMultiply, + NumpadParenLeft, + NumpadParenRight, + NumpadStar, NumpadSubtract, + KeyboardEscape, + KeyboardFn, + KeyboardFnLock, + KeyboardPrintScreen, + KeyboardScrollLock, + KeyboardPause, + KeyboardBrowserBack, + KeyboardBrowserFavorites, + KeyboardBrowserForward, + KeyboardBrowserHome, + KeyboardBrowserRefresh, + KeyboardBrowserSearch, + KeyboardBrowserStop, + KeyboardEject, + KeyboardLaunchApp1, + KeyboardLaunchApp2, + KeyboardLaunchMail, + KeyboardMediaPlayPause, + KeyboardMediaSelect, + KeyboardMediaStop, + KeyboardMediaTrackNext, + KeyboardMediaTrackPrevious, + KeyboardPower, + KeyboardSleep, + KeyboardAudioVolumeDown, + KeyboardAudioVolumeMute, + KeyboardAudioVolumeUp, + KeyboardWakeUp, + KeyboardMeta, + KeyboardHyper, + KeyboardTurbo, + KeyboardAbort, + KeyboardResume, + KeyboardSuspend, + KeyboardAgain, + KeyboardCopy, + KeyboardCut, + KeyboardFind, + KeyboardOpen, + KeyboardPaste, + KeyboardProps, + KeyboardSelect, + KeyboardUndo, + KeyboardHiragana, + KeyboardKatakana, + KeyboardF1, + KeyboardF2, + KeyboardF3, + KeyboardF4, + KeyboardF5, + KeyboardF6, + KeyboardF7, + KeyboardF8, + KeyboardF9, + KeyboardF10, + KeyboardF11, + KeyboardF12, + KeyboardF13, + KeyboardF14, + KeyboardF15, + KeyboardF16, + KeyboardF17, + KeyboardF18, + KeyboardF19, + KeyboardF20, + KeyboardF21, + KeyboardF22, + KeyboardF23, + KeyboardF24, + KeyboardF25, + KeyboardF26, + KeyboardF27, + KeyboardF28, + KeyboardF29, + KeyboardF30, + KeyboardF31, + KeyboardF32, + KeyboardF33, + KeyboardF34, + KeyboardF35, - AbntC1, - AbntC2, - Apostrophe, - Apps, - Asterisk, - At, - Ax, - Backslash, - Calculator, - Capital, - Colon, - Comma, - Convert, - Equals, - Grave, - Kana, - Kanji, - LAlt, - LBracket, - LControl, - LShift, - LWin, - Mail, - MediaSelect, - MediaStop, - Minus, - Mute, - MyComputer, + KeyboardMacOS(u16), + KeyboardAndroid(u32), + KeyboardWindows(u16), + KeyboardXkb(u32), - NavigateForward, + /// Left mouse button + MouseLeft, + /// Right mouse button + MouseRight, + /// Middle mouse button + MouseMiddle, + /// Forward mouse button + MouseForward, + /// Back mouse button + MouseBack, - NavigateBackward, - NextTrack, - NoConvert, - OEM102, - Period, - PlayPause, - Plus, - Power, - PrevTrack, - RAlt, - RBracket, - RControl, - RShift, - RWin, - Semicolon, - Slash, - Sleep, - Stop, - Sysrq, - Tab, - Underline, - Unlabeled, - VolumeDown, - VolumeUp, - Wake, - WebBack, - WebFavorites, - WebForward, - WebHome, - WebRefresh, - WebSearch, - WebStop, - Yen, - Copy, - Paste, - Cut, + MouseOther(u16), Unknown, } + +impl From<&winit::event::KeyEvent> for Button { + fn from(event: &winit::event::KeyEvent) -> Self { + match event.physical_key { + winit::keyboard::PhysicalKey::Code(code) => match code { + winit::keyboard::KeyCode::Backquote => Button::KeyboardBackquote, + winit::keyboard::KeyCode::Backslash => Button::KeyboardBackslash, + winit::keyboard::KeyCode::BracketLeft => Button::KeyboardBracketLeft, + winit::keyboard::KeyCode::BracketRight => Button::KeyboardBracketRight, + winit::keyboard::KeyCode::Comma => Button::KeyboardComma, + winit::keyboard::KeyCode::Digit0 => Button::Keyboard0, + winit::keyboard::KeyCode::Digit1 => Button::Keyboard1, + winit::keyboard::KeyCode::Digit2 => Button::Keyboard2, + winit::keyboard::KeyCode::Digit3 => Button::Keyboard3, + winit::keyboard::KeyCode::Digit4 => Button::Keyboard4, + winit::keyboard::KeyCode::Digit5 => Button::Keyboard5, + winit::keyboard::KeyCode::Digit6 => Button::Keyboard6, + winit::keyboard::KeyCode::Digit7 => Button::Keyboard7, + winit::keyboard::KeyCode::Digit8 => Button::Keyboard8, + winit::keyboard::KeyCode::Digit9 => Button::Keyboard9, + winit::keyboard::KeyCode::Equal => Button::KeyboardEqual, + winit::keyboard::KeyCode::IntlBackslash => Button::KeyboardIntlBackslash, + winit::keyboard::KeyCode::IntlRo => Button::KeyboardIntlRo, + winit::keyboard::KeyCode::IntlYen => Button::KeyboardIntlYen, + winit::keyboard::KeyCode::KeyA => Button::KeyboardA, + winit::keyboard::KeyCode::KeyB => Button::KeyboardB, + winit::keyboard::KeyCode::KeyC => Button::KeyboardC, + winit::keyboard::KeyCode::KeyD => Button::KeyboardD, + winit::keyboard::KeyCode::KeyE => Button::KeyboardE, + winit::keyboard::KeyCode::KeyF => Button::KeyboardF, + winit::keyboard::KeyCode::KeyG => Button::KeyboardG, + winit::keyboard::KeyCode::KeyH => Button::KeyboardH, + winit::keyboard::KeyCode::KeyI => Button::KeyboardI, + winit::keyboard::KeyCode::KeyJ => Button::KeyboardJ, + winit::keyboard::KeyCode::KeyK => Button::KeyboardK, + winit::keyboard::KeyCode::KeyL => Button::KeyboardL, + winit::keyboard::KeyCode::KeyM => Button::KeyboardM, + winit::keyboard::KeyCode::KeyN => Button::KeyboardN, + winit::keyboard::KeyCode::KeyO => Button::KeyboardO, + winit::keyboard::KeyCode::KeyP => Button::KeyboardP, + winit::keyboard::KeyCode::KeyQ => Button::KeyboardQ, + winit::keyboard::KeyCode::KeyR => Button::KeyboardR, + winit::keyboard::KeyCode::KeyS => Button::KeyboardS, + winit::keyboard::KeyCode::KeyT => Button::KeyboardT, + winit::keyboard::KeyCode::KeyU => Button::KeyboardU, + winit::keyboard::KeyCode::KeyV => Button::KeyboardV, + winit::keyboard::KeyCode::KeyW => Button::KeyboardW, + winit::keyboard::KeyCode::KeyX => Button::KeyboardX, + winit::keyboard::KeyCode::KeyY => Button::KeyboardY, + winit::keyboard::KeyCode::KeyZ => Button::KeyboardZ, + winit::keyboard::KeyCode::Minus => Button::KeyboardMinus, + winit::keyboard::KeyCode::Period => Button::KeyboardPeriod, + winit::keyboard::KeyCode::Quote => Button::KeyboardQuote, + winit::keyboard::KeyCode::Semicolon => Button::KeyboardSemicolon, + winit::keyboard::KeyCode::Slash => Button::KeyboardSlash, + winit::keyboard::KeyCode::AltLeft => Button::KeyboardAltLeft, + winit::keyboard::KeyCode::AltRight => Button::KeyboardAltRight, + winit::keyboard::KeyCode::Backspace => Button::KeyboardBackspace, + winit::keyboard::KeyCode::CapsLock => Button::KeyboardCapsLock, + winit::keyboard::KeyCode::ContextMenu => Button::KeyboardContextMenu, + winit::keyboard::KeyCode::ControlLeft => Button::KeyboardControlLeft, + winit::keyboard::KeyCode::ControlRight => Button::KeyboardControlRight, + winit::keyboard::KeyCode::Enter => Button::KeyboardEnter, + winit::keyboard::KeyCode::SuperLeft => Button::KeyboardSuperLeft, + winit::keyboard::KeyCode::SuperRight => Button::KeyboardSuperRight, + winit::keyboard::KeyCode::ShiftLeft => Button::KeyboardShiftLeft, + winit::keyboard::KeyCode::ShiftRight => Button::KeyboardShiftRight, + winit::keyboard::KeyCode::Space => Button::KeyboardSpace, + winit::keyboard::KeyCode::Tab => Button::KeyboardTab, + winit::keyboard::KeyCode::Convert => Button::KeyboardConvert, + winit::keyboard::KeyCode::KanaMode => Button::KeyboardKanaMode, + winit::keyboard::KeyCode::Lang1 => Button::KeyboardLang1, + winit::keyboard::KeyCode::Lang2 => Button::KeyboardLang2, + winit::keyboard::KeyCode::Lang3 => Button::KeyboardLang3, + winit::keyboard::KeyCode::Lang4 => Button::KeyboardLang4, + winit::keyboard::KeyCode::Lang5 => Button::KeyboardLang5, + winit::keyboard::KeyCode::NonConvert => Button::KeyboardNonConvert, + winit::keyboard::KeyCode::Delete => Button::KeyboardDelete, + winit::keyboard::KeyCode::End => Button::KeyboardEnd, + winit::keyboard::KeyCode::Help => Button::KeyboardHelp, + winit::keyboard::KeyCode::Home => Button::KeyboardHome, + winit::keyboard::KeyCode::Insert => Button::KeyboardInsert, + winit::keyboard::KeyCode::PageDown => Button::KeyboardPageDown, + winit::keyboard::KeyCode::PageUp => Button::KeyboardPageUp, + winit::keyboard::KeyCode::ArrowDown => Button::KeyboardArrowDown, + winit::keyboard::KeyCode::ArrowLeft => Button::KeyboardArrowLeft, + winit::keyboard::KeyCode::ArrowRight => Button::KeyboardArrowRight, + winit::keyboard::KeyCode::ArrowUp => Button::KeyboardArrowUp, + winit::keyboard::KeyCode::NumLock => Button::KeyboardNumLock, + winit::keyboard::KeyCode::Numpad0 => Button::Numpad0, + winit::keyboard::KeyCode::Numpad1 => Button::Numpad1, + winit::keyboard::KeyCode::Numpad2 => Button::Numpad2, + winit::keyboard::KeyCode::Numpad3 => Button::Numpad3, + winit::keyboard::KeyCode::Numpad4 => Button::Numpad4, + winit::keyboard::KeyCode::Numpad5 => Button::Numpad5, + winit::keyboard::KeyCode::Numpad6 => Button::Numpad6, + winit::keyboard::KeyCode::Numpad7 => Button::Numpad7, + winit::keyboard::KeyCode::Numpad8 => Button::Numpad8, + winit::keyboard::KeyCode::Numpad9 => Button::Numpad9, + winit::keyboard::KeyCode::NumpadAdd => Button::NumpadAdd, + winit::keyboard::KeyCode::NumpadBackspace => Button::NumpadBackspace, + winit::keyboard::KeyCode::NumpadClear => Button::NumpadClear, + winit::keyboard::KeyCode::NumpadClearEntry => Button::NumpadClearEntry, + winit::keyboard::KeyCode::NumpadComma => Button::NumpadComma, + winit::keyboard::KeyCode::NumpadDecimal => Button::NumpadDecimal, + winit::keyboard::KeyCode::NumpadDivide => Button::NumpadDivide, + winit::keyboard::KeyCode::NumpadEnter => Button::NumpadEnter, + winit::keyboard::KeyCode::NumpadEqual => Button::NumpadEqual, + winit::keyboard::KeyCode::NumpadHash => Button::NumpadHash, + winit::keyboard::KeyCode::NumpadMemoryAdd => Button::NumpadMemoryAdd, + winit::keyboard::KeyCode::NumpadMemoryClear => Button::NumpadMemoryClear, + winit::keyboard::KeyCode::NumpadMemoryRecall => Button::NumpadMemoryRecall, + winit::keyboard::KeyCode::NumpadMemoryStore => Button::NumpadMemoryStore, + winit::keyboard::KeyCode::NumpadMemorySubtract => Button::NumpadMemorySubtract, + winit::keyboard::KeyCode::NumpadMultiply => Button::NumpadMultiply, + winit::keyboard::KeyCode::NumpadParenLeft => Button::NumpadParenLeft, + winit::keyboard::KeyCode::NumpadParenRight => Button::NumpadParenRight, + winit::keyboard::KeyCode::NumpadStar => Button::NumpadStar, + winit::keyboard::KeyCode::NumpadSubtract => Button::NumpadSubtract, + winit::keyboard::KeyCode::Escape => Button::KeyboardEscape, + winit::keyboard::KeyCode::Fn => Button::KeyboardFn, + winit::keyboard::KeyCode::FnLock => Button::KeyboardFnLock, + winit::keyboard::KeyCode::PrintScreen => Button::KeyboardPrintScreen, + winit::keyboard::KeyCode::ScrollLock => Button::KeyboardScrollLock, + winit::keyboard::KeyCode::Pause => Button::KeyboardPause, + winit::keyboard::KeyCode::BrowserBack => Button::KeyboardBrowserBack, + winit::keyboard::KeyCode::BrowserFavorites => Button::KeyboardBrowserFavorites, + winit::keyboard::KeyCode::BrowserForward => Button::KeyboardBrowserForward, + winit::keyboard::KeyCode::BrowserHome => Button::KeyboardBrowserHome, + winit::keyboard::KeyCode::BrowserRefresh => Button::KeyboardBrowserRefresh, + winit::keyboard::KeyCode::BrowserSearch => Button::KeyboardBrowserSearch, + winit::keyboard::KeyCode::BrowserStop => Button::KeyboardBrowserStop, + winit::keyboard::KeyCode::Eject => Button::KeyboardEject, + winit::keyboard::KeyCode::LaunchApp1 => Button::KeyboardLaunchApp1, + winit::keyboard::KeyCode::LaunchApp2 => Button::KeyboardLaunchApp2, + winit::keyboard::KeyCode::LaunchMail => Button::KeyboardLaunchMail, + winit::keyboard::KeyCode::MediaPlayPause => Button::KeyboardMediaPlayPause, + winit::keyboard::KeyCode::MediaSelect => Button::KeyboardMediaSelect, + winit::keyboard::KeyCode::MediaStop => Button::KeyboardMediaStop, + winit::keyboard::KeyCode::MediaTrackNext => Button::KeyboardMediaTrackNext, + winit::keyboard::KeyCode::MediaTrackPrevious => Button::KeyboardMediaTrackPrevious, + winit::keyboard::KeyCode::Power => Button::KeyboardPower, + winit::keyboard::KeyCode::Sleep => Button::KeyboardSleep, + winit::keyboard::KeyCode::AudioVolumeDown => Button::KeyboardAudioVolumeDown, + winit::keyboard::KeyCode::AudioVolumeMute => Button::KeyboardAudioVolumeMute, + winit::keyboard::KeyCode::AudioVolumeUp => Button::KeyboardAudioVolumeUp, + winit::keyboard::KeyCode::WakeUp => Button::KeyboardWakeUp, + winit::keyboard::KeyCode::Meta => Button::KeyboardMeta, + winit::keyboard::KeyCode::Hyper => Button::KeyboardHyper, + winit::keyboard::KeyCode::Turbo => Button::KeyboardTurbo, + winit::keyboard::KeyCode::Abort => Button::KeyboardAbort, + winit::keyboard::KeyCode::Resume => Button::KeyboardResume, + winit::keyboard::KeyCode::Suspend => Button::KeyboardSuspend, + winit::keyboard::KeyCode::Again => Button::KeyboardAgain, + winit::keyboard::KeyCode::Copy => Button::KeyboardCopy, + winit::keyboard::KeyCode::Cut => Button::KeyboardCut, + winit::keyboard::KeyCode::Find => Button::KeyboardFind, + winit::keyboard::KeyCode::Open => Button::KeyboardOpen, + winit::keyboard::KeyCode::Paste => Button::KeyboardPaste, + winit::keyboard::KeyCode::Props => Button::KeyboardProps, + winit::keyboard::KeyCode::Select => Button::KeyboardSelect, + winit::keyboard::KeyCode::Undo => Button::KeyboardUndo, + winit::keyboard::KeyCode::Hiragana => Button::KeyboardHiragana, + winit::keyboard::KeyCode::Katakana => Button::KeyboardKatakana, + winit::keyboard::KeyCode::F1 => Button::KeyboardF1, + winit::keyboard::KeyCode::F2 => Button::KeyboardF2, + winit::keyboard::KeyCode::F3 => Button::KeyboardF3, + winit::keyboard::KeyCode::F4 => Button::KeyboardF4, + winit::keyboard::KeyCode::F5 => Button::KeyboardF5, + winit::keyboard::KeyCode::F6 => Button::KeyboardF6, + winit::keyboard::KeyCode::F7 => Button::KeyboardF7, + winit::keyboard::KeyCode::F8 => Button::KeyboardF8, + winit::keyboard::KeyCode::F9 => Button::KeyboardF9, + winit::keyboard::KeyCode::F10 => Button::KeyboardF10, + winit::keyboard::KeyCode::F11 => Button::KeyboardF11, + winit::keyboard::KeyCode::F12 => Button::KeyboardF12, + winit::keyboard::KeyCode::F13 => Button::KeyboardF13, + winit::keyboard::KeyCode::F14 => Button::KeyboardF14, + winit::keyboard::KeyCode::F15 => Button::KeyboardF15, + winit::keyboard::KeyCode::F16 => Button::KeyboardF16, + winit::keyboard::KeyCode::F17 => Button::KeyboardF17, + winit::keyboard::KeyCode::F18 => Button::KeyboardF18, + winit::keyboard::KeyCode::F19 => Button::KeyboardF19, + winit::keyboard::KeyCode::F20 => Button::KeyboardF20, + winit::keyboard::KeyCode::F21 => Button::KeyboardF21, + winit::keyboard::KeyCode::F22 => Button::KeyboardF22, + winit::keyboard::KeyCode::F23 => Button::KeyboardF23, + winit::keyboard::KeyCode::F24 => Button::KeyboardF24, + winit::keyboard::KeyCode::F25 => Button::KeyboardF25, + winit::keyboard::KeyCode::F26 => Button::KeyboardF26, + winit::keyboard::KeyCode::F27 => Button::KeyboardF27, + winit::keyboard::KeyCode::F28 => Button::KeyboardF28, + winit::keyboard::KeyCode::F29 => Button::KeyboardF29, + winit::keyboard::KeyCode::F30 => Button::KeyboardF30, + winit::keyboard::KeyCode::F31 => Button::KeyboardF31, + winit::keyboard::KeyCode::F32 => Button::KeyboardF32, + winit::keyboard::KeyCode::F33 => Button::KeyboardF33, + winit::keyboard::KeyCode::F34 => Button::KeyboardF34, + winit::keyboard::KeyCode::F35 => Button::KeyboardF35, + _ => Button::Unknown, + }, + winit::keyboard::PhysicalKey::Unidentified( + winit::keyboard::NativeKeyCode::Android(code), + ) => Button::KeyboardAndroid(code), + winit::keyboard::PhysicalKey::Unidentified(winit::keyboard::NativeKeyCode::MacOS( + code, + )) => Button::KeyboardMacOS(code), + winit::keyboard::PhysicalKey::Unidentified( + winit::keyboard::NativeKeyCode::Windows(code), + ) => Button::KeyboardWindows(code), + winit::keyboard::PhysicalKey::Unidentified(winit::keyboard::NativeKeyCode::Xkb( + code, + )) => Button::KeyboardXkb(code), + winit::keyboard::PhysicalKey::Unidentified( + winit::keyboard::NativeKeyCode::Unidentified, + ) => Button::Unknown, + } + } +} + +impl From<&winit::event::MouseButton> for Button { + fn from(button: &winit::event::MouseButton) -> Self { + match button { + winit::event::MouseButton::Left => Button::MouseLeft, + winit::event::MouseButton::Right => Button::MouseRight, + winit::event::MouseButton::Middle => Button::MouseMiddle, + winit::event::MouseButton::Forward => Button::MouseForward, + winit::event::MouseButton::Back => Button::MouseBack, + winit::event::MouseButton::Other(code) => Button::MouseOther(*code), + } + } +} diff --git a/src/window/input.rs b/src/window/input.rs index 80a2447..9d3ae5e 100644 --- a/src/window/input.rs +++ b/src/window/input.rs @@ -85,8 +85,8 @@ impl Task for ReadInput { horizontal, vertical, } => { - mouse_scroll_delta_lines.horizontal += horizontal; - mouse_scroll_delta_lines.vertical += vertical; + mouse_scroll_delta_lines.horizontal += *horizontal as f64; + mouse_scroll_delta_lines.vertical += *vertical as f64; } MouseScroll::Pixels { horizontal, diff --git a/src/window/map.rs b/src/window/map.rs index 686a1bd..fa0af72 100644 --- a/src/window/map.rs +++ b/src/window/map.rs @@ -1,7 +1,6 @@ use crate::window::event; -/* NOTE: older implementation. Keep it here for reference until final migration - * +/* pub fn event(event: &winit::event::Event<()>) -> Option { let input_event = match event { winit::event::Event::WindowEvent { @@ -35,7 +34,7 @@ pub fn event(event: &winit::event::Event<()>) -> Option { }; Some(input_event) } -*/ +*/ pub fn keyboard_input( _device_id: winit::event::DeviceId, @@ -46,16 +45,16 @@ pub fn keyboard_input( // TODO: impement 1:1 mapper function winit::keyboard::PhysicalKey::Code(key_code) => { let scan_code = key_code as u32; - if scan_code < (event::KeyCode::Unknown as u32) { + if scan_code < (event::Key::Unknown as u32) { ( - unsafe { Some(std::mem::transmute::(key_code)) }, + unsafe { Some(std::mem::transmute(key_code as u32)) }, scan_code, ) } else { (None, scan_code) } } - _ => (None, event::KeyCode::Unknown as u32), + _ => (None, event::Key::Unknown as u32), }; let button = event::Button::Key { @@ -91,10 +90,10 @@ fn mouse_wheel(delta: &winit::event::MouseScrollDelta) -> event::Event { event::Event::MouseScroll { delta: match delta { winit::event::MouseScrollDelta::LineDelta(x, y) => event::MouseScroll::Lines { - horizontal: *x as f64, - vertical: *y as f64, + horizontal: *x, + vertical: *y, }, - winit::event::MouseScrollDelta::PixelDelta(position) => event::MouseScroll::Lines { + winit::event::MouseScrollDelta::PixelDelta(position) => event::MouseScroll::Pixels { horizontal: position.x, vertical: position.y, }, @@ -138,232 +137,232 @@ fn dropped_file(path: &std::path::Path) -> event::Event { } } -fn map_key_event(event: winit::event::KeyEvent) -> event::KeyCode { +fn map_key_event(event: winit::event::KeyEvent) -> event::Key { match event.physical_key { winit::keyboard::PhysicalKey::Code(keycode) => match keycode { - winit::keyboard::KeyCode::Digit1 => event::KeyCode::Key1, - winit::keyboard::KeyCode::Digit2 => event::KeyCode::Key2, - winit::keyboard::KeyCode::Digit3 => event::KeyCode::Key3, - winit::keyboard::KeyCode::Digit4 => event::KeyCode::Key4, - winit::keyboard::KeyCode::Digit5 => event::KeyCode::Key5, - winit::keyboard::KeyCode::Digit6 => event::KeyCode::Key6, - winit::keyboard::KeyCode::Digit7 => event::KeyCode::Key7, - winit::keyboard::KeyCode::Digit8 => event::KeyCode::Key8, - winit::keyboard::KeyCode::Digit9 => event::KeyCode::Key9, - winit::keyboard::KeyCode::Digit0 => event::KeyCode::Key0, - - winit::keyboard::KeyCode::KeyA => event::KeyCode::A, - winit::keyboard::KeyCode::KeyB => event::KeyCode::B, - winit::keyboard::KeyCode::KeyC => event::KeyCode::C, - winit::keyboard::KeyCode::KeyD => event::KeyCode::D, - winit::keyboard::KeyCode::KeyE => event::KeyCode::E, - winit::keyboard::KeyCode::KeyF => event::KeyCode::F, - winit::keyboard::KeyCode::KeyG => event::KeyCode::G, - winit::keyboard::KeyCode::KeyH => event::KeyCode::H, - winit::keyboard::KeyCode::KeyI => event::KeyCode::I, - winit::keyboard::KeyCode::KeyJ => event::KeyCode::J, - winit::keyboard::KeyCode::KeyK => event::KeyCode::K, - winit::keyboard::KeyCode::KeyL => event::KeyCode::L, - winit::keyboard::KeyCode::KeyM => event::KeyCode::M, - winit::keyboard::KeyCode::KeyN => event::KeyCode::N, - winit::keyboard::KeyCode::KeyO => event::KeyCode::O, - winit::keyboard::KeyCode::KeyP => event::KeyCode::P, - winit::keyboard::KeyCode::KeyQ => event::KeyCode::Q, - winit::keyboard::KeyCode::KeyR => event::KeyCode::R, - winit::keyboard::KeyCode::KeyS => event::KeyCode::S, - winit::keyboard::KeyCode::KeyT => event::KeyCode::T, - winit::keyboard::KeyCode::KeyU => event::KeyCode::U, - winit::keyboard::KeyCode::KeyV => event::KeyCode::V, - winit::keyboard::KeyCode::KeyW => event::KeyCode::W, - winit::keyboard::KeyCode::KeyX => event::KeyCode::X, - winit::keyboard::KeyCode::KeyY => event::KeyCode::Y, - winit::keyboard::KeyCode::KeyZ => event::KeyCode::Z, - - winit::keyboard::KeyCode::Escape => event::KeyCode::Escape, - - winit::keyboard::KeyCode::F1 => event::KeyCode::F1, - winit::keyboard::KeyCode::F2 => event::KeyCode::F2, - winit::keyboard::KeyCode::F3 => event::KeyCode::F3, - winit::keyboard::KeyCode::F4 => event::KeyCode::F4, - winit::keyboard::KeyCode::F5 => event::KeyCode::F5, - winit::keyboard::KeyCode::F6 => event::KeyCode::F6, - winit::keyboard::KeyCode::F7 => event::KeyCode::F7, - winit::keyboard::KeyCode::F8 => event::KeyCode::F8, - winit::keyboard::KeyCode::F9 => event::KeyCode::F9, - winit::keyboard::KeyCode::F10 => event::KeyCode::F10, - winit::keyboard::KeyCode::F11 => event::KeyCode::F11, - winit::keyboard::KeyCode::F12 => event::KeyCode::F12, - winit::keyboard::KeyCode::F13 => event::KeyCode::F13, - winit::keyboard::KeyCode::F14 => event::KeyCode::F14, - winit::keyboard::KeyCode::F15 => event::KeyCode::F15, - winit::keyboard::KeyCode::F16 => event::KeyCode::F16, - winit::keyboard::KeyCode::F17 => event::KeyCode::F17, - winit::keyboard::KeyCode::F18 => event::KeyCode::F18, - winit::keyboard::KeyCode::F19 => event::KeyCode::F19, - winit::keyboard::KeyCode::F20 => event::KeyCode::F20, - winit::keyboard::KeyCode::F21 => event::KeyCode::F21, - winit::keyboard::KeyCode::F22 => event::KeyCode::F22, - winit::keyboard::KeyCode::F23 => event::KeyCode::F23, - winit::keyboard::KeyCode::F24 => event::KeyCode::F24, - - winit::keyboard::KeyCode::PrintScreen => event::KeyCode::PrintScreen, - winit::keyboard::KeyCode::ScrollLock => event::KeyCode::ScrollLock, - winit::keyboard::KeyCode::Pause => event::KeyCode::Pause, - - winit::keyboard::KeyCode::Insert => event::KeyCode::Insert, - winit::keyboard::KeyCode::Home => event::KeyCode::Home, - winit::keyboard::KeyCode::Delete => event::KeyCode::Delete, - winit::keyboard::KeyCode::End => event::KeyCode::End, - - winit::keyboard::KeyCode::PageDown => event::KeyCode::PageDown, - winit::keyboard::KeyCode::PageUp => event::KeyCode::PageUp, - - winit::keyboard::KeyCode::ArrowLeft => event::KeyCode::Left, - winit::keyboard::KeyCode::ArrowUp => event::KeyCode::Up, - winit::keyboard::KeyCode::ArrowRight => event::KeyCode::Right, - winit::keyboard::KeyCode::ArrowDown => event::KeyCode::Down, + winit::keyboard::KeyCode::Digit1 => event::Key::Key1, + winit::keyboard::KeyCode::Digit2 => event::Key::Key2, + winit::keyboard::KeyCode::Digit3 => event::Key::Key3, + winit::keyboard::KeyCode::Digit4 => event::Key::Key4, + winit::keyboard::KeyCode::Digit5 => event::Key::Key5, + winit::keyboard::KeyCode::Digit6 => event::Key::Key6, + winit::keyboard::KeyCode::Digit7 => event::Key::Key7, + winit::keyboard::KeyCode::Digit8 => event::Key::Key8, + winit::keyboard::KeyCode::Digit9 => event::Key::Key9, + winit::keyboard::KeyCode::Digit0 => event::Key::Key0, + + winit::keyboard::KeyCode::KeyA => event::Key::A, + winit::keyboard::KeyCode::KeyB => event::Key::B, + winit::keyboard::KeyCode::KeyC => event::Key::C, + winit::keyboard::KeyCode::KeyD => event::Key::D, + winit::keyboard::KeyCode::KeyE => event::Key::E, + winit::keyboard::KeyCode::KeyF => event::Key::F, + winit::keyboard::KeyCode::KeyG => event::Key::G, + winit::keyboard::KeyCode::KeyH => event::Key::H, + winit::keyboard::KeyCode::KeyI => event::Key::I, + winit::keyboard::KeyCode::KeyJ => event::Key::J, + winit::keyboard::KeyCode::KeyK => event::Key::K, + winit::keyboard::KeyCode::KeyL => event::Key::L, + winit::keyboard::KeyCode::KeyM => event::Key::M, + winit::keyboard::KeyCode::KeyN => event::Key::N, + winit::keyboard::KeyCode::KeyO => event::Key::O, + winit::keyboard::KeyCode::KeyP => event::Key::P, + winit::keyboard::KeyCode::KeyQ => event::Key::Q, + winit::keyboard::KeyCode::KeyR => event::Key::R, + winit::keyboard::KeyCode::KeyS => event::Key::S, + winit::keyboard::KeyCode::KeyT => event::Key::T, + winit::keyboard::KeyCode::KeyU => event::Key::U, + winit::keyboard::KeyCode::KeyV => event::Key::V, + winit::keyboard::KeyCode::KeyW => event::Key::W, + winit::keyboard::KeyCode::KeyX => event::Key::X, + winit::keyboard::KeyCode::KeyY => event::Key::Y, + winit::keyboard::KeyCode::KeyZ => event::Key::Z, + + winit::keyboard::KeyCode::Escape => event::Key::Escape, + + winit::keyboard::KeyCode::F1 => event::Key::F1, + winit::keyboard::KeyCode::F2 => event::Key::F2, + winit::keyboard::KeyCode::F3 => event::Key::F3, + winit::keyboard::KeyCode::F4 => event::Key::F4, + winit::keyboard::KeyCode::F5 => event::Key::F5, + winit::keyboard::KeyCode::F6 => event::Key::F6, + winit::keyboard::KeyCode::F7 => event::Key::F7, + winit::keyboard::KeyCode::F8 => event::Key::F8, + winit::keyboard::KeyCode::F9 => event::Key::F9, + winit::keyboard::KeyCode::F10 => event::Key::F10, + winit::keyboard::KeyCode::F11 => event::Key::F11, + winit::keyboard::KeyCode::F12 => event::Key::F12, + winit::keyboard::KeyCode::F13 => event::Key::F13, + winit::keyboard::KeyCode::F14 => event::Key::F14, + winit::keyboard::KeyCode::F15 => event::Key::F15, + winit::keyboard::KeyCode::F16 => event::Key::F16, + winit::keyboard::KeyCode::F17 => event::Key::F17, + winit::keyboard::KeyCode::F18 => event::Key::F18, + winit::keyboard::KeyCode::F19 => event::Key::F19, + winit::keyboard::KeyCode::F20 => event::Key::F20, + winit::keyboard::KeyCode::F21 => event::Key::F21, + winit::keyboard::KeyCode::F22 => event::Key::F22, + winit::keyboard::KeyCode::F23 => event::Key::F23, + winit::keyboard::KeyCode::F24 => event::Key::F24, + + winit::keyboard::KeyCode::PrintScreen => event::Key::PrintScreen, + winit::keyboard::KeyCode::ScrollLock => event::Key::ScrollLock, + winit::keyboard::KeyCode::Pause => event::Key::Pause, + + winit::keyboard::KeyCode::Insert => event::Key::Insert, + winit::keyboard::KeyCode::Home => event::Key::Home, + winit::keyboard::KeyCode::Delete => event::Key::Delete, + winit::keyboard::KeyCode::End => event::Key::End, + + winit::keyboard::KeyCode::PageDown => event::Key::PageDown, + winit::keyboard::KeyCode::PageUp => event::Key::PageUp, + + winit::keyboard::KeyCode::ArrowLeft => event::Key::Left, + winit::keyboard::KeyCode::ArrowUp => event::Key::Up, + winit::keyboard::KeyCode::ArrowRight => event::Key::Right, + winit::keyboard::KeyCode::ArrowDown => event::Key::Down, - winit::keyboard::KeyCode::Backspace => event::KeyCode::Backspace, - winit::keyboard::KeyCode::Enter => event::KeyCode::Return, - winit::keyboard::KeyCode::Space => event::KeyCode::Space, + winit::keyboard::KeyCode::Backspace => event::Key::Backspace, + winit::keyboard::KeyCode::Enter => event::Key::Return, + winit::keyboard::KeyCode::Space => event::Key::Space, - // winit::keyboard::KeyCode::Compose => event::KeyCode::Compose, - // winit::keyboard::KeyCode::Caret => event::KeyCode::Caret, - winit::keyboard::KeyCode::NumLock => event::KeyCode::Numlock, + // winit::keyboard::KeyCode::Compose => event::Key::Compose, + // winit::keyboard::KeyCode::Caret => event::Key::Caret, + winit::keyboard::KeyCode::NumLock => event::Key::Numlock, - winit::keyboard::KeyCode::Numpad0 => event::KeyCode::Numpad0, - - winit::keyboard::KeyCode::Numpad1 => event::KeyCode::Numpad1, - - winit::keyboard::KeyCode::Numpad2 => event::KeyCode::Numpad2, - - winit::keyboard::KeyCode::Numpad3 => event::KeyCode::Numpad3, + winit::keyboard::KeyCode::Numpad0 => event::Key::Numpad0, + + winit::keyboard::KeyCode::Numpad1 => event::Key::Numpad1, + + winit::keyboard::KeyCode::Numpad2 => event::Key::Numpad2, + + winit::keyboard::KeyCode::Numpad3 => event::Key::Numpad3, - winit::keyboard::KeyCode::Numpad4 => event::KeyCode::Numpad4, + winit::keyboard::KeyCode::Numpad4 => event::Key::Numpad4, - winit::keyboard::KeyCode::Numpad5 => event::KeyCode::Numpad5, + winit::keyboard::KeyCode::Numpad5 => event::Key::Numpad5, - winit::keyboard::KeyCode::Numpad6 => event::KeyCode::Numpad6, + winit::keyboard::KeyCode::Numpad6 => event::Key::Numpad6, - winit::keyboard::KeyCode::Numpad7 => event::KeyCode::Numpad7, + winit::keyboard::KeyCode::Numpad7 => event::Key::Numpad7, - winit::keyboard::KeyCode::Numpad8 => event::KeyCode::Numpad8, + winit::keyboard::KeyCode::Numpad8 => event::Key::Numpad8, - winit::keyboard::KeyCode::Numpad9 => event::KeyCode::Numpad9, + winit::keyboard::KeyCode::Numpad9 => event::Key::Numpad9, - winit::keyboard::KeyCode::NumpadAdd => event::KeyCode::NumpadAdd, + winit::keyboard::KeyCode::NumpadAdd => event::Key::NumpadAdd, - winit::keyboard::KeyCode::NumpadDivide => event::KeyCode::NumpadDivide, + winit::keyboard::KeyCode::NumpadDivide => event::Key::NumpadDivide, - winit::keyboard::KeyCode::NumpadDecimal => event::KeyCode::NumpadDecimal, + winit::keyboard::KeyCode::NumpadDecimal => event::Key::NumpadDecimal, - winit::keyboard::KeyCode::NumpadComma => event::KeyCode::NumpadComma, + winit::keyboard::KeyCode::NumpadComma => event::Key::NumpadComma, - winit::keyboard::KeyCode::NumpadEnter => event::KeyCode::NumpadEnter, + winit::keyboard::KeyCode::NumpadEnter => event::Key::NumpadEnter, - winit::keyboard::KeyCode::NumpadEqual => event::KeyCode::NumpadEquals, + winit::keyboard::KeyCode::NumpadEqual => event::Key::NumpadEquals, - winit::keyboard::KeyCode::NumpadMultiply => event::KeyCode::NumpadMultiply, + winit::keyboard::KeyCode::NumpadMultiply => event::Key::NumpadMultiply, - winit::keyboard::KeyCode::NumpadSubtract => event::KeyCode::NumpadSubtract, + winit::keyboard::KeyCode::NumpadSubtract => event::Key::NumpadSubtract, - // winit::keyboard::KeyCode::AbntC1 => event::KeyCode::AbntC1, - // winit::keyboard::KeyCode::AbntC2 => event::KeyCode::AbntC2, + // winit::keyboard::KeyCode::AbntC1 => event::Key::AbntC1, + // winit::keyboard::KeyCode::AbntC2 => event::Key::AbntC2, - // winit::keyboard::KeyCode::Apostrophe => event::KeyCode::Apostrophe, - // winit::keyboard::KeyCode::Apps => event::KeyCode::Apps, + // winit::keyboard::KeyCode::Apostrophe => event::Key::Apostrophe, + // winit::keyboard::KeyCode::Apps => event::Key::Apps, - // winit::keyboard::KeyCode::Asterisk => event::KeyCode::Asterisk, - // winit::keyboard::KeyCode::At => event::KeyCode::At, - // winit::keyboard::KeyCode::Ax => event::KeyCode::Ax, - winit::keyboard::KeyCode::Backslash => event::KeyCode::Backslash, + // winit::keyboard::KeyCode::Asterisk => event::Key::Asterisk, + // winit::keyboard::KeyCode::At => event::Key::At, + // winit::keyboard::KeyCode::Ax => event::Key::Ax, + winit::keyboard::KeyCode::Backslash => event::Key::Backslash, - winit::keyboard::KeyCode::LaunchApp2 => event::KeyCode::Calculator, + winit::keyboard::KeyCode::LaunchApp2 => event::Key::Calculator, - // winit::keyboard::KeyCode::Capital => event::KeyCode::Capital, - // winit::keyboard::KeyCode::Colon => event::KeyCode::Colon, - winit::keyboard::KeyCode::Comma => event::KeyCode::Comma, + // winit::keyboard::KeyCode::Capital => event::Key::Capital, + // winit::keyboard::KeyCode::Colon => event::Key::Colon, + winit::keyboard::KeyCode::Comma => event::Key::Comma, - winit::keyboard::KeyCode::Convert => event::KeyCode::Convert, - //winit::keyboard::KeyCode::Equals => event::KeyCode::Equals, - //winit::keyboard::KeyCode::Grave => event::KeyCode::Grave, - //winit::keyboard::KeyCode::Kana => event::KeyCode::Kana, - //winit::keyboard::KeyCode::Kanji => event::KeyCode::Kanji, - winit::keyboard::KeyCode::AltLeft => event::KeyCode::LAlt, + winit::keyboard::KeyCode::Convert => event::Key::Convert, + //winit::keyboard::KeyCode::Equals => event::Key::Equals, + //winit::keyboard::KeyCode::Grave => event::Key::Grave, + //winit::keyboard::KeyCode::Kana => event::Key::Kana, + //winit::keyboard::KeyCode::Kanji => event::Key::Kanji, + winit::keyboard::KeyCode::AltLeft => event::Key::LAlt, - winit::keyboard::KeyCode::BracketLeft => event::KeyCode::LBracket, + winit::keyboard::KeyCode::BracketLeft => event::Key::LBracket, - winit::keyboard::KeyCode::ControlLeft => event::KeyCode::LControl, - winit::keyboard::KeyCode::ShiftLeft => event::KeyCode::LShift, - winit::keyboard::KeyCode::SuperLeft => event::KeyCode::LWin, - winit::keyboard::KeyCode::LaunchMail => event::KeyCode::Mail, + winit::keyboard::KeyCode::ControlLeft => event::Key::LControl, + winit::keyboard::KeyCode::ShiftLeft => event::Key::LShift, + winit::keyboard::KeyCode::SuperLeft => event::Key::LWin, + winit::keyboard::KeyCode::LaunchMail => event::Key::Mail, - winit::keyboard::KeyCode::MediaSelect => event::KeyCode::MediaSelect, + winit::keyboard::KeyCode::MediaSelect => event::Key::MediaSelect, - winit::keyboard::KeyCode::MediaStop => event::KeyCode::MediaStop, - winit::keyboard::KeyCode::Minus => event::KeyCode::Minus, - winit::keyboard::KeyCode::AudioVolumeMute => event::KeyCode::Mute, + winit::keyboard::KeyCode::MediaStop => event::Key::MediaStop, + winit::keyboard::KeyCode::Minus => event::Key::Minus, + winit::keyboard::KeyCode::AudioVolumeMute => event::Key::Mute, - winit::keyboard::KeyCode::LaunchApp1 => event::KeyCode::MyComputer, + winit::keyboard::KeyCode::LaunchApp1 => event::Key::MyComputer, - winit::keyboard::KeyCode::BrowserForward => event::KeyCode::NavigateForward, + winit::keyboard::KeyCode::BrowserForward => event::Key::NavigateForward, - winit::keyboard::KeyCode::BrowserBack => event::KeyCode::NavigateBackward, + winit::keyboard::KeyCode::BrowserBack => event::Key::NavigateBackward, - winit::keyboard::KeyCode::MediaTrackNext => event::KeyCode::NextTrack, + winit::keyboard::KeyCode::MediaTrackNext => event::Key::NextTrack, - // winit::keyboard::KeyCode::NoConvert => event::KeyCode::NoConvert, - // winit::keyboard::KeyCode::OEM102 => event::KeyCode::OEM102, - winit::keyboard::KeyCode::Period => event::KeyCode::Period, + // winit::keyboard::KeyCode::NoConvert => event::Key::NoConvert, + // winit::keyboard::KeyCode::OEM102 => event::Key::OEM102, + winit::keyboard::KeyCode::Period => event::Key::Period, - winit::keyboard::KeyCode::MediaPlayPause => event::KeyCode::PlayPause, - // winit::keyboard::KeyCode::Plus => event::KeyCode::Plus, - winit::keyboard::KeyCode::Power => event::KeyCode::Power, + winit::keyboard::KeyCode::MediaPlayPause => event::Key::PlayPause, + // winit::keyboard::KeyCode::Plus => event::Key::Plus, + winit::keyboard::KeyCode::Power => event::Key::Power, - winit::keyboard::KeyCode::MediaTrackPrevious => event::KeyCode::PrevTrack, - winit::keyboard::KeyCode::AltRight => event::KeyCode::RAlt, + winit::keyboard::KeyCode::MediaTrackPrevious => event::Key::PrevTrack, + winit::keyboard::KeyCode::AltRight => event::Key::RAlt, - winit::keyboard::KeyCode::BracketRight => event::KeyCode::RBracket, + winit::keyboard::KeyCode::BracketRight => event::Key::RBracket, - winit::keyboard::KeyCode::ControlRight => event::KeyCode::RControl, - winit::keyboard::KeyCode::ShiftRight => event::KeyCode::RShift, - winit::keyboard::KeyCode::SuperRight => event::KeyCode::RWin, + winit::keyboard::KeyCode::ControlRight => event::Key::RControl, + winit::keyboard::KeyCode::ShiftRight => event::Key::RShift, + winit::keyboard::KeyCode::SuperRight => event::Key::RWin, - winit::keyboard::KeyCode::Semicolon => event::KeyCode::Semicolon, - winit::keyboard::KeyCode::Slash => event::KeyCode::Slash, - winit::keyboard::KeyCode::Sleep => event::KeyCode::Sleep, - winit::keyboard::KeyCode::MediaStop => event::KeyCode::Stop, - //winit::keyboard::KeyCode::Sysrq => event::KeyCode::Sysrq, - winit::keyboard::KeyCode::Tab => event::KeyCode::Tab, + winit::keyboard::KeyCode::Semicolon => event::Key::Semicolon, + winit::keyboard::KeyCode::Slash => event::Key::Slash, + winit::keyboard::KeyCode::Sleep => event::Key::Sleep, + winit::keyboard::KeyCode::MediaStop => event::Key::Stop, + //winit::keyboard::KeyCode::Sysrq => event::Key::Sysrq, + winit::keyboard::KeyCode::Tab => event::Key::Tab, - // winit::keyboard::KeyCode::Underline => event::KeyCode::Underline, + // winit::keyboard::KeyCode::Underline => event::Key::Underline, - // winit::keyboard::KeyCode::Unlabeled => event::KeyCode::Unlabeled, - winit::keyboard::KeyCode::AudioVolumeDown => event::KeyCode::VolumeDown, + // winit::keyboard::KeyCode::Unlabeled => event::Key::Unlabeled, + winit::keyboard::KeyCode::AudioVolumeDown => event::Key::VolumeDown, - winit::keyboard::KeyCode::AudioVolumeUp => event::KeyCode::VolumeUp, - // winit::keyboard::KeyCode::Wake => event::KeyCode::Wake, - winit::keyboard::KeyCode::BrowserBack => event::KeyCode::WebBack, + winit::keyboard::KeyCode::AudioVolumeUp => event::Key::VolumeUp, + // winit::keyboard::KeyCode::Wake => event::Key::Wake, + winit::keyboard::KeyCode::BrowserBack => event::Key::WebBack, - winit::keyboard::KeyCode::BrowserFavorites => event::KeyCode::WebFavorites, + winit::keyboard::KeyCode::BrowserFavorites => event::Key::WebFavorites, - winit::keyboard::KeyCode::BrowserForward => event::KeyCode::WebForward, + winit::keyboard::KeyCode::BrowserForward => event::Key::WebForward, - winit::keyboard::KeyCode::BrowserHome => event::KeyCode::WebHome, + winit::keyboard::KeyCode::BrowserHome => event::Key::WebHome, - winit::keyboard::KeyCode::BrowserRefresh => event::KeyCode::WebRefresh, + winit::keyboard::KeyCode::BrowserRefresh => event::Key::WebRefresh, - winit::keyboard::KeyCode::BrowserSearch => event::KeyCode::WebSearch, + winit::keyboard::KeyCode::BrowserSearch => event::Key::WebSearch, - winit::keyboard::KeyCode::BrowserStop => event::KeyCode::WebStop, - // winit::keyboard::KeyCode::Yen => event::KeyCode::Yen, - winit::keyboard::KeyCode::Copy => event::KeyCode::Copy, - winit::keyboard::KeyCode::Paste => event::KeyCode::Paste, - winit::keyboard::KeyCode::Cut => event::KeyCode::Cut, + winit::keyboard::KeyCode::BrowserStop => event::Key::WebStop, + // winit::keyboard::KeyCode::Yen => event::Key::Yen, + winit::keyboard::KeyCode::Copy => event::Key::Copy, + winit::keyboard::KeyCode::Paste => event::Key::Paste, + winit::keyboard::KeyCode::Cut => event::Key::Cut, - _ => event::KeyCode::Unknown, + _ => event::Key::Unknown, }, - _ => event::KeyCode::Unknown, + _ => event::Key::Unknown, } } From 7ba250a265441ac83399e18f09e3f7ffb35859fd Mon Sep 17 00:00:00 2001 From: Ilja Kartashov Date: Wed, 20 Nov 2024 16:11:45 +0100 Subject: [PATCH 4/4] Backport old camera implementation --- src/lib.rs | 2 +- src/world.rs | 2 ++ src/world/camera.rs | 45 ++++++++++++++++++++++----------------------- 3 files changed, 25 insertions(+), 24 deletions(-) diff --git a/src/lib.rs b/src/lib.rs index b5f476a..fef5724 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -48,7 +48,7 @@ pub use utils::Id; /// World pub mod world; -pub use world::{Entity, World}; +pub use world::{Camera, Entity, World}; /// Window API and input events pub mod window; diff --git a/src/world.rs b/src/world.rs index a0aa16b..023e21a 100644 --- a/src/world.rs +++ b/src/world.rs @@ -1,3 +1,4 @@ +mod camera; mod storage; use std::sync::{Arc, Condvar, Mutex}; @@ -5,6 +6,7 @@ use std::{any::TypeId, collections::HashMap, marker::PhantomData}; use crate::recursive; use crate::utils::{Id, Lock, TypeLock}; +pub use camera::{Camera, Lens, View}; pub use storage::{Entity, IntoEntity}; #[derive(Default, Debug, Eq, PartialEq)] diff --git a/src/world/camera.rs b/src/world/camera.rs index bef43af..d280bee 100644 --- a/src/world/camera.rs +++ b/src/world/camera.rs @@ -2,7 +2,7 @@ use std::ops::Range; -use dotrix_math::{perspective, Mat3, Mat4, Point3, Quat, Rad, Vec3}; +use crate::math::{Mat3, Mat4, Quat, Vec3}; /// Camera object and constructor pub struct Camera { @@ -24,7 +24,7 @@ impl Camera { } /// Returns projection matrix constructor - pub fn lens(fov: impl Into>, plane: Range) -> Lens { + pub fn lens(fov: impl Into, plane: Range) -> Lens { Lens::new(fov, plane) } } @@ -32,14 +32,14 @@ impl Camera { /// Projection matrix constructor pub struct Lens { /// Field of View (rad) - pub fov: Rad, + pub fov: f32, /// Near..Far plane pub plane: Range, } impl Lens { /// Returns new instance of projection matrix constructor - pub fn new(fov: impl Into>, plane: Range) -> Self { + pub fn new(fov: impl Into, plane: Range) -> Self { Self { fov: fov.into(), plane, @@ -49,14 +49,14 @@ impl Lens { /// Returns projection matrix for the surface pub fn proj(&self, surface_width: u32, surface_height: u32) -> Mat4 { let aspect_ratio = surface_width as f32 / surface_height as f32; - perspective(self.fov, aspect_ratio, self.plane.start, self.plane.end) + Mat4::perspective_rh(self.fov, aspect_ratio, self.plane.start, self.plane.end) } } impl Default for Lens { fn default() -> Self { Self { - fov: Rad(1.1), + fov: 1.1, // std::f32::consts::FRAC_PI_4 plane: 0.0625..524288.06, } } @@ -80,50 +80,49 @@ impl View { /// /// self.point is handled as camera position pub fn rotate(self, pitch: f32, yaw: f32, roll: f32) -> Mat4 { - let rx = Mat3::from_angle_x(Rad(roll)); - let ry = Mat3::from_angle_y(Rad(pitch)); - let rz = Mat3::from_angle_z(Rad(yaw)); + let rx = Mat3::from_rotation_x(roll); + let ry = Mat3::from_rotation_y(pitch); + let rz = Mat3::from_rotation_z(yaw); - let mut mx = Mat4::from(rx * ry * rz); - mx.w.x = self.point.x; - mx.w.y = self.point.y; - mx.w.z = self.point.z; + let mut mx = Mat4::from_mat3(rx * ry * rz); + mx.w_axis.x = self.point.x; + mx.w_axis.y = self.point.y; + mx.w_axis.z = self.point.z; mx } /// Return view matrix made from target pub fn target(&self, target: Vec3) -> Mat4 { - self.target_up(target, Vec3::unit_z()) + self.target_up(target, Vec3::Z) } /// Return view matrix made from target and up vector pub fn target_up(&self, target: Vec3, up: Vec3) -> Mat4 { + // let view = Mat4::look_at_rh(Vec3::new(1.5f32, -5.0, 3.0), Vec3::ZERO, Vec3::Z); Mat4::look_at_rh( - Point3::new(self.point.x, self.point.y, self.point.z), - Point3::new(target.x, target.y, target.z), + Vec3::new(self.point.x, self.point.y, self.point.z), + Vec3::new(target.x, target.y, target.z), up, ) } /// Return view matrix for camera flying around a target (self.point) pub fn follow(self, distance: f32, pan: f32, tilt: f32, roll: f32) -> Mat4 { - use dotrix_math::{InnerSpace, Rotation3}; - - let target = &self.point; + let target = self.point; let dz = distance * tilt.sin(); let dxy = distance * tilt.cos(); let dx = dxy * pan.cos(); let dy = dxy * pan.sin(); let position = Vec3::new(target.x + dx, target.y + dy, target.z + dz); let direction = (target - position).normalize(); - let roll = Quat::from_axis_angle(direction, Rad(roll)); - let camera_right = direction.cross(Vec3::unit_z()); + let roll = Quat::from_axis_angle(direction, roll); + let camera_right = direction.cross(Vec3::Z); let camera_up = roll * camera_right.cross(direction); Mat4::look_at_rh( - Point3::new(position.x, position.y, position.z), - Point3::new(target.x, target.y, target.z), + Vec3::new(position.x, position.y, position.z), + Vec3::new(target.x, target.y, target.z), camera_up, ) }