diff options
| author | Kai Stevenson <kai@kaistevenson.com> | 2026-08-18 22:22:27 -0700 |
|---|---|---|
| committer | Kai Stevenson <kai@kaistevenson.com> | 2026-08-18 22:22:27 -0700 |
| commit | 2640f91e36558650bb988dcc82b5148ee71f3eb0 (patch) | |
| tree | 5f67c648569109c84736b11b39cb6d2cd6b67e4d /src/sim/rb_sim | |
| parent | 92dd02d7cc4d9fc930760d26d81edbe2197a3fc0 (diff) | |
optimize with settlement counter
Diffstat (limited to 'src/sim/rb_sim')
| -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( |
