109 return !(*
this == inRHS);
328 void SetMass(
float inMass) { mMass = inMass; }
365 void SetUserData(
uint64 inUserData);
374 Vec3 CancelVelocityTowardsSteepSlopes(
Vec3Arg inDesiredVelocity)
const;
380 void StartTrackingContactChanges();
383 void FinishTrackingContactChanges();
400 bool CanWalkStairs(
Vec3Arg inLinearVelocity)
const;
458 void UpdateGroundVelocity();
472 void SetInnerBodyShape(
const Shape *inShape);
490 void CheckCollision(
RVec3Arg inPosition,
QuatArg inRotation,
Vec3Arg inMovementDirection,
float inMaxSeparationDistance,
const Shape *inShape,
RVec3Arg inBaseOffset,
CollideShapeCollector &ioCollector,
const BroadPhaseLayerFilter &inBroadPhaseLayerFilter,
const ObjectLayerFilter &inObjectLayerFilter,
const BodyFilter &inBodyFilter,
const ShapeFilter &inShapeFilter)
const;
496 virtual void SaveState(
StateRecorder &inStream)
const override;
499#ifdef JPH_DEBUG_RENDERER
517 if (c.mHadCollision && c.mBodyB == inBody)
526 if (c.mHadCollision && c.mCharacterIDB == inCharacterID)
539 struct ContactOrderingPredicate
558 CharacterContact * mContact;
560 float mProjectedVelocity;
561 Vec3 mLinearVelocity;
563 bool mIsSteepSlope =
false;
572 ContactCollector(PhysicsSystem *inSystem,
const CharacterVirtual *inCharacter,
uint inMaxHits,
float inHitReductionCosMaxAngle,
Vec3Arg inUp,
RVec3Arg inBaseOffset, TempContactList &outContacts) : mBaseOffset(inBaseOffset), mUp(inUp), mSystem(inSystem), mCharacter(inCharacter), mContacts(outContacts), mMaxHits(inMaxHits), mHitReductionCosMaxAngle(inHitReductionCosMaxAngle) { }
574 virtual void SetUserData(
uint64 inUserData)
override { mOtherCharacter =
reinterpret_cast<CharacterVirtual *
>(inUserData); }
576 virtual void AddHit(
const CollideShapeResult &inResult)
override;
580 PhysicsSystem * mSystem;
581 const CharacterVirtual * mCharacter;
582 CharacterVirtual * mOtherCharacter =
nullptr;
583 TempContactList & mContacts;
585 float mHitReductionCosMaxAngle;
586 bool mMaxHitsExceeded =
false;
590 template <
bool IgnoreInitialOverlap>
594 ContactCastCollector(PhysicsSystem *inSystem,
const CharacterVirtual *inCharacter,
Vec3Arg inDisplacement,
Vec3Arg inUp,
const IgnoredContactList &inIgnoredContacts,
RVec3Arg inBaseOffset, CharacterContact &outContact) : mBaseOffset(inBaseOffset), mDisplacement(inDisplacement), mUp(inUp), mSystem(inSystem), mCharacter(inCharacter), mIgnoredContacts(inIgnoredContacts), mContact(outContact) { }
596 virtual void SetUserData(
uint64 inUserData)
override { mOtherCharacter =
reinterpret_cast<CharacterVirtual *
>(inUserData); }
598 virtual void AddHit(
const ShapeCastResult &inResult)
override;
603 PhysicsSystem * mSystem;
604 const CharacterVirtual * mCharacter;
605 CharacterVirtual * mOtherCharacter =
nullptr;
606 const IgnoredContactList & mIgnoredContacts;
607 CharacterContact & mContact;
611 template <
class taCollector>
612 inline static void sFillContactProperties(
const CharacterVirtual *inCharacter, CharacterContact &outContact,
const Body &inBody,
Vec3Arg inUp,
RVec3Arg inBaseOffset,
const taCollector &inCollector,
const CollideShapeResult &inResult);
613 inline static void sFillCharacterContactProperties(CharacterContact &outContact,
const CharacterVirtual *inOtherCharacter,
RVec3Arg inBaseOffset,
const CollideShapeResult &inResult);
616 void MoveShape(
RVec3 &ioPosition,
Vec3Arg inVelocity,
float inDeltaTime, ContactList *outActiveContacts,
const BroadPhaseLayerFilter &inBroadPhaseLayerFilter,
const ObjectLayerFilter &inObjectLayerFilter,
const BodyFilter &inBodyFilter,
const ShapeFilter &inShapeFilter, TempAllocator &inAllocator
617 #ifdef JPH_DEBUG_RENDERER
618 ,
bool inDrawConstraints =
false
623 bool ValidateContact(
const CharacterContact &inContact)
const;
626 void ContactAdded(
const CharacterContact &inContact, CharacterContactSettings &ioSettings);
629 void GetContactsAtPosition(
RVec3Arg inPosition,
Vec3Arg inMovementDirection,
const Shape *inShape, TempContactList &outContacts,
const BroadPhaseLayerFilter &inBroadPhaseLayerFilter,
const ObjectLayerFilter &inObjectLayerFilter,
const BodyFilter &inBodyFilter,
const ShapeFilter &inShapeFilter)
const;
632 void RemoveConflictingContacts(TempContactList &ioContacts, IgnoredContactList &outIgnoredContacts)
const;
635 void DetermineConstraints(TempContactList &inContacts,
float inDeltaTime, ConstraintList &outConstraints)
const;
638 void SolveConstraints(
Vec3Arg inVelocity,
float inDeltaTime,
float inTimeRemaining, ConstraintList &ioConstraints, IgnoredContactList &ioIgnoredContacts,
float &outTimeSimulated, Vec3 &outDisplacement, TempAllocator &inAllocator
639 #ifdef JPH_DEBUG_RENDERER
640 ,
bool inDrawConstraints =
false
645 void GetAdjustedBodyVelocity(
const Body& inBody, Vec3 &outLinearVelocity, Vec3 &outAngularVelocity)
const;
650 Vec3 CalculateCharacterGroundVelocity(
RVec3Arg inCenterOfMass,
Vec3Arg inLinearVelocity,
Vec3Arg inAngularVelocity,
float inDeltaTime)
const;
653 bool HandleContact(
Vec3Arg inVelocity,
Constraint &ioConstraint,
float inDeltaTime);
658 bool ValidateMovement(
RVec3Arg inPosition,
Vec3Arg inDisplacement, CharacterContact &outContact,
const IgnoredContactList &inIgnoredContacts,
const BroadPhaseLayerFilter &inBroadPhaseLayerFilter,
const ObjectLayerFilter &inObjectLayerFilter,
const BodyFilter &inBodyFilter,
const ShapeFilter &inShapeFilter)
const;
663 bool GetFirstContactForSweep(
RVec3Arg inPosition,
Vec3Arg inDisplacement, CharacterContact &outContact,
const IgnoredContactList &inIgnoredContacts,
const BroadPhaseLayerFilter &inBroadPhaseLayerFilter,
const ObjectLayerFilter &inObjectLayerFilter,
const BodyFilter &inBodyFilter,
const ShapeFilter &inShapeFilter)
const;
666 void StoreActiveContacts(
const TempContactList &inContacts, TempAllocator &inAllocator);
669 void UpdateSupportingContact(
bool inSkipContactVelocityCheck, TempAllocator &inAllocator);
672 void MoveToContact(
RVec3Arg inPosition,
const CharacterContact &inContact,
const BroadPhaseLayerFilter &inBroadPhaseLayerFilter,
const ObjectLayerFilter &inObjectLayerFilter,
const BodyFilter &inBodyFilter,
const ShapeFilter &inShapeFilter, TempAllocator &inAllocator);
675 inline RMat44 GetCenterOfMassTransform(
RVec3Arg inPosition,
QuatArg inRotation,
const Shape *inShape)
const
681 inline RVec3 GetInnerBodyPosition()
const
683 return mPosition + (mRotation * mShapeOffset + mCharacterPadding * mUp);
687 void UpdateInnerBodyTransform();
693 CharacterContactListener * mListener =
nullptr;
696 CharacterVsCharacterCollision * mCharacterVsCharacterCollision =
nullptr;
700 float mPredictiveContactDistance;
701 uint mMaxCollisionIterations;
702 uint mMaxConstraintIterations;
703 float mMinTimeRemaining;
704 float mCollisionTolerance;
705 float mCharacterPadding;
707 float mHitReductionCosMaxAngle;
708 float mPenetrationRecoverySpeed;
709 bool mEnhancedInternalEdgeRemoval;
730 ContactList mActiveContacts;
733 int mTrackingContactChanges = 0;
736 struct ListenerContactValue
738 ListenerContactValue() =
default;
739 explicit ListenerContactValue(
const CharacterContactSettings &inSettings) : mSettings(inSettings) { }
741 CharacterContactSettings mSettings;
745 using ListenerContacts = UnorderedMap<CharacterContactKey, ListenerContactValue>;
746 ListenerContacts mListenerContacts;
749 float mLastDeltaTime = 1.0f / 60.0f;
752 mutable bool mMaxHitsExceeded =
false;
EBackFaceMode
How collision detection functions will treat back facing triangles.
Definition BackFaceMode.h:11
@ CollideWithBackFaces
Collide with back facing surfaces/triangles.
Definition BackFaceMode.h:13
@ Constraint
Definition Constraint.h:28
#define JPH_EXPORT
Definition Core.h:286
std::uint64_t uint64
Definition Core.h:551
unsigned int uint
Definition Core.h:546
#define JPH_NAMESPACE_END
Definition Core.h:469
#define JPH_NAMESPACE_BEGIN
Definition Core.h:463
JPH_NAMESPACE_BEGIN uint64 HashBytes(const void *inData, uint inSize, uint64 inSeed=0xcbf29ce484222325UL)
Definition HashCombine.h:15
JPH_INLINE constexpr float DegreesToRadians(float inV)
Convert a value from degrees to radians.
Definition Math.h:16
const Quat QuatArg
Definition MathTypes.h:28
const Vec3 Vec3Arg
Definition MathTypes.h:19
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:50
EMotionType
Motion type of a physics body.
Definition MotionType.h:11
uint16 ObjectLayer
Definition ObjectLayer.h:16
Vec3Arg RVec3Arg
Definition Real.h:30
Mat44Arg RMat44Arg
Definition Real.h:32
Mat44 RMat44
Definition Real.h:31
Vec3 RVec3
Definition Real.h:29
@ Array
Used in attribute declaration, indicates that this is an array of objects.
Definition SerializableAttribute.h:23
CollisionCollector< ShapeCastResult, CollisionCollectorTraitsCastShape > CastShapeCollector
Definition Shape.h:44
@ Plane
Used by PlaneShape.
Definition Shape.h:70
CollisionCollector< CollideShapeResult, CollisionCollectorTraitsCollideShape > CollideShapeCollector
Definition Shape.h:46
JPH_INLINE float Cos(float inX)
Cosine of x (input in radians).
Definition Trigonometry.h:20
Class function to filter out bodies, returns true if test should collide with body.
Definition BodyFilter.h:16
ID of a body. This is a way of reasoning about bodies in a multithreaded simulation while avoiding ra...
Definition BodyID.h:13
Filter class for broadphase layers.
Definition BroadPhaseLayer.h:94
RefConst< Shape > mShape
Definition CharacterBase.h:136
Vec3 mUp
Definition CharacterBase.h:139
JPH_OVERRIDE_NEW_DELETE CharacterBase(const CharacterBaseSettings *inSettings, PhysicsSystem *inSystem)
Constructor.
Definition CharacterBase.cpp:12
CharacterBaseSettings & operator=(const CharacterBaseSettings &)=default
JPH_OVERRIDE_NEW_DELETE CharacterBaseSettings()=default
Constructor.
ID of a character. Used primarily to identify deleted characters and to sort deterministically.
Definition CharacterID.h:13
static CharacterID sNextCharacterID()
Generate the next available character ID.
Definition CharacterID.h:74
Definition CharacterVirtual.h:269
JPH_OVERRIDE_NEW_DELETE CharacterVirtual(const CharacterVirtualSettings *inSettings, RVec3Arg inPosition, QuatArg inRotation, uint64 inUserData, PhysicsSystem *inSystem)
Definition CharacterVirtual.cpp:117
void SetEnhancedInternalEdgeRemoval(bool inApply)
Definition CharacterVirtual.h:340
TransformedShape GetTransformedShape() const
Get the transformed shape that represents the volume of the character, can be used for collision chec...
Definition CharacterVirtual.h:475
float GetMass() const
Character mass (kg).
Definition CharacterVirtual.h:327
float GetPenetrationRecoverySpeed() const
This value governs how fast a penetration will be resolved, 0 = nothing is resolved,...
Definition CharacterVirtual.h:335
RVec3 GetPosition() const
Get the position of the character.
Definition CharacterVirtual.h:306
void SetLinearVelocity(Vec3Arg inLinearVelocity)
Set the linear velocity of the character (m / s).
Definition CharacterVirtual.h:303
const ContactList & GetActiveContacts() const
Definition CharacterVirtual.h:511
RMat44 GetWorldTransform() const
Calculate the world transform of the character.
Definition CharacterVirtual.h:321
void SetCharacterVsCharacterCollision(CharacterVsCharacterCollision *inCharacterVsCharacterCollision)
Set the character vs character collision interface.
Definition CharacterVirtual.h:297
RVec3 GetCenterOfMassPosition() const
Definition CharacterVirtual.h:318
bool GetMaxHitsExceeded() const
Definition CharacterVirtual.h:357
bool HasCollidedWith(const BodyID &inBody) const
Check if the character is currently in contact with or has collided with another body in the last ope...
Definition CharacterVirtual.h:514
void SetMaxStrength(float inMaxStrength)
Definition CharacterVirtual.h:332
float GetCharacterPadding() const
Character padding.
Definition CharacterVirtual.h:343
void SetMaxNumHits(uint inMaxHits)
Definition CharacterVirtual.h:347
uint GetMaxNumHits() const
Max num hits to collect in order to avoid excess of contact points collection.
Definition CharacterVirtual.h:346
float GetMaxStrength() const
Maximum force with which the character can push other bodies (N).
Definition CharacterVirtual.h:331
void SetShapeOffset(Vec3Arg inShapeOffset)
Definition CharacterVirtual.h:361
BodyID GetInnerBodyID() const
Optional inner rigid body that proxies the character in the world. Can be used to update body propert...
Definition CharacterVirtual.h:368
void SetMass(float inMass)
Definition CharacterVirtual.h:328
bool GetEnhancedInternalEdgeRemoval() const
Set to indicate that extra effort should be made to try to remove ghost contacts (collisions with int...
Definition CharacterVirtual.h:339
bool HasCollidedWith(const CharacterID &inCharacterID) const
Check if the character is currently in contact with or has collided with another character in the las...
Definition CharacterVirtual.h:523
Vec3 GetLinearVelocity() const
Get the linear velocity of the character (m / s).
Definition CharacterVirtual.h:300
CharacterContactListener * GetListener() const
Get the current contact listener.
Definition CharacterVirtual.h:294
RMat44 GetCenterOfMassTransform() const
Calculates the transform for this character's center of mass.
Definition CharacterVirtual.h:324
CharacterVirtual(const CharacterVirtualSettings *inSettings, RVec3Arg inPosition, QuatArg inRotation, PhysicsSystem *inSystem)
Constructor without user data.
Definition CharacterVirtual.h:282
static bool sDrawStickToFloor
Draw the state of the stick to floor algorithm.
Definition CharacterVirtual.h:502
static bool sDrawWalkStairs
Draw the state of the walk stairs algorithm.
Definition CharacterVirtual.h:501
static bool sDrawConstraints
Draw the current state of the constraints for iteration 0 when creating them.
Definition CharacterVirtual.h:500
void SetRotation(QuatArg inRotation)
Set the rotation of the character.
Definition CharacterVirtual.h:315
void SetHitReductionCosMaxAngle(float inCosMaxAngle)
Definition CharacterVirtual.h:351
uint64 GetUserData() const
Access to the user data, can be used for anything by the application.
Definition CharacterVirtual.h:364
Vec3 GetShapeOffset() const
An extra offset applied to the shape in local space. This allows applying an extra offset to the shap...
Definition CharacterVirtual.h:360
Array< CharacterContact > ContactList
Definition CharacterVirtual.h:507
void SetPenetrationRecoverySpeed(float inSpeed)
Definition CharacterVirtual.h:336
bool HasCollidedWith(const CharacterVirtual *inCharacter) const
Check if the character is currently in contact with or has collided with another character in the las...
Definition CharacterVirtual.h:532
float GetHitReductionCosMaxAngle() const
Cos(angle) where angle is the maximum angle between two hits contact normals that are allowed to be m...
Definition CharacterVirtual.h:350
Array< CharacterContact, STLTempAllocator< CharacterContact > > TempContactList
Definition CharacterVirtual.h:506
static bool sDrawSupportingVolume
Draw the supporting volume plane.
Definition CharacterVirtual.h:503
void SetPosition(RVec3Arg inPosition)
Set the position of the character.
Definition CharacterVirtual.h:309
const CharacterID & GetID() const
The ID of this character.
Definition CharacterVirtual.h:288
void SetListener(CharacterContactListener *inListener)
Set the contact listener.
Definition CharacterVirtual.h:291
Quat GetRotation() const
Get the rotation of the character.
Definition CharacterVirtual.h:312
Contains the configuration of a character.
Definition CharacterVirtual.h:24
uint mMaxConstraintIterations
How often to try stepping in the constraint solving.
Definition CharacterVirtual.h:49
uint mMaxCollisionIterations
Max amount of collision loops.
Definition CharacterVirtual.h:48
float mMinTimeRemaining
Early out condition: If this much time is left to simulate we are done.
Definition CharacterVirtual.h:50
float mPenetrationRecoverySpeed
This value governs how fast a penetration will be resolved, 0 = nothing is resolved,...
Definition CharacterVirtual.h:55
float mMaxStrength
Maximum force with which the character can push other bodies (N).
Definition CharacterVirtual.h:40
ObjectLayer mInnerBodyLayer
Layer that the inner rigid body will be added to.
Definition CharacterVirtual.h:68
Vec3 mShapeOffset
An extra offset applied to the shape in local space. This allows applying an extra offset to the shap...
Definition CharacterVirtual.h:43
JPH_OVERRIDE_NEW_DELETE CharacterVirtualSettings()=default
Constructor.
RefConst< Shape > mInnerBodyShape
Definition CharacterVirtual.h:61
CharacterVirtualSettings(const CharacterVirtualSettings &)=default
float mCharacterPadding
How far we try to stay away from the geometry, this ensures that the sweep will hit as little as poss...
Definition CharacterVirtual.h:52
CharacterID mID
ID to give to this character. This is used for deterministically sorting and as an identifier to repr...
Definition CharacterVirtual.h:34
float mMass
Character mass (kg). Used to push down objects with gravity when the character is standing on top.
Definition CharacterVirtual.h:37
float mCollisionTolerance
How far we're willing to penetrate geometry.
Definition CharacterVirtual.h:51
EBackFaceMode mBackFaceMode
When colliding with back faces, the character will not be able to move through back facing triangles....
Definition CharacterVirtual.h:46
float mHitReductionCosMaxAngle
Cos(angle) where angle is the maximum angle between two hits contact normals that are allowed to be m...
Definition CharacterVirtual.h:54
float mPredictiveContactDistance
How far to scan outside of the shape for predictive contacts. A value of 0 will most likely cause the...
Definition CharacterVirtual.h:47
BodyID mInnerBodyIDOverride
Definition CharacterVirtual.h:65
uint mMaxNumHits
Max num hits to collect in order to avoid excess of contact points collection.
Definition CharacterVirtual.h:53
Definition CharacterVirtual.h:220
virtual void CollideCharacter(const CharacterVirtual *inCharacter, RMat44Arg inCenterOfMassTransform, const CollideShapeSettings &inCollideShapeSettings, RVec3Arg inBaseOffset, CollideShapeCollector &ioCollector) const =0
virtual ~CharacterVsCharacterCollision()=default
virtual void CastCharacter(const CharacterVirtual *inCharacter, RMat44Arg inCenterOfMassTransform, Vec3Arg inDirection, const ShapeCastSettings &inShapeCastSettings, RVec3Arg inBaseOffset, CastShapeCollector &ioCollector) const =0
Definition CharacterVirtual.h:247
void Add(CharacterVirtual *inCharacter)
Add a character to the list of characters to check collision against.
Definition CharacterVirtual.h:250
Array< CharacterVirtual * > mCharacters
The list of characters to check collision against.
Definition CharacterVirtual.h:259
Settings to be passed with a collision query.
Definition CollideShape.h:94
JPH_INLINE Mat44 PostTranslated(Vec3Arg inTranslation) const
Post multiply by translation matrix: result = Mat44::sTranslation(inTranslation) * this (i....
Definition Mat44.inl:1127
JPH_INLINE Mat44 PreTranslated(Vec3Arg inTranslation) const
Pre multiply by translation matrix: result = this * Mat44::sTranslation(inTranslation).
Definition Mat44.inl:1122
static JPH_INLINE Mat44 sRotationTranslation(QuatArg inR, Vec3Arg inT)
Get matrix that rotates and translates.
Definition Mat44.inl:149
Filter class for object layers.
Definition ObjectLayer.h:28
Definition PhysicsMaterial.h:23
Definition PhysicsSystem.h:30
static JPH_INLINE Quat sIdentity()
Definition Quat.h:104
Definition Reference.h:166
Settings to be passed with a shape cast.
Definition ShapeCast.h:92
Filter class.
Definition ShapeFilter.h:17
Base class for all shapes (collision volume of a body). Defines a virtual interface for collision det...
Definition Shape.h:185
virtual Vec3 GetCenterOfMass() const
All shapes are centered around their center of mass. This function returns the center of mass positio...
Definition Shape.h:210
Definition StateRecorder.h:110
A sub shape id contains a path to an element (usually a triangle or other primitive type) of a compou...
Definition SubShapeID.h:23
Type GetValue() const
Get the value of the path to the sub shape ID.
Definition SubShapeID.h:52
Definition TempAllocator.h:16
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition Vec3.inl:125
float4 Quat
Definition HLSLToCPP.h:485
Settings struct with settings for ExtendedUpdate.
Definition CharacterVirtual.h:430
float mWalkStairsMinStepForward
See WalkStairs inStepForward parameter. Note that the parameter only indicates a magnitude,...
Definition CharacterVirtual.h:433
Vec3 mStickToFloorStepDown
See StickToFloor inStepDown parameter. Can be zero to turn off.
Definition CharacterVirtual.h:431
float mWalkStairsStepForwardTest
See WalkStairs inStepForwardTest parameter. Note that the parameter only indicates a magnitude,...
Definition CharacterVirtual.h:434
Vec3 mWalkStairsStepDownExtra
See WalkStairs inStepDownExtra.
Definition CharacterVirtual.h:436
float mWalkStairsCosAngleForwardContact
Cos(angle) where angle is the maximum angle between the ground normal in the horizontal plane and the...
Definition CharacterVirtual.h:435
Vec3 mWalkStairsStepUp
See WalkStairs inStepUp parameter. Can be zero to turn off.
Definition CharacterVirtual.h:432