Skip to main content

router/
router.rs

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}