pub trait AnyCollider: Component<Mutability = Mutable> + ComputeMassProperties {
type Context: for<'w, 's> ReadOnlySystemParam<Item<'w, 's>: Send + Sync>;
// Required methods
fn aabb_with_context(
&self,
position: Vector,
rotation: impl Into<Rotation>,
context: AabbContext<'_, '_, '_, Self::Context>,
) -> ColliderAabb;
fn contact_manifolds_with_context(
&self,
other: &Self,
position1: Vector,
rotation1: impl Into<Rotation>,
position2: Vector,
rotation2: impl Into<Rotation>,
prediction_distance: Scalar,
manifolds: &mut Vec<ContactManifold>,
context: ContactManifoldContext<'_, '_, '_, Self::Context>,
);
// Provided method
fn swept_aabb_with_context(
&self,
start_position: Vector,
start_rotation: impl Into<Rotation>,
end_position: Vector,
end_rotation: impl Into<Rotation>,
context: AabbContext<'_, '_, '_, Self::Context>,
) -> ColliderAabb { ... }
}
Expand description
A trait that generalizes over colliders. Implementing this trait allows colliders to be used with the physics engine.
Required Associated Types§
Sourcetype Context: for<'w, 's> ReadOnlySystemParam<Item<'w, 's>: Send + Sync>
type Context: for<'w, 's> ReadOnlySystemParam<Item<'w, 's>: Send + Sync>
A type providing additional context for collider operations.
Context
allows you to access an arbitrary ReadOnlySystemParam
on
the world, for context-sensitive behavior in collider operations. You
can use this to query components on the collider entity, or get any
other necessary context from the world.
§Example
#[derive(Component)]
pub struct VoxelCollider;
#[derive(Component)]
pub struct VoxelData {
// collider voxel data...
}
impl AnyCollider for VoxelCollider {
type Context = (
// you can query extra components here
SQuery<&'static VoxelData>,
// or put any other read-only system param here
SRes<Time>,
);
fn contact_manifolds_with_context(
&self,
other: &Self,
position1: Vector,
rotation1: impl Into<Rotation>,
position2: Vector,
rotation2: impl Into<Rotation>,
prediction_distance: Scalar,
manifolds: &mut Vec<ContactManifold>,
context: ContactManifoldContext<Self::Context>,
) {
let [voxels1, voxels2] = context.0.get_many([context.entity1, context.entity2])
.expect("our own `VoxelCollider` entities should have `VoxelData`");
let elapsed = context.1.elapsed();
// do some computation...
}
}
Required Methods§
Sourcefn aabb_with_context(
&self,
position: Vector,
rotation: impl Into<Rotation>,
context: AabbContext<'_, '_, '_, Self::Context>,
) -> ColliderAabb
fn aabb_with_context( &self, position: Vector, rotation: impl Into<Rotation>, context: AabbContext<'_, '_, '_, Self::Context>, ) -> ColliderAabb
Computes the Axis-Aligned Bounding Box of the collider with the given position and rotation.
See SimpleCollider::aabb
for collider types with empty AnyCollider::Context
Sourcefn contact_manifolds_with_context(
&self,
other: &Self,
position1: Vector,
rotation1: impl Into<Rotation>,
position2: Vector,
rotation2: impl Into<Rotation>,
prediction_distance: Scalar,
manifolds: &mut Vec<ContactManifold>,
context: ContactManifoldContext<'_, '_, '_, Self::Context>,
)
fn contact_manifolds_with_context( &self, other: &Self, position1: Vector, rotation1: impl Into<Rotation>, position2: Vector, rotation2: impl Into<Rotation>, prediction_distance: Scalar, manifolds: &mut Vec<ContactManifold>, context: ContactManifoldContext<'_, '_, '_, Self::Context>, )
Computes all ContactManifold
s between two colliders.
Returns an empty vector if the colliders are separated by a distance greater than prediction_distance
or if the given shapes are invalid.
See SimpleCollider::contact_manifolds
for collider types with empty AnyCollider::Context
Provided Methods§
Sourcefn swept_aabb_with_context(
&self,
start_position: Vector,
start_rotation: impl Into<Rotation>,
end_position: Vector,
end_rotation: impl Into<Rotation>,
context: AabbContext<'_, '_, '_, Self::Context>,
) -> ColliderAabb
fn swept_aabb_with_context( &self, start_position: Vector, start_rotation: impl Into<Rotation>, end_position: Vector, end_rotation: impl Into<Rotation>, context: AabbContext<'_, '_, '_, Self::Context>, ) -> ColliderAabb
Computes the swept Axis-Aligned Bounding Box of the collider. This corresponds to the space the shape would occupy if it moved from the given start position to the given end position.
See SimpleCollider::swept_aabb
for collider types with empty AnyCollider::Context
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.