use super::tree::NodeId;
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub enum CameraProjection {
Perspective { fov_y_rad: f32 },
Orthographic { half_height: f32 },
}
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub struct CameraConfig {
pub projection: CameraProjection,
pub near: f32,
pub far: f32,
#[serde(default = "CameraBehavior::default_static")]
pub behavior: CameraBehavior,
}
#[derive(Clone, Debug, PartialEq, serde::Serialize, serde::Deserialize)]
#[serde(rename_all = "snake_case")]
#[derive(Default)]
#[cfg_attr(feature = "schemars", derive(schemars::JsonSchema))]
pub enum CameraBehavior {
#[default]
Static,
Follow {
target: NodeId,
offset: [f32; 3],
look_at_target: bool,
},
OrbitTarget {
target: NodeId,
distance: f32,
pitch: f32,
yaw: f32,
auto_rotate_speed: f32,
},
RailAlongCurve {
curve: NodeId,
look_ahead_distance: f32,
target: Option<NodeId>,
},
}
impl CameraBehavior {
pub fn default_static() -> Self {
Self::Static
}
}
impl CameraConfig {
pub fn default_perspective() -> Self {
Self {
projection: CameraProjection::Perspective {
fov_y_rad: std::f32::consts::FRAC_PI_3,
},
near: 0.1,
far: 200.0,
behavior: CameraBehavior::Static,
}
}
pub fn default_orthographic() -> Self {
Self {
projection: CameraProjection::Orthographic { half_height: 5.0 },
near: 0.1,
far: 200.0,
behavior: CameraBehavior::Static,
}
}
}