Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Body/BodyLockInterface.h
9912 views
1
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2
// SPDX-FileCopyrightText: 2021 Jorrit Rouwe
3
// SPDX-License-Identifier: MIT
4
5
6
#pragma once
7
8
#include <Jolt/Physics/Body/Body.h>
9
#include <Jolt/Physics/Body/BodyManager.h>
10
#include <Jolt/Physics/PhysicsLock.h>
11
#include <Jolt/Core/Mutex.h>
12
13
JPH_NAMESPACE_BEGIN
14
15
/// Base class interface for locking a body. Usually you will use BodyLockRead / BodyLockWrite / BodyLockMultiRead / BodyLockMultiWrite instead.
16
class BodyLockInterface : public NonCopyable
17
{
18
public:
19
/// Redefine MutexMask
20
using MutexMask = BodyManager::MutexMask;
21
22
/// Constructor
23
explicit BodyLockInterface(BodyManager &inBodyManager) : mBodyManager(inBodyManager) { }
24
virtual ~BodyLockInterface() = default;
25
26
///@name Locking functions
27
///@{
28
virtual SharedMutex * LockRead(const BodyID &inBodyID) const = 0;
29
virtual void UnlockRead(SharedMutex *inMutex) const = 0;
30
virtual SharedMutex * LockWrite(const BodyID &inBodyID) const = 0;
31
virtual void UnlockWrite(SharedMutex *inMutex) const = 0;
32
///@}
33
34
/// Get the mask needed to lock all bodies
35
inline MutexMask GetAllBodiesMutexMask() const
36
{
37
return mBodyManager.GetAllBodiesMutexMask();
38
}
39
40
///@name Batch locking functions
41
///@{
42
virtual MutexMask GetMutexMask(const BodyID *inBodies, int inNumber) const = 0;
43
virtual void LockRead(MutexMask inMutexMask) const = 0;
44
virtual void UnlockRead(MutexMask inMutexMask) const = 0;
45
virtual void LockWrite(MutexMask inMutexMask) const = 0;
46
virtual void UnlockWrite(MutexMask inMutexMask) const = 0;
47
///@}
48
49
/// Convert body ID to body
50
inline Body * TryGetBody(const BodyID &inBodyID) const { return mBodyManager.TryGetBody(inBodyID); }
51
52
protected:
53
BodyManager & mBodyManager;
54
};
55
56
/// Implementation that performs no locking (assumes the lock has already been taken)
57
class BodyLockInterfaceNoLock final : public BodyLockInterface
58
{
59
public:
60
using BodyLockInterface::BodyLockInterface;
61
62
///@name Locking functions
63
virtual SharedMutex * LockRead([[maybe_unused]] const BodyID &inBodyID) const override { return nullptr; }
64
virtual void UnlockRead([[maybe_unused]] SharedMutex *inMutex) const override { /* Nothing to do */ }
65
virtual SharedMutex * LockWrite([[maybe_unused]] const BodyID &inBodyID) const override { return nullptr; }
66
virtual void UnlockWrite([[maybe_unused]] SharedMutex *inMutex) const override { /* Nothing to do */ }
67
68
///@name Batch locking functions
69
virtual MutexMask GetMutexMask([[maybe_unused]] const BodyID *inBodies, [[maybe_unused]] int inNumber) const override { return 0; }
70
virtual void LockRead([[maybe_unused]] MutexMask inMutexMask) const override { /* Nothing to do */ }
71
virtual void UnlockRead([[maybe_unused]] MutexMask inMutexMask) const override { /* Nothing to do */ }
72
virtual void LockWrite([[maybe_unused]] MutexMask inMutexMask) const override { /* Nothing to do */ }
73
virtual void UnlockWrite([[maybe_unused]] MutexMask inMutexMask) const override { /* Nothing to do */ }
74
};
75
76
/// Implementation that uses the body manager to lock the correct mutex for a body
77
class BodyLockInterfaceLocking final : public BodyLockInterface
78
{
79
public:
80
using BodyLockInterface::BodyLockInterface;
81
82
///@name Locking functions
83
virtual SharedMutex * LockRead(const BodyID &inBodyID) const override
84
{
85
SharedMutex &mutex = mBodyManager.GetMutexForBody(inBodyID);
86
PhysicsLock::sLockShared(mutex JPH_IF_ENABLE_ASSERTS(, &mBodyManager, EPhysicsLockTypes::PerBody));
87
return &mutex;
88
}
89
90
virtual void UnlockRead(SharedMutex *inMutex) const override
91
{
92
PhysicsLock::sUnlockShared(*inMutex JPH_IF_ENABLE_ASSERTS(, &mBodyManager, EPhysicsLockTypes::PerBody));
93
}
94
95
virtual SharedMutex * LockWrite(const BodyID &inBodyID) const override
96
{
97
SharedMutex &mutex = mBodyManager.GetMutexForBody(inBodyID);
98
PhysicsLock::sLock(mutex JPH_IF_ENABLE_ASSERTS(, &mBodyManager, EPhysicsLockTypes::PerBody));
99
return &mutex;
100
}
101
102
virtual void UnlockWrite(SharedMutex *inMutex) const override
103
{
104
PhysicsLock::sUnlock(*inMutex JPH_IF_ENABLE_ASSERTS(, &mBodyManager, EPhysicsLockTypes::PerBody));
105
}
106
107
///@name Batch locking functions
108
virtual MutexMask GetMutexMask(const BodyID *inBodies, int inNumber) const override
109
{
110
return mBodyManager.GetMutexMask(inBodies, inNumber);
111
}
112
113
virtual void LockRead(MutexMask inMutexMask) const override
114
{
115
mBodyManager.LockRead(inMutexMask);
116
}
117
118
virtual void UnlockRead(MutexMask inMutexMask) const override
119
{
120
mBodyManager.UnlockRead(inMutexMask);
121
}
122
123
virtual void LockWrite(MutexMask inMutexMask) const override
124
{
125
mBodyManager.LockWrite(inMutexMask);
126
}
127
128
virtual void UnlockWrite(MutexMask inMutexMask) const override
129
{
130
mBodyManager.UnlockWrite(inMutexMask);
131
}
132
};
133
134
JPH_NAMESPACE_END
135
136