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 BodyManager;
18class IslandBuilder;
19class Constraint;
20class TempAllocator;
21class SoftBodyUpdateContext;
22
27class PhysicsUpdateContext : public NonCopyable
28{
29public:
31 explicit PhysicsUpdateContext(TempAllocator &inTempAllocator);
32 ~PhysicsUpdateContext();
33
34 static constexpr int cMaxConcurrency = 32;
35
36 using JobHandleArray = StaticArray<JobHandle, cMaxConcurrency>;
37
38 struct Step;
39
40 struct BodyPairQueue
41 {
42 atomic<uint32> mWriteIdx { 0 };
43 uint8 mPadding1[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
44
45 atomic<uint32> mReadIdx { 0 };
46 uint8 mPadding2[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
47 };
48
50
51 using JobMask = uint32;
52 static_assert(sizeof(JobMask) * 8 >= cMaxConcurrency);
53
55 struct Step
56 {
57 Step() = default;
58 Step(const Step &) { JPH_ASSERT(false); } // vector needs a copy constructor, but we're never going to call it
59
60 PhysicsUpdateContext *mContext;
61
62 bool mIsFirst;
63 bool mIsLast;
64
65 BroadPhase::UpdateState mBroadPhaseUpdateState;
66
67 uint32 mNumActiveBodiesAtStepStart;
68
69 atomic<uint32> mDetermineActiveConstraintReadIdx { 0 };
70 uint8 mPadding1[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
71
72 atomic<uint32> mNumActiveConstraints { 0 };
73 uint8 mPadding2[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
74
75 atomic<uint32> mSetupVelocityConstraintsReadIdx { 0 };
76 uint8 mPadding3[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
77
78 atomic<uint32> mStepListenerReadIdx { 0 };
79 uint8 mPadding4[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
80
81 atomic<uint32> mApplyGravityReadIdx { 0 };
82 uint8 mPadding5[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
83
84 atomic<uint32> mActiveBodyReadIdx { 0 };
85 uint8 mPadding6[JPH_CACHE_LINE_SIZE - sizeof(atomic<uint32>)];
86
87 BodyPairQueues mBodyPairQueues;
88
89 uint32 mMaxBodyPairsPerQueue;
90
91 atomic<JobMask> mActiveFindCollisionJobs;
92
93 atomic<uint> mNumBodyPairs { 0 };
94 atomic<uint> mNumManifolds { 0 };
95
96 atomic<uint32> mSolveVelocityConstraintsNextIsland { 0 };
97 atomic<uint32> mSolvePositionConstraintsNextIsland { 0 };
98
100 struct CCDBody
101 {
102 CCDBody(BodyID inBodyID1, Vec3Arg inDeltaPosition, float inLinearCastThresholdSq, float inMaxPenetration) : mDeltaPosition(inDeltaPosition), mBodyID1(inBodyID1), mLinearCastThresholdSq(inLinearCastThresholdSq), mMaxPenetration(inMaxPenetration) { }
103
104 Vec3 mDeltaPosition;
105 Vec3 mContactNormal;
106 RVec3 mContactPointOn2;
107 BodyID mBodyID1;
108 BodyID mBodyID2;
109 SubShapeID mSubShapeID2;
110 float mFraction = 1.0f;
111 float mFractionPlusSlop = 1.0f;
112 float mLinearCastThresholdSq;
113 float mMaxPenetration;
114 ContactSettings mContactSettings;
115 };
116 atomic<uint32> mIntegrateVelocityReadIdx { 0 };
117 CCDBody * mCCDBodies = nullptr;
118 uint32 mCCDBodiesCapacity = 0;
119 atomic<uint32> mNumCCDBodies = 0;
120 atomic<uint32> mNextCCDBody { 0 };
121 int * mActiveBodyToCCDBody = nullptr;
122 uint32 mNumActiveBodyToCCDBody = 0;
123
124 // Jobs in order of execution (some run in parallel)
125 JobHandle mBroadPhasePrepare;
126 JobHandleArray mStepListeners;
127 JobHandleArray mDetermineActiveConstraints;
128 JobHandleArray mApplyGravity;
129 JobHandleArray mFindCollisions;
130 JobHandle mUpdateBroadphaseFinalize;
131 JobHandleArray mSetupVelocityConstraints;
132 JobHandle mBuildIslandsFromConstraints;
133 JobHandle mFinalizeIslands;
134 JobHandle mBodySetIslandIndex;
135 JobHandleArray mSolveVelocityConstraints;
136 JobHandle mPreIntegrateVelocity;
137 JobHandleArray mIntegrateVelocity;
138 JobHandle mPostIntegrateVelocity;
139 JobHandle mResolveCCDContacts;
140 JobHandleArray mSolvePositionConstraints;
141 JobHandle mContactRemovedCallbacks;
142 JobHandle mSoftBodyPrepare;
143 JobHandleArray mSoftBodyCollide;
144 JobHandleArray mSoftBodySimulate;
145 JobHandle mSoftBodyFinalize;
146 JobHandle mStartNextStep;
147 };
148
150
152 int GetMaxConcurrency() const { const int max_concurrency = PhysicsUpdateContext::cMaxConcurrency; return min(max_concurrency, mJobSystem->GetMaxConcurrency()); }
153
154 PhysicsSystem * mPhysicsSystem;
155 TempAllocator * mTempAllocator;
156 JobSystem * mJobSystem;
157 JobSystem::Barrier * mBarrier;
158
159 float mStepDeltaTime;
160 float mWarmStartImpulseRatio;
161 atomic<uint32> mErrors { 0 };
162
163 Constraint ** mActiveConstraints = nullptr;
164
165 BodyPair * mBodyPairs = nullptr;
166
167 BodyManager * mBodyManager;
168 IslandBuilder * mIslandBuilder;
169
170 Steps mSteps;
171
172 uint mNumSoftBodies;
173 SoftBodyUpdateContext * mSoftBodyUpdateContexts = nullptr;
174 atomic<uint> mSoftBodyToCollide { 0 };
175};
177
std::uint8_t uint8
Definition Core.h:506
#define JPH_CACHE_LINE_SIZE
Definition Core.h:552
unsigned int uint
Definition Core.h:505
#define JPH_NAMESPACE_END
Definition Core.h:428
std::uint32_t uint32
Definition Core.h:508
#define JPH_NAMESPACE_BEGIN
Definition Core.h:422
#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
Definition BodyManager.h:47
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