use crate::vector::Vec3; pub trait Camera { /// Returns the camera position. fn position(&self) -> Vec3; /// Returns the position of the camera target. fn target(&self) -> Vec3; /// Returns the direction the camera is looking. fn direction(&self) -> Vec3 { self.target() - self.position() } /// Returns the right direction relative from where the camera is looking. fn right(&self) -> Vec3 { self.direction().cross(&self.global_up()).normalize() } /// Returns the left direction relative from where the camera is looking. fn left(&self) -> Vec3 { -self.right() } /// Returns the upwards direction relative from where the camera is looking. fn up(&self) -> Vec3 { let rev_direction = -self.direction(); rev_direction.cross(&self.right()) } /// Returns the downwards direction relative from where the camera is looking. fn down(&self) -> Vec3 { -self.up() } /// Returns the global direction upwards. /// /// The default implementation which returns [`Vec3::UP`] should be fine in most /// cases. fn global_up(&self) -> Vec3 { Vec3::UP } }