pub struct Unsupported;Expand description
Error indicating that a geometric query is not supported between certain shape combinations.
Many geometric queries in Parry (like distance calculation, contact detection, or time-of-impact) are implemented using specialized algorithms for specific pairs of shapes. When you attempt a query between two shapes for which no implementation exists, this error is returned.
§When This Error Occurs
This error typically occurs in two situations:
-
Missing Implementation: The query has not been implemented for the specific pair of shapes. For example, some advanced queries might not support all combinations of composite shapes.
-
Complex Shape Combinations: Certain queries involving composite shapes (like
Compound,TriMesh, orHeightField) may not be fully supported, especially for less common operations.
§Common Scenarios
- Computing contact manifolds between two custom shapes that don’t have a specialized implementation
- Using non-linear shape casting with certain composite shapes
- Querying distance between shapes that require more complex algorithms not yet implemented
§How to Handle This Error
When you encounter this error, you have several options:
§1. Use a Different Query Type
Try a more basic query that’s more widely supported:
// If contact manifolds are unsupported, try basic contact:
if let Ok(contact) = contact(&pos1, &shape1, &pos2, &shape2, 0.0) {
// Process the contact point
}
// Or try distance computation:
let dist = distance(&pos1, &shape1, &pos2, &shape2);§2. Decompose Complex Shapes
Break down complex shapes into simpler components:
// Instead of querying against a complex mesh directly,
// iterate through its triangles:
for triangle in mesh.triangles() {
let dist = distance(&pos1, &triangle, &pos2, &ball);
// Process each triangle-ball pair
}§3. Use the BVH for Composite Shapes
For shapes with BVH acceleration structures (like TriMesh), use specialized traversal methods:
// Use BVH queries instead of direct shape queries:
for leaf_id in mesh.bvh().intersect_aabb(&query_aabb) {
let triangle = mesh.triangle(leaf_id);
// Process the triangle
}§4. Implement a Custom Query Dispatcher
For advanced use cases, implement the QueryDispatcher trait to add support for your specific
shape combinations:
struct MyQueryDispatcher {
default: DefaultQueryDispatcher,
}
// Implement QueryDispatcher and add your custom query implementations§Example: Catching and Handling the Error
let ball = Ball::new(1.0);
let cuboid = Cuboid::new(Vector3::new(1.0, 1.0, 1.0));
let pos1 = Isometry3::identity();
let pos2 = Isometry3::identity();
// Most queries return Result<T, Unsupported>
match contact(&pos1, &ball, &pos2, &cuboid, 0.0) {
Ok(Some(contact)) => {
// Query succeeded and found a contact
println!("Contact found at distance: {}", contact.dist);
}
Ok(None) => {
// Query succeeded but no contact found
println!("No contact");
}
Err(Unsupported) => {
// Query not supported for this shape combination
println!("This query is not supported between these shapes");
// Fall back to an alternative approach
}
}Trait Implementations§
Source§impl Clone for Unsupported
impl Clone for Unsupported
Source§fn clone(&self) -> Unsupported
fn clone(&self) -> Unsupported
1.0.0 · Source§fn clone_from(&mut self, source: &Self)
fn clone_from(&mut self, source: &Self)
source. Read moreSource§impl Debug for Unsupported
impl Debug for Unsupported
Source§impl Display for Unsupported
impl Display for Unsupported
Source§impl Error for Unsupported
impl Error for Unsupported
1.30.0 · Source§fn source(&self) -> Option<&(dyn Error + 'static)>
fn source(&self) -> Option<&(dyn Error + 'static)>
1.0.0 · Source§fn description(&self) -> &str
fn description(&self) -> &str
Source§impl PartialEq for Unsupported
impl PartialEq for Unsupported
impl Copy for Unsupported
impl Eq for Unsupported
impl StructuralPartialEq for Unsupported
Auto Trait Implementations§
impl Freeze for Unsupported
impl RefUnwindSafe for Unsupported
impl Send for Unsupported
impl Sync for Unsupported
impl Unpin for Unsupported
impl UnwindSafe for Unsupported
Blanket Implementations§
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<Q, K> Equivalent<K> for Q
impl<Q, K> Equivalent<K> for Q
Source§fn equivalent(&self, key: &K) -> bool
fn equivalent(&self, key: &K) -> bool
key and return true if they are equal.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<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.