1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
pub mod spatial;
pub mod sprite;
pub mod text;

use oxygengine_core::{
    ecs::{Entity, Universe},
    scripting::{
        intuicio::core::{registry::Registry, struct_type::NativeStructBuilder},
        ScriptFunctionReference,
    },
};
use oxygengine_ha_renderer::components::transform::HaTransform;
use oxygengine_nodes::ScriptedNodes;

pub const EVENT_PREPARE: &str = "event_prepare";
pub const EVENT_UPDATE: &str = "event_update";
pub const EVENT_DRAW: &str = "event_draw";
pub const EVENT_DRAW_GUI: &str = "event_draw_gui";

pub fn install(registry: &mut Registry) {
    registry.add_struct(
        NativeStructBuilder::new_named_uninitialized::<Universe>("Universe")
            .module_name("core")
            .build(),
    );
    registry.add_struct(
        NativeStructBuilder::new_named_uninitialized::<Entity>("Entity")
            .module_name("core")
            .build(),
    );
    registry.add_struct(
        NativeStructBuilder::new_named::<HaTransform>("HaTransform")
            .module_name("core")
            .build(),
    );
    sprite::SpriteNode::install(registry);
    text::TextNode::install(registry);
    spatial::SpatialNode::install(registry);
}

pub fn dispatch_events(universe: &Universe, names: &[&str]) {
    let nodes = &mut *universe.expect_resource_mut::<ScriptedNodes>();
    for name in names {
        nodes.dispatch::<&mut HaTransform>(
            universe,
            ScriptFunctionReference::parse(name).unwrap(),
            &[universe.into()],
        );
    }
}