calculate vertex extents for accurate mesh aabb hitboxes

This commit is contained in:
Quaternions 2023-09-28 16:15:12 -07:00
parent b9c21b6e62
commit 531473ef83
2 changed files with 19 additions and 13 deletions

View File

@ -387,28 +387,30 @@ type TreyMesh = Aabb;
pub struct ModelPhysics { pub struct ModelPhysics {
//A model is a thing that has a hitbox. can be represented by a list of TreyMesh-es //A model is a thing that has a hitbox. can be represented by a list of TreyMesh-es
//in this iteration, all it needs is extents. //in this iteration, all it needs is extents.
model_transform: glam::Affine3A, mesh: TreyMesh,
} }
impl ModelPhysics { impl ModelPhysics {
pub fn new(model_transform:glam::Affine3A) -> Self { pub fn from_model(model:&crate::model::IndexedModel,model_transform:glam::Affine3A) -> Self {
Self{model_transform} let mut aabb=Aabb::new();
for &indexed_vertex in &model.unique_vertices {
aabb.grow(model_transform.transform_point3(glam::Vec3::from_array(model.unique_pos[indexed_vertex.pos as usize])));
}
Self{
mesh:aabb,
}
} }
pub fn unit_vertices(&self) -> [glam::Vec3;8] { pub fn unit_vertices(&self) -> [glam::Vec3;8] {
Aabb::unit_vertices() Aabb::unit_vertices()
} }
pub fn mesh(&self) -> TreyMesh { pub fn mesh(&self) -> TreyMesh {
let mut aabb=Aabb::new(); return self.mesh;
for &vertex in self.unit_vertices().iter() {
aabb.grow(self.model_transform.transform_point3(vertex));
}
return aabb;
} }
pub fn unit_face_vertices(&self,face:TreyMeshFace) -> [glam::Vec3;4] { pub fn unit_face_vertices(&self,face:TreyMeshFace) -> [glam::Vec3;4] {
Aabb::unit_face_vertices(face) Aabb::unit_face_vertices(face)
} }
pub fn face_mesh(&self,face:TreyMeshFace) -> TreyMesh { pub fn face_mesh(&self,face:TreyMeshFace) -> TreyMesh {
let mut aabb=self.mesh(); let mut aabb=self.mesh;
//in this implementation face = worldspace aabb face //in this implementation face = worldspace aabb face
match face { match face {
AabbFace::Right => aabb.min.x=aabb.max.x, AabbFace::Right => aabb.min.x=aabb.max.x,

View File

@ -87,11 +87,15 @@ impl GraphicsData {
depth_texture.create_view(&wgpu::TextureViewDescriptor::default()) depth_texture.create_view(&wgpu::TextureViewDescriptor::default())
} }
fn generate_model_physics(&mut self,modeldatas:&Vec<ModelData>){ fn generate_model_physics(&mut self,indexed_models:&model::IndexedModelInstances){
self.physics.models.append(&mut modeldatas.iter().map(|m| for instance in indexed_models.instances{
//make aabb and run vertices to get realistic bounds //make aabb and run vertices to get realistic bounds
m.instances.iter().map(|t|body::ModelPhysics::new(t.model_transform)) if let Some(model)=indexed_models.models.get(instance.model as usize){
).flatten().collect()); self.physics.models.push(body::ModelPhysics::from_model(model,instance.model_transform));
}else{
println!("oh no model missing id={}",instance.model);
}
}
println!("Physics Objects: {}",self.physics.models.len()); println!("Physics Objects: {}",self.physics.models.len());
} }
fn generate_model_graphics(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,mut indexed_models:model::IndexedModelInstances){ fn generate_model_graphics(&mut self,device:&wgpu::Device,queue:&wgpu::Queue,mut indexed_models:model::IndexedModelInstances){