1use std::collections::HashMap;
2
3use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
7pub struct LinearInputActivation(f32);
8
9impl LinearInputActivation {
10 pub fn try_from(val: f32) -> Result<Self, f32> {
11 if 0.0 <= val && val <= 1.0 {
12 Ok(Self(val))
13 } else {
14 Err(val)
15 }
16 }
17 pub fn get(self) -> f32 {
18 self.0
19 }
20
21 pub fn clamp(val: f32) -> Self {
22 Self(val.clamp(0.0, 1.0))
23 }
24}
25
26#[derive(Debug, Clone, Copy, PartialEq, PartialOrd)]
28pub struct VectorInputActivation(f32, f32);
29
30impl VectorInputActivation {
31 pub fn try_from(x: f32, y: f32) -> Result<Self, (f32, f32)> {
32 if -1.0 <= x && x <= 1.0 && -1.0 <= y && y <= 1.0 {
33 Ok(Self(x, y))
34 } else {
35 Err((x, y))
36 }
37 }
38 pub fn get(self) -> (f32, f32) {
39 (self.0, self.1)
40 }
41
42 pub fn clamp(x: f32, y: f32) -> VectorInputActivation {
43 Self(x.clamp(-1.0, 1.0), y.clamp(-1.0, 1.0))
44 }
45}
46
47#[derive(Debug, Hash, PartialEq, Eq, Serialize, Deserialize, Clone, Copy)]
49pub enum KeyCode {
50 Backquote,
54 Backslash,
59 BracketLeft,
61 BracketRight,
63 Comma,
65 Digit0,
67 Digit1,
69 Digit2,
71 Digit3,
73 Digit4,
75 Digit5,
77 Digit6,
79 Digit7,
81 Digit8,
83 Digit9,
85 Equal,
87 IntlBackslash,
90 IntlRo,
93 IntlYen,
97 KeyA,
100 KeyB,
102 KeyC,
104 KeyD,
106 KeyE,
108 KeyF,
110 KeyG,
112 KeyH,
114 KeyI,
116 KeyJ,
118 KeyK,
120 KeyL,
122 KeyM,
124 KeyN,
126 KeyO,
128 KeyP,
130 KeyQ,
133 KeyR,
135 KeyS,
137 KeyT,
139 KeyU,
141 KeyV,
143 KeyW,
146 KeyX,
148 KeyY,
151 KeyZ,
155 Minus,
157 Period,
159 Quote,
161 Semicolon,
163 Slash,
165 AltLeft,
167 AltRight,
170 Backspace,
173 CapsLock,
175 ContextMenu,
178 ControlLeft,
180 ControlRight,
182 Enter,
184 SuperLeft,
186 SuperRight,
188 ShiftLeft,
190 ShiftRight,
192 Space,
194 Tab,
196 Convert,
198 KanaMode,
200 Lang1,
204 Lang2,
208 Lang3,
210 Lang4,
212 Lang5,
214 NonConvert,
216 Delete,
222 End,
224 Help,
226 Home,
228 Insert,
230 PageDown,
232 PageUp,
234 ArrowDown,
236 ArrowLeft,
238 ArrowRight,
240 ArrowUp,
242 NumLock,
244 Numpad0,
246 Numpad1,
248 Numpad2,
250 Numpad3,
252 Numpad4,
254 Numpad5,
256 Numpad6,
258 Numpad7,
261 Numpad8,
263 Numpad9,
266 NumpadAdd,
268 NumpadBackspace,
270 NumpadClear,
276 NumpadClearEntry,
278 NumpadComma,
281 NumpadDecimal,
284 NumpadDivide,
286 NumpadEnter,
287 NumpadEqual,
289 NumpadHash,
292 NumpadMemoryAdd,
294 NumpadMemoryClear,
296 NumpadMemoryRecall,
298 NumpadMemoryStore,
300 NumpadMemorySubtract,
302 NumpadMultiply,
307 NumpadParenLeft,
309 NumpadParenRight,
311 NumpadStar,
319 NumpadSubtract,
321 Escape,
323 Fn,
325 FnLock,
328 PrintScreen,
330 ScrollLock,
332 Pause,
334 BrowserBack,
338 BrowserFavorites,
339 BrowserForward,
341 BrowserHome,
343 BrowserRefresh,
344 BrowserSearch,
345 BrowserStop,
346 Eject,
349 LaunchApp1,
351 LaunchApp2,
353 LaunchMail,
354 MediaPlayPause,
355 MediaSelect,
356 MediaStop,
357 MediaTrackNext,
358 MediaTrackPrevious,
359 Power,
362 Sleep,
363 AudioVolumeDown,
364 AudioVolumeMute,
365 AudioVolumeUp,
366 WakeUp,
367 Meta,
369 Hyper,
371 Turbo,
372 Abort,
373 Resume,
374 Suspend,
375 Again,
377 Copy,
379 Cut,
381 Find,
383 Open,
385 Paste,
387 Props,
389 Select,
391 Undo,
393 Hiragana,
395 Katakana,
397 F1,
400 F2,
403 F3,
406 F4,
409 F5,
412 F6,
415 F7,
418 F8,
421 F9,
424 F10,
427 F11,
430 F12,
433 F13,
436 F14,
439 F15,
442 F16,
445 F17,
448 F18,
451 F19,
454 F20,
457 F21,
460 F22,
463 F23,
466 F24,
469 F25,
471 F26,
473 F27,
475 F28,
477 F29,
479 F30,
481 F31,
483 F32,
485 F33,
487 F34,
489 F35,
491}
492
493impl From<winit::keyboard::KeyCode> for KeyCode {
494 fn from(value: winit::keyboard::KeyCode) -> Self {
495 match value {
496 winit::keyboard::KeyCode::Backquote => Self::Backquote,
497 winit::keyboard::KeyCode::Backslash => Self::Backslash,
498 winit::keyboard::KeyCode::BracketLeft => Self::BracketLeft,
499 winit::keyboard::KeyCode::BracketRight => Self::BracketRight,
500 winit::keyboard::KeyCode::Comma => Self::Comma,
501 winit::keyboard::KeyCode::Digit0 => Self::Digit0,
502 winit::keyboard::KeyCode::Digit1 => Self::Digit1,
503 winit::keyboard::KeyCode::Digit2 => Self::Digit2,
504 winit::keyboard::KeyCode::Digit3 => Self::Digit3,
505 winit::keyboard::KeyCode::Digit4 => Self::Digit4,
506 winit::keyboard::KeyCode::Digit5 => Self::Digit5,
507 winit::keyboard::KeyCode::Digit6 => Self::Digit6,
508 winit::keyboard::KeyCode::Digit7 => Self::Digit7,
509 winit::keyboard::KeyCode::Digit8 => Self::Digit8,
510 winit::keyboard::KeyCode::Digit9 => Self::Digit9,
511 winit::keyboard::KeyCode::Equal => Self::Equal,
512 winit::keyboard::KeyCode::IntlBackslash => Self::IntlBackslash,
513 winit::keyboard::KeyCode::IntlRo => Self::IntlRo,
514 winit::keyboard::KeyCode::IntlYen => Self::IntlYen,
515 winit::keyboard::KeyCode::KeyA => Self::KeyA,
516 winit::keyboard::KeyCode::KeyB => Self::KeyB,
517 winit::keyboard::KeyCode::KeyC => Self::KeyC,
518 winit::keyboard::KeyCode::KeyD => Self::KeyD,
519 winit::keyboard::KeyCode::KeyE => Self::KeyE,
520 winit::keyboard::KeyCode::KeyF => Self::KeyF,
521 winit::keyboard::KeyCode::KeyG => Self::KeyG,
522 winit::keyboard::KeyCode::KeyH => Self::KeyH,
523 winit::keyboard::KeyCode::KeyI => Self::KeyI,
524 winit::keyboard::KeyCode::KeyJ => Self::KeyJ,
525 winit::keyboard::KeyCode::KeyK => Self::KeyK,
526 winit::keyboard::KeyCode::KeyL => Self::KeyL,
527 winit::keyboard::KeyCode::KeyM => Self::KeyM,
528 winit::keyboard::KeyCode::KeyN => Self::KeyN,
529 winit::keyboard::KeyCode::KeyO => Self::KeyO,
530 winit::keyboard::KeyCode::KeyP => Self::KeyP,
531 winit::keyboard::KeyCode::KeyQ => Self::KeyQ,
532 winit::keyboard::KeyCode::KeyR => Self::KeyR,
533 winit::keyboard::KeyCode::KeyS => Self::KeyS,
534 winit::keyboard::KeyCode::KeyT => Self::KeyT,
535 winit::keyboard::KeyCode::KeyU => Self::KeyU,
536 winit::keyboard::KeyCode::KeyV => Self::KeyV,
537 winit::keyboard::KeyCode::KeyW => Self::KeyW,
538 winit::keyboard::KeyCode::KeyX => Self::KeyX,
539 winit::keyboard::KeyCode::KeyY => Self::KeyY,
540 winit::keyboard::KeyCode::KeyZ => Self::KeyZ,
541 winit::keyboard::KeyCode::Minus => Self::Minus,
542 winit::keyboard::KeyCode::Period => Self::Period,
543 winit::keyboard::KeyCode::Quote => Self::Quote,
544 winit::keyboard::KeyCode::Semicolon => Self::Semicolon,
545 winit::keyboard::KeyCode::Slash => Self::Slash,
546 winit::keyboard::KeyCode::AltLeft => Self::AltLeft,
547 winit::keyboard::KeyCode::AltRight => Self::AltRight,
548 winit::keyboard::KeyCode::Backspace => Self::Backspace,
549 winit::keyboard::KeyCode::CapsLock => Self::CapsLock,
550 winit::keyboard::KeyCode::ContextMenu => Self::ContextMenu,
551 winit::keyboard::KeyCode::ControlLeft => Self::ControlLeft,
552 winit::keyboard::KeyCode::ControlRight => Self::ControlRight,
553 winit::keyboard::KeyCode::Enter => Self::Enter,
554 winit::keyboard::KeyCode::SuperLeft => Self::SuperLeft,
555 winit::keyboard::KeyCode::SuperRight => Self::SuperRight,
556 winit::keyboard::KeyCode::ShiftLeft => Self::ShiftLeft,
557 winit::keyboard::KeyCode::ShiftRight => Self::ShiftRight,
558 winit::keyboard::KeyCode::Space => Self::Space,
559 winit::keyboard::KeyCode::Tab => Self::Tab,
560 winit::keyboard::KeyCode::Convert => Self::Convert,
561 winit::keyboard::KeyCode::KanaMode => Self::KanaMode,
562 winit::keyboard::KeyCode::Lang1 => Self::Lang1,
563 winit::keyboard::KeyCode::Lang2 => Self::Lang2,
564 winit::keyboard::KeyCode::Lang3 => Self::Lang3,
565 winit::keyboard::KeyCode::Lang4 => Self::Lang4,
566 winit::keyboard::KeyCode::Lang5 => Self::Lang5,
567 winit::keyboard::KeyCode::NonConvert => Self::NonConvert,
568 winit::keyboard::KeyCode::Delete => Self::Delete,
569 winit::keyboard::KeyCode::End => Self::End,
570 winit::keyboard::KeyCode::Help => Self::Help,
571 winit::keyboard::KeyCode::Home => Self::Home,
572 winit::keyboard::KeyCode::Insert => Self::Insert,
573 winit::keyboard::KeyCode::PageDown => Self::PageDown,
574 winit::keyboard::KeyCode::PageUp => Self::PageUp,
575 winit::keyboard::KeyCode::ArrowDown => Self::ArrowDown,
576 winit::keyboard::KeyCode::ArrowLeft => Self::ArrowLeft,
577 winit::keyboard::KeyCode::ArrowRight => Self::ArrowRight,
578 winit::keyboard::KeyCode::ArrowUp => Self::ArrowUp,
579 winit::keyboard::KeyCode::NumLock => Self::NumLock,
580 winit::keyboard::KeyCode::Numpad0 => Self::Numpad0,
581 winit::keyboard::KeyCode::Numpad1 => Self::Numpad1,
582 winit::keyboard::KeyCode::Numpad2 => Self::Numpad2,
583 winit::keyboard::KeyCode::Numpad3 => Self::Numpad3,
584 winit::keyboard::KeyCode::Numpad4 => Self::Numpad4,
585 winit::keyboard::KeyCode::Numpad5 => Self::Numpad5,
586 winit::keyboard::KeyCode::Numpad6 => Self::Numpad6,
587 winit::keyboard::KeyCode::Numpad7 => Self::Numpad7,
588 winit::keyboard::KeyCode::Numpad8 => Self::Numpad8,
589 winit::keyboard::KeyCode::Numpad9 => Self::Numpad9,
590 winit::keyboard::KeyCode::NumpadAdd => Self::NumpadAdd,
591 winit::keyboard::KeyCode::NumpadBackspace => Self::NumpadBackspace,
592 winit::keyboard::KeyCode::NumpadClear => Self::NumpadClear,
593 winit::keyboard::KeyCode::NumpadClearEntry => Self::NumpadClearEntry,
594 winit::keyboard::KeyCode::NumpadComma => Self::NumpadComma,
595 winit::keyboard::KeyCode::NumpadDecimal => Self::NumpadDecimal,
596 winit::keyboard::KeyCode::NumpadDivide => Self::NumpadDivide,
597 winit::keyboard::KeyCode::NumpadEnter => Self::NumpadEnter,
598 winit::keyboard::KeyCode::NumpadEqual => Self::NumpadEqual,
599 winit::keyboard::KeyCode::NumpadHash => Self::NumpadHash,
600 winit::keyboard::KeyCode::NumpadMemoryAdd => Self::NumpadMemoryAdd,
601 winit::keyboard::KeyCode::NumpadMemoryClear => Self::NumpadMemoryClear,
602 winit::keyboard::KeyCode::NumpadMemoryRecall => Self::NumpadMemoryRecall,
603 winit::keyboard::KeyCode::NumpadMemoryStore => Self::NumpadMemoryStore,
604 winit::keyboard::KeyCode::NumpadMemorySubtract => Self::NumpadMemorySubtract,
605 winit::keyboard::KeyCode::NumpadMultiply => Self::NumpadMultiply,
606 winit::keyboard::KeyCode::NumpadParenLeft => Self::NumpadParenLeft,
607 winit::keyboard::KeyCode::NumpadParenRight => Self::NumpadParenRight,
608 winit::keyboard::KeyCode::NumpadStar => Self::NumpadStar,
609 winit::keyboard::KeyCode::NumpadSubtract => Self::NumpadSubtract,
610 winit::keyboard::KeyCode::Escape => Self::Escape,
611 winit::keyboard::KeyCode::Fn => Self::Fn,
612 winit::keyboard::KeyCode::FnLock => Self::FnLock,
613 winit::keyboard::KeyCode::PrintScreen => Self::PrintScreen,
614 winit::keyboard::KeyCode::ScrollLock => Self::ScrollLock,
615 winit::keyboard::KeyCode::Pause => Self::Pause,
616 winit::keyboard::KeyCode::BrowserBack => Self::BrowserBack,
617 winit::keyboard::KeyCode::BrowserFavorites => Self::BrowserFavorites,
618 winit::keyboard::KeyCode::BrowserForward => Self::BrowserForward,
619 winit::keyboard::KeyCode::BrowserHome => Self::BrowserHome,
620 winit::keyboard::KeyCode::BrowserRefresh => Self::BrowserRefresh,
621 winit::keyboard::KeyCode::BrowserSearch => Self::BrowserSearch,
622 winit::keyboard::KeyCode::BrowserStop => Self::BrowserStop,
623 winit::keyboard::KeyCode::Eject => Self::Eject,
624 winit::keyboard::KeyCode::LaunchApp1 => Self::LaunchApp1,
625 winit::keyboard::KeyCode::LaunchApp2 => Self::LaunchApp2,
626 winit::keyboard::KeyCode::LaunchMail => Self::LaunchMail,
627 winit::keyboard::KeyCode::MediaPlayPause => Self::MediaPlayPause,
628 winit::keyboard::KeyCode::MediaSelect => Self::MediaSelect,
629 winit::keyboard::KeyCode::MediaStop => Self::MediaStop,
630 winit::keyboard::KeyCode::MediaTrackNext => Self::MediaTrackNext,
631 winit::keyboard::KeyCode::MediaTrackPrevious => Self::MediaTrackPrevious,
632 winit::keyboard::KeyCode::Power => Self::Power,
633 winit::keyboard::KeyCode::Sleep => Self::Sleep,
634 winit::keyboard::KeyCode::AudioVolumeDown => Self::AudioVolumeDown,
635 winit::keyboard::KeyCode::AudioVolumeMute => Self::AudioVolumeMute,
636 winit::keyboard::KeyCode::AudioVolumeUp => Self::AudioVolumeUp,
637 winit::keyboard::KeyCode::WakeUp => Self::WakeUp,
638 winit::keyboard::KeyCode::Meta => Self::Meta,
639 winit::keyboard::KeyCode::Hyper => Self::Hyper,
640 winit::keyboard::KeyCode::Turbo => Self::Turbo,
641 winit::keyboard::KeyCode::Abort => Self::Abort,
642 winit::keyboard::KeyCode::Resume => Self::Resume,
643 winit::keyboard::KeyCode::Suspend => Self::Suspend,
644 winit::keyboard::KeyCode::Again => Self::Again,
645 winit::keyboard::KeyCode::Copy => Self::Copy,
646 winit::keyboard::KeyCode::Cut => Self::Cut,
647 winit::keyboard::KeyCode::Find => Self::Find,
648 winit::keyboard::KeyCode::Open => Self::Open,
649 winit::keyboard::KeyCode::Paste => Self::Paste,
650 winit::keyboard::KeyCode::Props => Self::Props,
651 winit::keyboard::KeyCode::Select => Self::Select,
652 winit::keyboard::KeyCode::Undo => Self::Undo,
653 winit::keyboard::KeyCode::Hiragana => Self::Hiragana,
654 winit::keyboard::KeyCode::Katakana => Self::Katakana,
655 winit::keyboard::KeyCode::F1 => Self::F1,
656 winit::keyboard::KeyCode::F2 => Self::F2,
657 winit::keyboard::KeyCode::F3 => Self::F3,
658 winit::keyboard::KeyCode::F4 => Self::F4,
659 winit::keyboard::KeyCode::F5 => Self::F5,
660 winit::keyboard::KeyCode::F6 => Self::F6,
661 winit::keyboard::KeyCode::F7 => Self::F7,
662 winit::keyboard::KeyCode::F8 => Self::F8,
663 winit::keyboard::KeyCode::F9 => Self::F9,
664 winit::keyboard::KeyCode::F10 => Self::F10,
665 winit::keyboard::KeyCode::F11 => Self::F11,
666 winit::keyboard::KeyCode::F12 => Self::F12,
667 winit::keyboard::KeyCode::F13 => Self::F13,
668 winit::keyboard::KeyCode::F14 => Self::F14,
669 winit::keyboard::KeyCode::F15 => Self::F15,
670 winit::keyboard::KeyCode::F16 => Self::F16,
671 winit::keyboard::KeyCode::F17 => Self::F17,
672 winit::keyboard::KeyCode::F18 => Self::F18,
673 winit::keyboard::KeyCode::F19 => Self::F19,
674 winit::keyboard::KeyCode::F20 => Self::F20,
675 winit::keyboard::KeyCode::F21 => Self::F21,
676 winit::keyboard::KeyCode::F22 => Self::F22,
677 winit::keyboard::KeyCode::F23 => Self::F23,
678 winit::keyboard::KeyCode::F24 => Self::F24,
679 winit::keyboard::KeyCode::F25 => Self::F25,
680 winit::keyboard::KeyCode::F26 => Self::F26,
681 winit::keyboard::KeyCode::F27 => Self::F27,
682 winit::keyboard::KeyCode::F28 => Self::F28,
683 winit::keyboard::KeyCode::F29 => Self::F29,
684 winit::keyboard::KeyCode::F30 => Self::F30,
685 winit::keyboard::KeyCode::F31 => Self::F31,
686 winit::keyboard::KeyCode::F32 => Self::F32,
687 winit::keyboard::KeyCode::F33 => Self::F33,
688 winit::keyboard::KeyCode::F34 => Self::F34,
689 winit::keyboard::KeyCode::F35 => Self::F35,
690 _ => todo!(),
691 }
692 }
693}
694
695#[derive(Debug, Hash, PartialEq, Eq, Serialize, Deserialize, Clone, Copy)]
696pub enum MouseInputType {
697 MoveLeft,
698 MoveRight,
699 MoveUp,
700 MoveDown,
701 ScrollUp,
702 ScrollDown,
703}
704
705#[derive(Debug, Hash, PartialEq, Eq, Serialize, Deserialize, Clone, Copy)]
706pub enum LinearInputType {
707 KnownKeyboard(KeyCode),
708 Mouse(MouseInputType),
709}
710
711impl From<KeyCode> for LinearInputType {
712 fn from(value: KeyCode) -> Self {
713 Self::KnownKeyboard(value)
714 }
715}
716
717impl From<MouseInputType> for LinearInputType {
718 fn from(value: MouseInputType) -> Self {
719 Self::Mouse(value)
720 }
721}
722
723#[derive(Debug, Hash, PartialEq, Eq, Serialize, Deserialize, Clone, Copy)]
724pub enum VectorInputType {
725 MouseMove,
726}
727
728#[derive(Clone, Serialize, Deserialize)]
729struct InputMapInner<TLinear, TVector> {
730 linear_map: HashMap<LinearInputType, TLinear>,
731 vector_map: HashMap<VectorInputType, TVector>,
732}
733
734pub struct InputMap<TLinear, TVector> {
737 inner: InputMapInner<TLinear, TVector>,
738}
739
740impl<TLinear, TVector> InputMap<TLinear, TVector> {
741 pub fn empty() -> Self {
742 Self {
743 inner: InputMapInner {
744 linear_map: HashMap::new(),
745 vector_map: HashMap::new(),
746 },
747 }
748 }
749
750 #[inline]
751 pub fn assign_linear(&mut self, input: impl Into<LinearInputType>, value: TLinear) {
752 self.inner.linear_map.insert(input.into(), value);
753 }
754
755 #[inline]
756 pub fn unassign_linear(&mut self, input: impl Into<LinearInputType>) {
757 self.inner.linear_map.remove(&input.into());
758 }
759
760 #[inline]
761 pub fn get_linear(&self, input: impl Into<LinearInputType>) -> Option<&TLinear> {
762 self.inner.linear_map.get(&input.into())
763 }
764
765 #[inline]
766 pub fn assign_vector(&mut self, input: impl Into<VectorInputType>, value: TVector) {
767 self.inner.vector_map.insert(input.into(), value);
768 }
769
770 #[inline]
771 pub fn unassign_vector(&mut self, input: impl Into<VectorInputType>) {
772 self.inner.vector_map.remove(&input.into());
773 }
774
775 #[inline]
776 pub fn get_vector(&self, input: impl Into<VectorInputType>) -> Option<&TVector> {
777 self.inner.vector_map.get(&input.into())
778 }
779
780 pub fn union(&mut self, other: Self) {
782 for (input, value) in other.inner.linear_map {
783 self.assign_linear(input, value);
784 }
785 for (input, value) in other.inner.vector_map {
786 self.assign_vector(input, value);
787 }
788 }
789}
790
791impl<TLinear: Serialize, TVector: Serialize> InputMap<TLinear, TVector> {
792 pub fn serialize(&self) -> String {
793 serde_json::to_string_pretty(&self.inner).expect("input map serialization failed")
794 }
795}
796
797impl<'a, TLinear: Deserialize<'a>, TVector: Deserialize<'a>> InputMap<TLinear, TVector> {
798 pub fn deserialize(s: &'a str) -> Result<Self, serde_json::Error> {
799 let inner = serde_json::from_str::<InputMapInner<TLinear, TVector>>(&s)?;
800 Ok(Self { inner })
801 }
802}