ColliderTree

Struct ColliderTree 

Source
pub struct ColliderTree {
    pub bvh: Bvh2,
    pub proxies: StableVec<ColliderTreeProxy>,
    pub moved_proxies: Vec<ProxyId>,
    pub workspace: ColliderTreeWorkspace,
}
Expand description

A Bounding Volume Hierarchy (BVH) for accelerating queries on a set of colliders.

See the collider_tree module for more information.

Fields§

§bvh: Bvh2

The underlying BVH structure.

§proxies: StableVec<ColliderTreeProxy>

The proxies stored in the tree.

§moved_proxies: Vec<ProxyId>

A list of moved proxies since the last update.

This is used during tree optimization to determine which proxies need to be reinserted or rebuilt.

§workspace: ColliderTreeWorkspace

A workspace for reusing allocations across tree operations.

Implementations§

Source§

impl ColliderTree

Source

pub fn ray_traverse_closest<F: FnMut(ProxyId) -> Scalar>( &self, ray: Ray3d, max_distance: Scalar, intersection_fn: F, ) -> Option<(ProxyId, Scalar)>

Traverses the tree for the closest intersection with the given ray.

§Arguments
  • ray: The ray to be tested for intersection.
  • max_distance: The maximum distance along the ray to consider for intersections.
  • intersection_fn: A function that takes a proxy ID, and returns the distance to the intersection with that proxy. This function is called for each potential intersection found during traversal.
Source

pub fn ray_traverse_all<F: FnMut(ProxyId) -> bool>( &self, ray: Ray3d, max_distance: Scalar, intersection_fn: F, )

Traverses the tree for all intersections with the given ray.

Terminates when all intersections within max_distance have been visited or when intersection_fn returns false for an intersection.

§Arguments
  • ray: The ray to be tested for intersection.
  • max_distance: The maximum distance along the ray to consider for intersections.
  • intersection_fn: A function that takes a proxy ID, and is called for each potential intersection found during traversal. Return false to halt traversal early.
Source

pub fn sweep_traverse_closest<F: FnMut(ProxyId) -> Scalar>( &self, aabb: Aabb, direction: Dir, max_distance: Scalar, target_distance: Scalar, intersection_fn: F, ) -> Option<(ProxyId, Scalar)>

Traverse the BVH by sweeping an AABB along a velocity vector, returning the closest hit.

§Arguments
  • aabb: The axis-aligned bounding box to be swept.
  • direction: The direction along which to sweep the AABB.
  • target_distance: The separation distance at which a hit is still considered valid.
  • max_distance: The maximum distance along the sweep to consider for intersections.
  • intersection_fn: A function that takes a proxy ID, and returns the distance to the intersection with that proxy. This function is called for each potential intersection found during traversal.
Source

pub fn sweep_traverse_all<F: FnMut(ProxyId) -> bool>( &self, aabb: Aabb, direction: Dir, target_distance: Scalar, max_distance: Scalar, intersection_fn: F, )

Traverse the BVH by sweeping an AABB along a velocity vector, calling intersection_fn for each hit.

§Arguments
  • aabb: The axis-aligned bounding box to be swept.
  • direction: The direction along which to sweep the AABB.
  • target_distance: The separation distance at which a hit is still considered valid.
  • max_distance: The maximum distance along the sweep to consider for intersections.
  • intersection_fn: A function that takes a proxy ID, and is called for each potential intersection found during traversal. Return false to halt traversal early.
Source

pub fn squared_distance_traverse_closest<F: FnMut(ProxyId) -> Scalar>( &self, point: Vector, max_distance_squared: Scalar, eval: F, ) -> Option<(ProxyId, Scalar)>

Traverse the BVH with a point, returning the closest proxy and its squared distance within max_distance_squared.

§Arguments
  • point: The point to be tested for proximity.
  • max_distance_squared: The maximum distance from the point to consider for projections.
  • eval: A function that takes a proxy ID and returns the squared distance from the point to that proxy. This function is called for each potential projection found during traversal.
Source

pub fn point_traverse<F: FnMut(ProxyId) -> bool>(&self, point: Vector, eval: F)

Traverse the BVH with a point, calling eval for each intersection.

§Arguments
  • point: The point to be tested for intersection.
  • eval: A function that takes a proxy ID and is called for each potential intersection found during traversal. Return false to halt traversal early.
Source

pub fn aabb_traverse<F: FnMut(ProxyId) -> bool>(&self, aabb: Aabb, eval: F)

Traverse the BVH with an AABB, calling eval for each intersection.

§Arguments
  • aabb: The axis-aligned bounding box to be tested for intersection.
  • eval: A function that takes a proxy ID and is called for each potential intersection found during traversal. Return false to halt traversal early.
Source§

impl ColliderTree

Source

pub fn add_proxy(&mut self, aabb: Aabb, proxy: ColliderTreeProxy) -> ProxyId

Adds a proxy to the tree, returning its index.

Source

pub fn remove_proxy(&mut self, proxy_id: ProxyId) -> Option<ColliderTreeProxy>

Removes a proxy from the tree.

Returns true if the proxy was successfully removed, or false if the proxy ID was invalid.

Source

pub fn get_proxy(&self, proxy_id: ProxyId) -> Option<&ColliderTreeProxy>

Gets a proxy from the tree by its ID.

Returns None if the proxy ID is invalid.

Source

pub fn get_proxy_mut( &mut self, proxy_id: ProxyId, ) -> Option<&mut ColliderTreeProxy>

Gets a mutable reference to a proxy from the tree by its ID.

Returns None if the proxy ID is invalid.

Source

pub unsafe fn get_proxy_unchecked( &self, proxy_id: ProxyId, ) -> &ColliderTreeProxy

Gets a proxy from the tree by its ID without bounds checking.

§Safety

The caller must ensure that the proxy_id is valid.

Source

pub unsafe fn get_proxy_unchecked_mut( &mut self, proxy_id: ProxyId, ) -> &mut ColliderTreeProxy

Gets a mutable reference to a proxy from the tree by its ID without bounds checking.

§Safety

The caller must ensure that the proxy_id is valid.

Source

pub fn get_proxy_aabb(&self, proxy_id: ProxyId) -> Option<Aabb>

Gets the AABB of a proxy in the tree.

Returns None if the proxy ID is invalid.

Source

pub unsafe fn get_proxy_aabb_unchecked(&self, proxy_id: ProxyId) -> Aabb

Gets the AABB of a proxy in the tree without bounds checking.

§Safety

The caller must ensure that the proxy_id is valid.

Source

pub fn set_proxy_aabb(&mut self, proxy_id: ProxyId, aabb: Aabb)

Updates the AABB of a proxy in the tree.

If the BVH should be refitted at the same time, consider using resize_proxy_aabb instead.

If resizing a large number of proxies, consider calling this method for each proxy and then calling refit_all once at the end.

Source

pub fn resize_proxy_aabb(&mut self, proxy_id: ProxyId, aabb: Aabb)

Resizes the AABB of a proxy in the tree.

This is equivalent to calling set_proxy_aabb and then refitting the BVH working up from the resized node.

For resizing a large number of proxies, consider calling set_proxy_aabb for each proxy and then calling refit_all once at the end.

Source

pub fn reinsert_proxy(&mut self, proxy_id: ProxyId, aabb: Aabb)

Updates the AABB of a proxy and reinserts it at an optimal place in the tree.

Source

pub fn refit_all(&mut self)

Refits the entire tree from the leaves up.

Source

pub fn rebuild_full(&mut self)

Fully rebuilds the tree from the given list of AABBs.

Source

pub fn rebuild_partial(&mut self, leaves: &[u32])

Rebuilds parts of the tree corresponding to the given list of leaf node indices.

Source

pub fn optimize(&mut self, batch_size_ratio: f32)

Restructures the tree using parallel reinsertion, optimizing node locations based on SAH cost.

This can be used to improve query performance after the tree quality has degraded, for example after many proxy insertions and removals.

Source

pub fn optimize_candidates(&mut self, candidates: &[u32], iterations: u32)

Restructures the tree using parallel reinsertion, optimizing node locations based on SAH cost.

Only the specified candidate proxies are considered for reinsertion.

Trait Implementations§

Source§

impl Clone for ColliderTree

Source§

fn clone(&self) -> ColliderTree

Returns a duplicate of the value. Read more
1.0.0 · Source§

fn clone_from(&mut self, source: &Self)

Performs copy-assignment from source. Read more
Source§

impl Default for ColliderTree

Source§

fn default() -> ColliderTree

Returns the “default value” for a type. Read more

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T, U> AsBindGroupShaderType<U> for T
where U: ShaderType, &'a T: for<'a> Into<U>,

Source§

fn as_bind_group_shader_type(&self, _images: &RenderAssets<GpuImage>) -> U

Return the T ShaderType for self. When used in AsBindGroup derives, it is safe to assume that all images in self exist.
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> CloneToUninit for T
where T: Clone,

Source§

unsafe fn clone_to_uninit(&self, dest: *mut u8)

🔬This is a nightly-only experimental API. (clone_to_uninit)
Performs copy-assignment from self to dest. Read more
Source§

impl<T> Downcast for T
where T: Any,

Source§

fn into_any(self: Box<T>) -> Box<dyn Any>

Converts 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>

Converts 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)

Converts &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)

Converts &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
where T: Any + Send,

Source§

fn into_any_send(self: Box<T>) -> Box<dyn Any + Send>

Converts Box<Trait> (where Trait: DowncastSend) to Box<dyn Any + Send>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> DowncastSync for T
where T: Any + Send + Sync,

Source§

fn into_any_sync(self: Box<T>) -> Box<dyn Any + Send + Sync>

Converts Box<Trait> (where Trait: DowncastSync) to Box<dyn Any + Send + Sync>, which can then be downcast into Box<ConcreteType> where ConcreteType implements Trait.
Source§

fn into_any_arc(self: Arc<T>) -> Arc<dyn Any + Send + Sync>

Converts Arc<Trait> (where Trait: DowncastSync) to Arc<Any>, which can then be downcast into Arc<ConcreteType> where ConcreteType implements Trait.
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> FromWorld for T
where T: Default,

Source§

fn from_world(_world: &mut World) -> T

Creates Self using default().

Source§

impl<T, W> HasTypeWitness<W> for T
where W: MakeTypeWitness<Arg = T>, T: ?Sized,

Source§

const WITNESS: W = W::MAKE

A constant of the type witness
Source§

impl<T> Identity for T
where T: ?Sized,

Source§

const TYPE_EQ: TypeEq<T, <T as Identity>::Type> = TypeEq::NEW

Proof that Self is the same type as Self::Type, provides methods for casting between Self and Self::Type.
Source§

type Type = T

The same type as Self, used to emulate type equality bounds (T == U) with associated type equality constraints (T: Identity<Type = U>).
Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<T> IntoResult<T> for T

Source§

fn into_result(self) -> Result<T, RunSystemError>

Converts this type into the system output type.
Source§

impl<A> Is for A
where A: Any,

Source§

fn is<T>() -> bool
where T: Any,

Checks if the current type “is” another type, using a TypeId equality comparison. This is most useful in the context of generic logic. Read more
Source§

impl<SS, SP> SupersetOf<SS> for SP
where SS: SubsetOf<SP>,

Source§

fn to_subset(&self) -> Option<SS>

The inverse inclusion map: attempts to construct self from the equivalent element of its superset. Read more
Source§

fn is_in_subset(&self) -> bool

Checks if self is actually part of its subset T (and can be converted to it).
Source§

fn to_subset_unchecked(&self) -> SS

Use with care! Same as self.to_subset but without any property checks. Always succeeds.
Source§

fn from_subset(element: &SS) -> SP

The inclusion map: converts self to the equivalent element of its superset.
Source§

impl<T> ToOwned for T
where T: Clone,

Source§

type Owned = T

The resulting type after obtaining ownership.
Source§

fn to_owned(&self) -> T

Creates owned data from borrowed data, usually by cloning. Read more
Source§

fn clone_into(&self, target: &mut T)

Uses borrowed data to replace owned data, usually by cloning. Read more
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> TypeData for T
where T: 'static + Send + Sync + Clone,

Source§

fn clone_type_data(&self) -> Box<dyn TypeData>

Creates a type-erased clone of this value.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

impl<T> ConditionalSend for T
where T: Send,

Source§

impl<T> Settings for T
where T: 'static + Send + Sync,

Source§

impl<T> WasmNotSend for T
where T: Send,

Source§

impl<T> WasmNotSendSync for T

Source§

impl<T> WasmNotSync for T
where T: Sync,