melvin_ob/imaging/
camera_state.rs1use fixed::types::I32F32;
2use std::{collections::HashMap, sync::LazyLock};
3use strum_macros::{Display, EnumIter};
4
5#[cfg(test)]
6use rand::prelude::Rng;
7
8#[derive(Debug, Display, PartialEq, Eq, Clone, Copy, Hash, EnumIter)]
18pub enum CameraAngle {
19 Narrow,
20 Normal,
21 Wide,
22}
23
24impl CameraAngle {
25 pub fn get_square_side_length(self) -> u16 { CAMERA_SCALE_LOOKUP[&self] }
31
32 pub fn get_max_speed(self) -> I32F32 { CAMERA_MAX_SPEED_LOOKUP[&self] }
33
34 #[cfg(test)]
35 pub fn random<R: Rng + ?Sized>(rng: &mut R) -> Self {
36 let variants = [CameraAngle::Narrow, CameraAngle::Normal, CameraAngle::Wide];
37 variants[rng.random_range(0..variants.len())]
38 }
39}
40
41impl From<&str> for CameraAngle {
42 fn from(value: &str) -> Self {
51 match value.to_lowercase().as_str() {
52 "narrow" => CameraAngle::Narrow,
53 "wide" => CameraAngle::Wide,
54 "normal" => CameraAngle::Normal,
55 _ => panic!("Couldn't convert camera_angle string"),
56 }
57 }
58}
59
60impl From<CameraAngle> for &'static str {
61 fn from(value: CameraAngle) -> Self {
69 match value {
70 CameraAngle::Narrow => "narrow",
71 CameraAngle::Normal => "normal",
72 CameraAngle::Wide => "wide",
73 }
74 }
75}
76
77static CAMERA_SCALE_LOOKUP: LazyLock<HashMap<CameraAngle, u16>> = LazyLock::new(|| {
83 let mut lookup = HashMap::new();
84 let transition_widths = vec![
85 (CameraAngle::Narrow, 600),
86 (CameraAngle::Normal, 800),
87 (CameraAngle::Wide, 1000),
88 ];
89
90 for (angle, square_side_length) in transition_widths {
91 lookup.insert(angle, square_side_length);
92 }
93 lookup
94});
95
96static CAMERA_MAX_SPEED_LOOKUP: LazyLock<HashMap<CameraAngle, I32F32>> = LazyLock::new(|| {
99 let mut lookup = HashMap::new();
100 let transition_widths = vec![
101 (CameraAngle::Narrow, I32F32::lit("10.0")),
102 (CameraAngle::Normal, I32F32::lit("50.0")),
103 (CameraAngle::Wide, I32F32::MAX),
104 ];
105
106 for (angle, square_side_length) in transition_widths {
107 lookup.insert(angle, square_side_length);
108 }
109 lookup
110});