pub use self::camera2d::Camera2d;
pub use self::camera3d::Camera3d;
pub use self::first_person3d::FirstPersonCamera3d;
pub use self::first_person_stereo3d::FirstPersonCamera3dStereo;
pub use self::fixed_view2d::{CoordinateSystem2d, FixedView2d};
pub use self::fixed_view3d::FixedView3d;
pub use self::orbit3d::OrbitCamera3d;
pub use self::sidescroll2d::PanZoomCamera2d;
#[derive(Copy, Clone, Debug, PartialEq, Default)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub enum Projection {
#[default]
Perspective,
Orthographic,
}
#[derive(Copy, Clone, Debug, PartialEq)]
#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
pub struct Exposure {
pub ev100: f32,
}
impl Default for Exposure {
fn default() -> Self {
Exposure::from_exposure(1.0)
}
}
impl Exposure {
pub const SUNLIGHT: f32 = 15.0;
pub const OVERCAST: f32 = 12.0;
pub const INDOOR: f32 = 7.0;
pub fn from_physical(
aperture_f_stops: f32,
shutter_speed_s: f32,
sensitivity_iso: f32,
) -> Self {
let ev100 = ((aperture_f_stops * aperture_f_stops) / shutter_speed_s * 100.0
/ sensitivity_iso)
.log2();
Exposure { ev100 }
}
pub fn from_exposure(exposure: f32) -> Self {
Exposure {
ev100: (1.0 / (exposure.max(1e-6) * 1.2)).log2(),
}
}
pub fn exposure(&self) -> f32 {
1.0 / (2.0f32.powf(self.ev100) * 1.2)
}
}
mod camera2d;
mod camera3d;
mod first_person3d;
mod first_person_stereo3d;
mod fixed_view2d;
mod fixed_view3d;
mod orbit3d;
mod sidescroll2d;