1
1
use crate :: math:: { Real , Vect } ;
2
- use bevy:: prelude:: { Entity , Event } ;
2
+ use bevy:: prelude:: { Entity , Event , EventWriter } ;
3
3
use rapier:: dynamics:: RigidBodySet ;
4
4
use rapier:: geometry:: {
5
5
ColliderHandle , ColliderSet , CollisionEvent as RapierCollisionEvent , CollisionEventFlags ,
@@ -58,8 +58,8 @@ pub(crate) struct EventQueue<'a> {
58
58
// Used to retrieve the entity of colliders that have been removed from the simulation
59
59
// since the last physics step.
60
60
pub deleted_colliders : & ' a HashMap < ColliderHandle , Entity > ,
61
- pub collision_events : RwLock < Vec < CollisionEvent > > ,
62
- pub contact_force_events : RwLock < Vec < ContactForceEvent > > ,
61
+ pub collision_events : RwLock < EventWriter < ' a , CollisionEvent > > ,
62
+ pub contact_force_events : RwLock < EventWriter < ' a , ContactForceEvent > > ,
63
63
}
64
64
65
65
impl < ' a > EventQueue < ' a > {
@@ -94,7 +94,7 @@ impl<'a> EventHandler for EventQueue<'a> {
94
94
} ;
95
95
96
96
if let Ok ( mut events) = self . collision_events . write ( ) {
97
- events. push ( event) ;
97
+ events. send ( event) ;
98
98
}
99
99
}
100
100
@@ -118,7 +118,7 @@ impl<'a> EventHandler for EventQueue<'a> {
118
118
} ;
119
119
120
120
if let Ok ( mut events) = self . contact_force_events . write ( ) {
121
- events. push ( event) ;
121
+ events. send ( event) ;
122
122
}
123
123
}
124
124
}
@@ -155,13 +155,15 @@ mod test {
155
155
pub struct EventsSaver < E : Event > {
156
156
pub events : Vec < E > ,
157
157
}
158
+
158
159
impl < E : Event > Default for EventsSaver < E > {
159
160
fn default ( ) -> Self {
160
161
Self {
161
162
events : Default :: default ( ) ,
162
163
}
163
164
}
164
165
}
166
+
165
167
pub fn save_events < E : Event + Clone > (
166
168
mut events : EventReader < E > ,
167
169
mut saver : ResMut < EventsSaver < E > > ,
@@ -170,6 +172,7 @@ mod test {
170
172
saver. events . push ( event. clone ( ) ) ;
171
173
}
172
174
}
175
+
173
176
fn run_test ( app : & mut App ) {
174
177
app. add_systems ( PostUpdate , save_events :: < CollisionEvent > )
175
178
. add_systems ( PostUpdate , save_events :: < ContactForceEvent > )
@@ -189,12 +192,12 @@ mod test {
189
192
. world ( )
190
193
. get_resource :: < EventsSaver < CollisionEvent > > ( )
191
194
. unwrap ( ) ;
192
- assert ! ( saved_collisions. events. len( ) > 0 ) ;
195
+ assert_eq ! ( saved_collisions. events. len( ) , 3 ) ;
193
196
let saved_contact_forces = app
194
197
. world ( )
195
- . get_resource :: < EventsSaver < CollisionEvent > > ( )
198
+ . get_resource :: < EventsSaver < ContactForceEvent > > ( )
196
199
. unwrap ( ) ;
197
- assert ! ( saved_contact_forces. events. len( ) > 0 ) ;
200
+ assert_eq ! ( saved_contact_forces. events. len( ) , 1 ) ;
198
201
}
199
202
200
203
/// Adapted from events example
@@ -229,7 +232,7 @@ mod test {
229
232
TransformBundle :: from ( Transform :: from_xyz ( 0.0 , 13.0 , 0.0 ) ) ,
230
233
RigidBody :: Dynamic ,
231
234
cuboid ( 0.5 , 0.5 , 0.5 ) ,
232
- ActiveEvents :: COLLISION_EVENTS ,
235
+ ActiveEvents :: COLLISION_EVENTS | ActiveEvents :: CONTACT_FORCE_EVENTS ,
233
236
ContactForceEventThreshold ( 30.0 ) ,
234
237
) ) ;
235
238
}
@@ -244,10 +247,13 @@ mod test {
244
247
TransformPlugin ,
245
248
RapierPhysicsPlugin :: < NoUserData > :: default ( ) ,
246
249
) )
247
- . insert_resource ( TimestepMode :: Interpolated {
248
- dt : 1.0 / 30.0 ,
249
- time_scale : 1.0 ,
250
- substeps : 2 ,
250
+ . insert_resource ( RapierConfiguration {
251
+ timestep_mode : TimestepMode :: Interpolated {
252
+ dt : 1.0 / 30.0 ,
253
+ time_scale : 1.0 ,
254
+ substeps : 2 ,
255
+ } ,
256
+ ..RapierConfiguration :: new ( 1f32 )
251
257
} )
252
258
. add_systems ( Startup , setup_physics)
253
259
. add_systems ( Update , remove_collider) ;
0 commit comments