use crate::prelude::screen_width;
use crate::prelude::*;
use crate::Vec2;
#[derive(Debug, Copy, Clone)]
pub struct Camera {
pub offset: Vec2,
pub scale: f32,
last_mouse_pos: Vec2,
}
impl Default for Camera {
fn default() -> Self {
Self::new(Vec2::ZERO, 1.0)
}
}
impl Camera {
pub fn new(offset: Vec2, scale: f32) -> Self {
Self {
offset,
scale,
last_mouse_pos: Vec2::new(0., 0.),
}
}
pub fn scale_wheel(&mut self, center: Vec2, wheel_value: f32, scale_factor: f32) {
if wheel_value > 0. {
self.scale_mul(center, scale_factor);
} else if wheel_value < 0. {
self.scale_mul(center, 1.0 / scale_factor);
}
}
pub fn scale_mul(&mut self, center: Vec2, mul_to_scale: f32) {
self.scale_new(center, self.scale * mul_to_scale);
}
pub fn scale_new(&mut self, center: Vec2, new_scale: f32) {
self.offset = (self.offset - center) * (new_scale / self.scale) + center;
self.scale = new_scale;
}
pub fn update(&mut self, mouse_pos: Vec2, should_offset: bool) {
if should_offset {
self.offset += mouse_pos - self.last_mouse_pos;
}
self.last_mouse_pos = mouse_pos;
}
}
impl Into<Camera2D> for &Camera {
fn into(self) -> Camera2D {
let aspect = screen_width() / screen_height();
Camera2D {
zoom: vec2(self.scale, -self.scale * aspect),
offset: vec2(self.offset.x, -self.offset.y),
target: vec2(0., 0.),
rotation: 0.,
render_target: None,
viewport: None,
}
}
}