diff options
Diffstat (limited to 'src/sim/rb_sim/mod.rs')
| -rw-r--r-- | src/sim/rb_sim/mod.rs | 35 |
1 files changed, 24 insertions, 11 deletions
diff --git a/src/sim/rb_sim/mod.rs b/src/sim/rb_sim/mod.rs index d986962..17f605e 100644 --- a/src/sim/rb_sim/mod.rs +++ b/src/sim/rb_sim/mod.rs @@ -129,7 +129,9 @@ impl RbSimManager { height: h, }; - let collider = self.convex_hull_collider_from_marchable(&entity).build(); + let collider = self + .convex_hull_collider_from_marchable(&entity, None) + .build(); self.rb_entities.insert(id, entity); self.physics_manager.collider_set.insert_with_parent( @@ -175,16 +177,22 @@ impl RbSimManager { } } - fn polyline_from_marchable(&self, marchable: &impl Marchable) -> (Vec<Vec2>, Vec<[u32; 2]>) { + fn polyline_from_marchable( + &self, + marchable: &impl Marchable, + minimum_verts: Option<u32>, + ) -> (Vec<Vec2>, Vec<[u32; 2]>) { let (w, h) = marchable.size(); let polys = marching_squares_vertex_trace(marchable, w, h); let mut vertices = Vec::new(); let mut indices = Vec::new(); + let minimum_verts = minimum_verts.unwrap_or(3); + for poly in polys { let v = vertices.len() as u32; let p = poly.len() as u32; - if p < 3 { + if p < minimum_verts { continue; } for i in 0..p { @@ -202,8 +210,9 @@ impl RbSimManager { fn polyline_collider_from_marchable( &self, marchable: &impl Marchable, + minimum_verts: Option<u32>, ) -> geometry::ColliderBuilder { - let (vertices, indices) = self.polyline_from_marchable(marchable); + let (vertices, indices) = self.polyline_from_marchable(marchable, minimum_verts); geometry::ColliderBuilder::polyline(vertices, Some(indices)) } @@ -211,18 +220,22 @@ impl RbSimManager { fn convex_hull_collider_from_marchable( &self, marchable: &impl Marchable, + minimum_verts: Option<u32>, ) -> geometry::ColliderBuilder { - let (vertices, indices) = self.polyline_from_marchable(marchable); + let (vertices, indices) = self.polyline_from_marchable(marchable, minimum_verts); geometry::ColliderBuilder::convex_decomposition(&vertices, &indices) } pub fn upsert_chunk_collider(&mut self, cx: i32, cy: i32, chunk: &Chunk) { - let collider = self.polyline_collider_from_marchable(chunk).translation( - vec2( - (cx as f32 + 0.5) * CHUNK_SIZE as f32, - (cy as f32 + 0.5) * CHUNK_SIZE as f32, - ) / PIXELS_TO_METRES, - ); + puffin::profile_function!(); + let collider = self + .polyline_collider_from_marchable(chunk, Some(20)) + .translation( + vec2( + (cx as f32 + 0.5) * CHUNK_SIZE as f32, + (cy as f32 + 0.5) * CHUNK_SIZE as f32, + ) / PIXELS_TO_METRES, + ); if let Some(handle) = self.chunk_colliders.remove(&(cx, cy)) { self.physics_manager.collider_set.remove( |
