Skip to main content

pipe_demo/
pipe-demo.rs

1use mittens_engine::{engine, engine::ecs::SignalEmitter, scripting, utils};
2
3// pipe-demo: demonstrates |> forward pipe operator in MMS.
4//
5// Run:  cargo run --example pipe-demo
6//
7// What to look for in the scene:
8//   - two horizontal strips of greyscale cubes (gamma-encoded and inverted)
9//   - a sphere whose colour is driven by a computed pipe chain
10//
11// Console output (from MMS print() — requires print() builtin to be implemented):
12//   [mms] double(2) = 4
13//   [mms] clamp01(double(0.3)) = 0.6
14//   ...
15//   [mms] pipe-demo: all assertions passed
16//
17// NOTE: output.prints is not yet on EvalOutput — add it alongside the
18//       print() and assert() evaluator builtins when implementing |>.
19
20fn main() {
21    mittens_engine::example_support::ensure_model_assets();
22    utils::logger::init();
23
24    let output = scripting::MeowMeowRunner::eval(include_str!("pipe-demo.mms"));
25
26    for error in &output.errors {
27        eprintln!("[mms error] {error}");
28    }
29    println!("[pipe-demo] {} intent(s)", output.intents.len());
30
31    if !output.errors.is_empty() {
32        eprintln!("[pipe-demo] FAIL — {} error(s)", output.errors.len());
33        std::process::exit(1);
34    }
35
36    let world = engine::ecs::World::default();
37    let mut universe = engine::Universe::new(world);
38
39    let scope = engine::ecs::ComponentId::default();
40    for intent in output.intents {
41        universe.command_queue.push_intent_now(scope, intent);
42    }
43
44    universe.systems.process_commands(
45        &mut universe.world,
46        &mut universe.visuals,
47        &mut universe.render_assets,
48        &mut universe.command_queue,
49    );
50
51    engine::Windowing::run_app(universe).expect("Windowing failed");
52}