summaryrefslogtreecommitdiff
path: root/src/sim/rb_sim
diff options
context:
space:
mode:
authorKai Stevenson <kai@kaistevenson.com>2026-08-18 22:22:27 -0700
committerKai Stevenson <kai@kaistevenson.com>2026-08-18 22:22:27 -0700
commit2640f91e36558650bb988dcc82b5148ee71f3eb0 (patch)
tree5f67c648569109c84736b11b39cb6d2cd6b67e4d /src/sim/rb_sim
parent92dd02d7cc4d9fc930760d26d81edbe2197a3fc0 (diff)
optimize with settlement counter
Diffstat (limited to 'src/sim/rb_sim')
-rw-r--r--src/sim/rb_sim/mod.rs35
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(