@@ -304,6 +304,8 @@ impl PhysicsBackend2D {
304304 /// - `density`: The density in kg/m².
305305 /// - `friction`: The friction coefficient (unitless).
306306 /// - `restitution`: The restitution coefficient in `[0.0, 1.0]`.
307+ /// - `collision_group`: The collider membership bitfield.
308+ /// - `collision_mask`: The collider interaction mask bitfield.
307309 ///
308310 /// # Returns
309311 /// Returns a `(slot_index, slot_generation)` pair for the created collider.
@@ -322,6 +324,8 @@ impl PhysicsBackend2D {
322324 density : f32 ,
323325 friction : f32 ,
324326 restitution : f32 ,
327+ collision_group : u32 ,
328+ collision_mask : u32 ,
325329 ) -> Result < ( u32 , u32 ) , Collider2DBackendError > {
326330 return self . attach_collider_2d (
327331 parent_slot_index,
@@ -332,6 +336,8 @@ impl PhysicsBackend2D {
332336 density,
333337 friction,
334338 restitution,
339+ collision_group,
340+ collision_mask,
335341 ) ;
336342 }
337343
@@ -350,6 +356,8 @@ impl PhysicsBackend2D {
350356 /// - `density`: The density in kg/m².
351357 /// - `friction`: The friction coefficient (unitless).
352358 /// - `restitution`: The restitution coefficient in `[0.0, 1.0]`.
359+ /// - `collision_group`: The collider membership bitfield.
360+ /// - `collision_mask`: The collider interaction mask bitfield.
353361 ///
354362 /// # Returns
355363 /// Returns a `(slot_index, slot_generation)` pair for the created collider.
@@ -369,6 +377,8 @@ impl PhysicsBackend2D {
369377 density : f32 ,
370378 friction : f32 ,
371379 restitution : f32 ,
380+ collision_group : u32 ,
381+ collision_mask : u32 ,
372382 ) -> Result < ( u32 , u32 ) , Collider2DBackendError > {
373383 return self . attach_collider_2d (
374384 parent_slot_index,
@@ -379,6 +389,8 @@ impl PhysicsBackend2D {
379389 density,
380390 friction,
381391 restitution,
392+ collision_group,
393+ collision_mask,
382394 ) ;
383395 }
384396
@@ -398,6 +410,8 @@ impl PhysicsBackend2D {
398410 /// - `density`: The density in kg/m².
399411 /// - `friction`: The friction coefficient (unitless).
400412 /// - `restitution`: The restitution coefficient in `[0.0, 1.0]`.
413+ /// - `collision_group`: The collider membership bitfield.
414+ /// - `collision_mask`: The collider interaction mask bitfield.
401415 ///
402416 /// # Returns
403417 /// Returns a `(slot_index, slot_generation)` pair for the created collider.
@@ -417,6 +431,8 @@ impl PhysicsBackend2D {
417431 density : f32 ,
418432 friction : f32 ,
419433 restitution : f32 ,
434+ collision_group : u32 ,
435+ collision_mask : u32 ,
420436 ) -> Result < ( u32 , u32 ) , Collider2DBackendError > {
421437 let rapier_builder = if half_height == 0.0 {
422438 ColliderBuilder :: ball ( radius)
@@ -433,6 +449,8 @@ impl PhysicsBackend2D {
433449 density,
434450 friction,
435451 restitution,
452+ collision_group,
453+ collision_mask,
436454 ) ;
437455 }
438456
@@ -452,6 +470,8 @@ impl PhysicsBackend2D {
452470 /// - `density`: The density in kg/m².
453471 /// - `friction`: The friction coefficient (unitless).
454472 /// - `restitution`: The restitution coefficient in `[0.0, 1.0]`.
473+ /// - `collision_group`: The collider membership bitfield.
474+ /// - `collision_mask`: The collider interaction mask bitfield.
455475 ///
456476 /// # Returns
457477 /// Returns a `(slot_index, slot_generation)` pair for the created collider.
@@ -472,6 +492,8 @@ impl PhysicsBackend2D {
472492 density : f32 ,
473493 friction : f32 ,
474494 restitution : f32 ,
495+ collision_group : u32 ,
496+ collision_mask : u32 ,
475497 ) -> Result < ( u32 , u32 ) , Collider2DBackendError > {
476498 let rapier_vertices: Vec < Vector > = vertices
477499 . iter ( )
@@ -493,6 +515,8 @@ impl PhysicsBackend2D {
493515 density,
494516 friction,
495517 restitution,
518+ collision_group,
519+ collision_mask,
496520 ) ;
497521 }
498522
@@ -1018,6 +1042,8 @@ impl PhysicsBackend2D {
10181042 /// - `density`: The requested density in kg/m².
10191043 /// - `friction`: The friction coefficient (unitless).
10201044 /// - `restitution`: The restitution coefficient in `[0.0, 1.0]`.
1045+ /// - `collision_group`: The collider membership bitfield.
1046+ /// - `collision_mask`: The collider interaction mask bitfield.
10211047 ///
10221048 /// # Returns
10231049 /// Returns a `(slot_index, slot_generation)` pair for the created collider.
@@ -1035,13 +1061,17 @@ impl PhysicsBackend2D {
10351061 density : f32 ,
10361062 friction : f32 ,
10371063 restitution : f32 ,
1064+ collision_group : u32 ,
1065+ collision_mask : u32 ,
10381066 ) -> Result < ( u32 , u32 ) , Collider2DBackendError > {
10391067 let ( rapier_parent_handle, rapier_density) = self
10401068 . prepare_parent_body_for_collider_attachment_2d (
10411069 parent_slot_index,
10421070 parent_slot_generation,
10431071 density,
10441072 ) ?;
1073+ let interaction_groups =
1074+ build_collision_groups_2d ( collision_group, collision_mask) ;
10451075
10461076 let rapier_collider = rapier_builder
10471077 . translation ( Vector :: new ( local_offset[ 0 ] , local_offset[ 1 ] ) )
@@ -1051,6 +1081,8 @@ impl PhysicsBackend2D {
10511081 . friction_combine_rule ( CoefficientCombineRule :: Multiply )
10521082 . restitution ( restitution)
10531083 . restitution_combine_rule ( CoefficientCombineRule :: Max )
1084+ . collision_groups ( interaction_groups)
1085+ . solver_groups ( interaction_groups)
10541086 . build ( ) ;
10551087
10561088 let rapier_handle = self . colliders . insert_with_parent (
@@ -1251,6 +1283,25 @@ fn build_rapier_rigid_body(
12511283 }
12521284}
12531285
1286+ /// Converts public collision filter bitfields into Rapier interaction groups.
1287+ ///
1288+ /// # Arguments
1289+ /// - `collision_group`: The collider membership bitfield.
1290+ /// - `collision_mask`: The collider interaction mask bitfield.
1291+ ///
1292+ /// # Returns
1293+ /// Returns Rapier interaction groups using AND-based matching.
1294+ fn build_collision_groups_2d (
1295+ collision_group : u32 ,
1296+ collision_mask : u32 ,
1297+ ) -> InteractionGroups {
1298+ return InteractionGroups :: new (
1299+ Group :: from_bits_retain ( collision_group) ,
1300+ Group :: from_bits_retain ( collision_mask) ,
1301+ InteractionTestMode :: And ,
1302+ ) ;
1303+ }
1304+
12541305/// Validates a 2D position.
12551306///
12561307/// # Arguments
0 commit comments