Skip to main content

signal_handler/
signal-handler.rs

1/// MMS signal handler demo.
2///
3/// Loads signal-handler.mms, which authors the scene and registers Click
4/// handlers via `on()`. Clicking a cube prints its name to stdout.
5///
6/// Run: cargo run --release --example signal-handler
7use mittens_engine::{engine, engine::ecs::SignalEmitter, scripting, utils};
8
9fn main() {
10    mittens_engine::example_support::ensure_model_assets();
11    utils::logger::init();
12
13    let world = engine::ecs::World::default();
14    let mut universe = engine::Universe::new(world);
15
16    // Evaluate the MMS script with live world access.
17    // on() calls inside the script register Click handlers into universe.systems.rx.
18    let source = include_str!("signal-handler.mms");
19    let output = scripting::MeowMeowRunner::eval_with_world(
20        source,
21        &mut universe.world,
22        &mut universe.systems.rx,
23        &mut universe.command_queue,
24    );
25
26    for err in &output.errors {
27        eprintln!("[mms] {err}");
28    }
29    if !output.errors.is_empty() {
30        std::process::exit(1);
31    }
32
33    // Any bare CE emissions from the script (not let-bound) are in output.intents.
34    // Our script only uses let-bindings so this is empty, but handle it anyway.
35    for intent in output.intents {
36        universe
37            .command_queue
38            .push_intent_now(engine::ecs::ComponentId::default(), intent);
39    }
40
41    universe.systems.process_commands(
42        &mut universe.world,
43        &mut universe.visuals,
44        &mut universe.render_assets,
45        &mut universe.command_queue,
46    );
47
48    universe.enable_repl();
49    engine::Windowing::run_app(universe).expect("Windowing failed");
50}