Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
IslandBuilder.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
9#include <Jolt/Core/Atomics.h>
10
12
13class TempAllocator;
14
15//#define JPH_VALIDATE_ISLAND_BUILDER
16
19{
20public:
23
25 void Init(uint32 inMaxActiveBodies);
26
28 void PrepareContactConstraints(uint32 inMaxContactConstraints, TempAllocator *inTempAllocator);
29
31 void PrepareNonContactConstraints(uint32 inNumConstraints, TempAllocator *inTempAllocator);
32
34 void LinkBodies(uint32 inFirst, uint32 inSecond);
35
37 void LinkConstraint(uint32 inConstraintIndex, uint32 inFirst, uint32 inSecond);
38
40 void LinkContact(uint32 inContactIndex, uint32 inFirst, uint32 inSecond);
41
43 void Finalize(const BodyID *inActiveBodies, uint32 inNumActiveBodies, uint32 inNumContacts, TempAllocator *inTempAllocator);
44
46 uint32 GetNumIslands() const { return mNumIslands; }
47
49 void GetBodiesInIsland(uint32 inIslandIndex, BodyID *&outBodiesBegin, BodyID *&outBodiesEnd) const;
50 bool GetConstraintsInIsland(uint32 inIslandIndex, uint32 *&outConstraintsBegin, uint32 *&outConstraintsEnd) const;
51 bool GetContactsInIsland(uint32 inIslandIndex, uint32 *&outContactsBegin, uint32 *&outContactsEnd) const;
52
54 void SetNumPositionSteps(uint32 inIslandIndex, uint inNumPositionSteps) { JPH_ASSERT(inIslandIndex < mNumIslands); JPH_ASSERT(inNumPositionSteps < 256); mNumPositionSteps[inIslandIndex] = uint8(inNumPositionSteps); }
55 uint GetNumPositionSteps(uint32 inIslandIndex) const { JPH_ASSERT(inIslandIndex < mNumIslands); return mNumPositionSteps[inIslandIndex]; }
56
57#ifdef JPH_TRACK_SIMULATION_STATS
58 struct IslandStats
59 {
60 atomic<uint64> mVelocityConstraintTicks = 0;
61 atomic<uint64> mPositionConstraintTicks = 0;
62 atomic<uint64> mUpdateBoundsTicks = 0;
63 uint8 mNumVelocitySteps = 0;
64 uint8 mNumPositionSteps = 0;
65 bool mIsLargeIsland = false;
66 };
67
69 IslandStats & GetIslandStats(uint32 inIslandIndex) { return mIslandStats[inIslandIndex]; }
70#endif
71
73 void ResetIslands(TempAllocator *inTempAllocator);
74
75private:
77 uint32 GetLowestBodyIndex(uint32 inActiveBodyIndex) const;
78
79#ifdef JPH_VALIDATE_ISLAND_BUILDER
81 void ValidateIslands(uint32 inNumActiveBodies) const;
82#endif
83
84 // Helper functions to build various islands
85 void BuildBodyIslands(const BodyID *inActiveBodies, uint32 inNumActiveBodies, TempAllocator *inTempAllocator);
86 void BuildConstraintIslands(const uint32 *inConstraintToBody, uint32 inNumConstraints, uint32 *&outConstraints, uint32 *&outConstraintsEnd, TempAllocator *inTempAllocator) const;
87
89 void SortIslands(TempAllocator *inTempAllocator);
90
92 struct BodyLink
93 {
95
96 atomic<uint32> mLinkedTo;
97 uint32 mIslandIndex;
98 };
99
100 // Intermediate data
101 BodyLink * mBodyLinks = nullptr;
102 uint32 * mConstraintLinks = nullptr;
103 uint32 * mContactLinks = nullptr;
104
105 // Final data
106 BodyID * mBodyIslands = nullptr;
107 uint32 * mBodyIslandEnds = nullptr;
108
109 uint32 * mConstraintIslands = nullptr;
110 uint32 * mConstraintIslandEnds = nullptr;
111
112 uint32 * mContactIslands = nullptr;
113 uint32 * mContactIslandEnds = nullptr;
114
115 uint32 * mIslandsSorted = nullptr;
116
117 uint8 * mNumPositionSteps = nullptr;
118
119#ifdef JPH_TRACK_SIMULATION_STATS
120 IslandStats * mIslandStats = nullptr;
121#endif
122
123 // Counters
124 uint32 mMaxActiveBodies;
125 uint32 mNumActiveBodies = 0;
126 uint32 mNumConstraints = 0;
127 uint32 mMaxContacts = 0;
128 uint32 mNumContacts = 0;
129 uint32 mNumIslands = 0;
130
131#ifdef JPH_VALIDATE_ISLAND_BUILDER
133 struct LinkValidation
134 {
135 uint32 mFirst;
136 uint32 mSecond;
137 };
138
139 LinkValidation * mLinkValidation = nullptr;
140 atomic<uint32> mNumLinkValidation;
141#endif
142};
143
std::uint8_t uint8
Definition Core.h:493
#define JPH_EXPORT
Definition Core.h:275
unsigned int uint
Definition Core.h:492
#define JPH_NAMESPACE_END
Definition Core.h:419
std::uint32_t uint32
Definition Core.h:495
#define JPH_NAMESPACE_BEGIN
Definition Core.h:413
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition Memory.h:43
ID of a body. This is a way of reasoning about bodies in a multithreaded simulation while avoiding ra...
Definition BodyID.h:13
Keeps track of connected bodies and builds islands for multithreaded velocity/position update.
Definition IslandBuilder.h:19
uint GetNumPositionSteps(uint32 inIslandIndex) const
Definition IslandBuilder.h:55
void SetNumPositionSteps(uint32 inIslandIndex, uint inNumPositionSteps)
The number of position iterations for each island.
Definition IslandBuilder.h:54
uint32 GetNumIslands() const
Get the amount of islands formed.
Definition IslandBuilder.h:46
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition NonCopyable.h:11
Definition TempAllocator.h:16