Scene loading/saving improvements, transform gizmo, entity creation

This commit is contained in:
2024-10-19 19:45:04 +02:00
parent fae8ea7cba
commit 3d98ba0023
15 changed files with 985 additions and 460 deletions

View File

@@ -13,6 +13,32 @@ GAME_NAME :: "OCT24";
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:248.
//
init_scene :: (scene: *Scene) {
scene.by_type._Block.allocator = scene.allocator;scene.by_type._Character.allocator = scene.allocator;scene.by_type._Item.allocator = scene.allocator;
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:260.
//
editor_ui_entity_creation :: () -> *Entity {
if ui_clickable_label("New Block") return new_block();if ui_clickable_label("New Character") return new_character();if ui_clickable_label("New Item") return new_item();
return null;
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:271.
//
delete_entity :: (e: *Entity) {
if e.type == {
case Block; bucket_array_remove(*e.scene.by_type._Block, e._locator); case Character; bucket_array_remove(*e.scene.by_type._Character, e._locator); case Item; bucket_array_remove(*e.scene.by_type._Item, e._locator);
}
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:282.
//
serialize_entity :: (e: *Entity, path: string) {
builder: String_Builder;
builder.allocator = temp;
@@ -28,9 +54,9 @@ serialize_entity :: (e: *Entity, path: string) {
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:259.
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:293.
//
deserialize_entity :: (scene: *Scene, path: string) -> *Entity {
deserialize_entity :: (scene: *Scene, id: Entity_Id, path: string) -> *Entity {
content := File.read_entire_file(path);
if content.count == 0 return null;
@@ -44,9 +70,9 @@ deserialize_entity :: (scene: *Scene, path: string) -> *Entity {
type := trim(first_line[1], " \n\r");
if type == {
case "Block"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Block); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Block)e); update_matrix(*e.transform);
case "Character"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Character); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Character)e); update_matrix(*e.transform);
case "Item"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Item); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*Item)e); update_matrix(*e.transform);
case "Block"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Block); p._locator = locator; e = p; register_entity(scene, p, id); init_entity(p); deserialize_entity(scene, lines, cast(*Block)e); update_matrix(*e.transform);
case "Character"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Character); p._locator = locator; e = p; register_entity(scene, p, id); init_entity(p); deserialize_entity(scene, lines, cast(*Character)e); update_matrix(*e.transform);
case "Item"; p, locator := find_and_occupy_empty_slot(*scene.by_type._Item); p._locator = locator; e = p; register_entity(scene, p, id); init_entity(p); deserialize_entity(scene, lines, cast(*Item)e); update_matrix(*e.transform);
}
@@ -54,7 +80,7 @@ deserialize_entity :: (scene: *Scene, path: string) -> *Entity {
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:268.
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:303.
//
new_block :: (scene: *Scene = null) -> *Block { _scene := scene;
if _scene == null {
@@ -70,70 +96,7 @@ _scene = engine.current_scene; }
p, locator := find_and_occupy_empty_slot(*_scene.by_type._Item); p._locator = locator; register_entity(_scene, p); p.transform = create_identity_transform(); init_entity(p); return p; }
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
//
serialize_entity :: (e: *Item, builder: *String_Builder) {
print_to_builder(builder, "type: Item\n");
print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled);
print_to_builder(builder, "entity.flags: %\n", e.entity.flags);
print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x);
print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y);
print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z);
print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x);
print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y);
print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z);
print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w);
print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x);
print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y);
print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z);
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
//
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Item) {
for line: lines {
values := split(line, ":");
if values.count == 2 {
if trim(values[0], " ") == {
case "entity.enabled";
scan2(values[1], "%", *e.entity.enabled);
case "entity.transform.position.x";
scan2(values[1], "%", *e.entity.transform.position.x);
case "entity.transform.position.y";
scan2(values[1], "%", *e.entity.transform.position.y);
case "entity.transform.position.z";
scan2(values[1], "%", *e.entity.transform.position.z);
case "entity.transform.orientation.x";
scan2(values[1], "%", *e.entity.transform.orientation.x);
case "entity.transform.orientation.y";
scan2(values[1], "%", *e.entity.transform.orientation.y);
case "entity.transform.orientation.z";
scan2(values[1], "%", *e.entity.transform.orientation.z);
case "entity.transform.orientation.w";
scan2(values[1], "%", *e.entity.transform.orientation.w);
case "entity.transform.scale.x";
scan2(values[1], "%", *e.entity.transform.scale.x);
case "entity.transform.scale.y";
scan2(values[1], "%", *e.entity.transform.scale.y);
case "entity.transform.scale.z";
scan2(values[1], "%", *e.entity.transform.scale.z);
case "entity.snap_offset.x";
scan2(values[1], "%", *e.entity.snap_offset.x);
case "entity.snap_offset.y";
scan2(values[1], "%", *e.entity.snap_offset.y);
case "entity.snap_offset.z";
scan2(values[1], "%", *e.entity.snap_offset.z);
}
}
}
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307.
//
serialize_entity :: (e: *Block, builder: *String_Builder) {
print_to_builder(builder, "type: Block\n");
@@ -152,12 +115,15 @@ serialize_entity :: (e: *Block, builder: *String_Builder) {
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
print_to_builder(builder, "entity.snap_intervals.x: %\n", e.entity.snap_intervals.x);
print_to_builder(builder, "entity.snap_intervals.y: %\n", e.entity.snap_intervals.y);
print_to_builder(builder, "entity.snap_intervals.z: %\n", e.entity.snap_intervals.z);
print_to_builder(builder, "block_type: %\n", e.block_type);
print_to_builder(builder, "debug_id: %\n", e.debug_id);
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307.
//
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) {
for line: lines {
@@ -192,6 +158,12 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) {
scan2(values[1], "%", *e.entity.snap_offset.y);
case "entity.snap_offset.z";
scan2(values[1], "%", *e.entity.snap_offset.z);
case "entity.snap_intervals.x";
scan2(values[1], "%", *e.entity.snap_intervals.x);
case "entity.snap_intervals.y";
scan2(values[1], "%", *e.entity.snap_intervals.y);
case "entity.snap_intervals.z";
scan2(values[1], "%", *e.entity.snap_intervals.z);
case "debug_id";
scan2(values[1], "%", *e.debug_id);
}
@@ -200,7 +172,7 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) {
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307.
//
serialize_entity :: (e: *Character, builder: *String_Builder) {
print_to_builder(builder, "type: Character\n");
@@ -219,6 +191,9 @@ serialize_entity :: (e: *Character, builder: *String_Builder) {
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
print_to_builder(builder, "entity.snap_intervals.x: %\n", e.entity.snap_intervals.x);
print_to_builder(builder, "entity.snap_intervals.y: %\n", e.entity.snap_intervals.y);
print_to_builder(builder, "entity.snap_intervals.z: %\n", e.entity.snap_intervals.z);
print_to_builder(builder, "look_direction.x: %\n", e.look_direction.x);
print_to_builder(builder, "look_direction.y: %\n", e.look_direction.y);
print_to_builder(builder, "look_direction.z: %\n", e.look_direction.z);
@@ -236,7 +211,7 @@ serialize_entity :: (e: *Character, builder: *String_Builder) {
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:272.
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307.
//
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) {
for line: lines {
@@ -271,6 +246,12 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) {
scan2(values[1], "%", *e.entity.snap_offset.y);
case "entity.snap_offset.z";
scan2(values[1], "%", *e.entity.snap_offset.z);
case "entity.snap_intervals.x";
scan2(values[1], "%", *e.entity.snap_intervals.x);
case "entity.snap_intervals.y";
scan2(values[1], "%", *e.entity.snap_intervals.y);
case "entity.snap_intervals.z";
scan2(values[1], "%", *e.entity.snap_intervals.z);
case "look_direction.x";
scan2(values[1], "%", *e.look_direction.x);
case "look_direction.y";
@@ -305,7 +286,79 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) {
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:280.
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307.
//
serialize_entity :: (e: *Item, builder: *String_Builder) {
print_to_builder(builder, "type: Item\n");
print_to_builder(builder, "entity.enabled: %\n", e.entity.enabled);
print_to_builder(builder, "entity.flags: %\n", e.entity.flags);
print_to_builder(builder, "entity.transform.position.x: %\n", e.entity.transform.position.x);
print_to_builder(builder, "entity.transform.position.y: %\n", e.entity.transform.position.y);
print_to_builder(builder, "entity.transform.position.z: %\n", e.entity.transform.position.z);
print_to_builder(builder, "entity.transform.orientation.x: %\n", e.entity.transform.orientation.x);
print_to_builder(builder, "entity.transform.orientation.y: %\n", e.entity.transform.orientation.y);
print_to_builder(builder, "entity.transform.orientation.z: %\n", e.entity.transform.orientation.z);
print_to_builder(builder, "entity.transform.orientation.w: %\n", e.entity.transform.orientation.w);
print_to_builder(builder, "entity.transform.scale.x: %\n", e.entity.transform.scale.x);
print_to_builder(builder, "entity.transform.scale.y: %\n", e.entity.transform.scale.y);
print_to_builder(builder, "entity.transform.scale.z: %\n", e.entity.transform.scale.z);
print_to_builder(builder, "entity.snap_offset.x: %\n", e.entity.snap_offset.x);
print_to_builder(builder, "entity.snap_offset.y: %\n", e.entity.snap_offset.y);
print_to_builder(builder, "entity.snap_offset.z: %\n", e.entity.snap_offset.z);
print_to_builder(builder, "entity.snap_intervals.x: %\n", e.entity.snap_intervals.x);
print_to_builder(builder, "entity.snap_intervals.y: %\n", e.entity.snap_intervals.y);
print_to_builder(builder, "entity.snap_intervals.z: %\n", e.entity.snap_intervals.z);
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307.
//
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Item) {
for line: lines {
values := split(line, ":");
if values.count == 2 {
if trim(values[0], " ") == {
case "entity.enabled";
scan2(values[1], "%", *e.entity.enabled);
case "entity.transform.position.x";
scan2(values[1], "%", *e.entity.transform.position.x);
case "entity.transform.position.y";
scan2(values[1], "%", *e.entity.transform.position.y);
case "entity.transform.position.z";
scan2(values[1], "%", *e.entity.transform.position.z);
case "entity.transform.orientation.x";
scan2(values[1], "%", *e.entity.transform.orientation.x);
case "entity.transform.orientation.y";
scan2(values[1], "%", *e.entity.transform.orientation.y);
case "entity.transform.orientation.z";
scan2(values[1], "%", *e.entity.transform.orientation.z);
case "entity.transform.orientation.w";
scan2(values[1], "%", *e.entity.transform.orientation.w);
case "entity.transform.scale.x";
scan2(values[1], "%", *e.entity.transform.scale.x);
case "entity.transform.scale.y";
scan2(values[1], "%", *e.entity.transform.scale.y);
case "entity.transform.scale.z";
scan2(values[1], "%", *e.entity.transform.scale.z);
case "entity.snap_offset.x";
scan2(values[1], "%", *e.entity.snap_offset.x);
case "entity.snap_offset.y";
scan2(values[1], "%", *e.entity.snap_offset.y);
case "entity.snap_offset.z";
scan2(values[1], "%", *e.entity.snap_offset.z);
case "entity.snap_intervals.x";
scan2(values[1], "%", *e.entity.snap_intervals.x);
case "entity.snap_intervals.y";
scan2(values[1], "%", *e.entity.snap_intervals.y);
case "entity.snap_intervals.z";
scan2(values[1], "%", *e.entity.snap_intervals.z);
}
}
}
}
//
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:315.
//
// NUM_ENTITY_TYPES tells the target program how many entity types there are.