Skip to content

Commit 934d1f2

Browse files
committed
Improve collider spawning performance by not scaling
1 parent 2f8cb58 commit 934d1f2

File tree

1 file changed

+23
-28
lines changed

1 file changed

+23
-28
lines changed

src/level_instantiation/on_spawn/collider.rs

+23-28
Original file line numberDiff line numberDiff line change
@@ -30,34 +30,29 @@ fn spawn(
3030
) {
3131
#[cfg(feature = "tracing")]
3232
let _span = info_span!("read_colliders").entered();
33-
for entity in collider_marker.iter() {
34-
let mut all_children_loaded = true;
35-
for child in children.iter_descendants(entity) {
36-
if let Ok(mesh_handle) = mesh_handles.get(child) {
37-
if let Some(mesh) = meshes.get(mesh_handle) {
38-
let global_transform = global_transforms
39-
.get(child)
40-
.context("Failed to get global transform while reading collider")?
41-
.compute_transform();
42-
let scaled_mesh = mesh.clone().scaled_by(global_transform.scale);
43-
let collider = XpbdCollider::trimesh_from_mesh(&scaled_mesh)
44-
.context("Failed to create collider from mesh")?;
45-
commands.entity(child).insert((
46-
collider,
47-
RigidBody::Static,
48-
CollisionLayers::new(
49-
[CollisionLayer::Terrain, CollisionLayer::CameraObstacle],
50-
[CollisionLayer::Character],
51-
),
52-
NavMeshAffector,
53-
));
54-
} else {
55-
all_children_loaded = false;
56-
}
57-
}
58-
}
59-
if all_children_loaded {
60-
commands.entity(entity).remove::<Collider>();
33+
for parent in collider_marker.iter() {
34+
for child in iter::once(entity).chain(children.iter_descendants(entity)) {
35+
let Ok(mesh_handle) = mesh_handles.get(child) else {
36+
continue;
37+
};
38+
// Cannot fail: we already load all the meshes at startup.
39+
let mesh = meshes.get(mesh_handle).unwrap();
40+
let collider = XpbdCollider::trimesh_from_mesh(&scaled_mesh)
41+
.context("Failed to create collider from mesh")?;
42+
commands.entity(child).insert((
43+
collider,
44+
CollisionLayers::new(
45+
[CollisionLayer::Terrain, CollisionLayer::CameraObstacle],
46+
[CollisionLayer::Character],
47+
),
48+
NavMeshAffector,
49+
));
6150
}
6251
}
52+
commands
53+
.entity(parent)
54+
.remove::<Collider>()
55+
// If this were on the descendant, the collider would behave as if its local transform were its global transform
56+
// ¯\_ (ツ)_/¯
57+
.insert(RigidBody::Static);
6358
}

0 commit comments

Comments
 (0)