use std::any::Any;
use glam::Point3;
pub use phys_geom::volume::ComputeVolume;
use phys_geom::{Aabb3, ComputeAabb3};
use super::ComplexShapeId;
use crate::ray::{Raycast, RaycastHitResult};
use crate::{ContainsPoint, ContainsResult, Expansion, Ray, SignedDistanceToPoint};
pub trait ComplexShapeTrait:
ComputeAabb3
+ Raycast
+ Expansion
+ ContainsPoint
+ SignedDistanceToPoint
+ ComputeVolume
+ ShapePlugin
+ Clone
{
}
pub trait ShapeSetTrait: Send + Sync + dyn_clone::DynClone {
fn as_any(&self) -> &dyn Any;
fn as_any_mut(&mut self) -> &mut dyn Any;
fn compute_aabb(&self, id: ComplexShapeId) -> Aabb3;
fn max_radius_and_max_angular_expansion(&self, id: ComplexShapeId) -> (f32, f32);
fn raycast(
&self,
id: ComplexShapeId,
local_ray: Ray,
max_distance: f32,
discard_inside_hit: bool,
) -> Option<RaycastHitResult>;
fn contains_point_with_threshold(
&self,
id: ComplexShapeId,
local_point: Point3,
threshold: f32,
) -> ContainsResult;
fn signed_distance_to_point(&self, id: ComplexShapeId, local_point: Point3) -> f32;
fn compute_volume(&self, id: ComplexShapeId) -> f32;
}
dyn_clone::clone_trait_object!(ShapeSetTrait);
pub trait ShapePlugin {
const PLUGIN_ID: u64;
}