Collision layers and entity rendering offsets

This commit is contained in:
2024-10-23 17:02:24 +02:00
parent 74675a4c77
commit 2bd500c6d6
4 changed files with 163 additions and 94 deletions

View File

@@ -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.
//

View File

@@ -69,6 +69,8 @@ Entity :: struct {
transform: Transform;
rendering_offset: Vector3;
snap_offset: Vector3;
snap_intervals: Vector3;

View File

@@ -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 {

View File

@@ -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);