fennel_engine/ecs/
sprite.rs1use ron::Value;
2use serde::Deserialize;
3use specs::{Entity, Join, LazyUpdate, ReadStorage, System, World, WorldExt, WriteExpect};
4
5use crate::{app::App, registry::ComponentFactory};
6
7pub struct HostPtr(pub *mut App);
9
10unsafe impl Send for HostPtr {}
11unsafe impl Sync for HostPtr {}
12
13#[derive(Deserialize, Debug)]
19pub struct Sprite {
20 pub image: String,
22 pub position: (f32, f32),
24}
25
26impl specs::Component for Sprite {
27 type Storage = specs::VecStorage<Self>;
28}
29
30pub struct SpriteFactory;
32
33impl ComponentFactory for SpriteFactory {
34 fn insert(&self, world: &mut World, entity: Entity, value: &Value) {
35 let sprite = ron::value::Value::into_rust::<Sprite>(value.clone());
36 println!("{:#?}", sprite);
37 world.write_storage::<Sprite>().insert(entity, sprite.expect("failed to construct a sprite")).unwrap();
38 }
39
40 fn insert_lazy(&self, lazy: &LazyUpdate, entity: Entity, value: &Value) {
41 let sprite = ron::value::Value::into_rust::<Sprite>(value.clone())
42 .expect("failed to construct a sprite");
43 lazy.insert(entity, sprite);
44 }
45}
46
47pub struct RenderingSystem;
52
53impl<'a> System<'a> for RenderingSystem {
54 type SystemData = (ReadStorage<'a, Sprite>, WriteExpect<'a, HostPtr>);
55
56 fn run(&mut self, (sprites, mut host_ptr): Self::SystemData) {
57 let runtime: &mut App = unsafe { &mut *host_ptr.0 };
58 let window = &mut runtime.window;
59
60 for sprite in (&sprites).join() {
61 window
62 .graphics
63 .draw_image(sprite.image.clone(), sprite.position)
64 .unwrap();
65 }
66 }
67}