render_gui_system/
render_gui_system.rs

1use std::rc::Rc;
2use std::cell::RefCell;
3
4#[macro_use] extern crate tinyecs;
5
6use tinyecs::*;
7
8pub struct GlutinFacade;
9impl GlutinFacade {
10    pub fn new() -> GlutinFacade {
11        GlutinFacade
12    }
13    pub fn draw_something(&mut self, some : &str) {
14        println!("{}", some);
15    }
16}
17pub struct HeavyGuiData;
18impl Component for HeavyGuiData {}
19impl HeavyGuiData {
20    pub fn new(_ : &GlutinFacade) -> HeavyGuiData {
21        HeavyGuiData
22    }
23}
24
25transit_system!(Glutin2HeavySystem: RenderData => HeavyGuiData,
26    |render_data| { HeavyGuiData::new(&render_data.facade.borrow_mut() ) });
27
28pub struct Renderable;
29impl Component for Renderable {}
30
31pub struct GuiWindow;
32impl Component for GuiWindow {}
33
34pub struct RenderData {
35    facade : Rc<RefCell<GlutinFacade>>
36}
37impl Component for RenderData {}
38
39
40pub struct RenderSystem {
41    facade : Rc<RefCell<GlutinFacade>>
42}
43impl RenderSystem {
44    pub fn new() -> RenderSystem {
45        RenderSystem {
46            facade : Rc::new(RefCell::new(GlutinFacade::new()))
47        }
48    }
49}
50
51impl System for RenderSystem {
52    fn aspect(&self) -> Aspect {
53        aspect_all!(Renderable)
54    }
55    fn on_created(&mut self, entity_manager : &mut EntityManager) {
56        let data_entity = entity_manager.create_entity();
57        data_entity.add_component(RenderData {facade : self.facade.clone()});
58    }
59    fn process_one(&mut self, _ : &mut Entity) {
60        self.facade.borrow_mut().draw_something("triangles triangles");
61    }
62}
63
64pub struct GuiSystem;
65
66impl System for GuiSystem {
67    fn aspect(&self) -> Aspect {
68        aspect_all!(GuiWindow)
69    }
70    fn data_aspects(&self) -> Vec<Aspect> {
71        vec![aspect_all!(RenderData, HeavyGuiData)]
72    }
73
74    fn process_d(&mut self, _ : &mut Entity, data : &mut DataList) {
75        let render_data = data.unwrap_entity().get_component::<RenderData>();
76        let _gui_data   = data.unwrap_entity().get_component::<HeavyGuiData>();
77        render_data.facade.borrow_mut().draw_something("gui gui gui");
78    }
79}
80
81fn main() {
82    let mut world = World::new();
83    world.set_system(RenderSystem::new());
84    world.set_system(GuiSystem);
85    world.set_system(Glutin2HeavySystem);
86
87    {
88        let mut entity_manager = world.entity_manager();
89
90        {
91            let mesh = entity_manager.create_entity();
92
93            mesh.add_component(Renderable);
94            mesh.refresh();
95        }
96        {
97            let window = entity_manager.create_entity();
98
99            window.add_component(GuiWindow);
100            window.refresh();
101        }
102    }
103    world.update();
104    world.update();
105    world.update();
106}