fyrox_impl/utils/
mod.rs

1// Copyright (c) 2019-present Dmitry Stepanov and Fyrox Engine contributors.
2//
3// Permission is hereby granted, free of charge, to any person obtaining a copy
4// of this software and associated documentation files (the "Software"), to deal
5// in the Software without restriction, including without limitation the rights
6// to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
7// copies of the Software, and to permit persons to whom the Software is
8// furnished to do so, subject to the following conditions:
9//
10// The above copyright notice and this permission notice shall be included in all
11// copies or substantial portions of the Software.
12//
13// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
14// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
15// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
16// AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
17// LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
18// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
19// SOFTWARE.
20
21#![warn(missing_docs)]
22
23//! Utilities module provides set of commonly used algorithms.
24
25pub mod astar;
26pub mod behavior;
27pub mod lightmap;
28pub mod navmesh;
29pub mod raw_mesh;
30pub mod uvgen;
31
32use crate::{
33    core::algebra::{Vector2, Vector3},
34    event::{ElementState, MouseScrollDelta, WindowEvent},
35    gui::{
36        message,
37        message::{ButtonState, KeyboardModifiers, OsEvent},
38    },
39    keyboard::{KeyCode, ModifiersState},
40};
41use fyrox_ui::message::CursorIcon;
42use half::f16;
43use std::{any::Any, sync::Arc};
44use winit::{event::Touch, keyboard::PhysicalKey};
45
46/// Translates `winit`'s key code to `fyrox-ui`'s key code.
47pub fn translate_key_to_ui(key: KeyCode) -> message::KeyCode {
48    match key {
49        KeyCode::Backquote => message::KeyCode::Backquote,
50        KeyCode::Backslash => message::KeyCode::Backslash,
51        KeyCode::BracketLeft => message::KeyCode::BracketLeft,
52        KeyCode::BracketRight => message::KeyCode::BracketRight,
53        KeyCode::Comma => message::KeyCode::Comma,
54        KeyCode::Digit0 => message::KeyCode::Digit0,
55        KeyCode::Digit1 => message::KeyCode::Digit1,
56        KeyCode::Digit2 => message::KeyCode::Digit2,
57        KeyCode::Digit3 => message::KeyCode::Digit3,
58        KeyCode::Digit4 => message::KeyCode::Digit4,
59        KeyCode::Digit5 => message::KeyCode::Digit5,
60        KeyCode::Digit6 => message::KeyCode::Digit6,
61        KeyCode::Digit7 => message::KeyCode::Digit7,
62        KeyCode::Digit8 => message::KeyCode::Digit8,
63        KeyCode::Digit9 => message::KeyCode::Digit9,
64        KeyCode::Equal => message::KeyCode::Equal,
65        KeyCode::IntlBackslash => message::KeyCode::IntlBackslash,
66        KeyCode::IntlRo => message::KeyCode::IntlRo,
67        KeyCode::IntlYen => message::KeyCode::IntlYen,
68        KeyCode::KeyA => message::KeyCode::KeyA,
69        KeyCode::KeyB => message::KeyCode::KeyB,
70        KeyCode::KeyC => message::KeyCode::KeyC,
71        KeyCode::KeyD => message::KeyCode::KeyD,
72        KeyCode::KeyE => message::KeyCode::KeyE,
73        KeyCode::KeyF => message::KeyCode::KeyF,
74        KeyCode::KeyG => message::KeyCode::KeyG,
75        KeyCode::KeyH => message::KeyCode::KeyH,
76        KeyCode::KeyI => message::KeyCode::KeyI,
77        KeyCode::KeyJ => message::KeyCode::KeyJ,
78        KeyCode::KeyK => message::KeyCode::KeyK,
79        KeyCode::KeyL => message::KeyCode::KeyL,
80        KeyCode::KeyM => message::KeyCode::KeyM,
81        KeyCode::KeyN => message::KeyCode::KeyN,
82        KeyCode::KeyO => message::KeyCode::KeyO,
83        KeyCode::KeyP => message::KeyCode::KeyP,
84        KeyCode::KeyQ => message::KeyCode::KeyQ,
85        KeyCode::KeyR => message::KeyCode::KeyR,
86        KeyCode::KeyS => message::KeyCode::KeyS,
87        KeyCode::KeyT => message::KeyCode::KeyT,
88        KeyCode::KeyU => message::KeyCode::KeyU,
89        KeyCode::KeyV => message::KeyCode::KeyV,
90        KeyCode::KeyW => message::KeyCode::KeyW,
91        KeyCode::KeyX => message::KeyCode::KeyX,
92        KeyCode::KeyY => message::KeyCode::KeyY,
93        KeyCode::KeyZ => message::KeyCode::KeyZ,
94        KeyCode::Minus => message::KeyCode::Minus,
95        KeyCode::Period => message::KeyCode::Period,
96        KeyCode::Quote => message::KeyCode::Quote,
97        KeyCode::Semicolon => message::KeyCode::Semicolon,
98        KeyCode::Slash => message::KeyCode::Slash,
99        KeyCode::AltLeft => message::KeyCode::AltLeft,
100        KeyCode::AltRight => message::KeyCode::AltRight,
101        KeyCode::Backspace => message::KeyCode::Backspace,
102        KeyCode::CapsLock => message::KeyCode::CapsLock,
103        KeyCode::ContextMenu => message::KeyCode::ContextMenu,
104        KeyCode::ControlLeft => message::KeyCode::ControlLeft,
105        KeyCode::ControlRight => message::KeyCode::ControlRight,
106        KeyCode::Enter => message::KeyCode::Enter,
107        KeyCode::SuperLeft => message::KeyCode::SuperLeft,
108        KeyCode::SuperRight => message::KeyCode::SuperRight,
109        KeyCode::ShiftLeft => message::KeyCode::ShiftLeft,
110        KeyCode::ShiftRight => message::KeyCode::ShiftRight,
111        KeyCode::Space => message::KeyCode::Space,
112        KeyCode::Tab => message::KeyCode::Tab,
113        KeyCode::Convert => message::KeyCode::Convert,
114        KeyCode::KanaMode => message::KeyCode::KanaMode,
115        KeyCode::Lang1 => message::KeyCode::Lang1,
116        KeyCode::Lang2 => message::KeyCode::Lang2,
117        KeyCode::Lang3 => message::KeyCode::Lang3,
118        KeyCode::Lang4 => message::KeyCode::Lang4,
119        KeyCode::Lang5 => message::KeyCode::Lang5,
120        KeyCode::NonConvert => message::KeyCode::NonConvert,
121        KeyCode::Delete => message::KeyCode::Delete,
122        KeyCode::End => message::KeyCode::End,
123        KeyCode::Help => message::KeyCode::Help,
124        KeyCode::Home => message::KeyCode::Home,
125        KeyCode::Insert => message::KeyCode::Insert,
126        KeyCode::PageDown => message::KeyCode::PageDown,
127        KeyCode::PageUp => message::KeyCode::PageUp,
128        KeyCode::ArrowDown => message::KeyCode::ArrowDown,
129        KeyCode::ArrowLeft => message::KeyCode::ArrowLeft,
130        KeyCode::ArrowRight => message::KeyCode::ArrowRight,
131        KeyCode::ArrowUp => message::KeyCode::ArrowUp,
132        KeyCode::NumLock => message::KeyCode::NumLock,
133        KeyCode::Numpad0 => message::KeyCode::Numpad0,
134        KeyCode::Numpad1 => message::KeyCode::Numpad1,
135        KeyCode::Numpad2 => message::KeyCode::Numpad2,
136        KeyCode::Numpad3 => message::KeyCode::Numpad3,
137        KeyCode::Numpad4 => message::KeyCode::Numpad4,
138        KeyCode::Numpad5 => message::KeyCode::Numpad5,
139        KeyCode::Numpad6 => message::KeyCode::Numpad6,
140        KeyCode::Numpad7 => message::KeyCode::Numpad7,
141        KeyCode::Numpad8 => message::KeyCode::Numpad8,
142        KeyCode::Numpad9 => message::KeyCode::Numpad9,
143        KeyCode::NumpadAdd => message::KeyCode::NumpadAdd,
144        KeyCode::NumpadBackspace => message::KeyCode::NumpadBackspace,
145        KeyCode::NumpadClear => message::KeyCode::NumpadClear,
146        KeyCode::NumpadClearEntry => message::KeyCode::NumpadClearEntry,
147        KeyCode::NumpadComma => message::KeyCode::NumpadComma,
148        KeyCode::NumpadDecimal => message::KeyCode::NumpadDecimal,
149        KeyCode::NumpadDivide => message::KeyCode::NumpadDivide,
150        KeyCode::NumpadEnter => message::KeyCode::NumpadEnter,
151        KeyCode::NumpadEqual => message::KeyCode::NumpadEqual,
152        KeyCode::NumpadHash => message::KeyCode::NumpadHash,
153        KeyCode::NumpadMemoryAdd => message::KeyCode::NumpadMemoryAdd,
154        KeyCode::NumpadMemoryClear => message::KeyCode::NumpadMemoryClear,
155        KeyCode::NumpadMemoryRecall => message::KeyCode::NumpadMemoryRecall,
156        KeyCode::NumpadMemoryStore => message::KeyCode::NumpadMemoryStore,
157        KeyCode::NumpadMemorySubtract => message::KeyCode::NumpadMemorySubtract,
158        KeyCode::NumpadMultiply => message::KeyCode::NumpadMultiply,
159        KeyCode::NumpadParenLeft => message::KeyCode::NumpadParenLeft,
160        KeyCode::NumpadParenRight => message::KeyCode::NumpadParenRight,
161        KeyCode::NumpadStar => message::KeyCode::NumpadStar,
162        KeyCode::NumpadSubtract => message::KeyCode::NumpadSubtract,
163        KeyCode::Escape => message::KeyCode::Escape,
164        KeyCode::Fn => message::KeyCode::Fn,
165        KeyCode::FnLock => message::KeyCode::FnLock,
166        KeyCode::PrintScreen => message::KeyCode::PrintScreen,
167        KeyCode::ScrollLock => message::KeyCode::ScrollLock,
168        KeyCode::Pause => message::KeyCode::Pause,
169        KeyCode::BrowserBack => message::KeyCode::BrowserBack,
170        KeyCode::BrowserFavorites => message::KeyCode::BrowserFavorites,
171        KeyCode::BrowserForward => message::KeyCode::BrowserForward,
172        KeyCode::BrowserHome => message::KeyCode::BrowserHome,
173        KeyCode::BrowserRefresh => message::KeyCode::BrowserRefresh,
174        KeyCode::BrowserSearch => message::KeyCode::BrowserSearch,
175        KeyCode::BrowserStop => message::KeyCode::BrowserStop,
176        KeyCode::Eject => message::KeyCode::Eject,
177        KeyCode::LaunchApp1 => message::KeyCode::LaunchApp1,
178        KeyCode::LaunchApp2 => message::KeyCode::LaunchApp2,
179        KeyCode::LaunchMail => message::KeyCode::LaunchMail,
180        KeyCode::MediaPlayPause => message::KeyCode::MediaPlayPause,
181        KeyCode::MediaSelect => message::KeyCode::MediaSelect,
182        KeyCode::MediaStop => message::KeyCode::MediaStop,
183        KeyCode::MediaTrackNext => message::KeyCode::MediaTrackNext,
184        KeyCode::MediaTrackPrevious => message::KeyCode::MediaTrackPrevious,
185        KeyCode::Power => message::KeyCode::Power,
186        KeyCode::Sleep => message::KeyCode::Sleep,
187        KeyCode::AudioVolumeDown => message::KeyCode::AudioVolumeDown,
188        KeyCode::AudioVolumeMute => message::KeyCode::AudioVolumeMute,
189        KeyCode::AudioVolumeUp => message::KeyCode::AudioVolumeUp,
190        KeyCode::WakeUp => message::KeyCode::WakeUp,
191        KeyCode::Meta => message::KeyCode::Meta,
192        KeyCode::Hyper => message::KeyCode::Hyper,
193        KeyCode::Turbo => message::KeyCode::Turbo,
194        KeyCode::Abort => message::KeyCode::Abort,
195        KeyCode::Resume => message::KeyCode::Resume,
196        KeyCode::Suspend => message::KeyCode::Suspend,
197        KeyCode::Again => message::KeyCode::Again,
198        KeyCode::Copy => message::KeyCode::Copy,
199        KeyCode::Cut => message::KeyCode::Cut,
200        KeyCode::Find => message::KeyCode::Find,
201        KeyCode::Open => message::KeyCode::Open,
202        KeyCode::Paste => message::KeyCode::Paste,
203        KeyCode::Props => message::KeyCode::Props,
204        KeyCode::Select => message::KeyCode::Select,
205        KeyCode::Undo => message::KeyCode::Undo,
206        KeyCode::Hiragana => message::KeyCode::Hiragana,
207        KeyCode::Katakana => message::KeyCode::Katakana,
208        KeyCode::F1 => message::KeyCode::F1,
209        KeyCode::F2 => message::KeyCode::F2,
210        KeyCode::F3 => message::KeyCode::F3,
211        KeyCode::F4 => message::KeyCode::F4,
212        KeyCode::F5 => message::KeyCode::F5,
213        KeyCode::F6 => message::KeyCode::F6,
214        KeyCode::F7 => message::KeyCode::F7,
215        KeyCode::F8 => message::KeyCode::F8,
216        KeyCode::F9 => message::KeyCode::F9,
217        KeyCode::F10 => message::KeyCode::F10,
218        KeyCode::F11 => message::KeyCode::F11,
219        KeyCode::F12 => message::KeyCode::F12,
220        KeyCode::F13 => message::KeyCode::F13,
221        KeyCode::F14 => message::KeyCode::F14,
222        KeyCode::F15 => message::KeyCode::F15,
223        KeyCode::F16 => message::KeyCode::F16,
224        KeyCode::F17 => message::KeyCode::F17,
225        KeyCode::F18 => message::KeyCode::F18,
226        KeyCode::F19 => message::KeyCode::F19,
227        KeyCode::F20 => message::KeyCode::F20,
228        KeyCode::F21 => message::KeyCode::F21,
229        KeyCode::F22 => message::KeyCode::F22,
230        KeyCode::F23 => message::KeyCode::F23,
231        KeyCode::F24 => message::KeyCode::F24,
232        KeyCode::F25 => message::KeyCode::F25,
233        KeyCode::F26 => message::KeyCode::F26,
234        KeyCode::F27 => message::KeyCode::F27,
235        KeyCode::F28 => message::KeyCode::F28,
236        KeyCode::F29 => message::KeyCode::F29,
237        KeyCode::F30 => message::KeyCode::F30,
238        KeyCode::F31 => message::KeyCode::F31,
239        KeyCode::F32 => message::KeyCode::F32,
240        KeyCode::F33 => message::KeyCode::F33,
241        KeyCode::F34 => message::KeyCode::F34,
242        KeyCode::F35 => message::KeyCode::F35,
243        _ => message::KeyCode::Unknown,
244    }
245}
246
247/// Translates `fyrox-ui`'s key code to `winit`'s.
248pub fn translate_key_from_ui(key: message::KeyCode) -> KeyCode {
249    match key {
250        message::KeyCode::Backquote => KeyCode::Backquote,
251        message::KeyCode::Backslash => KeyCode::Backslash,
252        message::KeyCode::BracketLeft => KeyCode::BracketLeft,
253        message::KeyCode::BracketRight => KeyCode::BracketRight,
254        message::KeyCode::Comma => KeyCode::Comma,
255        message::KeyCode::Digit0 => KeyCode::Digit0,
256        message::KeyCode::Digit1 => KeyCode::Digit1,
257        message::KeyCode::Digit2 => KeyCode::Digit2,
258        message::KeyCode::Digit3 => KeyCode::Digit3,
259        message::KeyCode::Digit4 => KeyCode::Digit4,
260        message::KeyCode::Digit5 => KeyCode::Digit5,
261        message::KeyCode::Digit6 => KeyCode::Digit6,
262        message::KeyCode::Digit7 => KeyCode::Digit7,
263        message::KeyCode::Digit8 => KeyCode::Digit8,
264        message::KeyCode::Digit9 => KeyCode::Digit9,
265        message::KeyCode::Equal => KeyCode::Equal,
266        message::KeyCode::IntlBackslash => KeyCode::IntlBackslash,
267        message::KeyCode::IntlRo => KeyCode::IntlRo,
268        message::KeyCode::IntlYen => KeyCode::IntlYen,
269        message::KeyCode::KeyA => KeyCode::KeyA,
270        message::KeyCode::KeyB => KeyCode::KeyB,
271        message::KeyCode::KeyC => KeyCode::KeyC,
272        message::KeyCode::KeyD => KeyCode::KeyD,
273        message::KeyCode::KeyE => KeyCode::KeyE,
274        message::KeyCode::KeyF => KeyCode::KeyF,
275        message::KeyCode::KeyG => KeyCode::KeyG,
276        message::KeyCode::KeyH => KeyCode::KeyH,
277        message::KeyCode::KeyI => KeyCode::KeyI,
278        message::KeyCode::KeyJ => KeyCode::KeyJ,
279        message::KeyCode::KeyK => KeyCode::KeyK,
280        message::KeyCode::KeyL => KeyCode::KeyL,
281        message::KeyCode::KeyM => KeyCode::KeyM,
282        message::KeyCode::KeyN => KeyCode::KeyN,
283        message::KeyCode::KeyO => KeyCode::KeyO,
284        message::KeyCode::KeyP => KeyCode::KeyP,
285        message::KeyCode::KeyQ => KeyCode::KeyQ,
286        message::KeyCode::KeyR => KeyCode::KeyR,
287        message::KeyCode::KeyS => KeyCode::KeyS,
288        message::KeyCode::KeyT => KeyCode::KeyT,
289        message::KeyCode::KeyU => KeyCode::KeyU,
290        message::KeyCode::KeyV => KeyCode::KeyV,
291        message::KeyCode::KeyW => KeyCode::KeyW,
292        message::KeyCode::KeyX => KeyCode::KeyX,
293        message::KeyCode::KeyY => KeyCode::KeyY,
294        message::KeyCode::KeyZ => KeyCode::KeyZ,
295        message::KeyCode::Minus => KeyCode::Minus,
296        message::KeyCode::Period => KeyCode::Period,
297        message::KeyCode::Quote => KeyCode::Quote,
298        message::KeyCode::Semicolon => KeyCode::Semicolon,
299        message::KeyCode::Slash => KeyCode::Slash,
300        message::KeyCode::AltLeft => KeyCode::AltLeft,
301        message::KeyCode::AltRight => KeyCode::AltRight,
302        message::KeyCode::Backspace => KeyCode::Backspace,
303        message::KeyCode::CapsLock => KeyCode::CapsLock,
304        message::KeyCode::ContextMenu => KeyCode::ContextMenu,
305        message::KeyCode::ControlLeft => KeyCode::ControlLeft,
306        message::KeyCode::ControlRight => KeyCode::ControlRight,
307        message::KeyCode::Enter => KeyCode::Enter,
308        message::KeyCode::SuperLeft => KeyCode::SuperLeft,
309        message::KeyCode::SuperRight => KeyCode::SuperRight,
310        message::KeyCode::ShiftLeft => KeyCode::ShiftLeft,
311        message::KeyCode::ShiftRight => KeyCode::ShiftRight,
312        message::KeyCode::Space => KeyCode::Space,
313        message::KeyCode::Tab => KeyCode::Tab,
314        message::KeyCode::Convert => KeyCode::Convert,
315        message::KeyCode::KanaMode => KeyCode::KanaMode,
316        message::KeyCode::Lang1 => KeyCode::Lang1,
317        message::KeyCode::Lang2 => KeyCode::Lang2,
318        message::KeyCode::Lang3 => KeyCode::Lang3,
319        message::KeyCode::Lang4 => KeyCode::Lang4,
320        message::KeyCode::Lang5 => KeyCode::Lang5,
321        message::KeyCode::NonConvert => KeyCode::NonConvert,
322        message::KeyCode::Delete => KeyCode::Delete,
323        message::KeyCode::End => KeyCode::End,
324        message::KeyCode::Help => KeyCode::Help,
325        message::KeyCode::Home => KeyCode::Home,
326        message::KeyCode::Insert => KeyCode::Insert,
327        message::KeyCode::PageDown => KeyCode::PageDown,
328        message::KeyCode::PageUp => KeyCode::PageUp,
329        message::KeyCode::ArrowDown => KeyCode::ArrowDown,
330        message::KeyCode::ArrowLeft => KeyCode::ArrowLeft,
331        message::KeyCode::ArrowRight => KeyCode::ArrowRight,
332        message::KeyCode::ArrowUp => KeyCode::ArrowUp,
333        message::KeyCode::NumLock => KeyCode::NumLock,
334        message::KeyCode::Numpad0 => KeyCode::Numpad0,
335        message::KeyCode::Numpad1 => KeyCode::Numpad1,
336        message::KeyCode::Numpad2 => KeyCode::Numpad2,
337        message::KeyCode::Numpad3 => KeyCode::Numpad3,
338        message::KeyCode::Numpad4 => KeyCode::Numpad4,
339        message::KeyCode::Numpad5 => KeyCode::Numpad5,
340        message::KeyCode::Numpad6 => KeyCode::Numpad6,
341        message::KeyCode::Numpad7 => KeyCode::Numpad7,
342        message::KeyCode::Numpad8 => KeyCode::Numpad8,
343        message::KeyCode::Numpad9 => KeyCode::Numpad9,
344        message::KeyCode::NumpadAdd => KeyCode::NumpadAdd,
345        message::KeyCode::NumpadBackspace => KeyCode::NumpadBackspace,
346        message::KeyCode::NumpadClear => KeyCode::NumpadClear,
347        message::KeyCode::NumpadClearEntry => KeyCode::NumpadClearEntry,
348        message::KeyCode::NumpadComma => KeyCode::NumpadComma,
349        message::KeyCode::NumpadDecimal => KeyCode::NumpadDecimal,
350        message::KeyCode::NumpadDivide => KeyCode::NumpadDivide,
351        message::KeyCode::NumpadEnter => KeyCode::NumpadEnter,
352        message::KeyCode::NumpadEqual => KeyCode::NumpadEqual,
353        message::KeyCode::NumpadHash => KeyCode::NumpadHash,
354        message::KeyCode::NumpadMemoryAdd => KeyCode::NumpadMemoryAdd,
355        message::KeyCode::NumpadMemoryClear => KeyCode::NumpadMemoryClear,
356        message::KeyCode::NumpadMemoryRecall => KeyCode::NumpadMemoryRecall,
357        message::KeyCode::NumpadMemoryStore => KeyCode::NumpadMemoryStore,
358        message::KeyCode::NumpadMemorySubtract => KeyCode::NumpadMemorySubtract,
359        message::KeyCode::NumpadMultiply => KeyCode::NumpadMultiply,
360        message::KeyCode::NumpadParenLeft => KeyCode::NumpadParenLeft,
361        message::KeyCode::NumpadParenRight => KeyCode::NumpadParenRight,
362        message::KeyCode::NumpadStar => KeyCode::NumpadStar,
363        message::KeyCode::NumpadSubtract => KeyCode::NumpadSubtract,
364        message::KeyCode::Escape => KeyCode::Escape,
365        message::KeyCode::Fn => KeyCode::Fn,
366        message::KeyCode::FnLock => KeyCode::FnLock,
367        message::KeyCode::PrintScreen => KeyCode::PrintScreen,
368        message::KeyCode::ScrollLock => KeyCode::ScrollLock,
369        message::KeyCode::Pause => KeyCode::Pause,
370        message::KeyCode::BrowserBack => KeyCode::BrowserBack,
371        message::KeyCode::BrowserFavorites => KeyCode::BrowserFavorites,
372        message::KeyCode::BrowserForward => KeyCode::BrowserForward,
373        message::KeyCode::BrowserHome => KeyCode::BrowserHome,
374        message::KeyCode::BrowserRefresh => KeyCode::BrowserRefresh,
375        message::KeyCode::BrowserSearch => KeyCode::BrowserSearch,
376        message::KeyCode::BrowserStop => KeyCode::BrowserStop,
377        message::KeyCode::Eject => KeyCode::Eject,
378        message::KeyCode::LaunchApp1 => KeyCode::LaunchApp1,
379        message::KeyCode::LaunchApp2 => KeyCode::LaunchApp2,
380        message::KeyCode::LaunchMail => KeyCode::LaunchMail,
381        message::KeyCode::MediaPlayPause => KeyCode::MediaPlayPause,
382        message::KeyCode::MediaSelect => KeyCode::MediaSelect,
383        message::KeyCode::MediaStop => KeyCode::MediaStop,
384        message::KeyCode::MediaTrackNext => KeyCode::MediaTrackNext,
385        message::KeyCode::MediaTrackPrevious => KeyCode::MediaTrackPrevious,
386        message::KeyCode::Power => KeyCode::Power,
387        message::KeyCode::Sleep => KeyCode::Sleep,
388        message::KeyCode::AudioVolumeDown => KeyCode::AudioVolumeDown,
389        message::KeyCode::AudioVolumeMute => KeyCode::AudioVolumeMute,
390        message::KeyCode::AudioVolumeUp => KeyCode::AudioVolumeUp,
391        message::KeyCode::WakeUp => KeyCode::WakeUp,
392        message::KeyCode::Meta => KeyCode::Meta,
393        message::KeyCode::Hyper => KeyCode::Hyper,
394        message::KeyCode::Turbo => KeyCode::Turbo,
395        message::KeyCode::Abort => KeyCode::Abort,
396        message::KeyCode::Resume => KeyCode::Resume,
397        message::KeyCode::Suspend => KeyCode::Suspend,
398        message::KeyCode::Again => KeyCode::Again,
399        message::KeyCode::Copy => KeyCode::Copy,
400        message::KeyCode::Cut => KeyCode::Cut,
401        message::KeyCode::Find => KeyCode::Find,
402        message::KeyCode::Open => KeyCode::Open,
403        message::KeyCode::Paste => KeyCode::Paste,
404        message::KeyCode::Props => KeyCode::Props,
405        message::KeyCode::Select => KeyCode::Select,
406        message::KeyCode::Undo => KeyCode::Undo,
407        message::KeyCode::Hiragana => KeyCode::Hiragana,
408        message::KeyCode::Katakana => KeyCode::Katakana,
409        message::KeyCode::F1 => KeyCode::F1,
410        message::KeyCode::F2 => KeyCode::F2,
411        message::KeyCode::F3 => KeyCode::F3,
412        message::KeyCode::F4 => KeyCode::F4,
413        message::KeyCode::F5 => KeyCode::F5,
414        message::KeyCode::F6 => KeyCode::F6,
415        message::KeyCode::F7 => KeyCode::F7,
416        message::KeyCode::F8 => KeyCode::F8,
417        message::KeyCode::F9 => KeyCode::F9,
418        message::KeyCode::F10 => KeyCode::F10,
419        message::KeyCode::F11 => KeyCode::F11,
420        message::KeyCode::F12 => KeyCode::F12,
421        message::KeyCode::F13 => KeyCode::F13,
422        message::KeyCode::F14 => KeyCode::F14,
423        message::KeyCode::F15 => KeyCode::F15,
424        message::KeyCode::F16 => KeyCode::F16,
425        message::KeyCode::F17 => KeyCode::F17,
426        message::KeyCode::F18 => KeyCode::F18,
427        message::KeyCode::F19 => KeyCode::F19,
428        message::KeyCode::F20 => KeyCode::F20,
429        message::KeyCode::F21 => KeyCode::F21,
430        message::KeyCode::F22 => KeyCode::F22,
431        message::KeyCode::F23 => KeyCode::F23,
432        message::KeyCode::F24 => KeyCode::F24,
433        message::KeyCode::F25 => KeyCode::F25,
434        message::KeyCode::F26 => KeyCode::F26,
435        message::KeyCode::F27 => KeyCode::F27,
436        message::KeyCode::F28 => KeyCode::F28,
437        message::KeyCode::F29 => KeyCode::F29,
438        message::KeyCode::F30 => KeyCode::F30,
439        message::KeyCode::F31 => KeyCode::F31,
440        message::KeyCode::F32 => KeyCode::F32,
441        message::KeyCode::F33 => KeyCode::F33,
442        message::KeyCode::F34 => KeyCode::F34,
443        message::KeyCode::F35 => KeyCode::F35,
444        _ => KeyCode::Fn,
445    }
446}
447
448/// Translates cursor icon from fyrox-ui library to glutin format.
449pub fn translate_cursor_icon(icon: CursorIcon) -> crate::window::CursorIcon {
450    match icon {
451        CursorIcon::Default => crate::window::CursorIcon::Default,
452        CursorIcon::Crosshair => crate::window::CursorIcon::Crosshair,
453        CursorIcon::Move => crate::window::CursorIcon::Move,
454        CursorIcon::Text => crate::window::CursorIcon::Text,
455        CursorIcon::Wait => crate::window::CursorIcon::Wait,
456        CursorIcon::Help => crate::window::CursorIcon::Help,
457        CursorIcon::Progress => crate::window::CursorIcon::Progress,
458        CursorIcon::NotAllowed => crate::window::CursorIcon::NotAllowed,
459        CursorIcon::ContextMenu => crate::window::CursorIcon::ContextMenu,
460        CursorIcon::Cell => crate::window::CursorIcon::Cell,
461        CursorIcon::VerticalText => crate::window::CursorIcon::VerticalText,
462        CursorIcon::Alias => crate::window::CursorIcon::Alias,
463        CursorIcon::Copy => crate::window::CursorIcon::Copy,
464        CursorIcon::NoDrop => crate::window::CursorIcon::NoDrop,
465        CursorIcon::Grab => crate::window::CursorIcon::Grab,
466        CursorIcon::Grabbing => crate::window::CursorIcon::Grabbing,
467        CursorIcon::AllScroll => crate::window::CursorIcon::AllScroll,
468        CursorIcon::ZoomIn => crate::window::CursorIcon::ZoomIn,
469        CursorIcon::ZoomOut => crate::window::CursorIcon::ZoomOut,
470        CursorIcon::EResize => crate::window::CursorIcon::EResize,
471        CursorIcon::NResize => crate::window::CursorIcon::NResize,
472        CursorIcon::NeResize => crate::window::CursorIcon::NeResize,
473        CursorIcon::NwResize => crate::window::CursorIcon::NwResize,
474        CursorIcon::SResize => crate::window::CursorIcon::SResize,
475        CursorIcon::SeResize => crate::window::CursorIcon::SeResize,
476        CursorIcon::SwResize => crate::window::CursorIcon::SwResize,
477        CursorIcon::WResize => crate::window::CursorIcon::WResize,
478        CursorIcon::EwResize => crate::window::CursorIcon::EwResize,
479        CursorIcon::NsResize => crate::window::CursorIcon::NsResize,
480        CursorIcon::NeswResize => crate::window::CursorIcon::NeswResize,
481        CursorIcon::NwseResize => crate::window::CursorIcon::NwseResize,
482        CursorIcon::ColResize => crate::window::CursorIcon::ColResize,
483        CursorIcon::RowResize => crate::window::CursorIcon::RowResize,
484        CursorIcon::Pointer => crate::window::CursorIcon::Pointer,
485    }
486}
487
488/// Translates window mouse button into fyrox-ui mouse button.
489pub fn translate_button(button: crate::event::MouseButton) -> crate::gui::message::MouseButton {
490    match button {
491        crate::event::MouseButton::Left => crate::gui::message::MouseButton::Left,
492        crate::event::MouseButton::Right => crate::gui::message::MouseButton::Right,
493        crate::event::MouseButton::Middle => crate::gui::message::MouseButton::Middle,
494        crate::event::MouseButton::Forward => crate::gui::message::MouseButton::Forward,
495        crate::event::MouseButton::Back => crate::gui::message::MouseButton::Back,
496        crate::event::MouseButton::Other(i) => crate::gui::message::MouseButton::Other(i),
497    }
498}
499
500/// Translates library button state into fyrox-ui button state.
501pub fn translate_state(state: ElementState) -> ButtonState {
502    match state {
503        ElementState::Pressed => ButtonState::Pressed,
504        ElementState::Released => ButtonState::Released,
505    }
506}
507
508/// Translates window event to fyrox-ui event.
509pub fn translate_event(event: &WindowEvent) -> Option<OsEvent> {
510    match event {
511        WindowEvent::KeyboardInput { event, .. } => {
512            if let PhysicalKey::Code(key) = event.physical_key {
513                Some(OsEvent::KeyboardInput {
514                    button: translate_key_to_ui(key),
515                    state: translate_state(event.state),
516                    text: event
517                        .text
518                        .as_ref()
519                        .map(|s| s.to_string())
520                        .unwrap_or_default(),
521                })
522            } else {
523                None
524            }
525        }
526        WindowEvent::CursorMoved { position, .. } => Some(OsEvent::CursorMoved {
527            position: Vector2::new(position.x as f32, position.y as f32),
528        }),
529        WindowEvent::MouseWheel { delta, .. } => match delta {
530            MouseScrollDelta::LineDelta(x, y) => Some(OsEvent::MouseWheel(*x, *y)),
531            MouseScrollDelta::PixelDelta(pos) => {
532                Some(OsEvent::MouseWheel(pos.x as f32, pos.y as f32))
533            }
534        },
535        WindowEvent::MouseInput { state, button, .. } => Some(OsEvent::MouseInput {
536            button: translate_button(*button),
537            state: translate_state(*state),
538        }),
539        &WindowEvent::ModifiersChanged(modifiers) => Some(OsEvent::KeyboardModifiers(
540            translate_keyboard_modifiers(modifiers.state()),
541        )),
542        WindowEvent::Touch(Touch {
543            phase,
544            location,
545            force,
546            id,
547            ..
548        }) => Some(OsEvent::Touch {
549            phase: match phase {
550                winit::event::TouchPhase::Started => fyrox_ui::message::TouchPhase::Started,
551                winit::event::TouchPhase::Moved => fyrox_ui::message::TouchPhase::Moved,
552                winit::event::TouchPhase::Ended => fyrox_ui::message::TouchPhase::Ended,
553                winit::event::TouchPhase::Cancelled => fyrox_ui::message::TouchPhase::Cancelled,
554            },
555            location: Vector2::new(location.x as f32, location.y as f32),
556            force: match force {
557                Some(force) => match force {
558                    winit::event::Force::Calibrated {
559                        force,
560                        max_possible_force,
561                        altitude_angle,
562                    } => Some(fyrox_ui::message::Force::Calibrated {
563                        force: force.to_be_bytes(),
564                        max_possible_force: max_possible_force.to_be_bytes(),
565                        altitude_angle: altitude_angle
566                            .as_ref()
567                            .map(|altitude_angle| altitude_angle.to_be_bytes()),
568                    }),
569                    winit::event::Force::Normalized(value) => {
570                        Some(fyrox_ui::message::Force::Normalized(value.to_be_bytes()))
571                    }
572                },
573                None => None,
574            },
575            id: *id,
576        }),
577        _ => None,
578    }
579}
580
581/// Translates keyboard modifiers to fyrox-ui keyboard modifiers.
582pub fn translate_keyboard_modifiers(modifiers: ModifiersState) -> KeyboardModifiers {
583    KeyboardModifiers {
584        alt: modifiers.alt_key(),
585        shift: modifiers.shift_key(),
586        control: modifiers.control_key(),
587        system: modifiers.super_key(),
588    }
589}
590
591/// Maps key code to its name. Can be useful if you making adjustable key bindings in your
592/// game and you need quickly map key code to its name.
593pub fn virtual_key_code_name(code: KeyCode) -> &'static str {
594    match code {
595        KeyCode::Backquote => "Backquote",
596        KeyCode::Backslash => "Backslash",
597        KeyCode::BracketLeft => "BracketLeft",
598        KeyCode::BracketRight => "BracketRight",
599        KeyCode::Comma => "Comma",
600        KeyCode::Digit0 => "0",
601        KeyCode::Digit1 => "1",
602        KeyCode::Digit2 => "2",
603        KeyCode::Digit3 => "3",
604        KeyCode::Digit4 => "4",
605        KeyCode::Digit5 => "5",
606        KeyCode::Digit6 => "6",
607        KeyCode::Digit7 => "7",
608        KeyCode::Digit8 => "8",
609        KeyCode::Digit9 => "9",
610        KeyCode::Equal => "Equal",
611        KeyCode::IntlBackslash => "IntlBackslash",
612        KeyCode::IntlRo => "IntlRo",
613        KeyCode::IntlYen => "IntlYen",
614        KeyCode::KeyA => "A",
615        KeyCode::KeyB => "B",
616        KeyCode::KeyC => "C",
617        KeyCode::KeyD => "D",
618        KeyCode::KeyE => "E",
619        KeyCode::KeyF => "F",
620        KeyCode::KeyG => "G",
621        KeyCode::KeyH => "H",
622        KeyCode::KeyI => "I",
623        KeyCode::KeyJ => "J",
624        KeyCode::KeyK => "K",
625        KeyCode::KeyL => "L",
626        KeyCode::KeyM => "M",
627        KeyCode::KeyN => "N",
628        KeyCode::KeyO => "O",
629        KeyCode::KeyP => "P",
630        KeyCode::KeyQ => "Q",
631        KeyCode::KeyR => "R",
632        KeyCode::KeyS => "S",
633        KeyCode::KeyT => "T",
634        KeyCode::KeyU => "U",
635        KeyCode::KeyV => "V",
636        KeyCode::KeyW => "W",
637        KeyCode::KeyX => "X",
638        KeyCode::KeyY => "Y",
639        KeyCode::KeyZ => "Z",
640        KeyCode::Minus => "Minus",
641        KeyCode::Period => "Period",
642        KeyCode::Quote => "Quote",
643        KeyCode::Semicolon => "Semicolon",
644        KeyCode::Slash => "Slash",
645        KeyCode::AltLeft => "AltLeft",
646        KeyCode::AltRight => "AltRight",
647        KeyCode::Backspace => "Backspace",
648        KeyCode::CapsLock => "CapsLock",
649        KeyCode::ContextMenu => "ContextMenu",
650        KeyCode::ControlLeft => "ControlLeft",
651        KeyCode::ControlRight => "ControlRight",
652        KeyCode::Enter => "Enter",
653        KeyCode::SuperLeft => "SuperLeft",
654        KeyCode::SuperRight => "SuperRight",
655        KeyCode::ShiftLeft => "ShiftLeft",
656        KeyCode::ShiftRight => "ShiftRight",
657        KeyCode::Space => "Space",
658        KeyCode::Tab => "Tab",
659        KeyCode::Convert => "Convert",
660        KeyCode::KanaMode => "KanaMode",
661        KeyCode::Lang1 => "Lang1",
662        KeyCode::Lang2 => "Lang2",
663        KeyCode::Lang3 => "Lang3",
664        KeyCode::Lang4 => "Lang4",
665        KeyCode::Lang5 => "Lang5",
666        KeyCode::NonConvert => "NonConvert",
667        KeyCode::Delete => "Delete",
668        KeyCode::End => "End",
669        KeyCode::Help => "Help",
670        KeyCode::Home => "Home",
671        KeyCode::Insert => "Insert",
672        KeyCode::PageDown => "PageDown",
673        KeyCode::PageUp => "PageUp",
674        KeyCode::ArrowDown => "ArrowDown",
675        KeyCode::ArrowLeft => "ArrowLeft",
676        KeyCode::ArrowRight => "ArrowRight",
677        KeyCode::ArrowUp => "ArrowUp",
678        KeyCode::NumLock => "NumLock",
679        KeyCode::Numpad0 => "Numpad0",
680        KeyCode::Numpad1 => "Numpad1",
681        KeyCode::Numpad2 => "Numpad2",
682        KeyCode::Numpad3 => "Numpad3",
683        KeyCode::Numpad4 => "Numpad4",
684        KeyCode::Numpad5 => "Numpad5",
685        KeyCode::Numpad6 => "Numpad6",
686        KeyCode::Numpad7 => "Numpad7",
687        KeyCode::Numpad8 => "Numpad8",
688        KeyCode::Numpad9 => "Numpad9",
689        KeyCode::NumpadAdd => "NumpadAdd",
690        KeyCode::NumpadBackspace => "NumpadBackspace",
691        KeyCode::NumpadClear => "NumpadClear",
692        KeyCode::NumpadClearEntry => "NumpadClearEntry",
693        KeyCode::NumpadComma => "NumpadComma",
694        KeyCode::NumpadDecimal => "NumpadDecimal",
695        KeyCode::NumpadDivide => "NumpadDivide",
696        KeyCode::NumpadEnter => "NumpadEnter",
697        KeyCode::NumpadEqual => "NumpadEqual",
698        KeyCode::NumpadHash => "NumpadHash",
699        KeyCode::NumpadMemoryAdd => "NumpadMemoryAdd",
700        KeyCode::NumpadMemoryClear => "NumpadMemoryClear",
701        KeyCode::NumpadMemoryRecall => "NumpadMemoryRecall",
702        KeyCode::NumpadMemoryStore => "NumpadMemoryStore",
703        KeyCode::NumpadMemorySubtract => "NumpadMemorySubtract",
704        KeyCode::NumpadMultiply => "NumpadMultiply",
705        KeyCode::NumpadParenLeft => "NumpadParenLeft",
706        KeyCode::NumpadParenRight => "NumpadParenRight",
707        KeyCode::NumpadStar => "NumpadStar",
708        KeyCode::NumpadSubtract => "NumpadSubtract",
709        KeyCode::Escape => "Escape",
710        KeyCode::Fn => "Fn",
711        KeyCode::FnLock => "FnLock",
712        KeyCode::PrintScreen => "PrintScreen",
713        KeyCode::ScrollLock => "ScrollLock",
714        KeyCode::Pause => "Pause",
715        KeyCode::BrowserBack => "BrowserBack",
716        KeyCode::BrowserFavorites => "BrowserFavorites",
717        KeyCode::BrowserForward => "BrowserForward",
718        KeyCode::BrowserHome => "BrowserHome",
719        KeyCode::BrowserRefresh => "BrowserRefresh",
720        KeyCode::BrowserSearch => "BrowserSearch",
721        KeyCode::BrowserStop => "BrowserStop",
722        KeyCode::Eject => "Eject",
723        KeyCode::LaunchApp1 => "LaunchApp1",
724        KeyCode::LaunchApp2 => "LaunchApp2",
725        KeyCode::LaunchMail => "LaunchMail",
726        KeyCode::MediaPlayPause => "MediaPlayPause",
727        KeyCode::MediaSelect => "MediaSelect",
728        KeyCode::MediaStop => "MediaStop",
729        KeyCode::MediaTrackNext => "MediaTrackNext",
730        KeyCode::MediaTrackPrevious => "MediaTrackPrevious",
731        KeyCode::Power => "Power",
732        KeyCode::Sleep => "Sleep",
733        KeyCode::AudioVolumeDown => "AudioVolumeDown",
734        KeyCode::AudioVolumeMute => "AudioVolumeMute",
735        KeyCode::AudioVolumeUp => "AudioVolumeUp",
736        KeyCode::WakeUp => "WakeUp",
737        KeyCode::Meta => "Meta",
738        KeyCode::Hyper => "Hyper",
739        KeyCode::Turbo => "Turbo",
740        KeyCode::Abort => "Abort",
741        KeyCode::Resume => "Resume",
742        KeyCode::Suspend => "Suspend",
743        KeyCode::Again => "Again",
744        KeyCode::Copy => "Copy",
745        KeyCode::Cut => "Cut",
746        KeyCode::Find => "Find",
747        KeyCode::Open => "Open",
748        KeyCode::Paste => "Paste",
749        KeyCode::Props => "Props",
750        KeyCode::Select => "Select",
751        KeyCode::Undo => "Undo",
752        KeyCode::Hiragana => "Hiragana",
753        KeyCode::Katakana => "Katakana",
754        KeyCode::F1 => "F1",
755        KeyCode::F2 => "F2",
756        KeyCode::F3 => "F3",
757        KeyCode::F4 => "F4",
758        KeyCode::F5 => "F5",
759        KeyCode::F6 => "F6",
760        KeyCode::F7 => "F7",
761        KeyCode::F8 => "F8",
762        KeyCode::F9 => "F9",
763        KeyCode::F10 => "F10",
764        KeyCode::F11 => "F11",
765        KeyCode::F12 => "F12",
766        KeyCode::F13 => "F13",
767        KeyCode::F14 => "F14",
768        KeyCode::F15 => "F15",
769        KeyCode::F16 => "F16",
770        KeyCode::F17 => "F17",
771        KeyCode::F18 => "F18",
772        KeyCode::F19 => "F19",
773        KeyCode::F20 => "F20",
774        KeyCode::F21 => "F21",
775        KeyCode::F22 => "F22",
776        KeyCode::F23 => "F23",
777        KeyCode::F24 => "F24",
778        KeyCode::F25 => "F25",
779        KeyCode::F26 => "F26",
780        KeyCode::F27 => "F27",
781        KeyCode::F28 => "F28",
782        KeyCode::F29 => "F29",
783        KeyCode::F30 => "F30",
784        KeyCode::F31 => "F31",
785        KeyCode::F32 => "F32",
786        KeyCode::F33 => "F33",
787        KeyCode::F34 => "F34",
788        KeyCode::F35 => "F35",
789        _ => "Unknown",
790    }
791}
792
793/// Helper function to convert `Option<Arc<T>>` to `Option<Arc<dyn Any>>`.
794#[allow(clippy::manual_map)]
795pub fn into_any_arc<T: Any + Send + Sync>(
796    opt: Option<Arc<T>>,
797) -> Option<Arc<dyn Any + Send + Sync>> {
798    match opt {
799        Some(r) => Some(r),
800        None => None,
801    }
802}
803
804/// Converts `Vector3<f32>` -> `Vector3<f16>`.
805pub fn vec3_f16_from_f32(v: Vector3<f32>) -> Vector3<f16> {
806    v.map(f16::from_f32)
807}
808
809/// Converts `Vector3<f16>` -> `Vector3<f32>`.
810pub fn vec3_f32_from_f16(v: Vector3<f16>) -> Vector3<f32> {
811    v.map(|v| v.to_f32())
812}