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 ResetIslands(TempAllocator *inTempAllocator);
55
56private:
58 uint32 GetLowestBodyIndex(uint32 inActiveBodyIndex) const;
59
60#ifdef JPH_VALIDATE_ISLAND_BUILDER
62 void ValidateIslands(uint32 inNumActiveBodies) const;
63#endif
64
65 // Helper functions to build various islands
66 void BuildBodyIslands(const BodyID *inActiveBodies, uint32 inNumActiveBodies, TempAllocator *inTempAllocator);
67 void BuildConstraintIslands(const uint32 *inConstraintToBody, uint32 inNumConstraints, uint32 *&outConstraints, uint32 *&outConstraintsEnd, TempAllocator *inTempAllocator) const;
68
70 void SortIslands(TempAllocator *inTempAllocator);
71
73 struct BodyLink
74 {
76
77 atomic<uint32> mLinkedTo;
78 uint32 mIslandIndex;
79 };
80
81 // Intermediate data
82 BodyLink * mBodyLinks = nullptr;
83 uint32 * mConstraintLinks = nullptr;
84 uint32 * mContactLinks = nullptr;
85
86 // Final data
87 BodyID * mBodyIslands = nullptr;
88 uint32 * mBodyIslandEnds = nullptr;
89
90 uint32 * mConstraintIslands = nullptr;
91 uint32 * mConstraintIslandEnds = nullptr;
92
93 uint32 * mContactIslands = nullptr;
94 uint32 * mContactIslandEnds = nullptr;
95
96 uint32 * mIslandsSorted = nullptr;
97
98 // Counters
99 uint32 mMaxActiveBodies;
100 uint32 mNumActiveBodies = 0;
101 uint32 mNumConstraints = 0;
102 uint32 mMaxContacts = 0;
103 uint32 mNumContacts = 0;
104 uint32 mNumIslands = 0;
105
106#ifdef JPH_VALIDATE_ISLAND_BUILDER
108 struct LinkValidation
109 {
110 uint32 mFirst;
111 uint32 mSecond;
112 };
113
114 LinkValidation * mLinkValidation = nullptr;
115 atomic<uint32> mNumLinkValidation;
116#endif
117};
118
#define JPH_NAMESPACE_END
Definition: Core.h:354
std::uint32_t uint32
Definition: Core.h:429
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:348
#define JPH_OVERRIDE_NEW_DELETE
Macro to override the new and delete functions.
Definition: Memory.h:29
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
void Init(uint32 inMaxActiveBodies)
Initialize the island builder with the maximum amount of bodies that could be active.
Definition: IslandBuilder.cpp:32
void LinkConstraint(uint32 inConstraintIndex, uint32 inFirst, uint32 inSecond)
Link a constraint to a body by their index in the BodyManager::mActiveBodies.
Definition: IslandBuilder.cpp:159
void LinkContact(uint32 inContactIndex, uint32 inFirst, uint32 inSecond)
Link a contact to a body by their index in the BodyManager::mActiveBodies.
Definition: IslandBuilder.cpp:169
bool GetContactsInIsland(uint32 inIslandIndex, uint32 *&outContactsBegin, uint32 *&outContactsEnd) const
Definition: IslandBuilder.cpp:413
void ResetIslands(TempAllocator *inTempAllocator)
After you're done calling the three functions above, call this function to free associated data.
Definition: IslandBuilder.cpp:431
uint32 GetNumIslands() const
Get the amount of islands formed.
Definition: IslandBuilder.h:46
~IslandBuilder()
Destructor.
Definition: IslandBuilder.cpp:17
void PrepareContactConstraints(uint32 inMaxContactConstraints, TempAllocator *inTempAllocator)
Prepare for simulation step by allocating space for the contact constraints.
Definition: IslandBuilder.cpp:43
bool GetConstraintsInIsland(uint32 inIslandIndex, uint32 *&outConstraintsBegin, uint32 *&outConstraintsEnd) const
Definition: IslandBuilder.cpp:395
void PrepareNonContactConstraints(uint32 inNumConstraints, TempAllocator *inTempAllocator)
Prepare for simulation step by allocating space for the non-contact constraints.
Definition: IslandBuilder.cpp:67
void GetBodiesInIsland(uint32 inIslandIndex, BodyID *&outBodiesBegin, BodyID *&outBodiesEnd) const
Get iterator for a particular island, return false if there are no constraints.
Definition: IslandBuilder.cpp:387
void LinkBodies(uint32 inFirst, uint32 inSecond)
Link two bodies by their index in the BodyManager::mActiveBodies list to form islands.
Definition: IslandBuilder.cpp:98
void Finalize(const BodyID *inActiveBodies, uint32 inNumActiveBodies, uint32 inNumContacts, TempAllocator *inTempAllocator)
Finalize the islands after all bodies have been Link()-ed.
Definition: IslandBuilder.cpp:375
Class that makes another class non-copyable. Usage: Inherit from NonCopyable.
Definition: NonCopyable.h:11
Definition: TempAllocator.h:16