use super::Camera;
use glam::*;
#[derive(Clone, Debug)]
pub struct PrespectiveCamera {
eye: Vec3,
target: Vec3,
up: Vec3,
fov: f32,
aspect_ratio: f32,
near: f32,
far: f32,
}
impl PrespectiveCamera {
pub fn fov(&mut self) -> &mut f32 {
&mut self.fov
}
pub fn aspect_ratio(&mut self) -> &mut f32 {
&mut self.aspect_ratio
}
pub fn near(&mut self) -> &mut f32 {
&mut self.near
}
pub fn far(&mut self) -> &mut f32 {
&mut self.far
}
}
impl Default for PrespectiveCamera {
fn default() -> Self {
let eye = vec3(0.0, 1.0, 2.0);
let target = vec3(0.0, 0.0, 0.0);
let up = vec3(0.0, 1.0, 0.0);
let fov = 45.0;
let aspect_ratio = 16.0 / 9.0;
let near = 0.1;
let far = 100.0;
Self {
eye,
target,
up,
fov,
aspect_ratio,
near,
far,
}
}
}
impl Camera for PrespectiveCamera {
fn up(&mut self) -> &mut Vec3 {
&mut self.up
}
fn eye(&mut self) -> &mut Vec3 {
&mut self.eye
}
fn target(&mut self) -> &mut Vec3 {
&mut self.target
}
fn view(&self) -> Mat4 {
Mat4::look_at_rh(self.eye, self.target, self.up)
}
fn projection(&self) -> Mat4 {
Mat4::perspective_lh(self.fov, self.aspect_ratio, self.near, self.far)
}
}