process_types/
process_types.rs1#[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 world.set_system(RenderSystem);
95
96
97 world.set_system(DeferRenderSystem);
99
100 world.update();
101 world.update();
102}