use crate::prelude::*;
use bevy::{ecs::system::SystemParam, prelude::*};
#[derive(SystemParam)]
pub struct SpatialQuery<'w, 's> {
pub(crate) colliders: Query<
'w,
's,
(
Entity,
&'static Position,
&'static Rotation,
&'static Collider,
Option<&'static CollisionLayers>,
),
>,
pub(crate) added_colliders: Query<'w, 's, Entity, Added<Collider>>,
pub query_pipeline: ResMut<'w, SpatialQueryPipeline>,
}
impl<'w, 's> SpatialQuery<'w, 's> {
pub fn update_pipeline(&mut self) {
self.query_pipeline
.update(self.colliders.iter(), self.added_colliders.iter());
}
pub fn cast_ray(
&self,
origin: Vector,
direction: Vector,
max_time_of_impact: Scalar,
solid: bool,
query_filter: SpatialQueryFilter,
) -> Option<RayHitData> {
self.query_pipeline
.cast_ray(origin, direction, max_time_of_impact, solid, query_filter)
}
pub fn ray_hits(
&self,
origin: Vector,
direction: Vector,
max_time_of_impact: Scalar,
max_hits: u32,
solid: bool,
query_filter: SpatialQueryFilter,
) -> Vec<RayHitData> {
self.query_pipeline.ray_hits(
origin,
direction,
max_time_of_impact,
max_hits,
solid,
query_filter,
)
}
pub fn ray_hits_callback(
&self,
origin: Vector,
direction: Vector,
max_time_of_impact: Scalar,
solid: bool,
query_filter: SpatialQueryFilter,
callback: impl FnMut(RayHitData) -> bool,
) {
self.query_pipeline.ray_hits_callback(
origin,
direction,
max_time_of_impact,
solid,
query_filter,
callback,
)
}
#[allow(clippy::too_many_arguments)]
pub fn cast_shape(
&self,
shape: &Collider,
origin: Vector,
shape_rotation: RotationValue,
direction: Vector,
max_time_of_impact: Scalar,
ignore_origin_penetration: bool,
query_filter: SpatialQueryFilter,
) -> Option<ShapeHitData> {
self.query_pipeline.cast_shape(
shape,
origin,
shape_rotation,
direction,
max_time_of_impact,
ignore_origin_penetration,
query_filter,
)
}
#[allow(clippy::too_many_arguments)]
pub fn shape_hits(
&self,
shape: &Collider,
origin: Vector,
shape_rotation: RotationValue,
direction: Vector,
max_time_of_impact: Scalar,
max_hits: u32,
ignore_origin_penetration: bool,
query_filter: SpatialQueryFilter,
) -> Vec<ShapeHitData> {
self.query_pipeline.shape_hits(
shape,
origin,
shape_rotation,
direction,
max_time_of_impact,
max_hits,
ignore_origin_penetration,
query_filter,
)
}
#[allow(clippy::too_many_arguments)]
pub fn shape_hits_callback(
&self,
shape: &Collider,
origin: Vector,
shape_rotation: RotationValue,
direction: Vector,
max_time_of_impact: Scalar,
ignore_origin_penetration: bool,
query_filter: SpatialQueryFilter,
callback: impl FnMut(ShapeHitData) -> bool,
) {
self.query_pipeline.shape_hits_callback(
shape,
origin,
shape_rotation,
direction,
max_time_of_impact,
ignore_origin_penetration,
query_filter,
callback,
)
}
pub fn project_point(
&self,
point: Vector,
solid: bool,
query_filter: SpatialQueryFilter,
) -> Option<PointProjection> {
self.query_pipeline
.project_point(point, solid, query_filter)
}
pub fn point_intersections(
&self,
point: Vector,
query_filter: SpatialQueryFilter,
) -> Vec<Entity> {
self.query_pipeline.point_intersections(point, query_filter)
}
pub fn point_intersections_callback(
&self,
point: Vector,
query_filter: SpatialQueryFilter,
callback: impl FnMut(Entity) -> bool,
) {
self.query_pipeline
.point_intersections_callback(point, query_filter, callback)
}
pub fn aabb_intersections_with_aabb(&self, aabb: ColliderAabb) -> Vec<Entity> {
self.query_pipeline.aabb_intersections_with_aabb(aabb)
}
pub fn aabb_intersections_with_aabb_callback(
&self,
aabb: ColliderAabb,
callback: impl FnMut(Entity) -> bool,
) {
self.query_pipeline
.aabb_intersections_with_aabb_callback(aabb, callback)
}
pub fn shape_intersections(
&self,
shape: &Collider,
shape_position: Vector,
shape_rotation: RotationValue,
query_filter: SpatialQueryFilter,
) -> Vec<Entity> {
self.query_pipeline
.shape_intersections(shape, shape_position, shape_rotation, query_filter)
}
pub fn shape_intersections_callback(
&self,
shape: &Collider,
shape_position: Vector,
shape_rotation: RotationValue,
query_filter: SpatialQueryFilter,
callback: impl FnMut(Entity) -> bool,
) {
self.query_pipeline.shape_intersections_callback(
shape,
shape_position,
shape_rotation,
query_filter,
callback,
)
}
}