#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
#[serde(default)]
pub struct CameraShot {
pub preset: String,
pub fov_y_degrees: f32,
pub near: f32,
pub far: f32,
pub position: [f32; 3],
pub yaw: f32,
pub pitch: f32,
}
impl Default for CameraShot {
fn default() -> Self {
Self {
preset: String::new(),
fov_y_degrees: 75.0,
near: 0.05,
far: 200.0,
position: [0.0, 0.0, 0.0],
yaw: 0.0,
pitch: 0.0,
}
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn defaults_match_the_camera_they_configure() {
let s = CameraShot::default();
assert!(s.preset.is_empty());
assert_eq!(s.fov_y_degrees, 75.0);
assert_eq!((s.near, s.far), (0.05, 200.0));
assert_eq!(s.position, [0.0, 0.0, 0.0]);
assert_eq!((s.yaw, s.pitch), (0.0, 0.0));
}
#[test]
fn a_named_preset_parses_and_round_trips_through_postcard() {
let s: CameraShot = serde_json::from_str(
r#"{"preset":"establishing","fov_y_degrees":40,"position":[0,3,8],"yaw":1.5}"#,
)
.unwrap();
assert_eq!(s.preset, "establishing");
assert_eq!(s.fov_y_degrees, 40.0);
assert_eq!(s.position, [0.0, 3.0, 8.0]);
assert_eq!(s.yaw, 1.5);
let bytes = postcard::to_allocvec(&s).unwrap();
let back: CameraShot = postcard::from_bytes(&bytes).unwrap();
assert_eq!(back.preset, "establishing");
assert_eq!(back.far, 200.0);
}
}