diff --git a/engine/physics/src/model.rs b/engine/physics/src/model.rs index bddb094d..2cd7291c 100644 --- a/engine/physics/src/model.rs +++ b/engine/physics/src/model.rs @@ -68,7 +68,7 @@ pub enum FEV{ } //use Unit32 #[repr(C)] for map files -#[derive(Clone,Hash,Eq,PartialEq)] +#[derive(Clone,Copy,Hash,Eq,PartialEq)] struct Face{ normal:Planar64Vec3, dot:Planar64, @@ -324,6 +324,8 @@ impl TryFrom<&model::Mesh> for PhysicsMesh{ //flat map mesh.physics_groups[$1].groups.polys()[$2] as face_id //lower face_id points to upper face_id //the same face is not allowed to be in multiple polygon groups + // because SubmeshFaceId -> CompleteMeshFaceId -> SubmeshFaceId is ambiguous + // when multiple SubmeshFaceId point to one MeshFaceId let mut faces=Vec::new(); let mut face_id_from_face=HashMap::new(); let mesh_topologies:Vec=mesh.physics_groups.iter().map(|physics_group|{ @@ -387,15 +389,11 @@ impl TryFrom<&model::Mesh> for PhysicsMesh{ normal:(normal/len as i64).divide().narrow_1().unwrap(), dot:(dot/(len*len) as i64).narrow_1().unwrap(), }; - let face_id=match face_id_from_face.get(&face){ - Some(&face_id)=>face_id, - None=>{ - let face_id=MeshFaceId::new(faces.len() as u32); - face_id_from_face.insert(face.clone(),face_id); - faces.push(face); - face_id - } - }; + let face_id=*face_id_from_face.entry(face).or_insert_with(||{ + let face_id=MeshFaceId::new(faces.len() as u32); + faces.push(face); + face_id + }); submesh_faces.push(face_id); face_ref_guys.push(FaceRefEdges(face_edges)); } @@ -403,16 +401,16 @@ impl TryFrom<&model::Mesh> for PhysicsMesh{ PhysicsMeshTopology{ faces:submesh_faces, verts:submesh_verts, - face_topology:face_ref_guys.into_iter().map(|face_ref_guy|{ - FaceRefs{edges:face_ref_guy.0} + face_topology:face_ref_guys.into_iter().map(|FaceRefEdges(edges)|{ + FaceRefs{edges} }).collect(), - edge_topology:edge_pool.edge_guys.into_iter().map(|(edge_ref_verts,edge_ref_faces)| - EdgeRefs{faces:edge_ref_faces.0,verts:edge_ref_verts.0} + edge_topology:edge_pool.edge_guys.into_iter().map(|(EdgeRefVerts(verts),EdgeRefFaces(faces))| + EdgeRefs{faces,verts} ).collect(), - vert_topology:vert_ref_guys.into_iter().map(|vert_ref_guy| + vert_topology:vert_ref_guys.into_iter().map(|VertRefGuy{edges,faces}| VertRefs{ - edges:vert_ref_guy.edges.into_iter().collect(), - faces:vert_ref_guy.faces.into_iter().collect(), + edges:edges.into_iter().collect(), + faces:faces.into_iter().collect(), } ).collect(), }