Physics improvements
This commit is contained in:
@@ -43,9 +43,19 @@ Collision_Layers :: enum_flags {
|
||||
ALL :: .LAYER1 | LAYER2 | .LAYER3 | .LAYER4 | .LAYER5 | .LAYER6 | .LAYER7 | .LAYER8 | .LAYER9 | .LAYER10;
|
||||
}
|
||||
|
||||
Collider_Bake_Mode :: enum {
|
||||
AABB;
|
||||
|
||||
FULL_MESH;
|
||||
|
||||
ONLY_FACING_UP;
|
||||
}
|
||||
|
||||
Collider :: struct {
|
||||
type : Collider_Type;
|
||||
|
||||
bake_mode: Collider_Bake_Mode;
|
||||
|
||||
layer: Collision_Layers = .LAYER1;
|
||||
collides_with_layers: Collision_Layers = .LAYER1;
|
||||
|
||||
@@ -78,19 +88,43 @@ Physics_Body :: struct {
|
||||
}
|
||||
|
||||
update_mesh_collider :: (e: *Entity) {
|
||||
if e.collider.mesh.vertices.count == 0 {
|
||||
array_resize(*e.collider.mesh.vertices, 8);
|
||||
}
|
||||
if e.collider.bake_mode == {
|
||||
case .AABB; {
|
||||
if e.collider.mesh.vertices.count == 0 {
|
||||
array_resize(*e.collider.mesh.vertices, 8);
|
||||
}
|
||||
|
||||
m := e.transform.model_matrix;
|
||||
e.collider.mesh.vertices[0] = transform_position(e.collider.aabb.min, m);
|
||||
e.collider.mesh.vertices[1] = transform_position(e.collider.aabb.max, m);
|
||||
e.collider.mesh.vertices[2] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.min.y, e.collider.aabb.max.z}, m);
|
||||
e.collider.mesh.vertices[3] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.min.y, e.collider.aabb.max.z}, m);
|
||||
e.collider.mesh.vertices[4] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.min.y, e.collider.aabb.min.z}, m);
|
||||
e.collider.mesh.vertices[5] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.max.y, e.collider.aabb.max.z}, m);
|
||||
e.collider.mesh.vertices[6] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.max.y, e.collider.aabb.min.z}, m);
|
||||
e.collider.mesh.vertices[7] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.max.y, e.collider.aabb.min.z}, m);
|
||||
m := e.transform.model_matrix;
|
||||
e.collider.mesh.vertices[0] = transform_position(e.collider.aabb.min, m);
|
||||
e.collider.mesh.vertices[1] = transform_position(e.collider.aabb.max, m);
|
||||
e.collider.mesh.vertices[2] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.min.y, e.collider.aabb.max.z}, m);
|
||||
e.collider.mesh.vertices[3] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.min.y, e.collider.aabb.max.z}, m);
|
||||
e.collider.mesh.vertices[4] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.min.y, e.collider.aabb.min.z}, m);
|
||||
e.collider.mesh.vertices[5] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.max.y, e.collider.aabb.max.z}, m);
|
||||
e.collider.mesh.vertices[6] = transform_position(.{e.collider.aabb.max.x, e.collider.aabb.max.y, e.collider.aabb.min.z}, m);
|
||||
e.collider.mesh.vertices[7] = transform_position(.{e.collider.aabb.min.x, e.collider.aabb.max.y, e.collider.aabb.min.z}, m);
|
||||
}
|
||||
case .FULL_MESH; {
|
||||
//update_entity_transform(e);
|
||||
|
||||
model := get_model_by_handle(e.renderable.model);
|
||||
if model {
|
||||
for i: 0..e.renderable.num_nodes-1 {
|
||||
render_node := e.renderable.nodes[i];
|
||||
model_node := model.nodes[i];
|
||||
|
||||
for mesh_handle: model_node.meshes {
|
||||
mesh := parray_get(*engine.renderer.meshes, mesh_handle);
|
||||
|
||||
for p: mesh.positions {
|
||||
position := transform_position(p, render_node.transform.world_matrix);
|
||||
array_add(*e.collider.mesh.vertices, position);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
e.collider.mesh.is_baked = true;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user