Skip to content

Commit e61d7d3

Browse files
authored
Merge pull request #10 from kcbanner/jolt_5.3.1
Upgrade to Jolt 5.3.1, user extension support, and miscellaneous fixes
2 parents 0c60c1a + 2e54368 commit e61d7d3

File tree

274 files changed

+8483
-3401
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

274 files changed

+8483
-3401
lines changed

build.zig

Lines changed: 22 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,12 @@ pub fn build(b: *std.Build) void {
3737
) orelse true,
3838
};
3939

40+
const user_extensions = b.option(
41+
[]const std.Build.LazyPath,
42+
"user_extensions",
43+
"List of user source files to add to the joltc library",
44+
) orelse &.{};
45+
4046
const options_step = b.addOptions();
4147
inline for (std.meta.fields(@TypeOf(options))) |field| {
4248
options_step.addOption(field.type, field.name, @field(options, field.name));
@@ -98,9 +104,9 @@ pub fn build(b: *std.Build) void {
98104
src_dir ++ "/Core/Color.cpp",
99105
src_dir ++ "/Core/Factory.cpp",
100106
src_dir ++ "/Core/IssueReporting.cpp",
107+
src_dir ++ "/Core/JobSystemSingleThreaded.cpp",
101108
src_dir ++ "/Core/JobSystemThreadPool.cpp",
102109
src_dir ++ "/Core/JobSystemWithBarrier.cpp",
103-
src_dir ++ "/Core/JobSystemSingleThreaded.cpp",
104110
src_dir ++ "/Core/LinearCurve.cpp",
105111
src_dir ++ "/Core/Memory.cpp",
106112
src_dir ++ "/Core/Profiler.cpp",
@@ -123,16 +129,11 @@ pub fn build(b: *std.Build) void {
123129
src_dir ++ "/ObjectStream/SerializableObject.cpp",
124130
src_dir ++ "/ObjectStream/TypeDeclarations.cpp",
125131
src_dir ++ "/Physics/Body/Body.cpp",
126-
src_dir ++ "/Physics/Body/BodyAccess.cpp",
127132
src_dir ++ "/Physics/Body/BodyCreationSettings.cpp",
128133
src_dir ++ "/Physics/Body/BodyInterface.cpp",
129134
src_dir ++ "/Physics/Body/BodyManager.cpp",
130135
src_dir ++ "/Physics/Body/MassProperties.cpp",
131136
src_dir ++ "/Physics/Body/MotionProperties.cpp",
132-
src_dir ++ "/Physics/SoftBody/SoftBodyCreationSettings.cpp",
133-
src_dir ++ "/Physics/SoftBody/SoftBodyMotionProperties.cpp",
134-
src_dir ++ "/Physics/SoftBody/SoftBodyShape.cpp",
135-
src_dir ++ "/Physics/SoftBody/SoftBodySharedSettings.cpp",
136137
src_dir ++ "/Physics/Character/Character.cpp",
137138
src_dir ++ "/Physics/Character/CharacterBase.cpp",
138139
src_dir ++ "/Physics/Character/CharacterVirtual.cpp",
@@ -146,6 +147,7 @@ pub fn build(b: *std.Build) void {
146147
src_dir ++ "/Physics/Collision/CollideSphereVsTriangles.cpp",
147148
src_dir ++ "/Physics/Collision/CollisionDispatch.cpp",
148149
src_dir ++ "/Physics/Collision/CollisionGroup.cpp",
150+
src_dir ++ "/Physics/Collision/EstimateCollisionResponse.cpp",
149151
src_dir ++ "/Physics/Collision/GroupFilter.cpp",
150152
src_dir ++ "/Physics/Collision/GroupFilterTable.cpp",
151153
src_dir ++ "/Physics/Collision/ManifoldBetweenTwoFaces.cpp",
@@ -160,16 +162,19 @@ pub fn build(b: *std.Build) void {
160162
src_dir ++ "/Physics/Collision/Shape/ConvexShape.cpp",
161163
src_dir ++ "/Physics/Collision/Shape/CylinderShape.cpp",
162164
src_dir ++ "/Physics/Collision/Shape/DecoratedShape.cpp",
165+
src_dir ++ "/Physics/Collision/Shape/EmptyShape.cpp",
163166
src_dir ++ "/Physics/Collision/Shape/HeightFieldShape.cpp",
164167
src_dir ++ "/Physics/Collision/Shape/MeshShape.cpp",
165168
src_dir ++ "/Physics/Collision/Shape/MutableCompoundShape.cpp",
166169
src_dir ++ "/Physics/Collision/Shape/OffsetCenterOfMassShape.cpp",
170+
src_dir ++ "/Physics/Collision/Shape/PlaneShape.cpp",
167171
src_dir ++ "/Physics/Collision/Shape/RotatedTranslatedShape.cpp",
168172
src_dir ++ "/Physics/Collision/Shape/ScaledShape.cpp",
169173
src_dir ++ "/Physics/Collision/Shape/Shape.cpp",
170174
src_dir ++ "/Physics/Collision/Shape/SphereShape.cpp",
171175
src_dir ++ "/Physics/Collision/Shape/StaticCompoundShape.cpp",
172176
src_dir ++ "/Physics/Collision/Shape/TaperedCapsuleShape.cpp",
177+
src_dir ++ "/Physics/Collision/Shape/TaperedCylinderShape.cpp",
173178
src_dir ++ "/Physics/Collision/Shape/TriangleShape.cpp",
174179
src_dir ++ "/Physics/Collision/TransformedShape.cpp",
175180
src_dir ++ "/Physics/Constraints/ConeConstraint.cpp",
@@ -185,21 +190,26 @@ pub fn build(b: *std.Build) void {
185190
src_dir ++ "/Physics/Constraints/PathConstraintPath.cpp",
186191
src_dir ++ "/Physics/Constraints/PathConstraintPathHermite.cpp",
187192
src_dir ++ "/Physics/Constraints/PointConstraint.cpp",
193+
src_dir ++ "/Physics/Constraints/PulleyConstraint.cpp",
188194
src_dir ++ "/Physics/Constraints/RackAndPinionConstraint.cpp",
189195
src_dir ++ "/Physics/Constraints/SixDOFConstraint.cpp",
190196
src_dir ++ "/Physics/Constraints/SliderConstraint.cpp",
197+
src_dir ++ "/Physics/Constraints/SpringSettings.cpp",
191198
src_dir ++ "/Physics/Constraints/SwingTwistConstraint.cpp",
192199
src_dir ++ "/Physics/Constraints/TwoBodyConstraint.cpp",
193-
src_dir ++ "/Physics/Constraints/PulleyConstraint.cpp",
194-
src_dir ++ "/Physics/Constraints/SpringSettings.cpp",
195200
src_dir ++ "/Physics/DeterminismLog.cpp",
196201
src_dir ++ "/Physics/IslandBuilder.cpp",
197202
src_dir ++ "/Physics/LargeIslandSplitter.cpp",
198203
src_dir ++ "/Physics/PhysicsScene.cpp",
199204
src_dir ++ "/Physics/PhysicsSystem.cpp",
200205
src_dir ++ "/Physics/PhysicsUpdateContext.cpp",
201206
src_dir ++ "/Physics/Ragdoll/Ragdoll.cpp",
207+
src_dir ++ "/Physics/SoftBody/SoftBodyCreationSettings.cpp",
208+
src_dir ++ "/Physics/SoftBody/SoftBodyMotionProperties.cpp",
209+
src_dir ++ "/Physics/SoftBody/SoftBodyShape.cpp",
210+
src_dir ++ "/Physics/SoftBody/SoftBodySharedSettings.cpp",
202211
src_dir ++ "/Physics/StateRecorderImpl.cpp",
212+
src_dir ++ "/Physics/Vehicle/MotorcycleController.cpp",
203213
src_dir ++ "/Physics/Vehicle/TrackedVehicleController.cpp",
204214
src_dir ++ "/Physics/Vehicle/VehicleAntiRollBar.cpp",
205215
src_dir ++ "/Physics/Vehicle/VehicleCollisionTester.cpp",
@@ -211,33 +221,25 @@ pub fn build(b: *std.Build) void {
211221
src_dir ++ "/Physics/Vehicle/VehicleTransmission.cpp",
212222
src_dir ++ "/Physics/Vehicle/Wheel.cpp",
213223
src_dir ++ "/Physics/Vehicle/WheeledVehicleController.cpp",
214-
src_dir ++ "/Physics/Vehicle/MotorcycleController.cpp",
215224
src_dir ++ "/RegisterTypes.cpp",
216225
src_dir ++ "/Renderer/DebugRenderer.cpp",
217-
src_dir ++ "/Renderer/DebugRendererSimple.cpp",
218226
src_dir ++ "/Renderer/DebugRendererPlayback.cpp",
219227
src_dir ++ "/Renderer/DebugRendererRecorder.cpp",
228+
src_dir ++ "/Renderer/DebugRendererSimple.cpp",
220229
src_dir ++ "/Skeleton/SkeletalAnimation.cpp",
221230
src_dir ++ "/Skeleton/Skeleton.cpp",
222231
src_dir ++ "/Skeleton/SkeletonMapper.cpp",
223232
src_dir ++ "/Skeleton/SkeletonPose.cpp",
224-
src_dir ++ "/TriangleGrouper/TriangleGrouperClosestCentroid.cpp",
225-
src_dir ++ "/TriangleGrouper/TriangleGrouperMorton.cpp",
226233
src_dir ++ "/TriangleSplitter/TriangleSplitter.cpp",
227234
src_dir ++ "/TriangleSplitter/TriangleSplitterBinning.cpp",
228-
src_dir ++ "/TriangleSplitter/TriangleSplitterFixedLeafSize.cpp",
229-
src_dir ++ "/TriangleSplitter/TriangleSplitterLongestAxis.cpp",
230235
src_dir ++ "/TriangleSplitter/TriangleSplitterMean.cpp",
231-
src_dir ++ "/TriangleSplitter/TriangleSplitterMorton.cpp",
232236
},
233237
.flags = c_flags,
234238
});
235239

236-
if (target.result.abi != .msvc or optimize != .Debug) {
237-
joltc.addCSourceFiles(.{
238-
.files = &.{
239-
src_dir ++ "/Physics/PhysicsLock.cpp",
240-
},
240+
for (user_extensions) |user_extension| {
241+
joltc.addCSourceFile(.{
242+
.file = user_extension,
241243
.flags = c_flags,
242244
});
243245
}

libs/Jolt/AABBTree/AABBTreeBuilder.cpp

Lines changed: 63 additions & 60 deletions
Original file line numberDiff line numberDiff line change
@@ -8,84 +8,72 @@
88

99
JPH_NAMESPACE_BEGIN
1010

11-
AABBTreeBuilder::Node::Node()
12-
{
13-
mChild[0] = nullptr;
14-
mChild[1] = nullptr;
15-
}
16-
17-
AABBTreeBuilder::Node::~Node()
18-
{
19-
delete mChild[0];
20-
delete mChild[1];
21-
}
22-
23-
uint AABBTreeBuilder::Node::GetMinDepth() const
11+
uint AABBTreeBuilder::Node::GetMinDepth(const Array<Node> &inNodes) const
2412
{
2513
if (HasChildren())
2614
{
27-
uint left = mChild[0]->GetMinDepth();
28-
uint right = mChild[1]->GetMinDepth();
15+
uint left = inNodes[mChild[0]].GetMinDepth(inNodes);
16+
uint right = inNodes[mChild[1]].GetMinDepth(inNodes);
2917
return min(left, right) + 1;
3018
}
3119
else
3220
return 1;
3321
}
3422

35-
uint AABBTreeBuilder::Node::GetMaxDepth() const
23+
uint AABBTreeBuilder::Node::GetMaxDepth(const Array<Node> &inNodes) const
3624
{
3725
if (HasChildren())
3826
{
39-
uint left = mChild[0]->GetMaxDepth();
40-
uint right = mChild[1]->GetMaxDepth();
27+
uint left = inNodes[mChild[0]].GetMaxDepth(inNodes);
28+
uint right = inNodes[mChild[1]].GetMaxDepth(inNodes);
4129
return max(left, right) + 1;
4230
}
4331
else
4432
return 1;
4533
}
4634

47-
uint AABBTreeBuilder::Node::GetNodeCount() const
35+
uint AABBTreeBuilder::Node::GetNodeCount(const Array<Node> &inNodes) const
4836
{
4937
if (HasChildren())
50-
return mChild[0]->GetNodeCount() + mChild[1]->GetNodeCount() + 1;
38+
return inNodes[mChild[0]].GetNodeCount(inNodes) + inNodes[mChild[1]].GetNodeCount(inNodes) + 1;
5139
else
5240
return 1;
5341
}
5442

55-
uint AABBTreeBuilder::Node::GetLeafNodeCount() const
43+
uint AABBTreeBuilder::Node::GetLeafNodeCount(const Array<Node> &inNodes) const
5644
{
5745
if (HasChildren())
58-
return mChild[0]->GetLeafNodeCount() + mChild[1]->GetLeafNodeCount();
46+
return inNodes[mChild[0]].GetLeafNodeCount(inNodes) + inNodes[mChild[1]].GetLeafNodeCount(inNodes);
5947
else
6048
return 1;
6149
}
6250

63-
uint AABBTreeBuilder::Node::GetTriangleCountInTree() const
51+
uint AABBTreeBuilder::Node::GetTriangleCountInTree(const Array<Node> &inNodes) const
6452
{
6553
if (HasChildren())
66-
return mChild[0]->GetTriangleCountInTree() + mChild[1]->GetTriangleCountInTree();
54+
return inNodes[mChild[0]].GetTriangleCountInTree(inNodes) + inNodes[mChild[1]].GetTriangleCountInTree(inNodes);
6755
else
6856
return GetTriangleCount();
6957
}
7058

71-
void AABBTreeBuilder::Node::GetTriangleCountPerNode(float &outAverage, uint &outMin, uint &outMax) const
59+
void AABBTreeBuilder::Node::GetTriangleCountPerNode(const Array<Node> &inNodes, float &outAverage, uint &outMin, uint &outMax) const
7260
{
7361
outMin = INT_MAX;
7462
outMax = 0;
7563
outAverage = 0;
7664
uint avg_divisor = 0;
77-
GetTriangleCountPerNodeInternal(outAverage, avg_divisor, outMin, outMax);
65+
GetTriangleCountPerNodeInternal(inNodes, outAverage, avg_divisor, outMin, outMax);
7866
if (avg_divisor > 0)
7967
outAverage /= avg_divisor;
8068
}
8169

82-
float AABBTreeBuilder::Node::CalculateSAHCost(float inCostTraversal, float inCostLeaf) const
70+
float AABBTreeBuilder::Node::CalculateSAHCost(const Array<Node> &inNodes, float inCostTraversal, float inCostLeaf) const
8371
{
8472
float surface_area = mBounds.GetSurfaceArea();
85-
return surface_area > 0.0f? CalculateSAHCostInternal(inCostTraversal / surface_area, inCostLeaf / surface_area) : 0.0f;
73+
return surface_area > 0.0f? CalculateSAHCostInternal(inNodes, inCostTraversal / surface_area, inCostLeaf / surface_area) : 0.0f;
8674
}
8775

88-
void AABBTreeBuilder::Node::GetNChildren(uint inN, Array<const Node *> &outChildren) const
76+
void AABBTreeBuilder::Node::GetNChildren(const Array<Node> &inNodes, uint inN, Array<const Node*> &outChildren) const
8977
{
9078
JPH_ASSERT(outChildren.empty());
9179

@@ -94,8 +82,8 @@ void AABBTreeBuilder::Node::GetNChildren(uint inN, Array<const Node *> &outChild
9482
return;
9583

9684
// Start with the children of this node
97-
outChildren.push_back(mChild[0]);
98-
outChildren.push_back(mChild[1]);
85+
outChildren.push_back(&inNodes[mChild[0]]);
86+
outChildren.push_back(&inNodes[mChild[1]]);
9987

10088
size_t next = 0;
10189
bool all_triangles = true;
@@ -116,8 +104,8 @@ void AABBTreeBuilder::Node::GetNChildren(uint inN, Array<const Node *> &outChild
116104
if (to_expand->HasChildren())
117105
{
118106
outChildren.erase(outChildren.begin() + next);
119-
outChildren.push_back(to_expand->mChild[0]);
120-
outChildren.push_back(to_expand->mChild[1]);
107+
outChildren.push_back(&inNodes[to_expand->mChild[0]]);
108+
outChildren.push_back(&inNodes[to_expand->mChild[1]]);
121109
all_triangles = false;
122110
}
123111
else
@@ -127,22 +115,22 @@ void AABBTreeBuilder::Node::GetNChildren(uint inN, Array<const Node *> &outChild
127115
}
128116
}
129117

130-
float AABBTreeBuilder::Node::CalculateSAHCostInternal(float inCostTraversalDivSurfaceArea, float inCostLeafDivSurfaceArea) const
118+
float AABBTreeBuilder::Node::CalculateSAHCostInternal(const Array<Node> &inNodes, float inCostTraversalDivSurfaceArea, float inCostLeafDivSurfaceArea) const
131119
{
132120
if (HasChildren())
133121
return inCostTraversalDivSurfaceArea * mBounds.GetSurfaceArea()
134-
+ mChild[0]->CalculateSAHCostInternal(inCostTraversalDivSurfaceArea, inCostLeafDivSurfaceArea)
135-
+ mChild[1]->CalculateSAHCostInternal(inCostTraversalDivSurfaceArea, inCostLeafDivSurfaceArea);
122+
+ inNodes[mChild[0]].CalculateSAHCostInternal(inNodes, inCostTraversalDivSurfaceArea, inCostLeafDivSurfaceArea)
123+
+ inNodes[mChild[1]].CalculateSAHCostInternal(inNodes, inCostTraversalDivSurfaceArea, inCostLeafDivSurfaceArea);
136124
else
137125
return inCostLeafDivSurfaceArea * mBounds.GetSurfaceArea() * GetTriangleCount();
138126
}
139127

140-
void AABBTreeBuilder::Node::GetTriangleCountPerNodeInternal(float &outAverage, uint &outAverageDivisor, uint &outMin, uint &outMax) const
128+
void AABBTreeBuilder::Node::GetTriangleCountPerNodeInternal(const Array<Node> &inNodes, float &outAverage, uint &outAverageDivisor, uint &outMin, uint &outMax) const
141129
{
142130
if (HasChildren())
143131
{
144-
mChild[0]->GetTriangleCountPerNodeInternal(outAverage, outAverageDivisor, outMin, outMax);
145-
mChild[1]->GetTriangleCountPerNodeInternal(outAverage, outAverageDivisor, outMin, outMax);
132+
inNodes[mChild[0]].GetTriangleCountPerNodeInternal(inNodes, outAverage, outAverageDivisor, outMin, outMax);
133+
inNodes[mChild[1]].GetTriangleCountPerNodeInternal(inNodes, outAverage, outAverageDivisor, outMin, outMax);
146134
}
147135
else
148136
{
@@ -162,28 +150,36 @@ AABBTreeBuilder::AABBTreeBuilder(TriangleSplitter &inSplitter, uint inMaxTriangl
162150
AABBTreeBuilder::Node *AABBTreeBuilder::Build(AABBTreeBuilderStats &outStats)
163151
{
164152
TriangleSplitter::Range initial = mTriangleSplitter.GetInitialRange();
165-
Node *root = BuildInternal(initial);
166153

154+
// Worst case for number of nodes: 1 leaf node per triangle. At each level above, the number of nodes is half that of the level below.
155+
// This means that at most we'll be allocating 2x the number of triangles in nodes.
156+
mNodes.reserve(2 * initial.Count());
157+
mTriangles.reserve(initial.Count());
158+
159+
// Build the tree
160+
Node &root = mNodes[BuildInternal(initial)];
161+
162+
// Collect stats
167163
float avg_triangles_per_leaf;
168164
uint min_triangles_per_leaf, max_triangles_per_leaf;
169-
root->GetTriangleCountPerNode(avg_triangles_per_leaf, min_triangles_per_leaf, max_triangles_per_leaf);
165+
root.GetTriangleCountPerNode(mNodes, avg_triangles_per_leaf, min_triangles_per_leaf, max_triangles_per_leaf);
170166

171167
mTriangleSplitter.GetStats(outStats.mSplitterStats);
172168

173-
outStats.mSAHCost = root->CalculateSAHCost(1.0f, 1.0f);
174-
outStats.mMinDepth = root->GetMinDepth();
175-
outStats.mMaxDepth = root->GetMaxDepth();
176-
outStats.mNodeCount = root->GetNodeCount();
177-
outStats.mLeafNodeCount = root->GetLeafNodeCount();
169+
outStats.mSAHCost = root.CalculateSAHCost(mNodes, 1.0f, 1.0f);
170+
outStats.mMinDepth = root.GetMinDepth(mNodes);
171+
outStats.mMaxDepth = root.GetMaxDepth(mNodes);
172+
outStats.mNodeCount = root.GetNodeCount(mNodes);
173+
outStats.mLeafNodeCount = root.GetLeafNodeCount(mNodes);
178174
outStats.mMaxTrianglesPerLeaf = mMaxTrianglesPerLeaf;
179175
outStats.mTreeMinTrianglesPerLeaf = min_triangles_per_leaf;
180176
outStats.mTreeMaxTrianglesPerLeaf = max_triangles_per_leaf;
181177
outStats.mTreeAvgTrianglesPerLeaf = avg_triangles_per_leaf;
182178

183-
return root;
179+
return &root;
184180
}
185181

186-
AABBTreeBuilder::Node *AABBTreeBuilder::BuildInternal(const TriangleSplitter::Range &inTriangles)
182+
uint AABBTreeBuilder::BuildInternal(const TriangleSplitter::Range &inTriangles)
187183
{
188184
// Check if there are too many triangles left
189185
if (inTriangles.Count() > mMaxTrianglesPerLeaf)
@@ -214,26 +210,33 @@ AABBTreeBuilder::Node *AABBTreeBuilder::BuildInternal(const TriangleSplitter::Ra
214210
}
215211

216212
// Recursively build
217-
Node *node = new Node();
218-
node->mChild[0] = BuildInternal(left);
219-
node->mChild[1] = BuildInternal(right);
220-
node->mBounds = node->mChild[0]->mBounds;
221-
node->mBounds.Encapsulate(node->mChild[1]->mBounds);
222-
return node;
213+
const uint node_index = (uint)mNodes.size();
214+
mNodes.push_back(Node());
215+
uint left_index = BuildInternal(left);
216+
uint right_index = BuildInternal(right);
217+
Node &node = mNodes[node_index];
218+
node.mChild[0] = left_index;
219+
node.mChild[1] = right_index;
220+
node.mBounds = mNodes[node.mChild[0]].mBounds;
221+
node.mBounds.Encapsulate(mNodes[node.mChild[1]].mBounds);
222+
return node_index;
223223
}
224224

225225
// Create leaf node
226-
Node *node = new Node();
227-
node->mTriangles.reserve(inTriangles.Count());
226+
const uint node_index = (uint)mNodes.size();
227+
mNodes.push_back(Node());
228+
Node &node = mNodes.back();
229+
node.mTrianglesBegin = (uint)mTriangles.size();
230+
node.mNumTriangles = inTriangles.mEnd - inTriangles.mBegin;
231+
const VertexList &v = mTriangleSplitter.GetVertices();
228232
for (uint i = inTriangles.mBegin; i < inTriangles.mEnd; ++i)
229233
{
230234
const IndexedTriangle &t = mTriangleSplitter.GetTriangle(i);
231-
const VertexList &v = mTriangleSplitter.GetVertices();
232-
node->mTriangles.push_back(t);
233-
node->mBounds.Encapsulate(v, t);
235+
mTriangles.push_back(t);
236+
node.mBounds.Encapsulate(v, t);
234237
}
235238

236-
return node;
239+
return node_index;
237240
}
238241

239242
JPH_NAMESPACE_END

0 commit comments

Comments
 (0)