pub struct ContactGraph {
pub internal: UnGraph<Entity, ContactPair>,
/* private fields */
}
Expand description
A resource that stores all contact pairs in the physics world in an undirected graph.
Contact pairs exist between colliders that have intersecting AABBs, even if the shapes themselves are not yet touching.
For a simpler API that only provides touching contacts, consider using the Collisions
system parameter.
§Usage
The following methods can be used for querying collisions:
get
andget_mut
iter
anditer_mut
contains
collisions_with
andcollisions_with_mut
entities_colliding_with
For example, to iterate over all collisions with a given entity:
use avian2d::prelude::*;
use bevy::prelude::*;
#[derive(Component)]
struct PressurePlate;
fn activate_pressure_plates(mut query: Query<Entity, With<PressurePlate>>, contact_graph: Res<ContactGraph>) {
for pressure_plate in &query {
// Compute the total impulse applied to the pressure plate.
let mut total_impulse = 0.0;
for contact_pair in contact_graph.collisions_with(pressure_plate) {
total_impulse += contact_pair.total_normal_impulse_magnitude();
}
if total_impulse > 5.0 {
println!("Pressure plate activated!");
}
}
}
While mutable access is allowed, contact modification and filtering should typically
be done using CollisionHooks
. See the documentation for more information.
§Warning
For users, this resource is primarily for querying and reading collision data.
Directly adding, modifying, or removing contact pairs using this resource will not trigger any collision events, wake up the entities involved, or perform any other cleanup. Only make structural modifications if you know what you are doing.
For filtering and modifying collisions, consider using CollisionHooks
instead.
Fields§
§internal: UnGraph<Entity, ContactPair>
The internal undirected graph where nodes are entities and edges are contact pairs.
Implementations§
Source§impl ContactGraph
impl ContactGraph
Sourcepub fn get(&self, entity1: Entity, entity2: Entity) -> Option<&ContactPair>
pub fn get(&self, entity1: Entity, entity2: Entity) -> Option<&ContactPair>
Returns the contact pair between two entities.
If the pair does not exist, None
is returned.
A contact pair exists between two entities if their ColliderAabb
s intersect.
Use ContactPair::is_touching
to determine if the actual collider shapes are touching.
Sourcepub fn get_mut(
&mut self,
entity1: Entity,
entity2: Entity,
) -> Option<&mut ContactPair>
pub fn get_mut( &mut self, entity1: Entity, entity2: Entity, ) -> Option<&mut ContactPair>
Returns a mutable reference to the contact pair between two entities.
If the pair does not exist, None
is returned.
A contact pair exists between two entities if their ColliderAabb
s intersect.
Use ContactPair::is_touching
to determine if the actual collider shapes are touching.
Sourcepub fn contains(&self, entity1: Entity, entity2: Entity) -> bool
pub fn contains(&self, entity1: Entity, entity2: Entity) -> bool
Returns true
if the given entities have a contact pair.
A contact pair exists between two entities if their ColliderAabb
s intersect,
even if the shapes themselves are not yet touching.
Sourcepub fn contains_key(&self, pair_key: &PairKey) -> bool
pub fn contains_key(&self, pair_key: &PairKey) -> bool
Returns true
if the given pair key is in the contact graph.
The pair key should be equivalent to PairKey::new(entity1.index(), entity2.index())
.
This method can be useful to avoid constructing a new PairKey
when the key is already known.
If the key is not available, consider using contains
instead.
Sourcepub fn iter(&self) -> impl Iterator<Item = &ContactPair>
pub fn iter(&self) -> impl Iterator<Item = &ContactPair>
Returns an iterator yielding immutable access to all contact pairs.
A contact pair exists between two entities if their ColliderAabb
s intersect,
even if the shapes themselves are not yet touching.
If you only want touching contacts, use iter_touching
instead.
Sourcepub fn iter_touching(&self) -> impl Iterator<Item = &ContactPair>
pub fn iter_touching(&self) -> impl Iterator<Item = &ContactPair>
Returns an iterator yielding immutable access to all contact pairs that are currently touching.
This is a subset of iter
that only includes pairs where the colliders are touching.
Sourcepub fn iter_mut(&mut self) -> impl Iterator<Item = &mut ContactPair>
pub fn iter_mut(&mut self) -> impl Iterator<Item = &mut ContactPair>
Returns a iterator yielding mutable access to all contact pairs.
A contact pair exists between two entities if their ColliderAabb
s intersect,
even if the shapes themselves are not yet touching.
If you only want touching contacts, use iter_touching_mut
instead.
Sourcepub fn iter_touching_mut(&mut self) -> impl Iterator<Item = &mut ContactPair>
pub fn iter_touching_mut(&mut self) -> impl Iterator<Item = &mut ContactPair>
Returns a iterator yielding mutable access to all contact pairs that are currently touching.
This is a subset of iter_mut
that only includes pairs where the colliders are touching.
Sourcepub fn collisions_with(
&self,
entity: Entity,
) -> impl Iterator<Item = &ContactPair>
pub fn collisions_with( &self, entity: Entity, ) -> impl Iterator<Item = &ContactPair>
Returns an iterator yielding immutable access to all contact pairs involving the given entity.
A contact pair exists between two entities if their ColliderAabb
s intersect,
even if the shapes themselves are not yet touching.
Use ContactPair::is_touching
to determine if the actual collider shapes are touching.
Sourcepub fn collisions_with_mut(
&mut self,
entity: Entity,
) -> impl Iterator<Item = &mut ContactPair>
pub fn collisions_with_mut( &mut self, entity: Entity, ) -> impl Iterator<Item = &mut ContactPair>
Returns an iterator yielding mutable access to all contact pairs involving the given entity.
A contact pair exists between two entities if their ColliderAabb
s intersect,
even if the shapes themselves are not yet touching.
Use ContactPair::is_touching
to determine if the actual collider shapes are touching.
Sourcepub fn entities_colliding_with(
&self,
entity: Entity,
) -> impl Iterator<Item = Entity> + '_
pub fn entities_colliding_with( &self, entity: Entity, ) -> impl Iterator<Item = Entity> + '_
Returns an iterator yielding immutable access to all entities that have a contact pair with the given entity.
A contact pair exists between two entities if their ColliderAabb
s intersect,
even if the shapes themselves are not yet touching.
Sourcepub fn add_pair(&mut self, contacts: ContactPair)
pub fn add_pair(&mut self, contacts: ContactPair)
Creates a contact pair between two entities.
If a pair with the same entities already exists, this will do nothing.
§Warning
Creating a collision pair with this method will not trigger any collision events or wake up the entities involved. Only use this method if you know what you are doing.
Sourcepub fn add_pair_with_key(&mut self, contacts: ContactPair, pair_key: PairKey)
pub fn add_pair_with_key(&mut self, contacts: ContactPair, pair_key: PairKey)
Creates a contact pair between two entities with the given pair key.
The key must be equivalent to PairKey::new(contacts.entity1.index(), contacts.entity2.index())
.
If a pair with the same entities already exists, this will do nothing.
This method can be useful to avoid constructing a new PairKey
when the key is already known.
If the key is not available, consider using add_pair
instead.
§Warning
Creating a collision pair with this method will not trigger any collision events or wake up the entities involved. Only use this method if you know what you are doing.
Sourcepub fn insert_pair(&mut self, contacts: ContactPair)
pub fn insert_pair(&mut self, contacts: ContactPair)
Inserts a contact pair between two entities.
If a pair with the same entities already exists, it will be overwritten.
§Warning
Inserting a collision pair with this method will not trigger any collision events or wake up the entities involved. Only use this method if you know what you are doing.
Sourcepub fn insert_pair_with_key(&mut self, contacts: ContactPair, pair_key: PairKey)
pub fn insert_pair_with_key(&mut self, contacts: ContactPair, pair_key: PairKey)
Inserts a contact pair between two entities with the given pair key.
The key must be equivalent to PairKey::new(contacts.entity1.index(), contacts.entity2.index())
.
If a pair with the same entities already exists, it will be overwritten.
This method can be useful to avoid constructing a new PairKey
when the key is already known.
If the key is not available, consider using insert_pair
instead.
§Warning
Inserting a collision pair with this method will not trigger any collision events or wake up the entities involved. Only use this method if you know what you are doing.
Sourcepub fn remove_pair(
&mut self,
entity1: Entity,
entity2: Entity,
) -> Option<ContactPair>
pub fn remove_pair( &mut self, entity1: Entity, entity2: Entity, ) -> Option<ContactPair>
Removes a contact pair between two entites and returns its value.
§Warning
Removing a collision pair with this method will not trigger any collision events or wake up the entities involved. Only use this method if you know what you are doing.
For filtering and modifying collisions, consider using CollisionHooks
instead.
Sourcepub fn remove_collider_with<F>(&mut self, entity: Entity, pair_callback: F)where
F: FnMut(ContactPair),
pub fn remove_collider_with<F>(&mut self, entity: Entity, pair_callback: F)where
F: FnMut(ContactPair),
Removes the collider of the given entity from the contact graph, calling the given callback for each contact pair that is removed in the process.
§Warning
Removing a collider with this method will not trigger any collision events or wake up the entities involved. Only use this method if you know what you are doing.
Trait Implementations§
Source§impl Clone for ContactGraph
impl Clone for ContactGraph
Source§fn clone(&self) -> ContactGraph
fn clone(&self) -> ContactGraph
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source
. Read moreSource§impl Debug for ContactGraph
impl Debug for ContactGraph
Source§impl Default for ContactGraph
impl Default for ContactGraph
Source§fn default() -> ContactGraph
fn default() -> ContactGraph
impl Resource for ContactGraph
Auto Trait Implementations§
impl Freeze for ContactGraph
impl RefUnwindSafe for ContactGraph
impl Send for ContactGraph
impl Sync for ContactGraph
impl Unpin for ContactGraph
impl UnwindSafe for ContactGraph
Blanket Implementations§
Source§impl<T, U> AsBindGroupShaderType<U> for T
impl<T, U> AsBindGroupShaderType<U> for T
Source§fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U
T
ShaderType
for self
. When used in AsBindGroup
derives, it is safe to assume that all images in self
exist.Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> CloneToUninit for Twhere
T: Clone,
impl<T> CloneToUninit for Twhere
T: Clone,
Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
. Box<dyn Any>
can
then be further downcast
into Box<ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
. Rc<Any>
can then be
further downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> Downcast for Twhere
T: Any,
impl<T> Downcast for Twhere
T: Any,
Source§fn into_any(self: Box<T>) -> Box<dyn Any>
fn into_any(self: Box<T>) -> Box<dyn Any>
Box<dyn Trait>
(where Trait: Downcast
) to Box<dyn Any>
, which can then be
downcast
into Box<dyn ConcreteType>
where ConcreteType
implements Trait
.Source§fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
fn into_any_rc(self: Rc<T>) -> Rc<dyn Any>
Rc<Trait>
(where Trait: Downcast
) to Rc<Any>
, which can then be further
downcast
into Rc<ConcreteType>
where ConcreteType
implements Trait
.Source§fn as_any(&self) -> &(dyn Any + 'static)
fn as_any(&self) -> &(dyn Any + 'static)
&Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &Any
’s vtable from &Trait
’s.Source§fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
fn as_any_mut(&mut self) -> &mut (dyn Any + 'static)
&mut Trait
(where Trait: Downcast
) to &Any
. This is needed since Rust cannot
generate &mut Any
’s vtable from &mut Trait
’s.Source§impl<T> DowncastSend for T
impl<T> DowncastSend for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> DowncastSync for T
impl<T> DowncastSync for T
Source§impl<T> FromWorld for Twhere
T: Default,
impl<T> FromWorld for Twhere
T: Default,
Source§fn from_world(_world: &mut World) -> T
fn from_world(_world: &mut World) -> T
Creates Self
using default()
.
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left
is true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self
into a Left
variant of Either<Self, Self>
if into_left(&self)
returns true
.
Converts self
into a Right
variant of Either<Self, Self>
otherwise. Read moreSource§impl<T> Pointable for T
impl<T> Pointable for T
Source§impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
impl<SS, SP> SupersetOf<SS> for SPwhere
SS: SubsetOf<SP>,
Source§fn to_subset(&self) -> Option<SS>
fn to_subset(&self) -> Option<SS>
self
from the equivalent element of its
superset. Read moreSource§fn is_in_subset(&self) -> bool
fn is_in_subset(&self) -> bool
self
is actually part of its subset T
(and can be converted to it).Source§fn to_subset_unchecked(&self) -> SS
fn to_subset_unchecked(&self) -> SS
self.to_subset
but without any property checks. Always succeeds.Source§fn from_subset(element: &SS) -> SP
fn from_subset(element: &SS) -> SP
self
to the equivalent element of its superset.