render_gui_system/
render_gui_system.rs1use 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}