Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/thirdparty/jolt_physics/Jolt/Physics/Collision/CollideSoftBodyVertexIterator.h
9912 views
1
// Jolt Physics Library (https://github.com/jrouwe/JoltPhysics)
2
// SPDX-FileCopyrightText: 2024 Jorrit Rouwe
3
// SPDX-License-Identifier: MIT
4
5
#pragma once
6
7
#include <Jolt/Physics/SoftBody/SoftBodyVertex.h>
8
#include <Jolt/Core/StridedPtr.h>
9
10
JPH_NAMESPACE_BEGIN
11
12
/// Class that allows iterating over the vertices of a soft body.
13
/// It tracks the largest penetration and allows storing the resulting collision in a different structure than the soft body vertex itself.
14
class CollideSoftBodyVertexIterator
15
{
16
public:
17
/// Default constructor
18
CollideSoftBodyVertexIterator() = default;
19
CollideSoftBodyVertexIterator(const CollideSoftBodyVertexIterator &) = default;
20
21
/// Construct using (strided) pointers
22
CollideSoftBodyVertexIterator(const StridedPtr<const Vec3> &inPosition, const StridedPtr<const float> &inInvMass, const StridedPtr<Plane> &inCollisionPlane, const StridedPtr<float> &inLargestPenetration, const StridedPtr<int> &inCollidingShapeIndex) :
23
mPosition(inPosition),
24
mInvMass(inInvMass),
25
mCollisionPlane(inCollisionPlane),
26
mLargestPenetration(inLargestPenetration),
27
mCollidingShapeIndex(inCollidingShapeIndex)
28
{
29
}
30
31
/// Construct using a soft body vertex
32
explicit CollideSoftBodyVertexIterator(SoftBodyVertex *inVertices) :
33
mPosition(&inVertices->mPosition, sizeof(SoftBodyVertex)),
34
mInvMass(&inVertices->mInvMass, sizeof(SoftBodyVertex)),
35
mCollisionPlane(&inVertices->mCollisionPlane, sizeof(SoftBodyVertex)),
36
mLargestPenetration(&inVertices->mLargestPenetration, sizeof(SoftBodyVertex)),
37
mCollidingShapeIndex(&inVertices->mCollidingShapeIndex, sizeof(SoftBodyVertex))
38
{
39
}
40
41
/// Default assignment
42
CollideSoftBodyVertexIterator & operator = (const CollideSoftBodyVertexIterator &) = default;
43
44
/// Equality operator.
45
/// Note: Only used to determine end iterator, so we only compare position.
46
bool operator != (const CollideSoftBodyVertexIterator &inRHS) const
47
{
48
return mPosition != inRHS.mPosition;
49
}
50
51
/// Next vertex
52
CollideSoftBodyVertexIterator & operator ++ ()
53
{
54
++mPosition;
55
++mInvMass;
56
++mCollisionPlane;
57
++mLargestPenetration;
58
++mCollidingShapeIndex;
59
return *this;
60
}
61
62
/// Add an offset
63
/// Note: Only used to determine end iterator, so we only set position.
64
CollideSoftBodyVertexIterator operator + (int inOffset) const
65
{
66
return CollideSoftBodyVertexIterator(mPosition + inOffset, StridedPtr<const float>(), StridedPtr<Plane>(), StridedPtr<float>(), StridedPtr<int>());
67
}
68
69
/// Get the position of the current vertex
70
Vec3 GetPosition() const
71
{
72
return *mPosition;
73
}
74
75
/// Get the inverse mass of the current vertex
76
float GetInvMass() const
77
{
78
return *mInvMass;
79
}
80
81
/// Update penetration of the current vertex
82
/// @return Returns true if the vertex has the largest penetration so far, this means you need to follow up by calling SetCollision
83
bool UpdatePenetration(float inLargestPenetration) const
84
{
85
float &penetration = *mLargestPenetration;
86
if (penetration >= inLargestPenetration)
87
return false;
88
penetration = inLargestPenetration;
89
return true;
90
}
91
92
/// Update the collision of the current vertex
93
void SetCollision(const Plane &inCollisionPlane, int inCollidingShapeIndex) const
94
{
95
*mCollisionPlane = inCollisionPlane;
96
*mCollidingShapeIndex = inCollidingShapeIndex;
97
}
98
99
private:
100
/// Input data
101
StridedPtr<const Vec3> mPosition;
102
StridedPtr<const float> mInvMass;
103
104
/// Output data
105
StridedPtr<Plane> mCollisionPlane;
106
StridedPtr<float> mLargestPenetration;
107
StridedPtr<int> mCollidingShapeIndex;
108
};
109
110
JPH_NAMESPACE_END
111
112