Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
PhysicsUpdateContext.h
Go to the documentation of this file.
1// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3// SPDX-License-Identifier: MIT
4
5#pragma once
6
11#include <Jolt/Core/JobSystem.h>
13
15
16class PhysicsSystem;
17class IslandBuilder;
18class Constraint;
19class TempAllocator;
20class SoftBodyUpdateContext;
21
26class PhysicsUpdateContext : public NonCopyable
27{
28public:
30 explicit PhysicsUpdateContext(TempAllocator &inTempAllocator);
31 ~PhysicsUpdateContext();
32
33 static constexpr int cMaxConcurrency = 32;
34
35 using JobHandleArray = StaticArray<JobHandle, cMaxConcurrency>;
36
37 struct Step;
38
39 struct BodyPairQueue
40 {
41 atomic<uint32> mWriteIdx { 0 };
42 uint8 mPadding1[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
43
44 atomic<uint32> mReadIdx { 0 };
45 uint8 mPadding2[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
46 };
47
49
50 using JobMask = uint32;
51 static_assert(sizeof(JobMask) * 8 >= cMaxConcurrency);
52
54 struct Step
55 {
56 Step() = default;
57 Step(const Step &) { JPH_ASSERT(false); } // vector needs a copy constructor, but we're never going to call it
58
59 PhysicsUpdateContext *mContext;
60
61 bool mIsFirst;
62 bool mIsLast;
63
64 BroadPhase::UpdateState mBroadPhaseUpdateState;
65
66 uint32 mNumActiveBodiesAtStepStart;
67
68 atomic<uint32> mDetermineActiveConstraintReadIdx { 0 };
69 uint8 mPadding1[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
70
71 atomic<uint32> mNumActiveConstraints { 0 };
72 uint8 mPadding2[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
73
74 atomic<uint32> mSetupVelocityConstraintsReadIdx { 0 };
75 uint8 mPadding3[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
76
77 atomic<uint32> mStepListenerReadIdx { 0 };
78 uint8 mPadding4[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
79
80 atomic<uint32> mApplyGravityReadIdx { 0 };
81 uint8 mPadding5[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
82
83 atomic<uint32> mActiveBodyReadIdx { 0 };
84 uint8 mPadding6[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
85
86 BodyPairQueues mBodyPairQueues;
87
88 uint32 mMaxBodyPairsPerQueue;
89
90 atomic<JobMask> mActiveFindCollisionJobs;
91
92 atomic<uint> mNumBodyPairs { 0 };
93 atomic<uint> mNumManifolds { 0 };
94
95 atomic<uint32> mSolveVelocityConstraintsNextIsland { 0 };
96 atomic<uint32> mSolvePositionConstraintsNextIsland { 0 };
97
99 struct CCDBody
100 {
101 CCDBody(BodyID inBodyID1, Vec3Arg inDeltaPosition, float inLinearCastThresholdSq, float inMaxPenetration) : mDeltaPosition(inDeltaPosition), mBodyID1(inBodyID1), mLinearCastThresholdSq(inLinearCastThresholdSq), mMaxPenetration(inMaxPenetration) { }
102
103 Vec3 mDeltaPosition;
104 Vec3 mContactNormal;
105 RVec3 mContactPointOn2;
106 BodyID mBodyID1;
107 BodyID mBodyID2;
108 SubShapeID mSubShapeID2;
109 float mFraction = 1.0f;
110 float mFractionPlusSlop = 1.0f;
111 float mLinearCastThresholdSq;
112 float mMaxPenetration;
113 ContactSettings mContactSettings;
114 };
115 atomic<uint32> mIntegrateVelocityReadIdx { 0 };
116 CCDBody * mCCDBodies = nullptr;
117 uint32 mCCDBodiesCapacity = 0;
118 atomic<uint32> mNumCCDBodies = 0;
119 atomic<uint32> mNextCCDBody { 0 };
120 int * mActiveBodyToCCDBody = nullptr;
121 uint32 mNumActiveBodyToCCDBody = 0;
122
123 // Jobs in order of execution (some run in parallel)
124 JobHandle mBroadPhasePrepare;
125 JobHandleArray mStepListeners;
126 JobHandleArray mDetermineActiveConstraints;
127 JobHandleArray mApplyGravity;
128 JobHandleArray mFindCollisions;
129 JobHandle mUpdateBroadphaseFinalize;
130 JobHandleArray mSetupVelocityConstraints;
131 JobHandle mBuildIslandsFromConstraints;
132 JobHandle mFinalizeIslands;
133 JobHandle mBodySetIslandIndex;
134 JobHandleArray mSolveVelocityConstraints;
135 JobHandle mPreIntegrateVelocity;
136 JobHandleArray mIntegrateVelocity;
137 JobHandle mPostIntegrateVelocity;
138 JobHandle mResolveCCDContacts;
139 JobHandleArray mSolvePositionConstraints;
140 JobHandle mContactRemovedCallbacks;
141 JobHandle mSoftBodyPrepare;
142 JobHandleArray mSoftBodyCollide;
143 JobHandleArray mSoftBodySimulate;
144 JobHandle mSoftBodyFinalize;
145 JobHandle mStartNextStep;
146 };
147
149
151 int GetMaxConcurrency() const { const int max_concurrency = PhysicsUpdateContext::cMaxConcurrency; return min(max_concurrency, mJobSystem->GetMaxConcurrency()); }
152
153 PhysicsSystem * mPhysicsSystem;
154 TempAllocator * mTempAllocator;
155 JobSystem * mJobSystem;
156 JobSystem::Barrier * mBarrier;
157
158 float mStepDeltaTime;
159 float mWarmStartImpulseRatio;
160 atomic<uint32> mErrors { 0 };
161
162 Constraint ** mActiveConstraints = nullptr;
163
164 BodyPair * mBodyPairs = nullptr;
165
166 IslandBuilder * mIslandBuilder;
167
168 Steps mSteps;
169
170 uint mNumSoftBodies;
171 SoftBodyUpdateContext * mSoftBodyUpdateContexts = nullptr;
172 atomic<uint> mSoftBodyToCollide { 0 };
173};
175
std::uint8_t uint8
Definition Core.h:494
#define JPH_CACHE_LINE_SIZE
Definition Core.h:533
unsigned int uint
Definition Core.h:493
#define JPH_NAMESPACE_END
Definition Core.h:419
std::uint32_t uint32
Definition Core.h:496
#define JPH_NAMESPACE_BEGIN
Definition Core.h:413
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
Definition Array.h:36
ID of a body. This is a way of reasoning about bodies in a multithreaded simulation while avoiding ra...
Definition BodyID.h:13
Base class for all physics constraints. A constraint removes one or more degrees of freedom for a rig...
Definition Constraint.h:108
Definition ContactListener.h:41
Keeps track of connected bodies and builds islands for multithreaded velocity/position update.
Definition IslandBuilder.h:19
A job barrier keeps track of a number of jobs and allows waiting until they are all completed.
Definition JobSystem.h:123
Definition JobSystem.h:80
Definition JobSystem.h:70
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition NonCopyable.h:11
Definition PhysicsSystem.h:30
Simple variable length array backed by a fixed size buffer.
Definition StaticArray.h:14
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 Vec3.h:17
Structure that holds a body pair.
Definition BodyPair.h:14
Context used during broadphase update.
Definition BroadPhase.h:44