Rust rendering library built on top of Raylib
2.4 kB
98 lines
1use ren_core::math::Vec2;
2
3use raylib_ffi::{self as rl, Camera2D, Vector2};
4
5use crate::IGraphicsDrawer;
6
7pub struct Camera {
8 pub rl_camera: raylib_ffi::Camera2D,
9}
10
11impl Camera {
12 pub fn new(offset: Vec2<f32>) -> Self {
13 Self {
14 rl_camera: Camera2D {
15 offset: Vector2 {
16 x: offset.x,
17 y: offset.y,
18 },
19 target: Vector2 { x: 0.0, y: 0.0 },
20 rotation: 0.0,
21 zoom: 1.0,
22 },
23 }
24 }
25
26 pub fn get_offset(&self) -> Vec2<f32> {
27 Vec2::new(self.rl_camera.offset.x, self.rl_camera.offset.y)
28 }
29
30 pub fn get_target(&self) -> Vec2<f32> {
31 Vec2::new(self.rl_camera.target.x, self.rl_camera.target.y)
32 }
33
34 pub fn get_zoom(&self) -> f32 {
35 self.rl_camera.zoom
36 }
37
38 pub fn draw<T: Fn(&mut D), D: IGraphicsDrawer>(&self, drawer: &mut D, f: T) {
39 unsafe {
40 rl::BeginMode2D(self.rl_camera);
41 }
42 f(drawer);
43 unsafe {
44 rl::EndMode2D();
45 }
46 }
47
48 pub fn draw_mut<T: FnMut(&mut D), D: IGraphicsDrawer>(&self, drawer: &mut D, f: &mut T) {
49 unsafe {
50 rl::BeginMode2D(self.rl_camera);
51 }
52 f(drawer);
53 unsafe {
54 rl::EndMode2D();
55 }
56 }
57
58 /* remember to use end_draw, otherwise unexpected results will occur. */
59 #[inline]
60 pub fn begin_draw(&self) {
61 unsafe {
62 rl::BeginMode2D(self.rl_camera);
63 }
64 }
65
66 #[inline]
67 pub fn end_draw(&self) {
68 unsafe {
69 rl::EndMode2D();
70 }
71 }
72
73 pub fn vec2_to_world(&self, vec: Vec2<i32>) -> Vec2<i32> {
74 let v = unsafe {
75 raylib_ffi::GetScreenToWorld2D(
76 Vector2 {
77 x: vec.x as f32,
78 y: vec.y as f32,
79 },
80 self.rl_camera,
81 )
82 };
83 Vec2::new(v.x as i32, v.y as i32)
84 }
85
86 pub fn vec2_to_screen(&self, vec: Vec2<i32>) -> Vec2<i32> {
87 let v = unsafe {
88 raylib_ffi::GetWorldToScreen2D(
89 Vector2 {
90 x: vec.x as f32,
91 y: vec.y as f32,
92 },
93 self.rl_camera,
94 )
95 };
96 Vec2::new(v.x as i32, v.y as i32)
97 }
98}