anput_physics/queries/
point.rs

1use crate::{Scalar, components::BodyAccessInfo, density_fields::DensityField};
2use vek::Vec3;
3
4#[derive(Debug, Default, Clone, PartialEq)]
5pub struct PointOverlapQuery {
6    pub position: Vec3<Scalar>,
7    pub resolution: Vec3<Scalar>,
8    pub density_threshold: Scalar,
9}
10
11impl PointOverlapQuery {
12    pub fn query_field(
13        &self,
14        field: &dyn DensityField,
15        info: &BodyAccessInfo,
16    ) -> Option<PointOverlapResult> {
17        let density = field.density_at_point(self.position, info);
18        if density >= self.density_threshold {
19            let normal = field.normal_at_point(self.position, self.resolution, info);
20            Some(PointOverlapResult {
21                point: self.position,
22                density,
23                normal,
24            })
25        } else {
26            None
27        }
28    }
29}
30
31pub struct PointOverlapResult {
32    pub point: Vec3<Scalar>,
33    pub density: Scalar,
34    pub normal: Vec3<Scalar>,
35}