34 float mMaxStrength = 100.0f;
41 float mPredictiveContactDistance = 0.1f;
42 uint mMaxCollisionIterations = 5;
43 uint mMaxConstraintIterations = 15;
44 float mMinTimeRemaining = 1.0e-4f;
45 float mCollisionTolerance = 1.0e-3f;
46 float mCharacterPadding = 0.02f;
48 float mHitReductionCosMaxAngle = 0.999f;
49 float mPenetrationRecoverySpeed = 1.0f;
248 inline RVec3 GetCenterOfMassPosition()
const {
return mPosition + (mRotation * (mShapeOffset + mShape->GetCenterOfMass()) + mCharacterPadding * mUp); }
258 void SetMass(
float inMass) { mMass = inMass; }
295 void SetUserData(
uint64 inUserData);
304 Vec3 CancelVelocityTowardsSteepSlopes(
Vec3Arg inDesiredVelocity)
const;
310 void StartTrackingContactChanges();
313 void FinishTrackingContactChanges();
330 bool CanWalkStairs(
Vec3Arg inLinearVelocity)
const;
361 Vec3 mStickToFloorStepDown { 0, -0.5f, 0 };
362 Vec3 mWalkStairsStepUp { 0, 0.4f, 0 };
363 float mWalkStairsMinStepForward { 0.02f };
364 float mWalkStairsStepForwardTest { 0.15f };
388 void UpdateGroundVelocity();
402 void SetInnerBodyShape(
const Shape *inShape);
420 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;
423 virtual void SaveState(
StateRecorder &inStream)
const override;
426#ifdef JPH_DEBUG_RENDERER
427 static inline bool sDrawConstraints =
false;
428 static inline bool sDrawWalkStairs =
false;
429 static inline bool sDrawStickToFloor =
false;
454 return !(*
this == inRHS);
491 bool mHadCollision =
false;
492 bool mWasDiscarded =
false;
493 bool mCanPushCharacter =
true;
507 if (c.mHadCollision && c.mBodyB == inBody)
516 if (c.mHadCollision && c.mCharacterIDB == inCharacterID)
524 return HasCollidedWith(inCharacter->
GetID());
529 struct ContactOrderingPredicate
531 inline bool operator () (
const Contact &inLHS,
const Contact &inRHS)
const
533 if (inLHS.mBodyB != inRHS.mBodyB)
534 return inLHS.mBodyB < inRHS.mBodyB;
536 if (inLHS.mCharacterIDB != inRHS.mCharacterIDB)
537 return inLHS.mCharacterIDB < inRHS.mCharacterIDB;
539 return inLHS.mSubShapeIDB.GetValue() < inRHS.mSubShapeIDB.GetValue();
550 float mProjectedVelocity;
551 Vec3 mLinearVelocity;
553 bool mIsSteepSlope =
false;
562 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) { }
564 virtual void SetUserData(
uint64 inUserData)
override { mOtherCharacter =
reinterpret_cast<CharacterVirtual *
>(inUserData); }
573 TempContactList & mContacts;
575 float mHitReductionCosMaxAngle;
576 bool mMaxHitsExceeded =
false;
583 ContactCastCollector(
PhysicsSystem *inSystem,
const CharacterVirtual *inCharacter,
Vec3Arg inDisplacement,
Vec3Arg inUp,
const IgnoredContactList &inIgnoredContacts,
RVec3Arg inBaseOffset, Contact &outContact) : mBaseOffset(inBaseOffset), mDisplacement(inDisplacement), mUp(inUp), mSystem(inSystem), mCharacter(inCharacter), mIgnoredContacts(inIgnoredContacts), mContact(outContact) { }
585 virtual void SetUserData(
uint64 inUserData)
override { mOtherCharacter =
reinterpret_cast<CharacterVirtual *
>(inUserData); }
595 const IgnoredContactList & mIgnoredContacts;
600 template <
class taCollector>
606 #ifdef JPH_DEBUG_RENDERER
607 ,
bool inDrawConstraints =
false
612 bool ValidateContact(
const Contact &inContact)
const;
621 void RemoveConflictingContacts(TempContactList &ioContacts, IgnoredContactList &outIgnoredContacts)
const;
624 void DetermineConstraints(TempContactList &inContacts,
float inDeltaTime, ConstraintList &outConstraints)
const;
627 void SolveConstraints(
Vec3Arg inVelocity,
float inDeltaTime,
float inTimeRemaining, ConstraintList &ioConstraints, IgnoredContactList &ioIgnoredContacts,
float &outTimeSimulated,
Vec3 &outDisplacement,
TempAllocator &inAllocator
628 #ifdef JPH_DEBUG_RENDERER
629 ,
bool inDrawConstraints =
false
634 void GetAdjustedBodyVelocity(
const Body& inBody,
Vec3 &outLinearVelocity,
Vec3 &outAngularVelocity)
const;
639 Vec3 CalculateCharacterGroundVelocity(
RVec3Arg inCenterOfMass,
Vec3Arg inLinearVelocity,
Vec3Arg inAngularVelocity,
float inDeltaTime)
const;
642 bool HandleContact(
Vec3Arg inVelocity,
Constraint &ioConstraint,
float inDeltaTime);
648 void StoreActiveContacts(
const TempContactList &inContacts,
TempAllocator &inAllocator);
651 void UpdateSupportingContact(
bool inSkipContactVelocityCheck,
TempAllocator &inAllocator);
663 inline RVec3 GetInnerBodyPosition()
const
665 return mPosition + (mRotation * mShapeOffset + mCharacterPadding *
mUp);
669 void UpdateInnerBodyTransform();
682 float mPredictiveContactDistance;
683 uint mMaxCollisionIterations;
684 uint mMaxConstraintIterations;
685 float mMinTimeRemaining;
686 float mCollisionTolerance;
687 float mCharacterPadding;
689 float mHitReductionCosMaxAngle;
690 float mPenetrationRecoverySpeed;
712 ContactList mActiveContacts;
715 int mTrackingContactChanges = 0;
718 struct ListenerContactValue
720 ListenerContactValue() =
default;
728 ListenerContacts mListenerContacts;
731 float mLastDeltaTime = 1.0f / 60.0f;
734 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.
#define JPH_EXPORT
Definition Core.h:275
std::uint64_t uint64
Definition Core.h:490
unsigned int uint
Definition Core.h:486
#define JPH_NAMESPACE_END
Definition Core.h:418
#define JPH_NAMESPACE_BEGIN
Definition Core.h:412
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
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:31
EMotionType
Motion type of a physics body.
Definition MotionType.h:11
uint16 ObjectLayer
Definition ObjectLayer.h:16
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
Base class for character class.
Definition CharacterBase.h:54
Base class for configuration of a character.
Definition CharacterBase.h:21
bool mEnhancedInternalEdgeRemoval
Set to indicate that extra effort should be made to try to remove ghost contacts (collisions with int...
Definition CharacterBase.h:45
Vec3 mUp
Vector indicating the up direction of the character.
Definition CharacterBase.h:34
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:199
void SetEnhancedInternalEdgeRemoval(bool inApply)
Definition CharacterVirtual.h:270
TransformedShape GetTransformedShape() const
Get the transformed shape that represents the volume of the character, can be used for collision chec...
Definition CharacterVirtual.h:405
float GetMass() const
Character mass (kg)
Definition CharacterVirtual.h:257
float GetPenetrationRecoverySpeed() const
This value governs how fast a penetration will be resolved, 0 = nothing is resolved,...
Definition CharacterVirtual.h:265
RVec3 GetPosition() const
Get the position of the character.
Definition CharacterVirtual.h:236
void SetLinearVelocity(Vec3Arg inLinearVelocity)
Set the linear velocity of the character (m / s)
Definition CharacterVirtual.h:233
const ContactList & GetActiveContacts() const
Definition CharacterVirtual.h:501
RMat44 GetWorldTransform() const
Calculate the world transform of the character.
Definition CharacterVirtual.h:251
void SetCharacterVsCharacterCollision(CharacterVsCharacterCollision *inCharacterVsCharacterCollision)
Set the character vs character collision interface.
Definition CharacterVirtual.h:227
RVec3 GetCenterOfMassPosition() const
Definition CharacterVirtual.h:248
bool GetMaxHitsExceeded() const
Definition CharacterVirtual.h:287
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:504
void SetMaxStrength(float inMaxStrength)
Definition CharacterVirtual.h:262
float GetCharacterPadding() const
Character padding.
Definition CharacterVirtual.h:273
void SetMaxNumHits(uint inMaxHits)
Definition CharacterVirtual.h:277
uint GetMaxNumHits() const
Max num hits to collect in order to avoid excess of contact points collection.
Definition CharacterVirtual.h:276
float GetMaxStrength() const
Maximum force with which the character can push other bodies (N)
Definition CharacterVirtual.h:261
void SetShapeOffset(Vec3Arg inShapeOffset)
Definition CharacterVirtual.h:291
BodyID GetInnerBodyID() const
Optional inner rigid body that proxies the character in the world. Can be used to update body propert...
Definition CharacterVirtual.h:298
void SetMass(float inMass)
Definition CharacterVirtual.h:258
bool GetEnhancedInternalEdgeRemoval() const
Set to indicate that extra effort should be made to try to remove ghost contacts (collisions with int...
Definition CharacterVirtual.h:269
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:513
Vec3 GetLinearVelocity() const
Get the linear velocity of the character (m / s)
Definition CharacterVirtual.h:230
CharacterContactListener * GetListener() const
Get the current contact listener.
Definition CharacterVirtual.h:224
RMat44 GetCenterOfMassTransform() const
Calculates the transform for this character's center of mass.
Definition CharacterVirtual.h:254
CharacterVirtual(const CharacterVirtualSettings *inSettings, RVec3Arg inPosition, QuatArg inRotation, PhysicsSystem *inSystem)
Constructor without user data.
Definition CharacterVirtual.h:212
void SetRotation(QuatArg inRotation)
Set the rotation of the character.
Definition CharacterVirtual.h:245
void SetHitReductionCosMaxAngle(float inCosMaxAngle)
Definition CharacterVirtual.h:281
uint64 GetUserData() const
Access to the user data, can be used for anything by the application.
Definition CharacterVirtual.h:294
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:290
void SetPenetrationRecoverySpeed(float inSpeed)
Definition CharacterVirtual.h:266
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:522
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:280
void SetPosition(RVec3Arg inPosition)
Set the position of the character.
Definition CharacterVirtual.h:239
const CharacterID & GetID() const
The ID of this character.
Definition CharacterVirtual.h:218
void SetListener(CharacterContactListener *inListener)
Set the contact listener.
Definition CharacterVirtual.h:221
Quat GetRotation() const
Get the rotation of the character.
Definition CharacterVirtual.h:242
Contains the configuration of a character.
Definition CharacterVirtual.h:23
RefConst< Shape > mInnerBodyShape
Definition CharacterVirtual.h:55
BodyID mInnerBodyIDOverride
Definition CharacterVirtual.h:59
Definition CharacterVirtual.h:150
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:177
void Add(CharacterVirtual *inCharacter)
Add a character to the list of characters to check collision against.
Definition CharacterVirtual.h:180
Array< CharacterVirtual * > mCharacters
The list of characters to check collision against.
Definition CharacterVirtual.h:189
Class that contains all information of two colliding shapes.
Definition CollideShape.h:19
Settings to be passed with a collision query.
Definition CollideShape.h:94
Virtual interface that allows collecting multiple collision results.
Definition CollisionCollector.h:45
Base class for all physics constraints. A constraint removes one or more degrees of freedom for a rig...
Definition Constraint.h:103
Holds a 4x4 matrix of floats, but supports also operations on the 3x3 upper left part of the matrix.
Definition Mat44.h:13
JPH_INLINE Mat44 PostTranslated(Vec3Arg inTranslation) const
Post multiply by translation matrix: result = Mat44::sTranslation(inTranslation) * this (i....
Definition Mat44.inl:903
JPH_INLINE Mat44 PreTranslated(Vec3Arg inTranslation) const
Pre multiply by translation matrix: result = this * Mat44::sTranslation(inTranslation)
Definition Mat44.inl:898
static JPH_INLINE Mat44 sRotationTranslation(QuatArg inR, Vec3Arg inT)
Get matrix that rotates and translates.
Definition Mat44.inl:149
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition NonCopyable.h:11
Filter class for object layers.
Definition ObjectLayer.h:28
Definition PhysicsMaterial.h:23
Definition PhysicsSystem.h:30
An infinite plane described by the formula X . Normal + Constant = 0.
Definition Plane.h:11
static JPH_INLINE Quat sIdentity()
Definition Quat.h:103
Definition Reference.h:163
Result of a shape cast test.
Definition ShapeCast.h:114
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:186
virtual Vec3 GetCenterOfMass() const
All shapes are centered around their center of mass. This function returns the center of mass positio...
Definition Shape.h:211
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
Definition TempAllocator.h:16
Definition UnorderedMap.h:30
static JPH_INLINE Vec3 sZero()
Vector with all zeros.
Definition Vec3.inl:103
Settings struct with settings for ExtendedUpdate.
Definition CharacterVirtual.h:360