@@ -30,34 +30,29 @@ fn spawn(
30
30
) {
31
31
#[ cfg( feature = "tracing" ) ]
32
32
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
+ ) ) ;
61
50
}
62
51
}
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 ) ;
63
58
}
0 commit comments