@@ -15,6 +15,7 @@ use bevy::picking::{
1515use bevy:: prelude:: PickingPlugin ;
1616use bevy:: reflect:: prelude:: * ;
1717use bevy:: render:: { prelude:: * , view:: RenderLayers } ;
18+ use rapier:: parry:: query:: DefaultQueryDispatcher ;
1819
1920/// How a ray cast should handle [`Visibility`].
2021#[ derive( Clone , Copy , Reflect ) ]
@@ -85,7 +86,7 @@ pub fn update_hits(
8586 rapier_context : Query < (
8687 & crate :: prelude:: RapierContextColliders ,
8788 & crate :: prelude:: RapierRigidBodySet ,
88- & crate :: prelude:: RapierQueryPipeline ,
89+ & crate :: prelude:: RapierContextSimulation ,
8990 ) > ,
9091 mut output : EventWriter < PointerHits > ,
9192) {
@@ -97,7 +98,7 @@ pub fn update_hits(
9798 continue ;
9899 }
99100 let order = camera. order as f32 ;
100- for ( colliders, bodies, query_pipeline ) in rapier_context. iter ( ) {
101+ for ( colliders, bodies, simulation ) in rapier_context. iter ( ) {
101102 let predicate = |entity| {
102103 let marker_requirement =
103104 !backend_settings. require_markers || marked_targets. get ( entity) . is_ok ( ) ;
@@ -130,45 +131,56 @@ pub fn update_hits(
130131
131132 true
132133 } ;
134+ // FIXME: Due to "limitations in the borrow checker",
135+ // it's challenging to make a function to help with creating a rapier filter.
136+ let rapier_predicate =
137+ |h : rapier:: prelude:: ColliderHandle , _: & rapier:: prelude:: Collider | {
138+ crate :: prelude:: RapierContextColliders :: collider_entity_with_set (
139+ & colliders. colliders ,
140+ h,
141+ )
142+ . map ( & predicate)
143+ . unwrap_or ( false )
144+ } ;
145+ let filter = rapier:: prelude:: QueryFilter :: default ( ) . predicate ( & rapier_predicate) ;
146+ let query_pipeline = crate :: prelude:: RapierQueryPipeline {
147+ query_pipeline : simulation. broad_phase . as_query_pipeline (
148+ & DefaultQueryDispatcher ,
149+ & bodies. bodies ,
150+ & colliders. colliders ,
151+ filter. predicate ( & rapier_predicate) ,
152+ ) ,
153+ } ;
133154
134155 let mut picks = Vec :: new ( ) ;
135156 #[ cfg( feature = "dim2" ) ]
136- query_pipeline. intersections_with_point (
137- colliders,
138- bodies,
139- bevy:: math:: Vec2 :: new ( ray. origin . x , ray. origin . y ) ,
140- crate :: prelude:: QueryFilter :: default ( ) . predicate ( & predicate) ,
141- |entity| {
142- let hit_data = HitData {
143- camera : ray_id. camera ,
144- position : Some ( bevy:: math:: Vec3 :: new ( ray. origin . x , ray. origin . y , 0.0 ) ) ,
145- normal : None ,
146- depth : 0.0 ,
147- } ;
148- picks. push ( ( entity, hit_data) ) ;
149- true
150- } ,
151- ) ;
157+ for entity in query_pipeline
158+ . intersect_point ( colliders, bevy:: math:: Vec2 :: new ( ray. origin . x , ray. origin . y ) )
159+ {
160+ let hit_data = HitData {
161+ camera : ray_id. camera ,
162+ position : Some ( bevy:: math:: Vec3 :: new ( ray. origin . x , ray. origin . y , 0.0 ) ) ,
163+ normal : None ,
164+ depth : 0.0 ,
165+ } ;
166+ picks. push ( ( entity, hit_data) ) ;
167+ }
152168 #[ cfg( feature = "dim3" ) ]
153- query_pipeline. intersections_with_ray (
169+ for ( entity , intersection ) in query_pipeline. intersect_ray (
154170 colliders,
155- bodies,
156171 ray. origin ,
157172 ray. direction . into ( ) ,
158173 f32:: MAX ,
159174 true ,
160- crate :: prelude:: QueryFilter :: default ( ) . predicate ( & predicate) ,
161- |entity, intersection| {
162- let hit_data = HitData {
163- camera : ray_id. camera ,
164- position : Some ( intersection. point ) ,
165- normal : Some ( intersection. normal ) ,
166- depth : intersection. time_of_impact ,
167- } ;
168- picks. push ( ( entity, hit_data) ) ;
169- true
170- } ,
171- ) ;
175+ ) {
176+ let hit_data = HitData {
177+ camera : ray_id. camera ,
178+ position : Some ( intersection. point ) ,
179+ normal : Some ( intersection. normal ) ,
180+ depth : intersection. time_of_impact ,
181+ } ;
182+ picks. push ( ( entity, hit_data) ) ;
183+ }
172184
173185 if !picks. is_empty ( ) {
174186 output. write ( PointerHits :: new ( ray_id. pointer , picks, order) ) ;
0 commit comments