pub struct ContactGraph {
pub edges: ContactGraphInternal,
/* private fields */
}
Expand description
A resource that stores all ContactEdge
s in the physics world in an undirected graph,
and their corresponding ContactPair
s.
Contact pairs exist between colliders that have intersecting AABBs, even if the shapes themselves are not yet touching. Internally, pairs for active (non-sleeping) bodies are stored separately from pairs for sleeping bodies for optimization purposes.
For a simpler API that abstracts over this complexity, consider using the Collisions
system parameter.
§Usage
The following methods can be used for querying collisions:
get
andget_mut
iter_active
anditer_active_mut
iter_sleeping
anditer_sleeping_mut
contains
contact_pairs_with
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.contact_pairs_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.
For advanced usage, there are also methods such as get_edge
and get_edge_mut
methods to access the ContactEdge
s directly, along with variants that take a ContactId
to access edges by their ID.
§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§
§edges: ContactGraphInternal
The internal undirected graph where nodes are entities and edges are contact pairs.
Implementations§
Source§impl ContactGraph
impl ContactGraph
Sourcepub fn entity_to_node(&self, entity: Entity) -> Option<NodeIndex>
pub fn entity_to_node(&self, entity: Entity) -> Option<NodeIndex>
Returns the NodeIndex
of the given entity in the contact graph.
If the entity is not in the graph, None
is returned.
Sourcepub fn get_edge(&self, entity1: Entity, entity2: Entity) -> Option<&ContactEdge>
pub fn get_edge(&self, entity1: Entity, entity2: Entity) -> Option<&ContactEdge>
Returns the ContactEdge
between two entities.
If the edge does not exist, None
is returned.
A contact edge exists between two entities if their ColliderAabb
s intersect.
Use ContactEdge::is_touching
to determine if the actual collider shapes are touching.
Sourcepub fn get_edge_by_id(&self, id: ContactId) -> Option<&ContactEdge>
pub fn get_edge_by_id(&self, id: ContactId) -> Option<&ContactEdge>
Returns the ContactEdge
between two entities based on their IDs.
If the edge does not exist, None
is returned.
A contact edge exists between two entities if their ColliderAabb
s intersect.
Use ContactEdge::is_touching
to determine if the actual collider shapes are touching.
Sourcepub fn get_edge_mut(
&mut self,
entity1: Entity,
entity2: Entity,
) -> Option<&mut ContactEdge>
pub fn get_edge_mut( &mut self, entity1: Entity, entity2: Entity, ) -> Option<&mut ContactEdge>
Returns a mutable reference to the ContactEdge
between two entities.
If the edge does not exist, None
is returned.
A contact edge exists between two entities if their ColliderAabb
s intersect.
Use ContactEdge::is_touching
to determine if the actual collider shapes are touching.
Sourcepub fn get_edge_mut_by_id(&mut self, id: ContactId) -> Option<&mut ContactEdge>
pub fn get_edge_mut_by_id(&mut self, id: ContactId) -> Option<&mut ContactEdge>
Returns a mutable reference to the ContactEdge
between two entities based on their IDs.
If the edge does not exist, None
is returned.
A contact edge exists between two entities if their ColliderAabb
s intersect.
Use ContactEdge::is_touching
to determine if the actual collider shapes are touching.
Sourcepub fn get(
&self,
entity1: Entity,
entity2: Entity,
) -> Option<(&ContactEdge, &ContactPair)>
pub fn get( &self, entity1: Entity, entity2: Entity, ) -> Option<(&ContactEdge, &ContactPair)>
Returns the ContactEdge
and ContactPair
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_by_id(&self, id: ContactId) -> Option<(&ContactEdge, &ContactPair)>
pub fn get_by_id(&self, id: ContactId) -> Option<(&ContactEdge, &ContactPair)>
Returns the ContactEdge
and ContactPair
between two entities based on the contact ID.
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 ContactEdge, &mut ContactPair)>
pub fn get_mut( &mut self, entity1: Entity, entity2: Entity, ) -> Option<(&mut ContactEdge, &mut ContactPair)>
Returns a mutable reference to the ContactEdge
and ContactPair
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_by_id(
&mut self,
id: ContactId,
) -> Option<(&mut ContactEdge, &mut ContactPair)>
pub fn get_mut_by_id( &mut self, id: ContactId, ) -> Option<(&mut ContactEdge, &mut ContactPair)>
Returns a mutable reference to the ContactEdge
and ContactPair
between two entities based on the contact ID.
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_pair_by_edge(&self, edge: &ContactEdge) -> Option<&ContactPair>
pub fn get_pair_by_edge(&self, edge: &ContactEdge) -> Option<&ContactPair>
Returns the ContactPair
between two entities based on the ContactEdge
.
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_pair_mut_by_edge(
&mut self,
edge: &ContactEdge,
) -> Option<&mut ContactPair>
pub fn get_pair_mut_by_edge( &mut self, edge: &ContactEdge, ) -> Option<&mut ContactPair>
Returns a mutable reference to the ContactPair
between two entities based on the ContactEdge
.
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_manifold(
&self,
handle: ContactManifoldHandle,
) -> Option<&ContactManifold>
pub fn get_manifold( &self, handle: ContactManifoldHandle, ) -> Option<&ContactManifold>
Returns a ContactManifold
of a contact pair based on the ContactManifoldHandle
.
If the manifold does not exist, None
is returned.
Sourcepub fn get_manifold_mut(
&mut self,
handle: ContactManifoldHandle,
) -> Option<&mut ContactManifold>
pub fn get_manifold_mut( &mut self, handle: ContactManifoldHandle, ) -> Option<&mut ContactManifold>
Returns a mutable reference to a ContactManifold
of a contact pair based on the ContactManifoldHandle
.
If the manifold does not exist, None
is returned.
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 active_pairs(&self) -> &[ContactPair]
pub fn active_pairs(&self) -> &[ContactPair]
Returns a slice over all active (non-sleeping) contact pairs.
Sourcepub fn sleeping_pairs(&self) -> &[ContactPair]
pub fn sleeping_pairs(&self) -> &[ContactPair]
Returns a slice over all sleeping contact pairs.
Sourcepub fn active_pairs_mut(&mut self) -> &mut [ContactPair]
pub fn active_pairs_mut(&mut self) -> &mut [ContactPair]
Returns a mutable slice over all active (non-sleeping) contact pairs.
Sourcepub fn sleeping_pairs_mut(&mut self) -> &mut [ContactPair]
pub fn sleeping_pairs_mut(&mut self) -> &mut [ContactPair]
Returns a mutable slice over all sleeping contact pairs.
Sourcepub fn iter_active(&self) -> impl Iterator<Item = &ContactPair>
pub fn iter_active(&self) -> impl Iterator<Item = &ContactPair>
Returns an iterator yielding immutable access to all active (non-sleeping) 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_active_touching
instead.
Sourcepub fn iter_active_touching(&self) -> impl Iterator<Item = &ContactPair>
pub fn iter_active_touching(&self) -> impl Iterator<Item = &ContactPair>
Returns an iterator yielding immutable access to all active (non-sleeping) contact pairs that are currently touching.
This is a subset of iter_active
that only includes pairs where the colliders are touching.
Sourcepub fn iter_active_mut(&mut self) -> impl Iterator<Item = &mut ContactPair>
pub fn iter_active_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_active_touching_mut
instead.
Sourcepub fn iter_active_touching_mut(
&mut self,
) -> impl Iterator<Item = &mut ContactPair>
pub fn iter_active_touching_mut( &mut self, ) -> impl Iterator<Item = &mut ContactPair>
Returns an iterator yielding mutable access to all active (non-sleeping) contact pairs that are currently touching.
This is a subset of iter_active_mut
that only includes pairs where the colliders are touching.
Sourcepub fn iter_sleeping(&self) -> impl Iterator<Item = &ContactPair>
pub fn iter_sleeping(&self) -> impl Iterator<Item = &ContactPair>
Returns an iterator yielding immutable access to all sleeping 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_sleeping_touching
instead.
Sourcepub fn iter_sleeping_touching(&self) -> impl Iterator<Item = &ContactPair>
pub fn iter_sleeping_touching(&self) -> impl Iterator<Item = &ContactPair>
Returns an iterator yielding immutable access to all sleeping contact pairs that are currently touching.
This is a subset of iter_sleeping
that only includes pairs where the colliders are touching.
Sourcepub fn iter_sleeping_mut(&mut self) -> impl Iterator<Item = &mut ContactPair>
pub fn iter_sleeping_mut(&mut self) -> impl Iterator<Item = &mut ContactPair>
Returns an iterator yielding mutable access to all sleeping 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_sleeping_touching_mut
instead.
Sourcepub fn iter_sleeping_touching_mut(
&mut self,
) -> impl Iterator<Item = &mut ContactPair>
pub fn iter_sleeping_touching_mut( &mut self, ) -> impl Iterator<Item = &mut ContactPair>
Returns an iterator yielding mutable access to all sleeping contact pairs that are currently touching.
This is a subset of iter_sleeping_mut
that only includes pairs where the colliders are touching.
Sourcepub fn contact_edges_with(
&self,
entity: Entity,
) -> impl Iterator<Item = &ContactEdge>
pub fn contact_edges_with( &self, entity: Entity, ) -> impl Iterator<Item = &ContactEdge>
Returns an iterator yielding immutable access to all contact edges involving the given entity.
Sourcepub fn contact_edges_with_mut(
&mut self,
entity: Entity,
) -> impl Iterator<Item = &mut ContactEdge>
pub fn contact_edges_with_mut( &mut self, entity: Entity, ) -> impl Iterator<Item = &mut ContactEdge>
Returns an iterator yielding mutable access to all contact edges involving the given entity.
Sourcepub fn contact_pairs_with(
&self,
entity: Entity,
) -> impl Iterator<Item = &ContactPair>
pub fn contact_pairs_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 ContactEdge::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_edge(&mut self, contact_edge: ContactEdge) -> Option<ContactId>
pub fn add_edge(&mut self, contact_edge: ContactEdge) -> Option<ContactId>
Creates a ContactEdge
between two entities and adds an associated ContactPair
to the list of active pairs.
Returns the ID of the contact edge if it was created, or None
if the edge already exists.
§Warning
Creating a contact edge 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_edge_with<F>(
&mut self,
contact_edge: ContactEdge,
pair_callback: F,
) -> Option<ContactId>where
F: FnMut(&mut ContactPair),
pub fn add_edge_with<F>(
&mut self,
contact_edge: ContactEdge,
pair_callback: F,
) -> Option<ContactId>where
F: FnMut(&mut ContactPair),
Creates a ContactEdge
between two entities, calling the provided callback
to initialize the associated ContactPair
in the list of active pairs.
Returns the ID of the contact edge if it was created, or None
if the edge already exists.
§Warning
Creating a contact edge 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_edge_and_key_with<F>(
&mut self,
contact_edge: ContactEdge,
pair_key: PairKey,
pair_callback: F,
) -> Option<ContactId>where
F: FnMut(&mut ContactPair),
pub fn add_edge_and_key_with<F>(
&mut self,
contact_edge: ContactEdge,
pair_key: PairKey,
pair_callback: F,
) -> Option<ContactId>where
F: FnMut(&mut ContactPair),
Creates a ContactEdge
between two entities with the given pair key, calling the provided callback
to initialize the associated ContactPair
in the list of active pairs.
The key must be equivalent to PairKey::new(contacts.entity1.index(), contacts.entity2.index())
.
Returns the ID of the contact edge if it was created, or None
if the edge already exists.
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_edge
or add_edge_with
instead.
§Warning
Creating a contact edge 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_edge(
&mut self,
entity1: Entity,
entity2: Entity,
) -> Option<ContactEdge>
pub fn remove_edge( &mut self, entity1: Entity, entity2: Entity, ) -> Option<ContactEdge>
Removes a ContactEdge
between two entites and returns its value.
§Warning
Removing a contact edge 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_edge_by_id(
&mut self,
pair_key: &PairKey,
id: ContactId,
) -> Option<ContactEdge>
pub fn remove_edge_by_id( &mut self, pair_key: &PairKey, id: ContactId, ) -> Option<ContactEdge>
Removes a ContactEdge
based on its pair key and ID and returns its value.
§Warning
Removing a contact edge 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, edge_callback: F)
pub fn remove_collider_with<F>(&mut self, entity: Entity, edge_callback: F)
Removes the collider of the given entity from the contact graph, calling the given callback
for each ContactEdge
right before it is removed.
§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.
Sourcepub fn wake_entity_with<F>(&mut self, entity: Entity, pair_callback: F)
pub fn wake_entity_with<F>(&mut self, entity: Entity, pair_callback: F)
Transfers touching contacts of a body from the sleeping contacts to the active contacts,
calling the given callback for each ContactPair
that is moved to active contacts.
Sourcepub fn sleep_entity_with<F>(&mut self, entity: Entity, pair_callback: F)
pub fn sleep_entity_with<F>(&mut self, entity: Entity, pair_callback: F)
Transfers touching contacts of a body from the active contacts to the sleeping contacts,
calling the given callback for each ContactPair
that is moved to sleeping contacts.
Sourcepub fn clear(&mut self)
pub fn clear(&mut self)
Clears all contact pairs and the contact graph.
§Warning
Clearing contact pairs 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.
Additionally, this does not clear the ConstraintGraph
! You should additionally
call ConstraintGraph::clear
.
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>
, 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> 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, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
impl<T, W> HasTypeWitness<W> for Twhere
W: MakeTypeWitness<Arg = T>,
T: ?Sized,
Source§impl<T> Identity for Twhere
T: ?Sized,
impl<T> Identity for Twhere
T: ?Sized,
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> IntoResult<T> for T
impl<T> IntoResult<T> for T
Source§fn into_result(self) -> Result<T, RunSystemError>
fn into_result(self) -> Result<T, RunSystemError>
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.