process_types/
process_types.rs

1#[macro_use] extern crate tinyecs;
2
3use tinyecs::*;
4
5pub struct Position {
6    pub pos : [f32; 3]
7}
8impl Component for Position {}
9
10pub struct Mesh {
11    pub mesh : String
12}
13impl Component for Mesh {}
14
15pub struct DeferMesh {
16    pub order : i32
17}
18impl Component for DeferMesh {}
19
20pub struct Camera {
21    pub pos : [f32; 3]
22}
23impl Component for Camera {}
24
25pub struct RenderSystem;
26
27impl System for RenderSystem {
28    fn aspect(&self) -> Aspect {
29        Aspect::all2::<Position, Mesh>()
30    }
31    fn data_aspects(&self) -> Vec<Aspect> {
32        vec![Aspect::all::<Camera>()]
33    }
34    fn process_d(&mut self, entity : &mut Entity, data : &mut DataList) {
35        let cam = data.unwrap_entity();
36        let cam = cam.get_component::<Camera>();
37
38        let pos = entity.get_component::<Position>();
39        let mesh = entity.get_component::<Mesh>();
40
41        println!("{}, {}, seen from camera pos: {:?}", mesh.mesh, pos.pos[0], cam.pos);
42    }
43}
44
45pub struct DeferRenderSystem;
46
47impl System for DeferRenderSystem {
48    fn aspect(&self) -> Aspect {
49        Aspect::all2::<Position, Mesh>()
50    }
51    fn data_aspects(&self) -> Vec<Aspect> {
52        vec![Aspect::all::<Camera>()]
53    }
54    fn process_all(&mut self,
55                   entities : &mut Vec<&mut Entity>,
56                   _   : &mut WorldHandle,
57                   data   : &mut DataList) {
58        entities.sort_by(|e1, e2| {
59            let defer1 = e1.get_component::<DeferMesh>();
60            let defer2 = e2.get_component::<DeferMesh>();
61            defer1.order.cmp(&defer2.order)
62        });
63        for entity in entities {
64            let cam = data.unwrap_entity();
65            let cam = cam.get_component::<Camera>();
66
67            let mesh = entity.get_component::<Mesh>();
68
69            println!("{}, seen from camera pos: {:?}", mesh.mesh, cam.pos);
70        }
71    }
72}
73
74fn main() {
75    let mut world = World::new();
76
77    {
78        let mut entity_manager = world.entity_manager();
79        let entity = entity_manager.create_entity();
80
81        entity.add_component(Position {pos : [0.0, 0.0, 0.0]});
82        entity.add_component(Mesh {mesh : "player".to_string()});
83        entity.refresh();
84    }
85
86    {
87        let mut entity_manager = world.entity_manager();
88        let entity = entity_manager.create_entity();
89        entity.add_component(Camera {pos : [0.0, 0.0, 0.0]});
90        entity.refresh();
91    }
92    // will process all entities with Position and Mesh,
93    // and in this process all entities with Camera will be accessable
94    world.set_system(RenderSystem);
95
96
97    // same system, but we will use another implementetion inside it, for processing all entities at once
98    world.set_system(DeferRenderSystem);
99
100    world.update();
101    world.update();
102}