Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Body/BodyAccess.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
#pragma once
6
7
#ifdef JPH_ENABLE_ASSERTS
8
9
JPH_NAMESPACE_BEGIN
10
11
class JPH_EXPORT BodyAccess
12
{
13
public:
14
/// Access rules, used to detect race conditions during simulation
15
enum class EAccess : uint8
16
{
17
None = 0,
18
Read = 1,
19
ReadWrite = 3,
20
};
21
22
/// Grant a scope specific access rights on the current thread
23
class Grant
24
{
25
public:
26
inline Grant(EAccess inVelocity, EAccess inPosition)
27
{
28
EAccess &velocity = sVelocityAccess();
29
EAccess &position = sPositionAccess();
30
31
JPH_ASSERT(velocity == EAccess::ReadWrite);
32
JPH_ASSERT(position == EAccess::ReadWrite);
33
34
velocity = inVelocity;
35
position = inPosition;
36
}
37
38
inline ~Grant()
39
{
40
sVelocityAccess() = EAccess::ReadWrite;
41
sPositionAccess() = EAccess::ReadWrite;
42
}
43
};
44
45
/// Check if we have permission
46
static inline bool sCheckRights(EAccess inRights, EAccess inDesiredRights)
47
{
48
return (uint8(inRights) & uint8(inDesiredRights)) == uint8(inDesiredRights);
49
}
50
51
/// Access to read/write velocities
52
static inline EAccess & sVelocityAccess()
53
{
54
static thread_local EAccess sAccess = BodyAccess::EAccess::ReadWrite;
55
return sAccess;
56
}
57
58
/// Access to read/write positions
59
static inline EAccess & sPositionAccess()
60
{
61
static thread_local EAccess sAccess = BodyAccess::EAccess::ReadWrite;
62
return sAccess;
63
}
64
};
65
66
JPH_NAMESPACE_END
67
68
#endif // JPH_ENABLE_ASSERTS
69
70