Apply the configured wiring.
Resolves the builder state into a coroutine (if any scheduling modifier was set) or an immediate call (if bind was used), and registers the result with Fabric.
277{
282
283 bool has_any_path = !std::holds_alternative<std::monostate>(
m_factory)
287 || !std::holds_alternative<std::monostate>(
m_trigger)
289
290 reg.commit_driven = !has_any_path;
291
292
293
294
295 std::visit([&](
const auto&
ptr) {
296 using T = std::decay_t<
decltype(*ptr)>;
297 if constexpr (std::is_same_v<T, Emitter>) {
298 if (!
ptr->fn_name().empty()) {
300 ptr->fn_name(), std::make_shared<Emitter::InfluenceFn>(
ptr->fn()));
301 }
302 } else if constexpr (std::is_same_v<T, Sensor>) {
303 if (!
ptr->fn_name().empty()) {
305 ptr->fn_name(), std::make_shared<Sensor::PerceptionFn>(
ptr->fn()));
306 }
307 } else if constexpr (std::is_same_v<T, Agent>) {
308 if (!
ptr->influence_fn_name().empty()) {
310 ptr->influence_fn_name(), std::make_shared<Emitter::InfluenceFn>(
ptr->influence_fn()));
311 }
312 if (!
ptr->perception_fn_name().empty()) {
314 ptr->perception_fn_name(), std::make_shared<Sensor::PerceptionFn>(
ptr->perception_fn()));
315 }
316 }
317 },
318 reg.member);
319
320
321
322
323 if (!std::holds_alternative<std::monostate>(
m_factory)) {
325 reg.task_name = name;
326 std::visit([&](
auto&
factory) {
327 using F = std::decay_t<
decltype(
factory)>;
328 if constexpr (!std::is_same_v<F, std::monostate>) {
329 scheduler.add_task(
330 std::make_shared<std::invoke_result_t<F>>(
factory()),
331 name, false);
332 }
333 },
336 return;
337 }
338
339
340
341
344 reg.event_name = name;
345 ev_manager.add_event(
347 name);
349 return;
350 }
351
352
353
354
356 (*m_bind_attach)();
357
361 timer->schedule(*
m_duration, [timer, detach]() {
362 detach();
363 });
364 }
366 return;
367 }
368
369
370
371
374 reg.chain_name = name;
375
376 Kriya::EventChain
chain(scheduler, name);
379 glm::vec3 pos = step.position;
380 chain.then([&fab, pos,
id]() {
381 std::visit([&pos](
const auto&
ptr) {
382 ptr->set_position(pos);
383 },
384 fab.m_registrations[id].member);
385 fab.fire(id);
386 },
387 step.delay_seconds);
388 }
391 }
394 return;
395 }
396
397
398
399
400 if (!std::holds_alternative<std::monostate>(
m_trigger)) {
401 std::visit([&](auto& trig) {
402 using T = std::decay_t<
decltype(trig)>;
403
404 if constexpr (std::is_same_v<T, KeyTrigger>) {
406 reg.event_name = name;
408 ev_manager.add_event(
409 std::make_shared<Vruta::Event>(
410 trig.held
412 [&fab, id]() { fab.fire(id); })
414 [&fab, id]() { fab.fire(id); })),
415 name);
416
417 if (trig.on_release) {
418 auto release_name =
make_name(
"nexus_event_release");
419 reg.chain_name = release_name;
420 ev_manager.add_event(
421 std::make_shared<Vruta::Event>(
423 release_name);
424 }
425
426 } else if constexpr (std::is_same_v<T, MouseTrigger>) {
428 reg.event_name = name;
431 ev_manager.add_event(
432 std::make_shared<Vruta::Event>(
433 trig.held
435 [&fab, eid](double px, double py) {
436 fab.m_registrations[eid].pending_cursor = glm::vec2(px, py);
437 fab.fire(eid);
438 })
440 [&fab, eid](double px, double py) {
441 fab.m_registrations[eid].pending_cursor = glm::vec2(px, py);
442 fab.fire(eid);
443 })),
444 name);
445 if (trig.on_release) {
446 auto release_name =
make_name(
"nexus_event_release");
447 reg.chain_name = release_name;
448 ev_manager.add_event(
449 std::make_shared<Vruta::Event>(
451 release_name);
452 }
453
454 } else if constexpr (std::is_same_v<T, ScrollTrigger>) {
456 reg.event_name = name;
457 ev_manager.add_event(
458 std::make_shared<Vruta::Event>(
459 scroll_loop(trig.window, trig.fn)),
460 name);
461
462 } else if constexpr (std::is_same_v<T, NetworkTrigger>) {
464 reg.task_name = name;
465 scheduler.add_task(
466 std::make_shared<Vruta::SoundRoutine>(
467 network_loop(*trig.source,
m_fabric,
id)),
468 name, false);
469
470 } else if constexpr (std::is_same_v<T, WindowEventTrigger>) {
472 reg.event_name = name;
474 ev_manager.add_event(
475 std::make_shared<Vruta::Event>(
477 name);
478 }
479 },
482 return;
483 }
484
485
486
487
491 reg.task_name = name;
493
494 scheduler.add_task(
496 if (pos_fn.has_value()) {
497 glm::vec3 p = (*pos_fn)();
498 std::visit([&p](const auto& ptr) {
499 ptr->set_position(p);
500 },
501 fab.m_registrations[id].member);
502 }
504
506 auto cancel_name =
make_name(
"nexus_metro_cancel");
507 auto timer = std::make_shared<Kriya::Timer>(scheduler);
508 timer->schedule(*
m_duration, [name, timer, &scheduler]() {
509 scheduler.cancel_task(name);
510 });
511 }
512 }
513
515}
std::unordered_map< std::string, std::shared_ptr< Sensor::PerceptionFn > > m_perception_fns
Vruta::TaskScheduler & m_scheduler
std::unordered_map< uint32_t, Registration > m_registrations
std::unordered_map< std::string, std::shared_ptr< Emitter::InfluenceFn > > m_influence_fns
Vruta::EventManager & m_event_manager
std::optional< std::function< void()> > m_bind_detach
Vruta::Event window_event_source_loop(Vruta::WindowEventSource &source, Vruta::WindowEventFilter filter, Fabric &fabric, uint32_t id)
std::string make_name(const char *prefix) const
std::optional< std::function< void()> > m_bind_attach
std::optional< double > m_duration
Vruta::ProcessingToken m_metro_token
Vruta::ProcessingToken m_duration_token
std::optional< double > m_interval
const Factory & factory() const
Active factory variant set by use for non-Event factories.
std::vector< MoveStep > m_move_steps
std::optional< PositionFn > m_position_fn
@ Kriya
Automatable tasks and fluent scheduling api for Nodes and Buffers.
Tendency< A, C > chain(const Tendency< A, B > &first, const Tendency< B, C > &second)
Sequential composition: evaluate first, feed result into second.
Vruta::Event key_released(std::shared_ptr< Core::Window > window, IO::Keys key, std::function< void()> callback)
Creates an Event coroutine that triggers on specific key release.
Vruta::Event key_pressed(std::shared_ptr< Core::Window > window, IO::Keys key, std::function< void()> callback)
Creates an Event coroutine that triggers on specific key press.
Vruta::Event key_held(std::shared_ptr< Core::Window > window, IO::Keys key, std::function< void()> callback)
Creates an Event coroutine that triggers on key press and repeats while held.
Vruta::Event mouse_released(std::shared_ptr< Core::Window > window, IO::MouseButtons button, std::function< void(double, double)> callback)
Creates an Event coroutine that triggers on specific mouse button release.
Vruta::Event mouse_pressed(std::shared_ptr< Core::Window > window, IO::MouseButtons button, std::function< void(double, double)> callback)
Creates an Event coroutine that triggers on specific mouse button press.
Vruta::Event mouse_dragged(std::shared_ptr< Core::Window > window, IO::MouseButtons button, std::function< void(double, double)> callback)
Creates an Event coroutine that triggers on mouse drag with specific button.
std::shared_ptr< Vruta::Routine > metro(double interval_seconds, std::function< void()> callback, Vruta::ProcessingToken token)
Creates a periodic event generator that executes a callback at regular intervals.