Skip to main content

fantasy_craft/camera/camera2d/
components.rs

1use hecs::Entity;
2use macroquad::prelude::*;
3use serde::Deserialize;
4use serde_json::Value;
5use crate::core::context::Context;
6use crate::scene::scene_loader::ComponentLoader;
7
8#[derive(Debug)]
9pub struct CameraComponent {
10    pub lerp_factor: f32,
11    pub zoom: f32,
12    pub camera: Camera2D
13}
14
15fn default_lerp() -> f32 { 0.0 }
16fn default_zoom() -> f32 { 1.0 }
17
18#[derive(Deserialize, Debug, Default)]
19struct CameraComponentLoaderData {
20    #[serde(default="default_lerp")]
21    pub lerp_factor: f32,
22
23    #[serde(default="default_zoom")]
24    pub zoom: f32
25}
26
27pub struct CameraComponentLoader;
28
29impl ComponentLoader for CameraComponentLoader {
30    fn load(&self, ctx: &mut Context, entity: Entity, data: &Value) {
31        let loader_data: CameraComponentLoaderData = serde_json::from_value(data.clone())
32            .unwrap_or_default();
33
34        let component = CameraComponent {
35            lerp_factor: loader_data.lerp_factor,
36            zoom: loader_data.zoom,
37            camera: Camera2D::default()
38        };
39
40        ctx.world.insert_one(entity, component).expect("Failed to insert CameraComponent");
41    }
42}
43
44#[derive(Debug)]
45pub struct MainCamera;
46
47pub struct MainCameraLoader;
48
49impl ComponentLoader for MainCameraLoader {
50    fn load(&self, ctx: &mut Context, entity: Entity, _data: &Value) {
51        ctx.world.insert_one(entity, MainCamera).expect("Failed to insert MainCamera");
52    }
53}
54
55#[derive(Debug)]
56pub struct CameraTarget;
57
58pub struct CameraTargetLoader;
59
60impl ComponentLoader for CameraTargetLoader {
61    fn load(&self, ctx: &mut Context, entity: Entity, _data: &Value) {
62        ctx.world.insert_one(entity, CameraTarget).expect("Failed to insert CameraTarget");
63    }
64}