Scene loading/saving improvements, transform gizmo, entity creation
This commit is contained in:
@@ -13,6 +13,32 @@ GAME_NAME :: "OCT24";
|
|||||||
//
|
//
|
||||||
// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:248.
|
// 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) {
|
serialize_entity :: (e: *Entity, path: string) {
|
||||||
builder: String_Builder;
|
builder: String_Builder;
|
||||||
builder.allocator = temp;
|
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);
|
content := File.read_entire_file(path);
|
||||||
if content.count == 0 return null;
|
if content.count == 0 return null;
|
||||||
|
|
||||||
@@ -44,9 +70,9 @@ deserialize_entity :: (scene: *Scene, path: string) -> *Entity {
|
|||||||
type := trim(first_line[1], " \n\r");
|
type := trim(first_line[1], " \n\r");
|
||||||
|
|
||||||
if type == {
|
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 "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); init_entity(p); deserialize_entity(scene, lines, cast(*Character)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); init_entity(p); deserialize_entity(scene, lines, cast(*Item)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;
|
new_block :: (scene: *Scene = null) -> *Block { _scene := scene;
|
||||||
if _scene == null {
|
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; }
|
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.
|
// 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);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// 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.
|
|
||||||
//
|
//
|
||||||
serialize_entity :: (e: *Block, builder: *String_Builder) {
|
serialize_entity :: (e: *Block, builder: *String_Builder) {
|
||||||
print_to_builder(builder, "type: Block\n");
|
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.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.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_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, "block_type: %\n", e.block_type);
|
||||||
print_to_builder(builder, "debug_id: %\n", e.debug_id);
|
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) {
|
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) {
|
||||||
for line: lines {
|
for line: lines {
|
||||||
@@ -192,6 +158,12 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) {
|
|||||||
scan2(values[1], "%", *e.entity.snap_offset.y);
|
scan2(values[1], "%", *e.entity.snap_offset.y);
|
||||||
case "entity.snap_offset.z";
|
case "entity.snap_offset.z";
|
||||||
scan2(values[1], "%", *e.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";
|
case "debug_id";
|
||||||
scan2(values[1], "%", *e.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) {
|
serialize_entity :: (e: *Character, builder: *String_Builder) {
|
||||||
print_to_builder(builder, "type: Character\n");
|
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.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.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_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.x: %\n", e.look_direction.x);
|
||||||
print_to_builder(builder, "look_direction.y: %\n", e.look_direction.y);
|
print_to_builder(builder, "look_direction.y: %\n", e.look_direction.y);
|
||||||
print_to_builder(builder, "look_direction.z: %\n", e.look_direction.z);
|
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) {
|
deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) {
|
||||||
for line: lines {
|
for line: lines {
|
||||||
@@ -271,6 +246,12 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) {
|
|||||||
scan2(values[1], "%", *e.entity.snap_offset.y);
|
scan2(values[1], "%", *e.entity.snap_offset.y);
|
||||||
case "entity.snap_offset.z";
|
case "entity.snap_offset.z";
|
||||||
scan2(values[1], "%", *e.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";
|
case "look_direction.x";
|
||||||
scan2(values[1], "%", *e.look_direction.x);
|
scan2(values[1], "%", *e.look_direction.x);
|
||||||
case "look_direction.y";
|
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.
|
// NUM_ENTITY_TYPES tells the target program how many entity types there are.
|
||||||
|
|||||||
BIN
assets/models/rotation_gizmo.fbx
Normal file
BIN
assets/models/rotation_gizmo.fbx
Normal file
Binary file not shown.
BIN
assets/models/scale_gizmo.fbx
Normal file
BIN
assets/models/scale_gizmo.fbx
Normal file
Binary file not shown.
BIN
assets/models/translation_arrow.fbx
Normal file
BIN
assets/models/translation_arrow.fbx
Normal file
Binary file not shown.
BIN
assets/textures/ui_icons/play.png
Normal file
BIN
assets/textures/ui_icons/play.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 5.5 KiB |
BIN
assets/textures/ui_icons/stop.png
Normal file
BIN
assets/textures/ui_icons/stop.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 2.8 KiB |
@@ -1,6 +1,6 @@
|
|||||||
Entity_Id :: #type, isa s64;
|
Entity_Id :: #type, isa s64;
|
||||||
|
|
||||||
Entity_Flags :: enum_flags u8 {
|
Entity_Flags :: enum_flags u16 {
|
||||||
NONE;
|
NONE;
|
||||||
RENDERABLE;
|
RENDERABLE;
|
||||||
COLLISION;
|
COLLISION;
|
||||||
@@ -10,6 +10,9 @@ Entity_Flags :: enum_flags u8 {
|
|||||||
|
|
||||||
ANIMATED;
|
ANIMATED;
|
||||||
|
|
||||||
|
SNAP_TO_GRID;
|
||||||
|
UNIFORM_SCALE;
|
||||||
|
|
||||||
DONT_SAVE;
|
DONT_SAVE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -66,6 +69,7 @@ Entity :: struct {
|
|||||||
transform: Transform;
|
transform: Transform;
|
||||||
|
|
||||||
snap_offset: Vector3;
|
snap_offset: Vector3;
|
||||||
|
snap_intervals: Vector3;
|
||||||
|
|
||||||
renderable: Renderable; @DontSerialize
|
renderable: Renderable; @DontSerialize
|
||||||
animator: Animator; @DontSerialize
|
animator: Animator; @DontSerialize
|
||||||
@@ -182,9 +186,8 @@ destroy_entity :: (e: *Entity, remove_from_scene: bool = true) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if remove_from_scene {
|
if remove_from_scene {
|
||||||
array_unordered_remove_by_value(*game_state.engine.current_scene.entities, e);
|
array_unordered_remove_by_value(*engine.current_scene.entities, e);
|
||||||
if e.type == {
|
|
||||||
case Block; bucket_array_remove(*game_state.engine.current_scene.by_type._Block, e._locator);
|
delete_entity(e);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
#load "../renderer/directional_light.jai";
|
#load "../renderer/directional_light.jai";
|
||||||
#load "particles.jai";
|
#load "particles.jai";
|
||||||
|
|
||||||
|
#placeholder init_scene;
|
||||||
#placeholder Entity_Storage;
|
#placeholder Entity_Storage;
|
||||||
|
#placeholder delete_entity;
|
||||||
#placeholder serialize_entity;
|
#placeholder serialize_entity;
|
||||||
#placeholder deserialize_entity;
|
#placeholder deserialize_entity;
|
||||||
|
|
||||||
@@ -26,7 +28,7 @@ Scene :: struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
Entity_File_Info :: struct {
|
Entity_File_Info :: struct {
|
||||||
id: s64;
|
id: Entity_Id;
|
||||||
full_path: string;
|
full_path: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -38,28 +40,40 @@ visitor :: (info : *File_Visit_Info, files: *[..] Entity_File_Info) {
|
|||||||
// Entity text files
|
// Entity text files
|
||||||
if ext == "ent" && basename != "cam" {
|
if ext == "ent" && basename != "cam" {
|
||||||
file_info : Entity_File_Info;
|
file_info : Entity_File_Info;
|
||||||
file_info.id = cast(s32)string_to_int(basename);
|
file_info.id = cast(Entity_Id)string_to_int(basename);
|
||||||
file_info.full_path = copy_temporary_string(info.full_name);
|
file_info.full_path = copy_temporary_string(info.full_name);
|
||||||
array_add(files, file_info);
|
array_add(files, file_info);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
load_scene :: (path: string) -> *Scene {
|
load_scene :: (name: string) -> *Scene {
|
||||||
split_path := split(path, "/");
|
|
||||||
name := split_path[split_path.count-1];
|
|
||||||
scene := create_scene(name, 1024);
|
scene := create_scene(name, 1024);
|
||||||
|
path := tprint("../assets/scenes/%", name);
|
||||||
|
|
||||||
files : [..] Entity_File_Info;
|
files : [..] Entity_File_Info;
|
||||||
files.allocator = temp;
|
files.allocator = temp;
|
||||||
visit_files(path, true, *files, visitor);
|
visit_files(path, true, *files, visitor);
|
||||||
|
|
||||||
for file: files {
|
for file: files {
|
||||||
deserialize_entity(scene, file.full_path);
|
deserialize_entity(scene, file.id, file.full_path);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
calculate_aabbs(scene);
|
||||||
|
make_sure_nothing_collides(scene);
|
||||||
|
|
||||||
|
if engine.procs.on_scene_loaded != null {
|
||||||
|
engine.procs.on_scene_loaded(scene, engine.mode);
|
||||||
}
|
}
|
||||||
|
|
||||||
return scene;
|
return scene;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
save_scene :: (scene: *Scene) {
|
||||||
|
path := "../assets/scenes/";
|
||||||
|
save_scene(scene, path);
|
||||||
|
}
|
||||||
|
|
||||||
save_scene :: (scene: *Scene, path: string) {
|
save_scene :: (scene: *Scene, path: string) {
|
||||||
builder : String_Builder;
|
builder : String_Builder;
|
||||||
builder.allocator = temp;
|
builder.allocator = temp;
|
||||||
@@ -85,10 +99,17 @@ unload_scene :: (scene: *Scene) {
|
|||||||
destroy_entity(e, false);
|
destroy_entity(e, false);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
free(scene.name);
|
||||||
fini(*scene.pool);
|
fini(*scene.pool);
|
||||||
free(scene);
|
free(scene);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
reload_scene :: (scene: *Scene) {
|
||||||
|
name := copy_temporary_string(scene.name);
|
||||||
|
unload_scene(engine.current_scene);
|
||||||
|
engine.current_scene = load_scene(name);
|
||||||
|
}
|
||||||
|
|
||||||
create_scene :: (name: string = "", max_entities: s64 = 256) -> *Scene {
|
create_scene :: (name: string = "", max_entities: s64 = 256) -> *Scene {
|
||||||
scene := New(Scene);
|
scene := New(Scene);
|
||||||
new_name := name;
|
new_name := name;
|
||||||
@@ -112,6 +133,8 @@ create_scene :: (name: string = "", max_entities: s64 = 256) -> *Scene {
|
|||||||
scene.allocator.data = *scene.pool;
|
scene.allocator.data = *scene.pool;
|
||||||
scene.allocator.proc = flat_pool_allocator_proc;
|
scene.allocator.proc = flat_pool_allocator_proc;
|
||||||
|
|
||||||
|
init_scene(scene);
|
||||||
|
|
||||||
// Assign allocator to everything that needs allocations
|
// Assign allocator to everything that needs allocations
|
||||||
scene.entities.allocator = scene.allocator;
|
scene.entities.allocator = scene.allocator;
|
||||||
scene.particle_systems.allocator = scene.allocator;
|
scene.particle_systems.allocator = scene.allocator;
|
||||||
@@ -129,11 +152,15 @@ create_scene :: (name: string = "", max_entities: s64 = 256) -> *Scene {
|
|||||||
return scene;
|
return scene;
|
||||||
}
|
}
|
||||||
|
|
||||||
register_entity :: (scene: *Scene, entity: *Entity) {
|
register_entity :: (scene: *Scene, entity: *Entity, id: Entity_Id = -1) {
|
||||||
entity.scene = scene;
|
entity.scene = scene;
|
||||||
entity.id = next_entity_id;
|
if id != -1 {
|
||||||
|
entity.id = id;
|
||||||
|
} else {
|
||||||
|
entity.id = next_entity_id;
|
||||||
|
next_entity_id += 1;
|
||||||
|
}
|
||||||
array_add(*scene.entities, entity);
|
array_add(*scene.entities, entity);
|
||||||
next_entity_id += 1;
|
|
||||||
|
|
||||||
#if NETWORKING {
|
#if NETWORKING {
|
||||||
if net_data.net_mode == {
|
if net_data.net_mode == {
|
||||||
|
|||||||
@@ -55,6 +55,8 @@ Transform_Gizmo :: struct {
|
|||||||
color_forward_buffer: Buffer_Handle;
|
color_forward_buffer: Buffer_Handle;
|
||||||
color_right_buffer: Buffer_Handle;
|
color_right_buffer: Buffer_Handle;
|
||||||
|
|
||||||
|
pipeline: Pipeline_State_Handle;
|
||||||
|
|
||||||
uniform_gizmo_scale: float;
|
uniform_gizmo_scale: float;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -69,312 +71,610 @@ Editor :: struct {
|
|||||||
last_right_mouse_click_time: float;
|
last_right_mouse_click_time: float;
|
||||||
|
|
||||||
menu_position: Vector2;
|
menu_position: Vector2;
|
||||||
|
|
||||||
|
icons : struct {
|
||||||
|
play: Texture_Handle;
|
||||||
|
stop: Texture_Handle;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
init_editor :: () {
|
init_editor :: () {
|
||||||
aspect_ratio := cast(float)engine.renderer.render_target_width / cast(float)engine.renderer.render_target_height;
|
aspect_ratio := cast(float)engine.renderer.render_target_width / cast(float)engine.renderer.render_target_height;
|
||||||
engine.editor.camera = create_perspective_camera(.{0, 10, -10}, yaw=0, pitch=-40, roll=0.0, fov=40, aspect=aspect_ratio);
|
engine.editor.camera = create_perspective_camera(.{0, 10, -10}, yaw=0, pitch=-40, roll=0.0, fov=40, aspect=aspect_ratio);
|
||||||
|
|
||||||
|
init_transform_gizmo();
|
||||||
|
|
||||||
|
engine.editor.icons.play = create_texture(engine.renderer, "../modules/Coven/assets/textures/ui_icons/play.png", false);
|
||||||
|
engine.editor.icons.stop = create_texture(engine.renderer, "../modules/Coven/assets/textures/ui_icons/stop.png", false);
|
||||||
|
}
|
||||||
|
|
||||||
|
init_transform_gizmo :: () {
|
||||||
|
gizmo : Transform_Gizmo;
|
||||||
|
gizmo.selected_axis = .NONE;
|
||||||
|
gizmo.transform = create_identity_transform();
|
||||||
|
|
||||||
|
gizmo.center_model_buffer = create_constant_buffer(engine.renderer, null, size_of(Matrix4), mappable=true);
|
||||||
|
gizmo.up_model_buffer = create_constant_buffer(engine.renderer, null, size_of(Matrix4), mappable=true);
|
||||||
|
gizmo.forward_model_buffer = create_constant_buffer(engine.renderer, null, size_of(Matrix4), mappable=true);
|
||||||
|
gizmo.right_model_buffer = create_constant_buffer(engine.renderer, null, size_of(Matrix4), mappable=true);
|
||||||
|
|
||||||
|
gizmo.color_center = Color.{1,1,1,1};
|
||||||
|
gizmo.color_up = Color.{0,1,0,1};
|
||||||
|
gizmo.color_forward = Color.{0,0,1,1};
|
||||||
|
gizmo.color_right = Color.{1,0,0,1};
|
||||||
|
|
||||||
|
gizmo.color_center_buffer = create_constant_buffer(engine.renderer, *gizmo.color_center, size_of(Vector4), mappable=true);
|
||||||
|
gizmo.color_up_buffer = create_constant_buffer(engine.renderer, *gizmo.color_up, size_of(Vector4), mappable=true);
|
||||||
|
gizmo.color_forward_buffer = create_constant_buffer(engine.renderer, *gizmo.color_forward, size_of(Vector4), mappable=true);
|
||||||
|
gizmo.color_right_buffer = create_constant_buffer(engine.renderer, *gizmo.color_right, size_of(Vector4), mappable=true);
|
||||||
|
|
||||||
|
engine.editor.transform_gizmo = gizmo;
|
||||||
|
|
||||||
|
// Transform gizmo shader
|
||||||
|
{
|
||||||
|
vs := create_vertex_shader_from_source(engine.renderer, TRANSFORM_GIZMO_SHADER, "VS", mesh_data_types = .[.POSITION]);
|
||||||
|
ps := create_pixel_shader_from_source(engine.renderer, TRANSFORM_GIZMO_SHADER, "PS");
|
||||||
|
|
||||||
|
engine.editor.transform_gizmo.pipeline = create_pipeline_state2(engine.renderer, vs, ps, blend_type=.OPAQUE);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
update_transform_gizmo :: (ray: Ray, mouse_position: Vector2) -> bool {
|
update_transform_gizmo :: (ray: Ray, mouse_position: Vector2) -> bool {
|
||||||
return false;
|
if engine.editor.selected_entities.count != 1 return false;
|
||||||
// selected_entity := engine.editor.selected_entity;
|
|
||||||
//
|
selected_entity := engine.editor.selected_entities[0];
|
||||||
// if key_down(.TAB) {
|
|
||||||
// if engine.editor.transform_gizmo.space == {
|
if key_down(.TAB) {
|
||||||
// case .WORLD;
|
if engine.editor.transform_gizmo.space == {
|
||||||
// engine.editor.transform_gizmo.space = .LOCAL;
|
case .WORLD;
|
||||||
// case .LOCAL;
|
engine.editor.transform_gizmo.space = .LOCAL;
|
||||||
// engine.editor.transform_gizmo.space = .WORLD;
|
case .LOCAL;
|
||||||
// }
|
engine.editor.transform_gizmo.space = .WORLD;
|
||||||
// }
|
}
|
||||||
//
|
}
|
||||||
// if engine.editor.transform_gizmo.space == {
|
|
||||||
// case .WORLD;
|
if engine.editor.transform_gizmo.space == {
|
||||||
// set_rotation(*engine.editor.transform_gizmo.transform, .{0,0,0,1});
|
case .WORLD;
|
||||||
// case .LOCAL;
|
set_rotation(*engine.editor.transform_gizmo.transform, .{0,0,0,1});
|
||||||
// set_rotation(*engine.editor.transform_gizmo.transform, selected_entity.transform.orientation);
|
case .LOCAL;
|
||||||
// }
|
set_rotation(*engine.editor.transform_gizmo.transform, selected_entity.transform.orientation);
|
||||||
//
|
}
|
||||||
// if engine.editor.transform_gizmo.transform_type == {
|
|
||||||
// case .TRANSLATION;
|
if engine.editor.transform_gizmo.transform_type == {
|
||||||
// if !key_pressed(.MOUSE_LEFT) {
|
case .TRANSLATION;
|
||||||
// selected_axis, t := intersect_translation_gizmo(ray);
|
if !key_pressed(.MOUSE_LEFT) {
|
||||||
// engine.editor.transform_gizmo.selected_axis = selected_axis;
|
selected_axis, t := intersect_translation_gizmo(ray);
|
||||||
// } else if engine.editor.transform_gizmo.can_use && engine.editor.transform_gizmo.selected_axis != .NONE {
|
engine.editor.transform_gizmo.selected_axis = selected_axis;
|
||||||
// first_update := key_down(.MOUSE_LEFT);
|
} else if engine.editor.transform_gizmo.can_use && engine.editor.transform_gizmo.selected_axis != .NONE {
|
||||||
//
|
first_update := key_down(.MOUSE_LEFT);
|
||||||
// if first_update {
|
|
||||||
// engine.editor.transform_gizmo.actual_entity_position = selected_entity.transform.position;
|
if first_update {
|
||||||
// }
|
engine.editor.transform_gizmo.actual_entity_position = selected_entity.transform.position;
|
||||||
//
|
}
|
||||||
// // Move the currently selected entity along the selected axis
|
|
||||||
// axis_vec : Vector3;
|
// Move the currently selected entity along the selected axis
|
||||||
//
|
axis_vec : Vector3;
|
||||||
// if engine.editor.transform_gizmo.selected_axis == {
|
|
||||||
// case .UP;
|
if engine.editor.transform_gizmo.selected_axis == {
|
||||||
// axis_vec.y = 1;
|
case .UP;
|
||||||
// case .FORWARD;
|
axis_vec.y = 1;
|
||||||
// axis_vec.z = 1;
|
case .FORWARD;
|
||||||
// case .RIGHT;
|
axis_vec.z = 1;
|
||||||
// axis_vec.x = 1;
|
case .RIGHT;
|
||||||
// }
|
axis_vec.x = 1;
|
||||||
//
|
}
|
||||||
// r1 : Ray;
|
|
||||||
// r1.origin = selected_entity.transform.position;
|
r1 : Ray;
|
||||||
// r1.direction = rotate(axis_vec, engine.editor.transform_gizmo.transform.orientation);
|
r1.origin = selected_entity.transform.position;
|
||||||
//
|
r1.direction = rotate(axis_vec, engine.editor.transform_gizmo.transform.orientation);
|
||||||
// r2 := normalized_screen_to_ray_v2(*engine.editor.camera, mouse_position);
|
|
||||||
//
|
r2 := normalized_screen_to_ray_v2(*engine.editor.camera, mouse_position);
|
||||||
// d, t1, t2 := closest_distance_between_rays(r1, r2);
|
|
||||||
//
|
d, t1, t2 := closest_distance_between_rays(r1, r2);
|
||||||
// new_position := r1.origin + r1.direction * t1;
|
|
||||||
//
|
new_position := r1.origin + r1.direction * t1;
|
||||||
// if first_update {
|
|
||||||
// engine.editor.transform_gizmo.first_hit_position = new_position;
|
if first_update {
|
||||||
// }
|
engine.editor.transform_gizmo.first_hit_position = new_position;
|
||||||
//
|
}
|
||||||
// position_change := new_position - engine.editor.transform_gizmo.first_hit_position;
|
|
||||||
//
|
position_change := new_position - engine.editor.transform_gizmo.first_hit_position;
|
||||||
// entity_position := engine.editor.transform_gizmo.actual_entity_position + position_change;
|
|
||||||
//
|
entity_position := engine.editor.transform_gizmo.actual_entity_position + position_change;
|
||||||
// if selected_entity.flags & Entity_Flags.SNAP_TO_GRID {
|
|
||||||
// entity_position.x -= fmod_cycling(entity_position.x - selected_entity.snap_offset.x, selected_entity.snap_intervals.x);// + selected_entity.snap_offset.x;
|
if selected_entity.flags & Entity_Flags.SNAP_TO_GRID {
|
||||||
// entity_position.y -= fmod_cycling(entity_position.y - selected_entity.snap_offset.y, selected_entity.snap_intervals.y);// + selected_entity.snap_offset.y;
|
entity_position.x -= fmod_cycling(entity_position.x - selected_entity.snap_offset.x, selected_entity.snap_intervals.x);// + selected_entity.snap_offset.x;
|
||||||
// entity_position.z -= fmod_cycling(entity_position.z - selected_entity.snap_offset.z, selected_entity.snap_intervals.z);// + selected_entity.snap_offset.z;
|
entity_position.y -= fmod_cycling(entity_position.y - selected_entity.snap_offset.y, selected_entity.snap_intervals.y);// + selected_entity.snap_offset.y;
|
||||||
// }
|
entity_position.z -= fmod_cycling(entity_position.z - selected_entity.snap_offset.z, selected_entity.snap_intervals.z);// + selected_entity.snap_offset.z;
|
||||||
//
|
}
|
||||||
// selected_entity.transform.position = entity_position;
|
|
||||||
// set_position(*engine.editor.transform_gizmo.transform, entity_position);
|
selected_entity.transform.position = entity_position;
|
||||||
// }
|
selected_entity.transform.dirty = true;
|
||||||
//
|
set_position(*engine.editor.transform_gizmo.transform, entity_position);
|
||||||
// color_up := engine.editor.transform_gizmo.color_up;
|
}
|
||||||
// color_forward := engine.editor.transform_gizmo.color_forward;
|
|
||||||
// color_right := engine.editor.transform_gizmo.color_right;
|
color_up := engine.editor.transform_gizmo.color_up;
|
||||||
//
|
color_forward := engine.editor.transform_gizmo.color_forward;
|
||||||
// if engine.editor.transform_gizmo.selected_axis == {
|
color_right := engine.editor.transform_gizmo.color_right;
|
||||||
// case .NONE;
|
|
||||||
// case .UP;
|
if engine.editor.transform_gizmo.selected_axis == {
|
||||||
// color_up = Color.{1,1,0,1};
|
case .NONE;
|
||||||
// case .FORWARD;
|
case .UP;
|
||||||
// color_forward = Color.{1,1,0,1};
|
color_up = Color.{1,1,0,1};
|
||||||
// case .RIGHT;
|
case .FORWARD;
|
||||||
// color_right = Color.{1,1,0,1};
|
color_forward = Color.{1,1,0,1};
|
||||||
// }
|
case .RIGHT;
|
||||||
//
|
color_right = Color.{1,1,0,1};
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_up_buffer, *color_up, size_of(Color));
|
}
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_forward_buffer, *color_forward, size_of(Color));
|
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_right_buffer, *color_right, size_of(Color));
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_up_buffer, *color_up, size_of(Color));
|
||||||
// case .ROTATION;
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_forward_buffer, *color_forward, size_of(Color));
|
||||||
// selected_entity := engine.editor.selected_entity;
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_right_buffer, *color_right, size_of(Color));
|
||||||
//
|
case .ROTATION;
|
||||||
// if !engine.editor.transform_gizmo.clicked {
|
selected_entity := engine.editor.selected_entities[0];
|
||||||
// selected_axis, point := intersect_rotation_gizmo(ray);
|
|
||||||
// engine.editor.transform_gizmo.selected_axis = selected_axis;
|
if !engine.editor.transform_gizmo.clicked {
|
||||||
//
|
selected_axis, point := intersect_rotation_gizmo(ray);
|
||||||
// if engine.editor.transform_gizmo.selected_axis != .NONE && key_down(.MOUSE_LEFT) {
|
engine.editor.transform_gizmo.selected_axis = selected_axis;
|
||||||
// engine.editor.transform_gizmo.clicked = true;
|
|
||||||
// engine.editor.transform_gizmo.last_circle_dir = normalize(point - selected_entity.transform.position);
|
if engine.editor.transform_gizmo.selected_axis != .NONE && key_down(.MOUSE_LEFT) {
|
||||||
// }
|
engine.editor.transform_gizmo.clicked = true;
|
||||||
// } else if !key_pressed(.MOUSE_LEFT) {
|
engine.editor.transform_gizmo.last_circle_dir = normalize(point - selected_entity.transform.position);
|
||||||
// engine.editor.transform_gizmo.clicked = false;
|
}
|
||||||
// } else {
|
} else if !key_pressed(.MOUSE_LEFT) {
|
||||||
// direction : Vector3;
|
engine.editor.transform_gizmo.clicked = false;
|
||||||
// if engine.editor.transform_gizmo.selected_axis == {
|
} else {
|
||||||
// case .UP;
|
direction : Vector3;
|
||||||
// direction = .{0,1,0};
|
if engine.editor.transform_gizmo.selected_axis == {
|
||||||
// case .FORWARD;
|
case .UP;
|
||||||
// direction = .{0,0,1};
|
direction = .{0,1,0};
|
||||||
// case .RIGHT;
|
case .FORWARD;
|
||||||
// direction = .{1,0,0};
|
direction = .{0,0,1};
|
||||||
// }
|
case .RIGHT;
|
||||||
// direction = rotate(direction, engine.editor.transform_gizmo.transform.orientation);
|
direction = .{1,0,0};
|
||||||
//
|
}
|
||||||
// // Find the rotation
|
direction = rotate(direction, engine.editor.transform_gizmo.transform.orientation);
|
||||||
// circle : Circle;
|
|
||||||
// circle.radius = engine.editor.transform_gizmo.uniform_gizmo_scale;
|
// Find the rotation
|
||||||
// circle.center = selected_entity.transform.position;
|
circle : Circle;
|
||||||
// circle.orientation = direction;
|
circle.radius = engine.editor.transform_gizmo.uniform_gizmo_scale;
|
||||||
//
|
circle.center = selected_entity.transform.position;
|
||||||
// distance, point := closest_distance_ray_circle(ray, circle);
|
circle.orientation = direction;
|
||||||
// new_dir := normalize(point - selected_entity.transform.position);
|
|
||||||
//
|
distance, point := closest_distance_ray_circle(ray, circle);
|
||||||
// dotp := dot(engine.editor.transform_gizmo.last_circle_dir, new_dir);
|
new_dir := normalize(point - selected_entity.transform.position);
|
||||||
// angle := acos(clamp(dotp, -1.0, 1.0));
|
|
||||||
// cp := cross(engine.editor.transform_gizmo.last_circle_dir, new_dir);
|
dotp := dot(engine.editor.transform_gizmo.last_circle_dir, new_dir);
|
||||||
//
|
angle := acos(clamp(dotp, -1.0, 1.0));
|
||||||
// if dot(direction, cp) < 0 {
|
cp := cross(engine.editor.transform_gizmo.last_circle_dir, new_dir);
|
||||||
// angle *= -1.0;
|
|
||||||
// }
|
if dot(direction, cp) < 0 {
|
||||||
//
|
angle *= -1.0;
|
||||||
// q : Quaternion;
|
}
|
||||||
// set_from_axis_and_angle(*q, direction, angle);
|
|
||||||
//
|
q : Quaternion;
|
||||||
// selected_entity.transform.orientation = q * selected_entity.transform.orientation;
|
set_from_axis_and_angle(*q, direction, angle);
|
||||||
// update_matrix(*selected_entity.transform);
|
|
||||||
//
|
selected_entity.transform.orientation = q * selected_entity.transform.orientation;
|
||||||
// set_rotation(*engine.editor.transform_gizmo.transform, selected_entity.transform.orientation);
|
update_matrix(*selected_entity.transform);
|
||||||
//
|
|
||||||
// engine.editor.transform_gizmo.last_circle_dir = new_dir;
|
set_rotation(*engine.editor.transform_gizmo.transform, selected_entity.transform.orientation);
|
||||||
// }
|
|
||||||
//
|
engine.editor.transform_gizmo.last_circle_dir = new_dir;
|
||||||
// color_up := engine.editor.transform_gizmo.color_up;
|
}
|
||||||
// color_forward := engine.editor.transform_gizmo.color_forward;
|
|
||||||
// color_right := engine.editor.transform_gizmo.color_right;
|
color_up := engine.editor.transform_gizmo.color_up;
|
||||||
//
|
color_forward := engine.editor.transform_gizmo.color_forward;
|
||||||
// if engine.editor.transform_gizmo.selected_axis == {
|
color_right := engine.editor.transform_gizmo.color_right;
|
||||||
// case .NONE;
|
|
||||||
// case .UP;
|
if engine.editor.transform_gizmo.selected_axis == {
|
||||||
// color_up = Color.{1,1,0,1};
|
case .NONE;
|
||||||
// case .FORWARD;
|
case .UP;
|
||||||
// color_forward = Color.{1,1,0,1};
|
color_up = Color.{1,1,0,1};
|
||||||
// case .RIGHT;
|
case .FORWARD;
|
||||||
// color_right = Color.{1,1,0,1};
|
color_forward = Color.{1,1,0,1};
|
||||||
// }
|
case .RIGHT;
|
||||||
//
|
color_right = Color.{1,1,0,1};
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_up_buffer, *color_up, size_of(Color));
|
}
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_forward_buffer, *color_forward, size_of(Color));
|
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_right_buffer, *color_right, size_of(Color));
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_up_buffer, *color_up, size_of(Color));
|
||||||
// case .SCALE;
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_forward_buffer, *color_forward, size_of(Color));
|
||||||
// if !key_pressed(.MOUSE_LEFT) {
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_right_buffer, *color_right, size_of(Color));
|
||||||
// selected_axis, t := intersect_scale_gizmo(ray);
|
case .SCALE;
|
||||||
// engine.editor.transform_gizmo.selected_axis = selected_axis;
|
if !key_pressed(.MOUSE_LEFT) {
|
||||||
// } else if engine.editor.transform_gizmo.selected_axis != .NONE {
|
selected_axis, t := intersect_scale_gizmo(ray);
|
||||||
// selected_entity := engine.editor.selected_entity;
|
engine.editor.transform_gizmo.selected_axis = selected_axis;
|
||||||
// first_update := key_down(.MOUSE_LEFT);
|
} else if engine.editor.transform_gizmo.selected_axis != .NONE {
|
||||||
//
|
selected_entity := engine.editor.selected_entities[0];
|
||||||
// if first_update {
|
first_update := key_down(.MOUSE_LEFT);
|
||||||
// engine.editor.transform_gizmo.actual_entity_position = selected_entity.transform.position;
|
|
||||||
// engine.editor.transform_gizmo.actual_entity_scale = selected_entity.transform.scale;
|
if first_update {
|
||||||
// }
|
engine.editor.transform_gizmo.actual_entity_position = selected_entity.transform.position;
|
||||||
//
|
engine.editor.transform_gizmo.actual_entity_scale = selected_entity.transform.scale;
|
||||||
// // Move the currently selected entity along the selected axis
|
}
|
||||||
// axis_vec : Vector3;
|
|
||||||
//
|
// Move the currently selected entity along the selected axis
|
||||||
// if engine.editor.transform_gizmo.selected_axis == {
|
axis_vec : Vector3;
|
||||||
// case .UP;
|
|
||||||
// axis_vec.y = 1;
|
if engine.editor.transform_gizmo.selected_axis == {
|
||||||
// case .FORWARD;
|
case .UP;
|
||||||
// axis_vec.z = -1;
|
axis_vec.y = 1;
|
||||||
// case .RIGHT;
|
case .FORWARD;
|
||||||
// axis_vec.x = 1;
|
axis_vec.z = -1;
|
||||||
// case .CENTER; axis_vec = .{1,1,1};
|
case .RIGHT;
|
||||||
// }
|
axis_vec.x = 1;
|
||||||
//
|
case .CENTER; axis_vec = .{1,1,1};
|
||||||
// r1 : Ray;
|
}
|
||||||
// r1.origin = selected_entity.transform.position;
|
|
||||||
// r1.direction = rotate(axis_vec, engine.editor.transform_gizmo.transform.orientation);
|
r1 : Ray;
|
||||||
// // Shoot a ray from screen to world
|
r1.origin = selected_entity.transform.position;
|
||||||
// mouse_position : Vector2;
|
r1.direction = rotate(axis_vec, engine.editor.transform_gizmo.transform.orientation);
|
||||||
// mouse_position.x = xx engine.engine.input.mouse.x;
|
// Shoot a ray from screen to world
|
||||||
// mouse_position.y = xx engine.engine.input.mouse.y;
|
mouse_position : Vector2;
|
||||||
//
|
mouse_position.x = xx engine.input.mouse.x;
|
||||||
// screen_size : Vector2;
|
mouse_position.y = xx engine.input.mouse.y;
|
||||||
// screen_size.x = cast(float)engine.engine.window.width;
|
|
||||||
// screen_size.y = cast(float)engine.engine.window.height;
|
screen_size : Vector2;
|
||||||
//
|
screen_size.x = cast(float)engine.window.width;
|
||||||
// r2 := screen_to_ray_v2(*engine.editor.camera, mouse_position, screen_size);
|
screen_size.y = cast(float)engine.window.height;
|
||||||
//
|
|
||||||
// d, t1, t2 := closest_distance_between_rays(r1, r2);
|
r2 := screen_to_ray_v2(*engine.editor.camera, mouse_position, screen_size);
|
||||||
// new_position := r1.origin + r1.direction * t1;
|
|
||||||
//
|
d, t1, t2 := closest_distance_between_rays(r1, r2);
|
||||||
// if first_update {
|
new_position := r1.origin + r1.direction * t1;
|
||||||
// engine.editor.transform_gizmo.first_hit_position = new_position;
|
|
||||||
// }
|
if first_update {
|
||||||
//
|
engine.editor.transform_gizmo.first_hit_position = new_position;
|
||||||
// position_change := new_position - engine.editor.transform_gizmo.first_hit_position;
|
}
|
||||||
// scale_speed := ifx key_pressed(.SHIFT) then 4.0 else 1.0;
|
|
||||||
//
|
position_change := new_position - engine.editor.transform_gizmo.first_hit_position;
|
||||||
// if selected_entity.uses_uniform_scale {
|
scale_speed := ifx key_pressed(.SHIFT) then 4.0 else 1.0;
|
||||||
// current_scale := selected_entity.transform.scale;
|
|
||||||
//
|
if selected_entity.flags & .UNIFORM_SCALE {
|
||||||
// if engine.editor.transform_gizmo.selected_axis == {
|
current_scale := selected_entity.transform.scale;
|
||||||
// case .UP; {
|
|
||||||
// current_scale.y = engine.editor.transform_gizmo.actual_entity_scale.y + position_change.y * scale_speed;
|
if engine.editor.transform_gizmo.selected_axis == {
|
||||||
// position_change.x = 0;
|
case .UP; {
|
||||||
// position_change.z = 0;
|
current_scale.y = engine.editor.transform_gizmo.actual_entity_scale.y + position_change.y * scale_speed;
|
||||||
// }
|
position_change.x = 0;
|
||||||
// case .FORWARD; {
|
position_change.z = 0;
|
||||||
// current_scale.z = engine.editor.transform_gizmo.actual_entity_scale.z + position_change.z * scale_speed;
|
}
|
||||||
// position_change.x = 0;
|
case .FORWARD; {
|
||||||
// position_change.y = 0;
|
current_scale.z = engine.editor.transform_gizmo.actual_entity_scale.z + position_change.z * scale_speed;
|
||||||
// }
|
position_change.x = 0;
|
||||||
// case .RIGHT; {
|
position_change.y = 0;
|
||||||
// current_scale.x = engine.editor.transform_gizmo.actual_entity_scale.x + position_change.x * scale_speed;
|
}
|
||||||
// position_change.y = 0;
|
case .RIGHT; {
|
||||||
// position_change.z = 0;
|
current_scale.x = engine.editor.transform_gizmo.actual_entity_scale.x + position_change.x * scale_speed;
|
||||||
// }
|
position_change.y = 0;
|
||||||
// case .CENTER; {
|
position_change.z = 0;
|
||||||
// current_scale.x = engine.editor.transform_gizmo.actual_entity_scale.x + position_change.x * scale_speed;
|
}
|
||||||
// current_scale.y = current_scale.x; // @Incomplete: This is most definitely wrong!
|
case .CENTER; {
|
||||||
// current_scale.z = current_scale.x;
|
current_scale.x = engine.editor.transform_gizmo.actual_entity_scale.x + position_change.x * scale_speed;
|
||||||
//
|
current_scale.y = current_scale.x; // @Incomplete: This is most definitely wrong!
|
||||||
// position_change.y = 0;
|
current_scale.z = current_scale.x;
|
||||||
// position_change.z = 0;
|
|
||||||
// }
|
position_change.y = 0;
|
||||||
// }
|
position_change.z = 0;
|
||||||
//
|
}
|
||||||
// set_scale(*selected_entity.transform, current_scale);
|
}
|
||||||
//
|
|
||||||
// } else {
|
set_scale(*selected_entity.transform, current_scale);
|
||||||
// if engine.editor.transform_gizmo.selected_axis == {
|
|
||||||
// case .UP;
|
} else {
|
||||||
// position_change.x = 0;
|
if engine.editor.transform_gizmo.selected_axis == {
|
||||||
// position_change.z = 0;
|
case .UP;
|
||||||
// case .FORWARD;
|
position_change.x = 0;
|
||||||
// position_change.x = 0;
|
position_change.z = 0;
|
||||||
// position_change.y = 0;
|
case .FORWARD;
|
||||||
// case .RIGHT;
|
position_change.x = 0;
|
||||||
// position_change.y = 0;
|
position_change.y = 0;
|
||||||
// position_change.z = 0;
|
case .RIGHT;
|
||||||
// }
|
position_change.y = 0;
|
||||||
//
|
position_change.z = 0;
|
||||||
// entity_scale := engine.editor.transform_gizmo.actual_entity_scale + position_change * scale_speed;
|
}
|
||||||
// set_scale(*selected_entity.transform, entity_scale);
|
|
||||||
// }
|
entity_scale := engine.editor.transform_gizmo.actual_entity_scale + position_change * scale_speed;
|
||||||
// }
|
set_scale(*selected_entity.transform, entity_scale);
|
||||||
//
|
}
|
||||||
// color_up := engine.editor.transform_gizmo.color_up;
|
}
|
||||||
// color_forward := engine.editor.transform_gizmo.color_forward;
|
|
||||||
// color_right := engine.editor.transform_gizmo.color_right;
|
color_up := engine.editor.transform_gizmo.color_up;
|
||||||
// color_center := Color.{1,1,1,1};
|
color_forward := engine.editor.transform_gizmo.color_forward;
|
||||||
//
|
color_right := engine.editor.transform_gizmo.color_right;
|
||||||
// if engine.editor.transform_gizmo.selected_axis == {
|
color_center := Color.{1,1,1,1};
|
||||||
// case .NONE;
|
|
||||||
// case .UP;
|
if engine.editor.transform_gizmo.selected_axis == {
|
||||||
// color_up = Color.{1,1,0,1};
|
case .NONE;
|
||||||
// case .FORWARD;
|
case .UP;
|
||||||
// color_forward = Color.{1,1,0,1};
|
color_up = Color.{1,1,0,1};
|
||||||
// case .RIGHT;
|
case .FORWARD;
|
||||||
// color_right = Color.{1,1,0,1};
|
color_forward = Color.{1,1,0,1};
|
||||||
// case .CENTER;
|
case .RIGHT;
|
||||||
// color_center = Color.{1,1,0,1};
|
color_right = Color.{1,1,0,1};
|
||||||
// }
|
case .CENTER;
|
||||||
//
|
color_center = Color.{1,1,0,1};
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_center_buffer, *color_center, size_of(Color));
|
}
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_up_buffer, *color_up, size_of(Color));
|
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_forward_buffer, *color_forward, size_of(Color));
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_center_buffer, *color_center, size_of(Color));
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_right_buffer, *color_right, size_of(Color));
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_up_buffer, *color_up, size_of(Color));
|
||||||
// }
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_forward_buffer, *color_forward, size_of(Color));
|
||||||
//
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.color_right_buffer, *color_right, size_of(Color));
|
||||||
// return engine.editor.transform_gizmo.selected_axis != .NONE;
|
}
|
||||||
|
|
||||||
|
return engine.editor.transform_gizmo.selected_axis != .NONE;
|
||||||
|
}
|
||||||
|
|
||||||
|
intersect_translation_gizmo :: (ray: Ray) -> Transform_Axis, float {
|
||||||
|
transform := engine.editor.transform_gizmo.transform;
|
||||||
|
origin := transform.position;
|
||||||
|
orientation := transform.orientation;
|
||||||
|
|
||||||
|
up_ray: Ray;
|
||||||
|
up_ray.origin = origin;
|
||||||
|
up_ray.direction = rotate(.{0,1,0}, orientation);
|
||||||
|
right_ray: Ray;
|
||||||
|
right_ray.origin = origin;
|
||||||
|
right_ray.direction = rotate(.{1,0,0}, orientation);
|
||||||
|
forward_ray: Ray;
|
||||||
|
forward_ray.origin = origin;
|
||||||
|
forward_ray.direction = rotate(.{0,0,1}, orientation);
|
||||||
|
|
||||||
|
max_dist :: 0.5;
|
||||||
|
axis : Transform_Axis = .NONE;
|
||||||
|
closest := 100000000.0;
|
||||||
|
t := 0.0;
|
||||||
|
|
||||||
|
GIZMO_LENGTH := 1.3 * engine.editor.transform_gizmo.uniform_gizmo_scale;
|
||||||
|
|
||||||
|
du, tu1, tu2 := closest_distance_between_rays(ray, up_ray);
|
||||||
|
if du <= max_dist && du < closest && tu1 >= 0.0 && tu2 < GIZMO_LENGTH {
|
||||||
|
// Make sure that the point is not behind the gizmo
|
||||||
|
if dot(up_ray.direction, normalize((ray.origin + ray.direction * tu1) - origin)) >= 0.0 {
|
||||||
|
closest = du;
|
||||||
|
t = tu1;
|
||||||
|
axis = .UP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dr, tr1, tr2 := closest_distance_between_rays(ray, right_ray);
|
||||||
|
if dr <= max_dist && dr < closest && tr1 >= 0.0 && tr2 < GIZMO_LENGTH {
|
||||||
|
// Make sure that the point is not behind the gizmo
|
||||||
|
if dot(right_ray.direction, normalize((ray.origin + ray.direction * tr1) - origin)) >= 0.0 {
|
||||||
|
closest = dr;
|
||||||
|
t = tr1;
|
||||||
|
axis = .RIGHT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
df, tf1, tf2 := closest_distance_between_rays(ray, forward_ray);
|
||||||
|
if df <= max_dist && df < closest && tf1 >= 0.0 && tf2 < GIZMO_LENGTH {
|
||||||
|
// Make sure that the point is not behind the gizmo
|
||||||
|
if dot(forward_ray.direction, normalize((ray.origin + ray.direction * tf1) - origin)) >= 0.0 {
|
||||||
|
closest = df;
|
||||||
|
t = tf1;
|
||||||
|
axis = .FORWARD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return axis, t;
|
||||||
|
}
|
||||||
|
|
||||||
|
intersect_scale_gizmo :: (ray: Ray) -> Transform_Axis, float {
|
||||||
|
transform := engine.editor.transform_gizmo.transform;
|
||||||
|
origin := transform.position;
|
||||||
|
orientation := transform.orientation;
|
||||||
|
|
||||||
|
radius := engine.editor.transform_gizmo.uniform_gizmo_scale * 0.15;
|
||||||
|
if ray_sphere_intersect(ray, origin, radius) {
|
||||||
|
return .CENTER, 0.0;
|
||||||
|
}
|
||||||
|
|
||||||
|
up_ray: Ray;
|
||||||
|
up_ray.origin = origin;
|
||||||
|
up_ray.direction = rotate(.{0,1,0}, orientation);
|
||||||
|
right_ray: Ray;
|
||||||
|
right_ray.origin = origin;
|
||||||
|
right_ray.direction = rotate(.{1,0,0}, orientation);
|
||||||
|
forward_ray: Ray;
|
||||||
|
forward_ray.origin = origin;
|
||||||
|
forward_ray.direction = rotate(.{0,0,1}, orientation);
|
||||||
|
|
||||||
|
max_dist :: 0.5;
|
||||||
|
axis : Transform_Axis = .NONE;
|
||||||
|
closest := 100000000.0;
|
||||||
|
t := 0.0;
|
||||||
|
|
||||||
|
du, tu1, tu2 := closest_distance_between_rays(ray, up_ray);
|
||||||
|
if du <= max_dist && du < closest && tu1 >= 0.0 {
|
||||||
|
// Make sure that the point is not behind the gizmo
|
||||||
|
if dot(up_ray.direction, normalize((ray.origin + ray.direction * tu1) - origin)) >= 0.0 {
|
||||||
|
closest = du;
|
||||||
|
t = tu1;
|
||||||
|
axis = .UP;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
dr, tr1, tr2 := closest_distance_between_rays(ray, right_ray);
|
||||||
|
if dr <= max_dist && dr < closest && tr1 >= 0.0 {
|
||||||
|
// Make sure that the point is not behind the gizmo
|
||||||
|
if dot(right_ray.direction, normalize((ray.origin + ray.direction * tr1) - origin)) >= 0.0 {
|
||||||
|
closest = dr;
|
||||||
|
t = tr1;
|
||||||
|
axis = .RIGHT;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
df, tf1, tf2 := closest_distance_between_rays(ray, forward_ray);
|
||||||
|
if df <= max_dist && df < closest && tf1 >= 0.0 {
|
||||||
|
// Make sure that the point is not behind the gizmo
|
||||||
|
if dot(forward_ray.direction, normalize((ray.origin + ray.direction * tf1) - origin)) >= 0.0 {
|
||||||
|
closest = df;
|
||||||
|
t = tf1;
|
||||||
|
axis = .FORWARD;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return axis, t;
|
||||||
|
}
|
||||||
|
|
||||||
|
Circle :: struct {
|
||||||
|
center: Vector3;
|
||||||
|
radius: float;
|
||||||
|
orientation: Vector3;
|
||||||
|
}
|
||||||
|
|
||||||
|
closest_distance_ray_circle :: (r: Ray, c: Circle) -> float, Vector3 {
|
||||||
|
plane_p := c.center;
|
||||||
|
plane_orientation := c.orientation;
|
||||||
|
|
||||||
|
success, t := ray_plane_intersection(r, plane_p, plane_orientation);
|
||||||
|
|
||||||
|
if success {
|
||||||
|
// get the ray's intersection point on the plane which
|
||||||
|
// contains the circle
|
||||||
|
on_plane := r.origin + t * r.direction;
|
||||||
|
// project that point on to the circle's circumference
|
||||||
|
point := c.center + c.radius * normalize(on_plane - c.center);
|
||||||
|
return length(on_plane - point), point;
|
||||||
|
} else {
|
||||||
|
// the required point on the circle is the one closest to the camera origin
|
||||||
|
point := c.radius * normalize(reject(r.origin - c.center, c.orientation));
|
||||||
|
|
||||||
|
return distance_from_ray_to_point(r, point), point;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
intersect_rotation_gizmo :: (ray: Ray) -> Transform_Axis, Vector3 {
|
||||||
|
selected_entity := engine.editor.selected_entities[0];
|
||||||
|
orientation := selected_entity.transform.orientation;
|
||||||
|
|
||||||
|
radius := engine.editor.transform_gizmo.uniform_gizmo_scale;
|
||||||
|
up: Circle;
|
||||||
|
up.radius = radius;
|
||||||
|
up.center = engine.editor.transform_gizmo.transform.position;
|
||||||
|
up.orientation = rotate(.{0,1,0}, orientation);
|
||||||
|
right: Circle;
|
||||||
|
right.radius = radius;
|
||||||
|
right.center = engine.editor.transform_gizmo.transform.position;
|
||||||
|
right.orientation = rotate(.{1,0,0}, orientation);
|
||||||
|
forward: Circle;
|
||||||
|
forward.radius = radius;
|
||||||
|
forward.center = engine.editor.transform_gizmo.transform.position;
|
||||||
|
forward.orientation = rotate(.{0,0,1}, orientation);
|
||||||
|
|
||||||
|
min_dist :: 0.4;
|
||||||
|
axis : Transform_Axis = .NONE;
|
||||||
|
closest := 100000000.0;
|
||||||
|
p : Vector3;
|
||||||
|
|
||||||
|
du, pu := closest_distance_ray_circle(ray, up);
|
||||||
|
if du <= min_dist && du < closest {
|
||||||
|
closest = du;
|
||||||
|
axis = .UP;
|
||||||
|
p = pu;
|
||||||
|
}
|
||||||
|
|
||||||
|
dr, pr := closest_distance_ray_circle(ray, right);
|
||||||
|
if dr <= min_dist && dr < closest {
|
||||||
|
closest = dr;
|
||||||
|
axis = .RIGHT;
|
||||||
|
p = pr;
|
||||||
|
}
|
||||||
|
|
||||||
|
df, pf := closest_distance_ray_circle(ray, forward);
|
||||||
|
if df <= min_dist && df < closest {
|
||||||
|
closest = df;
|
||||||
|
axis = .FORWARD;
|
||||||
|
p = pf;
|
||||||
|
}
|
||||||
|
|
||||||
|
return axis, p;
|
||||||
}
|
}
|
||||||
|
|
||||||
update_gizmo_buffers :: () {
|
update_gizmo_buffers :: () {
|
||||||
// update_matrix(*engine.editor.transform_gizmo.transform);
|
entity := engine.editor.selected_entities[0];
|
||||||
//
|
engine.editor.transform_gizmo.transform.position = entity.transform.position;
|
||||||
// up_rotation := rotation_matrix(Matrix3, euler_to_quaternion(degrees_to_radians(90), degrees_to_radians(90), degrees_to_radians(0)));
|
engine.editor.transform_gizmo.transform.orientation = entity.transform.orientation;
|
||||||
// right_rotation := rotation_matrix(Matrix3, euler_to_quaternion(degrees_to_radians(90), degrees_to_radians(0), degrees_to_radians(90)));
|
update_matrix(*engine.editor.transform_gizmo.transform);
|
||||||
// up_model := engine.editor.transform_gizmo.transform.model_matrix * up_rotation;
|
|
||||||
// right_model := engine.editor.transform_gizmo.transform.model_matrix * right_rotation;
|
up_rotation := rotation_matrix(Matrix3, euler_to_quaternion(degrees_to_radians(90), degrees_to_radians(90), degrees_to_radians(0)));
|
||||||
// center_scale := make_scale_matrix4(.{0.15, 0.15, 0.15});
|
right_rotation := rotation_matrix(Matrix3, euler_to_quaternion(degrees_to_radians(90), degrees_to_radians(0), degrees_to_radians(90)));
|
||||||
// center_model := engine.editor.transform_gizmo.transform.model_matrix * center_scale;
|
up_model := engine.editor.transform_gizmo.transform.model_matrix * up_rotation;
|
||||||
//
|
right_model := engine.editor.transform_gizmo.transform.model_matrix * right_rotation;
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.center_model_buffer, *center_model, size_of(Matrix4));
|
center_scale := make_scale_matrix4(.{0.15, 0.15, 0.15});
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.up_model_buffer, *up_model, size_of(Matrix4));
|
center_model := engine.editor.transform_gizmo.transform.model_matrix * center_scale;
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.forward_model_buffer, *engine.editor.transform_gizmo.transform.model_matrix, size_of(Matrix4));
|
|
||||||
// upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.right_model_buffer, *right_model, size_of(Matrix4));
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.center_model_buffer, *center_model, size_of(Matrix4));
|
||||||
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.up_model_buffer, *up_model, size_of(Matrix4));
|
||||||
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.forward_model_buffer, *engine.editor.transform_gizmo.transform.model_matrix, size_of(Matrix4));
|
||||||
|
upload_data_to_buffer(engine.renderer, engine.editor.transform_gizmo.right_model_buffer, *right_model, size_of(Matrix4));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
render_transform_gizmo :: () {
|
||||||
|
if engine.editor.selected_entities.count == 1 {
|
||||||
|
update_gizmo_buffers();
|
||||||
|
renderer := engine.renderer;
|
||||||
|
push_cmd_set_draw_mode(renderer, .FILL);
|
||||||
|
push_cmd_set_depth_write(renderer, false);
|
||||||
|
push_cmd_set_pipeline_state(renderer, engine.editor.transform_gizmo.pipeline);
|
||||||
|
push_cmd_set_constant_buffer(engine.renderer, 0, engine.camera_buffer,.VERTEX);
|
||||||
|
|
||||||
#load "editor_ui.jai";
|
render_gizmo :: (mesh: *Mesh) {
|
||||||
|
renderer := engine.renderer;
|
||||||
|
vb := get_mesh_vb(mesh, engine.editor.transform_gizmo.pipeline);
|
||||||
|
|
||||||
|
// RIGHT
|
||||||
|
push_cmd_set_constant_buffer(engine.renderer, 1, engine.editor.transform_gizmo.right_model_buffer, .VERTEX);
|
||||||
|
push_cmd_set_constant_buffer(engine.renderer, 2, engine.editor.transform_gizmo.color_right_buffer, .PIXEL);
|
||||||
|
|
||||||
|
push_cmd_set_vertex_buffer(renderer, vb);
|
||||||
|
push_cmd_set_index_buffer(renderer, mesh.ib);
|
||||||
|
push_cmd_draw_indexed(renderer, mesh.indices.count);
|
||||||
|
|
||||||
|
// FORWARD
|
||||||
|
push_cmd_set_constant_buffer(engine.renderer, 1, engine.editor.transform_gizmo.forward_model_buffer, .VERTEX);
|
||||||
|
push_cmd_set_constant_buffer(engine.renderer, 2, engine.editor.transform_gizmo.color_forward_buffer, .PIXEL);
|
||||||
|
|
||||||
|
push_cmd_set_vertex_buffer(renderer, vb);
|
||||||
|
|
||||||
|
push_cmd_set_index_buffer(renderer, mesh.ib);
|
||||||
|
push_cmd_draw_indexed(renderer, mesh.indices.count);
|
||||||
|
|
||||||
|
// UP
|
||||||
|
push_cmd_set_constant_buffer(engine.renderer, 1, engine.editor.transform_gizmo.up_model_buffer, .VERTEX);
|
||||||
|
push_cmd_set_constant_buffer(engine.renderer, 2, engine.editor.transform_gizmo.color_up_buffer, .PIXEL);
|
||||||
|
|
||||||
|
push_cmd_set_vertex_buffer(renderer, vb);
|
||||||
|
push_cmd_set_index_buffer(renderer, mesh.ib);
|
||||||
|
push_cmd_draw_indexed(renderer, mesh.indices.count);
|
||||||
|
}
|
||||||
|
|
||||||
|
if engine.editor.transform_gizmo.transform_type == {
|
||||||
|
case .TRANSLATION; {
|
||||||
|
mesh := parray_get(*engine.renderer.meshes, engine.renderer.default_meshes.translation_gizmo);
|
||||||
|
render_gizmo(mesh);
|
||||||
|
}
|
||||||
|
case .SCALE; {
|
||||||
|
mesh := parray_get(*engine.renderer.meshes, engine.renderer.default_meshes.scale_gizmo);
|
||||||
|
render_gizmo(mesh);
|
||||||
|
|
||||||
|
center_mesh := parray_get(*engine.renderer.meshes, engine.renderer.default_meshes.cube);
|
||||||
|
push_cmd_set_constant_buffer(engine.renderer, 1, engine.editor.transform_gizmo.center_model_buffer, .VERTEX);
|
||||||
|
push_cmd_set_constant_buffer(engine.renderer, 2, engine.editor.transform_gizmo.color_center_buffer, .PIXEL);
|
||||||
|
|
||||||
|
vb := get_mesh_vb(mesh, engine.editor.transform_gizmo.pipeline);
|
||||||
|
push_cmd_set_vertex_buffer(renderer, vb);
|
||||||
|
push_cmd_set_index_buffer(renderer, center_mesh.ib);
|
||||||
|
push_cmd_draw_indexed(renderer, center_mesh.indices.count);
|
||||||
|
}
|
||||||
|
case .ROTATION; {
|
||||||
|
mesh := parray_get(*engine.renderer.meshes, engine.renderer.default_meshes.rotation_gizmo);
|
||||||
|
render_gizmo(mesh);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
#load "editor_ui.jai";
|
||||||
|
#load "../renderer/shaders.jai";
|
||||||
@@ -1,5 +1,7 @@
|
|||||||
#load "../ui/widgets.jai";
|
#load "../ui/widgets.jai";
|
||||||
|
|
||||||
|
#placeholder editor_ui_entity_creation;
|
||||||
|
|
||||||
pick_scene_view_at :: (camera: Camera, coordinates: Vector2) {
|
pick_scene_view_at :: (camera: Camera, coordinates: Vector2) {
|
||||||
ray := normalized_screen_to_ray_v2(camera, coordinates);
|
ray := normalized_screen_to_ray_v2(camera, coordinates);
|
||||||
|
|
||||||
@@ -54,22 +56,22 @@ editor_ui :: () {
|
|||||||
|
|
||||||
ui_space(20, 0);
|
ui_space(20, 0);
|
||||||
|
|
||||||
//if mode == {
|
if engine.mode == {
|
||||||
// case .PLAYING; {
|
case .PLAYING; {
|
||||||
// ui_set_next_background_color(.{0,0.6,0,1});
|
ui_set_next_background_color(.{0,0.6,0,1});
|
||||||
// if ui_button_with_texture(editor.icons.stop) {
|
if ui_button_with_texture(engine.editor.icons.stop) {
|
||||||
// edit_engine.current_scene();
|
switch_engine_mode(.EDITING);
|
||||||
// }
|
}
|
||||||
// ui_label(tprint("Playing '%'", engine.current_scene.name), .{0,0.7,0,1});
|
ui_label(tprint("Playing '%'", engine.current_scene.name), .{0,0.7,0,1});
|
||||||
// }
|
}
|
||||||
// case .EDITING; {
|
case .EDITING; {
|
||||||
ui_set_next_background_color(.{0.6,0,0,1});
|
ui_set_next_background_color(.{0.6,0,0,1});
|
||||||
//if ui_button_with_texture(editor.icons.play) {
|
if ui_button_with_texture(engine.editor.icons.play) {
|
||||||
// play_current_editor_scene();
|
switch_engine_mode(.PLAYING);
|
||||||
//}
|
}
|
||||||
ui_label(tprint("Editing '%'", engine.current_scene.name), .{1,1,1,1});
|
ui_label(tprint("Editing '%'", engine.current_scene.name), .{1,1,1,1});
|
||||||
//}
|
}
|
||||||
//}
|
}
|
||||||
}
|
}
|
||||||
ui_pop_parent();
|
ui_pop_parent();
|
||||||
|
|
||||||
@@ -135,7 +137,7 @@ editor_ui :: () {
|
|||||||
ui_set_next_size_x(.PCT, 1.0);
|
ui_set_next_size_x(.PCT, 1.0);
|
||||||
ui_tab_title_bar("SCENE");
|
ui_tab_title_bar("SCENE");
|
||||||
ui_set_next_size_x(.PCT, 1.0);
|
ui_set_next_size_x(.PCT, 1.0);
|
||||||
ui_set_next_size_y(.PCT, 0.9);
|
ui_set_next_size_y(.PCT, 0.75);
|
||||||
|
|
||||||
state := ui_interactable_texture(get_texture_from_pass("UI Blend Pass"));
|
state := ui_interactable_texture(get_texture_from_pass("UI Blend Pass"));
|
||||||
if state.left_mouse_down {
|
if state.left_mouse_down {
|
||||||
@@ -146,8 +148,15 @@ editor_ui :: () {
|
|||||||
engine.editor.mouse_viewport_state = state;
|
engine.editor.mouse_viewport_state = state;
|
||||||
|
|
||||||
ui_set_next_size_x(.PCT, 1.0);
|
ui_set_next_size_x(.PCT, 1.0);
|
||||||
ui_set_next_size_y(.PCT, 0.1);
|
ui_set_next_size_y(.PCT, 0.25);
|
||||||
ui_tab_title_bar("SCENES");
|
ui_tab_title_bar("Create entities");
|
||||||
|
{
|
||||||
|
new_entity := editor_ui_entity_creation();
|
||||||
|
if new_entity != null {
|
||||||
|
engine.editor.selected_entities.count = 0;
|
||||||
|
array_add(*engine.editor.selected_entities, new_entity);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ui_pop_parent();
|
ui_pop_parent();
|
||||||
|
|
||||||
@@ -162,14 +171,15 @@ editor_ui :: () {
|
|||||||
ui_set_next_size_x(.PCT, 1.0);
|
ui_set_next_size_x(.PCT, 1.0);
|
||||||
ui_tab_title_bar("PROPERTIES");
|
ui_tab_title_bar("PROPERTIES");
|
||||||
|
|
||||||
//if editor.selected_entity != null {
|
if engine.editor.selected_entities.count == 1 {
|
||||||
// ui_slider(*slider_value, 0.0, 1.0);
|
entity := engine.editor.selected_entities[0];
|
||||||
// ui_label(tprint("Name: %", editor.selected_entity.name));
|
ui_slider(*slider_value, 0.0, 1.0);
|
||||||
// ui_label(tprint("Id: %", editor.selected_entity.id));
|
ui_label(tprint("Name: %", entity.name));
|
||||||
// ui_label(tprint("Position: % % %", editor.selected_entity.transform.position.x, editor.selected_entity.transform.position.y, editor.selected_entity.transform.position.z));
|
ui_label(tprint("Id: %", entity.id));
|
||||||
// ui_label(tprint("Rotation: % % % %", editor.selected_entity.transform.orientation.x, editor.selected_entity.transform.orientation.y, editor.selected_entity.transform.orientation.z, editor.selected_entity.transform.orientation.w));
|
ui_label(tprint("Position: % % %", entity.transform.position.x, entity.transform.position.y, entity.transform.position.z));
|
||||||
// ui_label(tprint("Scale: % % %", editor.selected_entity.transform.scale.x, editor.selected_entity.transform.scale.y, editor.selected_entity.transform.scale.z));
|
ui_label(tprint("Rotation: % % % %", entity.transform.orientation.x, entity.transform.orientation.y, entity.transform.orientation.z, entity.transform.orientation.w));
|
||||||
//}
|
ui_label(tprint("Scale: % % %", entity.transform.scale.x, entity.transform.scale.y, entity.transform.scale.z));
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
ui_pop_parent();
|
ui_pop_parent();
|
||||||
@@ -187,22 +197,28 @@ base_editor_update :: () {
|
|||||||
eat_key(.MOUSE_LEFT);
|
eat_key(.MOUSE_LEFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Incomplete: Show that we saved the scene in the editor. Maybe a quick text message or just inside one of the tab titles
|
||||||
|
if key_pressed(.CTRL) && key_down(.S) {
|
||||||
|
save_scene(engine.current_scene);
|
||||||
|
}
|
||||||
|
|
||||||
// Check if we hit the gizmo
|
// Check if we hit the gizmo
|
||||||
// @Incomplete: MOVE THIS
|
// @Incomplete: MOVE THIS
|
||||||
engine.editor.should_check_entities = true;
|
engine.editor.should_check_entities = true;
|
||||||
|
|
||||||
//if editor.selected_entity != null {
|
if engine.editor.selected_entities.count == 1 {
|
||||||
// gizmo_scale := distance(editor.selected_entity.transform.position, editor.camera.position) * 0.1 * 0.5;
|
entity := engine.editor.selected_entities[0];
|
||||||
// editor.transform_gizmo.uniform_gizmo_scale = gizmo_scale;
|
gizmo_scale := distance(entity.transform.position, engine.editor.camera.position) * 0.1 * 0.5;
|
||||||
// set_scale(*editor.transform_gizmo.transform, .{gizmo_scale, gizmo_scale, gizmo_scale});
|
engine.editor.transform_gizmo.uniform_gizmo_scale = gizmo_scale;
|
||||||
|
set_scale(*engine.editor.transform_gizmo.transform, .{gizmo_scale, gizmo_scale, gizmo_scale});
|
||||||
|
|
||||||
// coordinates := Vector2.{editor.mouse_viewport_state.normalized_local_mouse_coordinates.x, 1.0 - editor.mouse_viewport_state.normalized_local_mouse_coordinates.y};
|
coordinates := Vector2.{engine.editor.mouse_viewport_state.normalized_local_mouse_coordinates.x, 1.0 - engine.editor.mouse_viewport_state.normalized_local_mouse_coordinates.y};
|
||||||
// ray := normalized_screen_to_ray_v2(*editor.camera, coordinates);
|
ray := normalized_screen_to_ray_v2(engine.editor.camera, coordinates);
|
||||||
|
|
||||||
// if update_transform_gizmo(ray, coordinates) {
|
if update_transform_gizmo(ray, coordinates) {
|
||||||
// editor.should_check_entities = false;
|
engine.editor.should_check_entities = false;
|
||||||
// }
|
}
|
||||||
//}
|
}
|
||||||
|
|
||||||
editor_ui();
|
editor_ui();
|
||||||
|
|
||||||
@@ -212,7 +228,7 @@ base_editor_update :: () {
|
|||||||
// // @Incomplete: At some point we want this to place entities at either a set distance or a distance depending on a raycast in the camera's forward direction so that we don't place things behind other entities
|
// // @Incomplete: At some point we want this to place entities at either a set distance or a distance depending on a raycast in the camera's forward direction so that we don't place things behind other entities
|
||||||
// set_position(*placed_entity.transform, editor.camera.position + editor.camera.forward * 30);
|
// set_position(*placed_entity.transform, editor.camera.position + editor.camera.forward * 30);
|
||||||
// editor.show_menu = false;
|
// editor.show_menu = false;
|
||||||
// editor.selected_entity = placed_entity;
|
// entity = placed_entity;
|
||||||
// }
|
// }
|
||||||
//}
|
//}
|
||||||
|
|
||||||
@@ -223,20 +239,20 @@ base_editor_update :: () {
|
|||||||
//show_message("Saved scene");
|
//show_message("Saved scene");
|
||||||
}
|
}
|
||||||
|
|
||||||
//if editor.selected_entity != null {
|
//if entity != null {
|
||||||
// // @Incomplete:@Incomplete: Duplicate
|
// // @Incomplete:@Incomplete: Duplicate
|
||||||
// //if key_pressed(.CTRL) && key_down(.D) {
|
// //if key_pressed(.CTRL) && key_down(.D) {
|
||||||
// // make_directory_if_it_does_not_exist("../temp");
|
// // make_directory_if_it_does_not_exist("../temp");
|
||||||
// // save_entity(editor.selected_entity, "../temp/", "temp");
|
// // save_entity(entity, "../temp/", "temp");
|
||||||
// // duplicated := load_entity(editor_scene, "../temp/temp.ent");
|
// // duplicated := load_entity(editor_scene, "../temp/temp.ent");
|
||||||
// // editor.selected_entity = duplicated;
|
// // entity = duplicated;
|
||||||
// //}
|
// //}
|
||||||
|
|
||||||
// // DELETE
|
// // DELETE
|
||||||
// // DELETE
|
// // DELETE
|
||||||
// //if key_down(.DELETE) || key_down(.BACKSPACE) {
|
// //if key_down(.DELETE) || key_down(.BACKSPACE) {
|
||||||
// // delete_entity(editor.selected_entity);
|
// // delete_entity(entity);
|
||||||
// // editor.selected_entity = null;
|
// // entity = null;
|
||||||
// // editor.transform_gizmo.selected_axis = .NONE;
|
// // editor.transform_gizmo.selected_axis = .NONE;
|
||||||
// //}
|
// //}
|
||||||
//}
|
//}
|
||||||
@@ -297,27 +313,26 @@ base_editor_update :: () {
|
|||||||
engine.editor.menu_position.y = cast(float)engine.renderer.render_target_height - mouse_position.y;
|
engine.editor.menu_position.y = cast(float)engine.renderer.render_target_height - mouse_position.y;
|
||||||
}
|
}
|
||||||
|
|
||||||
if key_down(.W) {
|
if !key_pressed(.CTRL) {
|
||||||
engine.editor.transform_gizmo.transform_type = .TRANSLATION;
|
if key_down(.W) {
|
||||||
}
|
engine.editor.transform_gizmo.transform_type = .TRANSLATION;
|
||||||
|
}
|
||||||
|
|
||||||
if key_down(.E) {
|
if key_down(.E) {
|
||||||
engine.editor.transform_gizmo.transform_type = .ROTATION;
|
engine.editor.transform_gizmo.transform_type = .ROTATION;
|
||||||
}
|
}
|
||||||
|
|
||||||
if key_down(.R) {
|
if key_down(.R) {
|
||||||
engine.editor.transform_gizmo.transform_type = .SCALE;
|
engine.editor.transform_gizmo.transform_type = .SCALE;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
update_view_matrix(camera);
|
update_view_matrix(camera);
|
||||||
}
|
}
|
||||||
|
|
||||||
//if editor.selected_entity != null {
|
if key_pressed(.CTRL) && key_down(.E) {
|
||||||
// e := editor.selected_entity;
|
new_mode := ifx engine.mode == .EDITING then Engine_Mode.PLAYING else .EDITING;
|
||||||
// set_position(*editor.transform_gizmo.transform, e.transform.position);
|
switch_engine_mode(new_mode);
|
||||||
// update_gizmo_buffers();
|
}
|
||||||
//}
|
|
||||||
|
|
||||||
//edit_scene_settings(*game_state.engine.current_scene.settings);
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -237,6 +237,40 @@ generate_code :: (w: Workspace) {
|
|||||||
entity_storage_string = builder_to_string(*builder);
|
entity_storage_string = builder_to_string(*builder);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
builder: String_Builder;
|
||||||
|
|
||||||
|
for entity_type_names {
|
||||||
|
print_to_builder(*builder, "scene.by_type._%1.allocator = scene.allocator;", it);
|
||||||
|
}
|
||||||
|
|
||||||
|
build_string := sprint(INIT_SCENE, builder_to_string(*builder));
|
||||||
|
add_build_string(build_string, w);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
builder: String_Builder;
|
||||||
|
|
||||||
|
for entity_type_names {
|
||||||
|
lower := to_lower_copy_new(it,, allocator=temp);
|
||||||
|
print_to_builder(*builder, "if ui_clickable_label(\"New %1\") return new_%2();", it, lower);;
|
||||||
|
}
|
||||||
|
|
||||||
|
build_string := sprint(EDITOR_UI_ENTITY_CREATION, builder_to_string(*builder));
|
||||||
|
add_build_string(build_string, w);
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
builder: String_Builder;
|
||||||
|
|
||||||
|
for entity_type_names {
|
||||||
|
print_to_builder(*builder, "\tcase %1; bucket_array_remove(*e.scene.by_type._%1, e._locator);", it);
|
||||||
|
}
|
||||||
|
|
||||||
|
build_string := sprint(DELETE_ENTITY, builder_to_string(*builder));
|
||||||
|
add_build_string(build_string, w);
|
||||||
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
builder: String_Builder;
|
builder: String_Builder;
|
||||||
|
|
||||||
@@ -252,12 +286,13 @@ generate_code :: (w: Workspace) {
|
|||||||
builder: String_Builder;
|
builder: String_Builder;
|
||||||
|
|
||||||
for entity_type_names {
|
for entity_type_names {
|
||||||
print_to_builder(*builder, "\tcase \"%1\"; p, locator := find_and_occupy_empty_slot(*scene.by_type._%1); p._locator = locator; e = p; register_entity(scene, p); init_entity(p); deserialize_entity(scene, lines, cast(*%1)e); update_matrix(*e.transform);\n", it);
|
print_to_builder(*builder, "\tcase \"%1\"; p, locator := find_and_occupy_empty_slot(*scene.by_type._%1); p._locator = locator; e = p; register_entity(scene, p, id); init_entity(p); deserialize_entity(scene, lines, cast(*%1)e); update_matrix(*e.transform);\n", it);
|
||||||
}
|
}
|
||||||
|
|
||||||
build_string := sprint(DESERIALIZE_ENTITY, builder_to_string(*builder));
|
build_string := sprint(DESERIALIZE_ENTITY, builder_to_string(*builder));
|
||||||
add_build_string(build_string, w);
|
add_build_string(build_string, w);
|
||||||
}
|
}
|
||||||
|
|
||||||
{
|
{
|
||||||
builder: String_Builder;
|
builder: String_Builder;
|
||||||
|
|
||||||
@@ -301,6 +336,15 @@ Entity_Storage :: struct {
|
|||||||
}
|
}
|
||||||
DONE
|
DONE
|
||||||
|
|
||||||
|
DELETE_ENTITY :: #string DONE
|
||||||
|
delete_entity :: (e: *Entity) {
|
||||||
|
if e.type == {
|
||||||
|
%1
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
DONE
|
||||||
|
|
||||||
SERIALIZE_ENTITY :: #string DONE
|
SERIALIZE_ENTITY :: #string DONE
|
||||||
serialize_entity :: (e: *Entity, path: string) {
|
serialize_entity :: (e: *Entity, path: string) {
|
||||||
builder: String_Builder;
|
builder: String_Builder;
|
||||||
@@ -315,7 +359,7 @@ serialize_entity :: (e: *Entity, path: string) {
|
|||||||
DONE
|
DONE
|
||||||
|
|
||||||
DESERIALIZE_ENTITY :: #string DONE
|
DESERIALIZE_ENTITY :: #string DONE
|
||||||
deserialize_entity :: (scene: *Scene, path: string) -> *Entity {
|
deserialize_entity :: (scene: *Scene, id: Entity_Id, path: string) -> *Entity {
|
||||||
content := File.read_entire_file(path);
|
content := File.read_entire_file(path);
|
||||||
if content.count == 0 return null;
|
if content.count == 0 return null;
|
||||||
|
|
||||||
@@ -335,3 +379,18 @@ deserialize_entity :: (scene: *Scene, path: string) -> *Entity {
|
|||||||
return e;
|
return e;
|
||||||
}
|
}
|
||||||
DONE
|
DONE
|
||||||
|
|
||||||
|
INIT_SCENE :: #string DONE
|
||||||
|
init_scene :: (scene: *Scene) {
|
||||||
|
%1
|
||||||
|
}
|
||||||
|
DONE
|
||||||
|
|
||||||
|
|
||||||
|
EDITOR_UI_ENTITY_CREATION :: #string DONE
|
||||||
|
editor_ui_entity_creation :: () -> *Entity {
|
||||||
|
%1
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
DONE
|
||||||
32
module.jai
32
module.jai
@@ -31,6 +31,10 @@ Engine_Core :: struct {
|
|||||||
time_buffer : Buffer_Handle;
|
time_buffer : Buffer_Handle;
|
||||||
screen_data_buffer : Buffer_Handle;
|
screen_data_buffer : Buffer_Handle;
|
||||||
directional_light_buffer : Buffer_Handle;
|
directional_light_buffer : Buffer_Handle;
|
||||||
|
|
||||||
|
procs: struct {
|
||||||
|
on_scene_loaded: (*Scene, Engine_Mode);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
engine: Engine_Core;
|
engine: Engine_Core;
|
||||||
@@ -92,16 +96,22 @@ coven_run :: (game_update_proc: (float), game_update_post_physics_proc: (float))
|
|||||||
|
|
||||||
ui_begin();
|
ui_begin();
|
||||||
|
|
||||||
game_update_proc(min(0.4, dt));
|
clamped_dt := min(0.4, dt);
|
||||||
|
|
||||||
update_animators(dt);
|
#if EDITOR {
|
||||||
|
base_editor_update();
|
||||||
|
}
|
||||||
|
if engine.mode == .PLAYING {
|
||||||
|
game_update_proc(clamped_dt);
|
||||||
|
update_animators(clamped_dt);
|
||||||
|
update_physics(engine.current_scene, clamped_dt);
|
||||||
|
game_update_post_physics_proc(clamped_dt);
|
||||||
|
}
|
||||||
|
|
||||||
update_physics(engine.current_scene, dt);
|
|
||||||
update_transforms();
|
update_transforms();
|
||||||
game_update_post_physics_proc(dt);
|
|
||||||
sync_engine_buffers();
|
sync_engine_buffers();
|
||||||
|
|
||||||
update_particle_systems(dt);
|
update_particle_systems(clamped_dt);
|
||||||
|
|
||||||
ui_end();
|
ui_end();
|
||||||
|
|
||||||
@@ -115,6 +125,18 @@ coven_run :: (game_update_proc: (float), game_update_post_physics_proc: (float))
|
|||||||
SDL_Quit();
|
SDL_Quit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
switch_engine_mode :: (to_mode: Engine_Mode) {
|
||||||
|
engine.mode = to_mode;
|
||||||
|
|
||||||
|
#if EDITOR {
|
||||||
|
engine.editor.selected_entities.count = 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if engine.current_scene != null {
|
||||||
|
reload_scene(engine.current_scene);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
#if NETWORKING {
|
#if NETWORKING {
|
||||||
#load "networking/networking.jai";
|
#load "networking/networking.jai";
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -807,20 +807,20 @@ init_default_meshes :: () {
|
|||||||
assert(success);
|
assert(success);
|
||||||
engine.renderer.default_meshes.cube = cube_mesh;
|
engine.renderer.default_meshes.cube = cube_mesh;
|
||||||
|
|
||||||
//translation_arrow_model := load_fbx("../modules/Coven/models/translation_arrow.fbx");
|
translation_arrow_model := load_fbx("../modules/Coven/assets/models/translation_arrow.fbx");
|
||||||
//translation_arrow_mesh :, success = get_first_mesh_from_model(translation_arrow_model);
|
translation_arrow_mesh :, success = get_first_mesh_from_model(translation_arrow_model);
|
||||||
//assert(success);
|
assert(success);
|
||||||
//engine.renderer.default_meshes.translation_gizmo = translation_arrow_mesh;
|
engine.renderer.default_meshes.translation_gizmo = translation_arrow_mesh;
|
||||||
|
|
||||||
//scale_gizmo_model := load_fbx("../modules/Coven/models/scale_gizmo.fbx");
|
scale_gizmo_model := load_fbx("../modules/Coven/assets/models/scale_gizmo.fbx");
|
||||||
//scale_gizmo_mesh :, success = get_first_mesh_from_model(scale_gizmo_model);
|
scale_gizmo_mesh :, success = get_first_mesh_from_model(scale_gizmo_model);
|
||||||
//assert(success);
|
assert(success);
|
||||||
//engine.renderer.default_meshes.scale_gizmo = scale_gizmo_mesh;
|
engine.renderer.default_meshes.scale_gizmo = scale_gizmo_mesh;
|
||||||
|
|
||||||
//rotation_gizmo_model := load_fbx("../modules/Coven/models/rotation_gizmo.fbx");
|
rotation_gizmo_model := load_fbx("../modules/Coven/assets/models/rotation_gizmo.fbx");
|
||||||
//rotation_gizmo_mesh :, success = get_first_mesh_from_model(rotation_gizmo_model);
|
rotation_gizmo_mesh :, success = get_first_mesh_from_model(rotation_gizmo_model);
|
||||||
//assert(success);
|
assert(success);
|
||||||
//engine.renderer.default_meshes.rotation_gizmo = rotation_gizmo_mesh;
|
engine.renderer.default_meshes.rotation_gizmo = rotation_gizmo_mesh;
|
||||||
}
|
}
|
||||||
|
|
||||||
deinit_renderer :: (renderer: *Renderer) {
|
deinit_renderer :: (renderer: *Renderer) {
|
||||||
|
|||||||
46
renderer/shaders.jai
Normal file
46
renderer/shaders.jai
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
TRANSFORM_GIZMO_SHADER :: #string BEGIN
|
||||||
|
cbuffer CameraData : register(b0)
|
||||||
|
{
|
||||||
|
float4x4 projection;
|
||||||
|
float4x4 view;
|
||||||
|
};
|
||||||
|
|
||||||
|
cbuffer Model : register(b1)
|
||||||
|
{
|
||||||
|
float4x4 model;
|
||||||
|
};
|
||||||
|
|
||||||
|
cbuffer Material : register(b2)
|
||||||
|
{
|
||||||
|
float4 color;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PSInput {
|
||||||
|
float4 position : SV_POSITION;
|
||||||
|
};
|
||||||
|
|
||||||
|
struct PS_OUTPUT {
|
||||||
|
float4 color : SV_Target0;
|
||||||
|
};
|
||||||
|
|
||||||
|
PSInput VS(float3 pos : POSITION) {
|
||||||
|
float4 position = float4(pos.x, pos.y, pos.z, 1.0);
|
||||||
|
PSInput input;
|
||||||
|
|
||||||
|
input.position = mul(position, model);
|
||||||
|
input.position = mul(input.position, view);
|
||||||
|
input.position = mul(input.position, projection);
|
||||||
|
|
||||||
|
return input;
|
||||||
|
}
|
||||||
|
|
||||||
|
PS_OUTPUT PS(PSInput input) {
|
||||||
|
PS_OUTPUT output;
|
||||||
|
|
||||||
|
output.color.rgb = color.rgb;
|
||||||
|
output.color.a = 1.0;
|
||||||
|
|
||||||
|
return output;
|
||||||
|
}
|
||||||
|
|
||||||
|
BEGIN
|
||||||
@@ -1,8 +1,8 @@
|
|||||||
ui_full_size_background :: (identifier: s64 = 0, loc := #caller_location) {
|
ui_full_size_background :: (color: Color = .{0,0,0,1}, identifier: s64 = 0, loc := #caller_location) {
|
||||||
ui_set_next_size_x(.PIXELS, xx engine.renderer.render_target_width);
|
ui_set_next_size_x(.PIXELS, xx engine.renderer.render_target_width);
|
||||||
ui_set_next_size_y(.PIXELS, xx engine.renderer.render_target_height);
|
ui_set_next_size_y(.PIXELS, xx engine.renderer.render_target_height);
|
||||||
|
|
||||||
ui_set_next_background_color(.{0.0, 0.0, 0.0, 1.0});
|
ui_set_next_background_color(color);
|
||||||
|
|
||||||
background := ui_box_make(.DRAW_BACKGROUND, hash=get_hash(loc, identifier));
|
background := ui_box_make(.DRAW_BACKGROUND, hash=get_hash(loc, identifier));
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user