use gizmo_physics_core::components::{ColliderShape, TriMeshShape};
use gizmo_renderer::components::Mesh;
pub fn create_collider_from_mesh(mesh: &Mesh, use_convex_hull: bool) -> ColliderShape {
let vertices = (*mesh.cpu_vertices).clone();
if use_convex_hull {
gizmo_physics_core::Collider::convex_hull(&vertices).shape
} else {
let mut indices = Vec::with_capacity(vertices.len());
for i in 0..vertices.len() {
indices.push(i as u32);
}
let bvh = gizmo_physics_core::bvh::BvhTree::build(&vertices, &mut indices).unwrap_or_default();
ColliderShape::TriMesh(TriMeshShape {
vertices: std::sync::Arc::new(vertices),
indices: std::sync::Arc::new(indices),
bvh: std::sync::Arc::new(bvh),
})
}
}
pub fn auto_generate_colliders(world: &mut gizmo_core::World, use_convex: bool) {
let mut missing_colliders = Vec::new();
if let Some(mesh_q) = world.query::<&Mesh>() {
let colliders = world.borrow::<gizmo_physics_core::Collider>();
for (e, mesh) in mesh_q.iter() {
if colliders.get(e).is_none() {
missing_colliders.push((e, mesh.clone()));
}
}
}
let count = missing_colliders.len();
for (e, mesh) in missing_colliders {
let entity = world.get_entity(e).unwrap();
let shape = create_collider_from_mesh(&mesh, use_convex);
let collider = gizmo_physics_core::Collider {
shape,
is_trigger: false,
material: Default::default(),
collision_layer: Default::default(),
};
if world
.borrow::<gizmo_physics_rigid::components::RigidBody>()
.get(e)
.is_none()
{
let mut rb = gizmo_physics_rigid::components::RigidBody::new_static();
rb.update_inertia_from_collider(&collider);
world.add_component(entity, rb);
}
world.add_component(entity, collider);
}
tracing::info!(
"[PhysicsParser] {} adet mesh'e otomatik Collider üretildi.",
count
);
}