Meta-program: Use note @NewEntity on procedures to mark them as editor-ui callable entity creation procedures
This commit is contained in:
@@ -225,7 +225,17 @@ message_loop :: () {
|
|||||||
if message.kind == {
|
if message.kind == {
|
||||||
case .TYPECHECKED;
|
case .TYPECHECKED;
|
||||||
typechecked := cast(*Message_Typechecked) message;
|
typechecked := cast(*Message_Typechecked) message;
|
||||||
for typechecked.structs note_struct(it.expression);
|
for typechecked.structs {
|
||||||
|
note_struct(it.expression);
|
||||||
|
}
|
||||||
|
|
||||||
|
for typechecked.procedure_headers {
|
||||||
|
for note: it.expression.notes {
|
||||||
|
if to_lower_copy_new(note.text,, allocator = temp) == "newentity" {
|
||||||
|
array_add(*new_entity_procs, it.expression.name);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
case .PHASE;
|
case .PHASE;
|
||||||
phase := cast(*Message_Phase) message;
|
phase := cast(*Message_Phase) message;
|
||||||
@@ -290,7 +300,11 @@ generate_code :: (w: Workspace) {
|
|||||||
|
|
||||||
for entity_type_names {
|
for entity_type_names {
|
||||||
lower := to_lower_copy_new(it,, allocator=temp);
|
lower := to_lower_copy_new(it,, allocator=temp);
|
||||||
print_to_builder(*builder, "if ui_clickable_label(\"New %1\") return new_%2();", it, lower);;
|
print_to_builder(*builder, "if ui_clickable_label(\"New %1\") return new_%2();", it, lower);
|
||||||
|
}
|
||||||
|
|
||||||
|
for new_entity_procs {
|
||||||
|
print_to_builder(*builder, "if ui_clickable_label(\"%1\") return %1();", it);
|
||||||
}
|
}
|
||||||
|
|
||||||
build_string := sprint(EDITOR_UI_ENTITY_CREATION, builder_to_string(*builder));
|
build_string := sprint(EDITOR_UI_ENTITY_CREATION, builder_to_string(*builder));
|
||||||
@@ -345,7 +359,7 @@ generate_code :: (w: Workspace) {
|
|||||||
builder: String_Builder;
|
builder: String_Builder;
|
||||||
|
|
||||||
for entity_type_names {
|
for entity_type_names {
|
||||||
print_to_builder(*builder, "new_%1 :: (scene: *Scene = null) -> *%2 { _scene := scene;\nif _scene == null { \n_scene = engine.current_scene; }\np, locator := find_and_occupy_empty_slot(*_scene.by_type._%2); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; }\n", to_lower_copy_new(it,, allocator=temp), it);
|
print_to_builder(*builder, "new_%1 :: (scene: *Scene = null, init: bool = true) -> *%2 { _scene := scene;\nif _scene == null { \n_scene = engine.current_scene; }\np, locator := find_and_occupy_empty_slot(*_scene.by_type._%2); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); if init { init_entity(p); } return p; }\n", to_lower_copy_new(it,, allocator=temp), it);
|
||||||
}
|
}
|
||||||
|
|
||||||
add_build_string(builder_to_string(*builder), w);
|
add_build_string(builder_to_string(*builder), w);
|
||||||
@@ -368,6 +382,7 @@ generate_code :: (w: Workspace) {
|
|||||||
|
|
||||||
generated_code := false;
|
generated_code := false;
|
||||||
entity_type_names: [..] string;
|
entity_type_names: [..] string;
|
||||||
|
new_entity_procs: [..] string;
|
||||||
|
|
||||||
// INSERTION_STRING represents the code we want to add to the target program.
|
// INSERTION_STRING represents the code we want to add to the target program.
|
||||||
// We'll use print to insert useful things where the % markers are.
|
// We'll use print to insert useful things where the % markers are.
|
||||||
|
|||||||
Reference in New Issue
Block a user