1use mittens_engine::{engine, engine::ecs::SignalEmitter, scripting, utils};
2
3fn spawn_runtime_text(
4 universe: &mut engine::Universe,
5 owner: engine::ecs::ComponentId,
6 label: &str,
7) {
8 use engine::ecs::component::{
9 ColorComponent, EdgeInsets, SizeDimension, StyleComponent, TextComponent,
10 TransformComponent,
11 };
12
13 let root = universe
14 .world
15 .add_component_boxed_named(label, Box::new(TransformComponent::new()));
16 let style = universe.world.add_component_boxed_named(
17 format!("{label}_style"),
18 Box::new({
19 let mut style = StyleComponent::new();
20 style.margin = EdgeInsets::all(0.5);
21 style.padding = EdgeInsets::axes(0.75, 0.5);
22 style.width = SizeDimension::Auto;
23 style.background_color = Some([0.93, 0.88, 0.98, 1.0]);
24 style
25 }),
26 );
27 let text = universe
28 .world
29 .add_component_boxed_named(format!("{label}_text"), Box::new(TextComponent::new(label)));
30 let color = universe
31 .world
32 .add_component(ColorComponent::rgba(0.38, 0.14, 0.62, 1.0));
33
34 let _ = universe.world.add_child(root, style);
35 let _ = universe.world.add_child(root, text);
36 let _ = universe.world.add_child(text, color);
37
38 universe.attach(owner, root).expect("attach routed child");
39}
40
41fn main() {
42 mittens_engine::example_support::ensure_model_assets();
43 utils::logger::init();
44
45 let world = engine::ecs::World::default();
46 let mut universe = engine::Universe::new(world);
47
48 let output = scripting::MeowMeowRunner::eval_with_world_at_path(
49 include_str!("router.mms"),
50 Some("examples/router.mms"),
51 &mut universe.world,
52 &mut universe.systems.rx,
53 &mut universe.command_queue,
54 );
55
56 for error in &output.errors {
57 eprintln!("[mms] {error}");
58 }
59 println!("[mms] {} intent(s) from router.mms", output.intents.len());
60
61 if !output.errors.is_empty() {
62 std::process::exit(1);
63 }
64
65 let scope = engine::ecs::ComponentId::default();
66 for intent in output.intents {
67 universe.command_queue.push_intent_now(scope, intent);
68 }
69
70 universe.systems.process_commands(
71 &mut universe.world,
72 &mut universe.visuals,
73 &mut universe.render_assets,
74 &mut universe.command_queue,
75 );
76
77 universe.enable_repl();
78
79 let demo_root = universe
80 .world
81 .all_components()
82 .find(|&cid| universe.world.component_label(cid) == Some("router_demo"))
83 .expect("router demo root");
84 let container = universe
85 .find_component(demo_root, "[name='container']")
86 .expect("container target");
87 let authored_child = universe
88 .find_component(demo_root, "[name='authored_child']")
89 .expect("authored child");
90
91 assert_eq!(universe.parent_of(authored_child), Some(container));
92
93 spawn_runtime_text(&mut universe, demo_root, "late child routed on attach");
94
95 let late_child = universe
96 .find_component(demo_root, "[name='late child routed on attach']")
97 .expect("late child");
98 assert_eq!(universe.parent_of(late_child), Some(container));
99
100 println!("[router-demo] init-time and attach-time routing verified");
101
102 engine::Windowing::run_app(universe).expect("Windowing failed");
103}