Jolt Physics
A multi core friendly Game Physics Engine
|
Base class for a compound shape. More...
#include <CompoundShape.h>
Classes | |
struct | CastRayVisitor |
struct | CastRayVisitorCollector |
struct | CastShapeVisitor |
struct | CollectTransformedShapesVisitor |
struct | CollideCompoundVsShapeVisitor |
struct | CollidePointVisitor |
struct | CollideShapeVsCompoundVisitor |
struct | GetIntersectingSubShapesVisitor |
struct | SubShape |
Public Types | |
using | SubShapes = Array< SubShape > |
Public Types inherited from Shape | |
using | ShapeResult = ShapeSettings::ShapeResult |
using | SupportingFace = StaticArray< Vec3, 32 > |
Type definition for a supporting face. | |
using | VisitedShapes = UnorderedSet< const Shape * > |
using | ShapeToIDMap = StreamUtils::ObjectToIDMap< Shape > |
using | IDToShapeMap = StreamUtils::IDToObjectMap< Shape > |
using | MaterialToIDMap = StreamUtils::ObjectToIDMap< PhysicsMaterial > |
using | IDToMaterialMap = StreamUtils::IDToObjectMap< PhysicsMaterial > |
Public Member Functions | |
JPH_OVERRIDE_NEW_DELETE | CompoundShape (EShapeSubType inSubType) |
Constructor. | |
CompoundShape (EShapeSubType inSubType, const ShapeSettings &inSettings, ShapeResult &outResult) | |
virtual Vec3 | GetCenterOfMass () const override |
All shapes are centered around their center of mass. This function returns the center of mass position that needs to be applied to transform the shape to where it was created. | |
virtual bool | MustBeStatic () const override |
Check if this shape can only be used to create a static body or if it can also be dynamic/kinematic. | |
virtual AABox | GetLocalBounds () const override |
Get local bounding box including convex radius, this box is centered around the center of mass rather than the world transform. | |
virtual uint | GetSubShapeIDBitsRecursive () const override |
Get the max number of sub shape ID bits that are needed to be able to address any leaf shape in this shape. Used mainly for checking that it is smaller or equal than SubShapeID::MaxBits. | |
virtual AABox | GetWorldSpaceBounds (Mat44Arg inCenterOfMassTransform, Vec3Arg inScale) const override |
virtual float | GetInnerRadius () const override |
virtual MassProperties | GetMassProperties () const override |
Calculate the mass and inertia of this shape. | |
virtual const PhysicsMaterial * | GetMaterial (const SubShapeID &inSubShapeID) const override |
Get the material assigned to a particular sub shape ID. | |
virtual const Shape * | GetLeafShape (const SubShapeID &inSubShapeID, SubShapeID &outRemainder) const override |
virtual uint64 | GetSubShapeUserData (const SubShapeID &inSubShapeID) const override |
Get the user data of a particular sub shape ID. Corresponds with the value stored in Shape::GetUserData of the leaf shape pointed to by inSubShapeID. | |
virtual TransformedShape | GetSubShapeTransformedShape (const SubShapeID &inSubShapeID, Vec3Arg inPositionCOM, QuatArg inRotation, Vec3Arg inScale, SubShapeID &outRemainder) const override |
virtual Vec3 | GetSurfaceNormal (const SubShapeID &inSubShapeID, Vec3Arg inLocalSurfacePosition) const override |
virtual void | GetSupportingFace (const SubShapeID &inSubShapeID, Vec3Arg inDirection, Vec3Arg inScale, Mat44Arg inCenterOfMassTransform, SupportingFace &outVertices) const override |
virtual void | GetSubmergedVolume (Mat44Arg inCenterOfMassTransform, Vec3Arg inScale, const Plane &inSurface, float &outTotalVolume, float &outSubmergedVolume, Vec3 &outCenterOfBuoyancy JPH_IF_DEBUG_RENDERER(, RVec3Arg inBaseOffset)) const override |
virtual void | Draw (DebugRenderer *inRenderer, RMat44Arg inCenterOfMassTransform, Vec3Arg inScale, ColorArg inColor, bool inUseMaterialColors, bool inDrawWireframe) const override |
Draw the shape at a particular location with a particular color (debugging purposes) | |
virtual void | DrawGetSupportFunction (DebugRenderer *inRenderer, RMat44Arg inCenterOfMassTransform, Vec3Arg inScale, ColorArg inColor, bool inDrawSupportDirection) const override |
Draw the results of the GetSupportFunction with the convex radius added back on to show any errors introduced by this process (only relevant for convex shapes) | |
virtual void | DrawGetSupportingFace (DebugRenderer *inRenderer, RMat44Arg inCenterOfMassTransform, Vec3Arg inScale) const override |
Draw the results of the GetSupportingFace function to show any errors introduced by this process (only relevant for convex shapes) | |
virtual void | CollideSoftBodyVertices (Mat44Arg inCenterOfMassTransform, Vec3Arg inScale, const CollideSoftBodyVertexIterator &inVertices, uint inNumVertices, int inCollidingShapeIndex) const override |
virtual void | TransformShape (Mat44Arg inCenterOfMassTransform, TransformedShapeCollector &ioCollector) const override |
virtual void | GetTrianglesStart (GetTrianglesContext &ioContext, const AABox &inBox, Vec3Arg inPositionCOM, QuatArg inRotation, Vec3Arg inScale) const override |
virtual int | GetTrianglesNext (GetTrianglesContext &ioContext, int inMaxTrianglesRequested, Float3 *outTriangleVertices, const PhysicsMaterial **outMaterials=nullptr) const override |
virtual int | GetIntersectingSubShapes (const AABox &inBox, uint *outSubShapeIndices, int inMaxSubShapeIndices) const =0 |
virtual int | GetIntersectingSubShapes (const OrientedBox &inBox, uint *outSubShapeIndices, int inMaxSubShapeIndices) const =0 |
const SubShapes & | GetSubShapes () const |
Access to the sub shapes of this compound. | |
uint | GetNumSubShapes () const |
Get the total number of sub shapes. | |
const SubShape & | GetSubShape (uint inIdx) const |
Access to a particular sub shape. | |
uint32 | GetCompoundUserData (uint inIdx) const |
Get the user data associated with a shape in this compound. | |
void | SetCompoundUserData (uint inIdx, uint32 inUserData) |
Set the user data associated with a shape in this compound. | |
bool | IsSubShapeIDValid (SubShapeID inSubShapeID) const |
uint32 | GetSubShapeIndexFromID (SubShapeID inSubShapeID, SubShapeID &outRemainder) const |
SubShapeIDCreator | GetSubShapeIDFromIndex (int inIdx, const SubShapeIDCreator &inParentSubShapeID) const |
Convert a sub shape index to a sub shape ID. | |
virtual void | SaveBinaryState (StreamOut &inStream) const override |
Saves the contents of the shape in binary form to inStream. | |
virtual void | SaveSubShapeState (ShapeList &outSubShapes) const override |
Outputs the shape references that this shape has to outSubShapes. | |
virtual void | RestoreSubShapeState (const ShapeRefC *inSubShapes, uint inNumShapes) override |
Restore the shape references after calling sRestoreFromBinaryState. Note that the exact same shapes need to be provided in the same order as returned by SaveSubShapeState. | |
virtual Stats | GetStatsRecursive (VisitedShapes &ioVisitedShapes) const override |
Volume of this shape (m^3). Note that for compound shapes the volume may be incorrect since child shapes can overlap which is not accounted for. | |
virtual float | GetVolume () const override |
virtual bool | IsValidScale (Vec3Arg inScale) const override |
virtual Vec3 | MakeScaleValid (Vec3Arg inScale) const override |
virtual AABox | GetWorldSpaceBounds (Mat44Arg inCenterOfMassTransform, Vec3Arg inScale) const |
AABox | GetWorldSpaceBounds (DMat44Arg inCenterOfMassTransform, Vec3Arg inScale) const |
Get world space bounds including convex radius. | |
Public Member Functions inherited from Shape | |
Shape (EShapeType inType, EShapeSubType inSubType) | |
Constructor. | |
Shape (EShapeType inType, EShapeSubType inSubType, const ShapeSettings &inSettings, ShapeResult &outResult) | |
virtual | ~Shape ()=default |
Destructor. | |
EShapeType | GetType () const |
Get type. | |
EShapeSubType | GetSubType () const |
uint64 | GetUserData () const |
User data (to be used freely by the application) | |
void | SetUserData (uint64 inUserData) |
AABox | GetWorldSpaceBounds (DMat44Arg inCenterOfMassTransform, Vec3Arg inScale) const |
Get world space bounds including convex radius. | |
virtual void | GetSubmergedVolume (Mat44Arg inCenterOfMassTransform, Vec3Arg inScale, const Plane &inSurface, float &outTotalVolume, float &outSubmergedVolume, Vec3 &outCenterOfBuoyancy, RVec3Arg inBaseOffset) const =0 |
virtual bool | CastRay (const RayCast &inRay, const SubShapeIDCreator &inSubShapeIDCreator, RayCastResult &ioHit) const =0 |
virtual void | CastRay (const RayCast &inRay, const RayCastSettings &inRayCastSettings, const SubShapeIDCreator &inSubShapeIDCreator, CastRayCollector &ioCollector, const ShapeFilter &inShapeFilter={ }) const =0 |
virtual void | CollidePoint (Vec3Arg inPoint, const SubShapeIDCreator &inSubShapeIDCreator, CollidePointCollector &ioCollector, const ShapeFilter &inShapeFilter={ }) const =0 |
virtual void | CollectTransformedShapes (const AABox &inBox, Vec3Arg inPositionCOM, QuatArg inRotation, Vec3Arg inScale, const SubShapeIDCreator &inSubShapeIDCreator, TransformedShapeCollector &ioCollector, const ShapeFilter &inShapeFilter) const |
ShapeResult | ScaleShape (Vec3Arg inScale) const |
virtual Stats | GetStats () const =0 |
Get stats of this shape. Use for logging / data collection purposes only. Does not add values from child shapes, use GetStatsRecursive for this. | |
virtual void | SaveMaterialState (PhysicsMaterialList &outMaterials) const |
Outputs the material references that this shape has to outMaterials. | |
virtual void | RestoreMaterialState (const PhysicsMaterialRefC *inMaterials, uint inNumMaterials) |
Restore the material references after calling sRestoreFromBinaryState. Note that the exact same materials need to be provided in the same order as returned by SaveMaterialState. | |
void | SaveWithChildren (StreamOut &inStream, ShapeToIDMap &ioShapeMap, MaterialToIDMap &ioMaterialMap) const |
Save this shape, all its children and its materials. Pass in an empty map in ioShapeMap / ioMaterialMap or reuse the same map while saving multiple shapes to the same stream in order to avoid writing duplicates. | |
Public Member Functions inherited from RefTarget< Shape > | |
RefTarget ()=default | |
Constructor. | |
RefTarget (const RefTarget &) | |
~RefTarget () | |
assert no one is referencing us | |
void | SetEmbedded () const |
RefTarget & | operator= (const RefTarget &) |
Assignment operator. | |
uint32 | GetRefCount () const |
Get current refcount of this object. | |
void | AddRef () const |
Add or release a reference to this object. | |
void | Release () const |
Public Member Functions inherited from NonCopyable | |
NonCopyable ()=default | |
NonCopyable (const NonCopyable &)=delete | |
void | operator= (const NonCopyable &)=delete |
Static Public Member Functions | |
static void | sRegister () |
Static Public Member Functions inherited from Shape | |
static ShapeResult | sRestoreFromBinaryState (StreamIn &inStream) |
Creates a Shape of the correct type and restores its contents from the binary stream inStream. | |
static ShapeResult | sRestoreWithChildren (StreamIn &inStream, IDToShapeMap &ioShapeMap, IDToMaterialMap &ioMaterialMap) |
Restore a shape, all its children and materials. Pass in an empty map in ioShapeMap / ioMaterialMap or reuse the same map while reading multiple shapes from the same stream in order to restore duplicates. | |
Static Public Member Functions inherited from RefTarget< Shape > | |
static int | sInternalGetRefCountOffset () |
INTERNAL HELPER FUNCTION USED BY SERIALIZATION. | |
Protected Member Functions | |
virtual void | RestoreBinaryState (StreamIn &inStream) override |
This function should not be called directly, it is used by sRestoreFromBinaryState. | |
uint | GetSubShapeIDBits () const |
Determine amount of bits needed to encode sub shape id. | |
void | CalculateInnerRadius () |
Determine the inner radius of this shape. | |
Protected Attributes | |
Vec3 | mCenterOfMass { Vec3::sZero() } |
Center of mass of the compound. | |
AABox | mLocalBounds |
SubShapes | mSubShapes |
float | mInnerRadius = FLT_MAX |
Smallest radius of GetInnerRadius() of child shapes. | |
Protected Attributes inherited from RefTarget< Shape > | |
atomic< uint32 > | mRefCount |
Current reference count. | |
Additional Inherited Members | |
Static Public Attributes inherited from Shape | |
static constexpr int | cGetTrianglesMinTrianglesRequested = 32 |
This is the minimum amount of triangles that should be requested through GetTrianglesNext. | |
static bool | sDrawSubmergedVolumes = false |
Debug helper which draws the intersection between water and the shapes, the center of buoyancy and the submerged volume. | |
Static Protected Member Functions inherited from Shape | |
static void | sCollidePointUsingRayCast (const Shape &inShape, Vec3Arg inPoint, const SubShapeIDCreator &inSubShapeIDCreator, CollidePointCollector &ioCollector, const ShapeFilter &inShapeFilter) |
A fallback version of CollidePoint that uses a ray cast and counts the number of hits to determine if the point is inside the shape. Odd number of hits means inside, even number of hits means outside. | |
Static Protected Attributes inherited from RefTarget< Shape > | |
static constexpr uint32 | cEmbedded |
A large value that gets added to the refcount to mark the object as embedded. | |
Base class for a compound shape.
using CompoundShape::SubShapes = Array<SubShape> |
|
inlineexplicit |
Constructor.
|
inline |
|
inlineprotected |
Determine the inner radius of this shape.
|
overridevirtual |
Collides all vertices of a soft body with this shape and updates SoftBodyVertex::mCollisionPlane, SoftBodyVertex::mCollidingShapeIndex and SoftBodyVertex::mLargestPenetration if a collision with more penetration was found.
inCenterOfMassTransform | Center of mass transform for this shape relative to the vertices. |
inScale | Scale in local space of the shape (scales relative to its center of mass) |
inVertices | The vertices of the soft body |
inNumVertices | The number of vertices in inVertices |
inCollidingShapeIndex | Value to store in CollideSoftBodyVertexIterator::mCollidingShapeIndex when a collision was found |
Implements Shape.
|
overridevirtual |
Draw the shape at a particular location with a particular color (debugging purposes)
Implements Shape.
|
overridevirtual |
Draw the results of the GetSupportFunction with the convex radius added back on to show any errors introduced by this process (only relevant for convex shapes)
Reimplemented from Shape.
|
overridevirtual |
Draw the results of the GetSupportingFace function to show any errors introduced by this process (only relevant for convex shapes)
Reimplemented from Shape.
|
inlineoverridevirtual |
All shapes are centered around their center of mass. This function returns the center of mass position that needs to be applied to transform the shape to where it was created.
Reimplemented from Shape.
Get the user data associated with a shape in this compound.
|
inlineoverridevirtual |
Returns the radius of the biggest sphere that fits entirely in the shape. In case this shape consists of multiple sub shapes, it returns the smallest sphere of the parts. This can be used as a measure of how far the shape can be moved without risking going through geometry.
Implements Shape.
|
pure virtual |
Get which sub shape's bounding boxes overlap with an axis aligned box
inBox | The axis aligned box to test against (relative to the center of mass of this shape) |
outSubShapeIndices | Buffer where to place the indices of the sub shapes that intersect |
inMaxSubShapeIndices | How many indices will fit in the buffer (normally you'd provide a buffer of GetNumSubShapes() indices) |
Implemented in MutableCompoundShape, and StaticCompoundShape.
|
pure virtual |
Get which sub shape's bounding boxes overlap with an axis aligned box
inBox | The axis aligned box to test against (relative to the center of mass of this shape) |
outSubShapeIndices | Buffer where to place the indices of the sub shapes that intersect |
inMaxSubShapeIndices | How many indices will fit in the buffer (normally you'd provide a buffer of GetNumSubShapes() indices) |
Implemented in MutableCompoundShape, and StaticCompoundShape.
|
overridevirtual |
Get the leaf shape for a particular sub shape ID.
inSubShapeID | The full sub shape ID that indicates the path to the leaf shape |
outRemainder | What remains of the sub shape ID after removing the path to the leaf shape (could e.g. refer to a triangle within a MeshShape) |
Reimplemented from Shape.
|
inlineoverridevirtual |
Get local bounding box including convex radius, this box is centered around the center of mass rather than the world transform.
Implements Shape.
|
overridevirtual |
Calculate the mass and inertia of this shape.
Implements Shape.
|
overridevirtual |
Get the material assigned to a particular sub shape ID.
Implements Shape.
|
inline |
Get the total number of sub shapes.
|
overridevirtual |
Volume of this shape (m^3). Note that for compound shapes the volume may be incorrect since child shapes can overlap which is not accounted for.
Get the combined stats of this shape and its children.
ioVisitedShapes | is used to track which shapes have already been visited, to avoid calculating the wrong memory size. |
Reimplemented from Shape.
|
overridevirtual |
Access to a particular sub shape.
|
inlineprotected |
Determine amount of bits needed to encode sub shape id.
|
overridevirtual |
Get the max number of sub shape ID bits that are needed to be able to address any leaf shape in this shape. Used mainly for checking that it is smaller or equal than SubShapeID::MaxBits.
Implements Shape.
|
inline |
Convert a sub shape index to a sub shape ID.
inIdx | Index of the sub shape of this compound |
inParentSubShapeID | Parent SubShapeID (describing the path to the compound shape) |
|
inline |
Convert SubShapeID to sub shape index
inSubShapeID | Sub shape id that indicates the leaf shape relative to this shape |
outRemainder | This is the sub shape ID for the sub shape of the compound after popping off the index |
|
inline |
Access to the sub shapes of this compound.
|
overridevirtual |
Get the direct child sub shape and its transform for a sub shape ID.
inSubShapeID | Sub shape ID that indicates the path to the leaf shape |
inPositionCOM | The position of the center of mass of this shape |
inRotation | The orientation of this shape |
inScale | Scale in local space of the shape (scales relative to its center of mass) |
outRemainder | The remainder of the sub shape ID after removing the sub shape |
Reimplemented from Shape.
|
overridevirtual |
Get the user data of a particular sub shape ID. Corresponds with the value stored in Shape::GetUserData of the leaf shape pointed to by inSubShapeID.
Reimplemented from Shape.
|
overridevirtual |
Get the vertices of the face that faces inDirection the most (includes any convex radius). Note that this function can only return faces of convex shapes or triangles, which is why a sub shape ID to get to that leaf must be provided.
inSubShapeID | Sub shape ID of target shape |
inDirection | Direction that the face should be facing (in local space to this shape) |
inCenterOfMassTransform | Transform to transform outVertices with |
inScale | Scale in local space of the shape (scales relative to its center of mass) |
outVertices | Resulting face. The returned face can be empty if the shape doesn't have polygons to return (e.g. because it's a sphere). The face will be returned in world space. |
Reimplemented from Shape.
|
overridevirtual |
Get the surface normal of a particular sub shape ID and point on surface (all vectors are relative to center of mass for this shape). Note: When you have a CollideShapeResult or ShapeCastResult you should use -mPenetrationAxis.Normalized() as contact normal as GetSurfaceNormal will only return face normals (and not vertex or edge normals).
Implements Shape.
|
inlineoverridevirtual |
Call this repeatedly to get all triangles in the box. outTriangleVertices should be large enough to hold 3 * inMaxTriangleRequested entries. outMaterials (if it is not null) should contain inMaxTrianglesRequested entries. The function returns the amount of triangles that it found (which will be <= inMaxTrianglesRequested), or 0 if there are no more triangles. Note that the function can return a value < inMaxTrianglesRequested and still have more triangles to process (triangles can be returned in blocks). Note that the function may return triangles outside of the requested box, only coarse culling is performed on the returned triangles.
Implements Shape.
|
inlineoverridevirtual |
To start iterating over triangles, call this function first. ioContext is a temporary buffer and should remain untouched until the last call to GetTrianglesNext. inBox is the world space bounding in which you want to get the triangles. inPositionCOM/inRotation/inScale describes the transform of this shape. To get the actual triangles call GetTrianglesNext.
Implements Shape.
|
overridevirtual |
Implements Shape.
|
inline |
Get world space bounds including convex radius.
|
inlinevirtual |
Get world space bounds including convex radius. This shape is scaled by inScale in local space first. This function can be overridden to return a closer fitting world space bounding box, by default it will just transform what GetLocalBounds() returns.
Reimplemented from Shape.
|
overridevirtual |
Get world space bounds including convex radius. This shape is scaled by inScale in local space first. This function can be overridden to return a closer fitting world space bounding box, by default it will just transform what GetLocalBounds() returns.
Reimplemented from Shape.
|
inline |
Check if a sub shape ID is still valid for this shape
inSubShapeID | Sub shape id that indicates the leaf shape relative to this shape |
|
overridevirtual |
Test if inScale is a valid scale for this shape. Some shapes can only be scaled uniformly, compound shapes cannot handle shapes being rotated and scaled (this would cause shearing), scale can never be zero. When the scale is invalid, the function will return false.
Here's a list of supported scales:
Reimplemented from Shape.
This function will make sure that if you wrap this shape in a ScaledShape that the scale is valid. Note that this involves discarding components of the scale that are invalid, so the resulting scaled shape may be different than the requested scale. Compare the return value of this function with the scale you passed in to detect major inconsistencies and possibly warn the user.
inScale | Local space scale for this shape. |
Reimplemented from Shape.
|
overridevirtual |
Check if this shape can only be used to create a static body or if it can also be dynamic/kinematic.
Reimplemented from Shape.
|
overrideprotectedvirtual |
This function should not be called directly, it is used by sRestoreFromBinaryState.
Reimplemented from Shape.
Reimplemented in MutableCompoundShape, and StaticCompoundShape.
|
overridevirtual |
Restore the shape references after calling sRestoreFromBinaryState. Note that the exact same shapes need to be provided in the same order as returned by SaveSubShapeState.
Reimplemented from Shape.
|
overridevirtual |
Saves the contents of the shape in binary form to inStream.
Reimplemented from Shape.
Reimplemented in MutableCompoundShape, and StaticCompoundShape.
|
overridevirtual |
Outputs the shape references that this shape has to outSubShapes.
Reimplemented from Shape.
Set the user data associated with a shape in this compound.
|
static |
|
overridevirtual |
Transforms this shape and all of its children with inTransform, resulting shape(s) are passed to ioCollector. Note that not all shapes support all transforms (especially true for scaling), the resulting shape will try to match the transform as accurately as possible.
inCenterOfMassTransform | The transform (rotation, translation, scale) that the center of mass of the shape should get |
ioCollector | The transformed shapes will be passed to this collector |
Reimplemented from Shape.
|
protected |
Center of mass of the compound.
|
protected |
Smallest radius of GetInnerRadius() of child shapes.
|
protected |
|
protected |