macroquad_ply/experimental/camera/
mouse.rs1use crate::prelude::screen_width;
2use crate::prelude::*;
3use crate::Vec2;
4
5#[derive(Debug, Copy, Clone)]
9pub struct Camera {
10 pub offset: Vec2,
11 pub scale: f32,
12
13 last_mouse_pos: Vec2,
14}
15
16impl Default for Camera {
17 fn default() -> Self {
18 Self::new(Vec2::ZERO, 1.0)
19 }
20}
21
22impl Camera {
23 pub const fn new(offset: Vec2, scale: f32) -> Self {
24 Self {
25 offset,
26 scale,
27
28 last_mouse_pos: Vec2::new(0., 0.),
29 }
30 }
31
32 pub fn scale_wheel(&mut self, center: Vec2, wheel_value: f32, scale_factor: f32) {
35 if wheel_value > 0. {
36 self.scale_mul(center, scale_factor);
37 } else if wheel_value < 0. {
38 self.scale_mul(center, 1.0 / scale_factor);
39 }
40 }
41
42 pub fn scale_mul(&mut self, center: Vec2, mul_to_scale: f32) {
44 self.scale_new(center, self.scale * mul_to_scale);
45 }
46
47 pub fn scale_new(&mut self, center: Vec2, new_scale: f32) {
49 self.offset = (self.offset - center) * (new_scale / self.scale) + center;
50 self.scale = new_scale;
51 }
52
53 pub fn update(&mut self, mouse_pos: Vec2, should_offset: bool) {
57 if should_offset {
58 self.offset += mouse_pos - self.last_mouse_pos;
59 }
60 self.last_mouse_pos = mouse_pos;
61 }
62}
63
64impl From<&Camera> for Camera2D {
65 fn from(val: &Camera) -> Self {
66 let aspect = screen_width() / screen_height();
67 Camera2D {
68 zoom: vec2(val.scale, -val.scale * aspect),
69 offset: vec2(val.offset.x, -val.offset.y),
70 target: vec2(0., 0.),
71 rotation: 0.,
72
73 render_target: None,
74 viewport: None,
75 }
76 }
77}