From 2bd500c6d6a8fea20be2906e30bbd729ffd6390e Mon Sep 17 00:00:00 2001 From: Daniel Bross Date: Wed, 23 Oct 2024 17:02:24 +0200 Subject: [PATCH] Collision layers and entity rendering offsets --- .build/.added_strings_w3.jai | 222 ++++++++++++++++++++--------------- core/entity.jai | 2 + core/scene.jai | 8 +- physics/physics.jai | 25 ++++ 4 files changed, 163 insertions(+), 94 deletions(-) diff --git a/.build/.added_strings_w3.jai b/.build/.added_strings_w3.jai index 04259e1..ef1732f 100644 --- a/.build/.added_strings_w3.jai +++ b/.build/.added_strings_w3.jai @@ -126,6 +126,9 @@ serialize_entity :: (e: *Block, builder: *String_Builder) { 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.rendering_offset.x: %\n", e.entity.rendering_offset.x); + print_to_builder(builder, "entity.rendering_offset.y: %\n", e.entity.rendering_offset.y); + print_to_builder(builder, "entity.rendering_offset.z: %\n", e.entity.rendering_offset.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); @@ -166,6 +169,12 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Block) { scan2(values[1], "%", *e.entity.transform.scale.y); case "entity.transform.scale.z"; scan2(values[1], "%", *e.entity.transform.scale.z); + case "entity.rendering_offset.x"; + scan2(values[1], "%", *e.entity.rendering_offset.x); + case "entity.rendering_offset.y"; + scan2(values[1], "%", *e.entity.rendering_offset.y); + case "entity.rendering_offset.z"; + scan2(values[1], "%", *e.entity.rendering_offset.z); case "entity.snap_offset.x"; scan2(values[1], "%", *e.entity.snap_offset.x); case "entity.snap_offset.y"; @@ -202,6 +211,9 @@ serialize_entity :: (e: *Item, builder: *String_Builder) { 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.rendering_offset.x: %\n", e.entity.rendering_offset.x); + print_to_builder(builder, "entity.rendering_offset.y: %\n", e.entity.rendering_offset.y); + print_to_builder(builder, "entity.rendering_offset.z: %\n", e.entity.rendering_offset.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); @@ -240,6 +252,12 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Item) { scan2(values[1], "%", *e.entity.transform.scale.y); case "entity.transform.scale.z"; scan2(values[1], "%", *e.entity.transform.scale.z); + case "entity.rendering_offset.x"; + scan2(values[1], "%", *e.entity.rendering_offset.x); + case "entity.rendering_offset.y"; + scan2(values[1], "%", *e.entity.rendering_offset.y); + case "entity.rendering_offset.z"; + scan2(values[1], "%", *e.entity.rendering_offset.z); case "entity.snap_offset.x"; scan2(values[1], "%", *e.entity.snap_offset.x); case "entity.snap_offset.y"; @@ -257,99 +275,6 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Item) { } } -// -// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307. -// -serialize_entity :: (e: *Crab, builder: *String_Builder) { - print_to_builder(builder, "type: Crab\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); - print_to_builder(builder, "current_yaw: %\n", e.current_yaw); - print_to_builder(builder, "target_look_direction.x: %\n", e.target_look_direction.x); - print_to_builder(builder, "target_look_direction.y: %\n", e.target_look_direction.y); - print_to_builder(builder, "target_look_direction.z: %\n", e.target_look_direction.z); - print_to_builder(builder, "current_direction.x: %\n", e.current_direction.x); - print_to_builder(builder, "current_direction.y: %\n", e.current_direction.y); - print_to_builder(builder, "current_direction.z: %\n", e.current_direction.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: *Crab) { - 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); - case "current_yaw"; - scan2(values[1], "%", *e.current_yaw); - case "target_look_direction.x"; - scan2(values[1], "%", *e.target_look_direction.x); - case "target_look_direction.y"; - scan2(values[1], "%", *e.target_look_direction.y); - case "target_look_direction.z"; - scan2(values[1], "%", *e.target_look_direction.z); - case "current_direction.x"; - scan2(values[1], "%", *e.current_direction.x); - case "current_direction.y"; - scan2(values[1], "%", *e.current_direction.y); - case "current_direction.z"; - scan2(values[1], "%", *e.current_direction.z); - } - } - } -} - // // String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307. // @@ -367,6 +292,9 @@ serialize_entity :: (e: *Character, builder: *String_Builder) { 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.rendering_offset.x: %\n", e.entity.rendering_offset.x); + print_to_builder(builder, "entity.rendering_offset.y: %\n", e.entity.rendering_offset.y); + print_to_builder(builder, "entity.rendering_offset.z: %\n", e.entity.rendering_offset.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); @@ -419,6 +347,12 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) { scan2(values[1], "%", *e.entity.transform.scale.y); case "entity.transform.scale.z"; scan2(values[1], "%", *e.entity.transform.scale.z); + case "entity.rendering_offset.x"; + scan2(values[1], "%", *e.entity.rendering_offset.x); + case "entity.rendering_offset.y"; + scan2(values[1], "%", *e.entity.rendering_offset.y); + case "entity.rendering_offset.z"; + scan2(values[1], "%", *e.entity.rendering_offset.z); case "entity.snap_offset.x"; scan2(values[1], "%", *e.entity.snap_offset.x); case "entity.snap_offset.y"; @@ -464,6 +398,108 @@ deserialize_entity :: (scene: *Scene, lines: [] string, e: *Character) { } } +// +// String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:307. +// +serialize_entity :: (e: *Crab, builder: *String_Builder) { + print_to_builder(builder, "type: Crab\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.rendering_offset.x: %\n", e.entity.rendering_offset.x); + print_to_builder(builder, "entity.rendering_offset.y: %\n", e.entity.rendering_offset.y); + print_to_builder(builder, "entity.rendering_offset.z: %\n", e.entity.rendering_offset.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); + print_to_builder(builder, "current_yaw: %\n", e.current_yaw); + print_to_builder(builder, "target_look_direction.x: %\n", e.target_look_direction.x); + print_to_builder(builder, "target_look_direction.y: %\n", e.target_look_direction.y); + print_to_builder(builder, "target_look_direction.z: %\n", e.target_look_direction.z); + print_to_builder(builder, "current_direction.x: %\n", e.current_direction.x); + print_to_builder(builder, "current_direction.y: %\n", e.current_direction.y); + print_to_builder(builder, "current_direction.z: %\n", e.current_direction.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: *Crab) { + 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.rendering_offset.x"; + scan2(values[1], "%", *e.entity.rendering_offset.x); + case "entity.rendering_offset.y"; + scan2(values[1], "%", *e.entity.rendering_offset.y); + case "entity.rendering_offset.z"; + scan2(values[1], "%", *e.entity.rendering_offset.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); + case "current_yaw"; + scan2(values[1], "%", *e.current_yaw); + case "target_look_direction.x"; + scan2(values[1], "%", *e.target_look_direction.x); + case "target_look_direction.y"; + scan2(values[1], "%", *e.target_look_direction.y); + case "target_look_direction.z"; + scan2(values[1], "%", *e.target_look_direction.z); + case "current_direction.x"; + scan2(values[1], "%", *e.current_direction.x); + case "current_direction.y"; + scan2(values[1], "%", *e.current_direction.y); + case "current_direction.z"; + scan2(values[1], "%", *e.current_direction.z); + } + } + } +} + // // String added via add_build_string() from c:/Personal/games/onegameamonth/oct24/modules/Coven/metaprogram.jai:315. // diff --git a/core/entity.jai b/core/entity.jai index 2ff08ff..5efad39 100644 --- a/core/entity.jai +++ b/core/entity.jai @@ -69,6 +69,8 @@ Entity :: struct { transform: Transform; + rendering_offset: Vector3; + snap_offset: Vector3; snap_intervals: Vector3; diff --git a/core/scene.jai b/core/scene.jai index e7bca86..4bf6413 100644 --- a/core/scene.jai +++ b/core/scene.jai @@ -224,7 +224,13 @@ update_entity_transform :: (e: *Entity, parent_matrix: Matrix4 = Matrix4_Identit e.transform.dirty = false; } - e.transform.world_matrix = parent_matrix * e.transform.model_matrix; + if length(e.rendering_offset) > 0.0 { + offset := create_identity_transform(); + set_position(*offset, e.rendering_offset); + e.transform.world_matrix = parent_matrix * e.transform.model_matrix * offset.model_matrix; + } else { + e.transform.world_matrix = parent_matrix * e.transform.model_matrix; + } for model_node, i: e.renderable.model.nodes { if model_node.parent == 0 { diff --git a/physics/physics.jai b/physics/physics.jai index ba1648a..e6451bf 100644 --- a/physics/physics.jai +++ b/physics/physics.jai @@ -26,9 +26,29 @@ Trigger_Overlap :: struct { MAX_TRIGGER_OVERLAPS :: 16; +Collision_Layers :: enum_flags { + NONE; + + LAYER1; + LAYER2; + LAYER3; + LAYER4; + LAYER5; + LAYER6; + LAYER7; + LAYER8; + LAYER9; + LAYER10; + + ALL :: .LAYER1 | LAYER2 | .LAYER3 | .LAYER4 | .LAYER5 | .LAYER6 | .LAYER7 | .LAYER8 | .LAYER9 | .LAYER10; +} + Collider :: struct { type : Collider_Type; + layer: Collision_Layers = .LAYER1; + collides_with_layers: Collision_Layers = .LAYER1; + aabb: AABB; override_aabb: bool; union { @@ -166,6 +186,10 @@ add_trigger_overlap_if_new :: (e: *Entity, other_e: *Entity) { e.collider.num_overlaps += 1; } +can_collide :: (e: *Entity, other: *Entity) -> bool { + return xx (e.collider.collides_with_layers & other.collider.layer); +} + physics_step :: (scene: *Scene, timestep: float) { update_gravity(scene, timestep); update_positions(scene, timestep); @@ -179,6 +203,7 @@ physics_step :: (scene: *Scene, timestep: float) { for other_e: scene.entities { if e == other_e continue; if other_e.collider.ignore continue; + if !can_collide(e, other_e) continue; if other_e.flags & .COLLISION { point := gjk(e.collider, other_e.collider);