Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
CollisionCollectorImpl.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
11
13template <class CollectorType>
14class AllHitCollisionCollector : public CollectorType
15{
16public:
18 using ResultType = typename CollectorType::ResultType;
19
20 // See: CollectorType::Reset
21 virtual void Reset() override
22 {
23 CollectorType::Reset();
24
25 mHits.clear();
26 }
27
28 // See: CollectorType::AddHit
29 virtual void AddHit(const ResultType &inResult) override
30 {
31 mHits.push_back(inResult);
32 }
33
35 void Sort()
36 {
37 QuickSort(mHits.begin(), mHits.end(), [](const ResultType &inLHS, const ResultType &inRHS) { return inLHS.GetEarlyOutFraction() < inRHS.GetEarlyOutFraction(); });
38 }
39
41 inline bool HadHit() const
42 {
43 return !mHits.empty();
44 }
45
47};
48
50template <class CollectorType>
51class ClosestHitCollisionCollector : public CollectorType
52{
53public:
55 using ResultType = typename CollectorType::ResultType;
56
57 // See: CollectorType::Reset
58 virtual void Reset() override
59 {
60 CollectorType::Reset();
61
62 mHadHit = false;
63 }
64
65 // See: CollectorType::AddHit
66 virtual void AddHit(const ResultType &inResult) override
67 {
68 float early_out = inResult.GetEarlyOutFraction();
69 if (!mHadHit || early_out < mHit.GetEarlyOutFraction())
70 {
71 // Update early out fraction
72 CollectorType::UpdateEarlyOutFraction(early_out);
73
74 // Store hit
75 mHit = inResult;
76 mHadHit = true;
77 }
78 }
79
81 inline bool HadHit() const
82 {
83 return mHadHit;
84 }
85
87
88private:
89 bool mHadHit = false;
90};
91
93template <class CollectorType>
94class ClosestHitPerBodyCollisionCollector : public CollectorType
95{
96public:
98 using ResultType = typename CollectorType::ResultType;
99
100 // See: CollectorType::Reset
101 virtual void Reset() override
102 {
103 CollectorType::Reset();
104
105 mHits.clear();
106 mHadHit = false;
107 }
108
109 // See: CollectorType::OnBody
110 virtual void OnBody(const Body &inBody) override
111 {
112 // Store the early out fraction so we can restore it after we've collected all hits for this body
113 mPreviousEarlyOutFraction = CollectorType::GetEarlyOutFraction();
114 }
115
116 // See: CollectorType::AddHit
117 virtual void AddHit(const ResultType &inResult) override
118 {
119 float early_out = inResult.GetEarlyOutFraction();
120 if (!mHadHit || early_out < CollectorType::GetEarlyOutFraction())
121 {
122 // Update early out fraction to avoid spending work on collecting further hits for this body
123 CollectorType::UpdateEarlyOutFraction(early_out);
124
125 if (!mHadHit)
126 {
127 // First time we have a hit we append it to the array
128 mHits.push_back(inResult);
129 mHadHit = true;
130 }
131 else
132 {
133 // Closer hits will override the previous one
134 mHits.back() = inResult;
135 }
136 }
137 }
138
139 // See: CollectorType::OnBodyEnd
140 virtual void OnBodyEnd() override
141 {
142 if (mHadHit)
143 {
144 // Reset the early out fraction to the configured value so that we will continue
145 // to collect hits at any distance for other bodies
146 JPH_ASSERT(mPreviousEarlyOutFraction != -FLT_MAX); // Check that we got a call to OnBody
147 CollectorType::ResetEarlyOutFraction(mPreviousEarlyOutFraction);
148 mHadHit = false;
149 }
150
151 // For asserting purposes we reset the stored early out fraction so we can detect that OnBody was called
152 JPH_IF_ENABLE_ASSERTS(mPreviousEarlyOutFraction = -FLT_MAX;)
153 }
154
156 void Sort()
157 {
158 QuickSort(mHits.begin(), mHits.end(), [](const ResultType &inLHS, const ResultType &inRHS) { return inLHS.GetEarlyOutFraction() < inRHS.GetEarlyOutFraction(); });
159 }
160
162 inline bool HadHit() const
163 {
164 return !mHits.empty();
165 }
166
168
169private:
170 // Store early out fraction that was initially configured for the collector
171 float mPreviousEarlyOutFraction = -FLT_MAX;
172
173 // Flag to indicate if we have a hit for the current body
174 bool mHadHit = false;
175};
176
178template <class CollectorType>
179class AnyHitCollisionCollector : public CollectorType
180{
181public:
183 using ResultType = typename CollectorType::ResultType;
184
185 // See: CollectorType::Reset
186 virtual void Reset() override
187 {
188 CollectorType::Reset();
189
190 mHadHit = false;
191 }
192
193 // See: CollectorType::AddHit
194 virtual void AddHit(const ResultType &inResult) override
195 {
196 // Test that the collector is not collecting more hits after forcing an early out
197 JPH_ASSERT(!mHadHit);
198
199 // Abort any further testing
200 CollectorType::ForceEarlyOut();
201
202 // Store hit
203 mHit = inResult;
204 mHadHit = true;
205 }
206
208 inline bool HadHit() const
209 {
210 return mHadHit;
211 }
212
214
215private:
216 bool mHadHit = false;
217};
218
#define JPH_NAMESPACE_END
Definition Core.h:418
#define JPH_NAMESPACE_BEGIN
Definition Core.h:412
#define JPH_IF_ENABLE_ASSERTS(...)
Definition IssueReporting.h:35
#define JPH_ASSERT(...)
Definition IssueReporting.h:33
void QuickSort(Iterator inBegin, Iterator inEnd, Compare inCompare)
Implementation of the quick sort algorithm. The STL version implementation is not consistent across p...
Definition QuickSort.h:53
Simple implementation that collects all hits and optionally sorts them on distance.
Definition CollisionCollectorImpl.h:15
void Sort()
Order hits on closest first.
Definition CollisionCollectorImpl.h:35
bool HadHit() const
Check if any hits were collected.
Definition CollisionCollectorImpl.h:41
typename CollectorType::ResultType ResultType
Redeclare ResultType.
Definition CollisionCollectorImpl.h:18
Array< ResultType > mHits
Definition CollisionCollectorImpl.h:46
virtual void AddHit(const ResultType &inResult) override
Definition CollisionCollectorImpl.h:29
virtual void Reset() override
Definition CollisionCollectorImpl.h:21
Simple implementation that collects any hit.
Definition CollisionCollectorImpl.h:180
virtual void Reset() override
Definition CollisionCollectorImpl.h:186
virtual void AddHit(const ResultType &inResult) override
Definition CollisionCollectorImpl.h:194
typename CollectorType::ResultType ResultType
Redeclare ResultType.
Definition CollisionCollectorImpl.h:183
bool HadHit() const
Check if this collector has had a hit.
Definition CollisionCollectorImpl.h:208
ResultType mHit
Definition CollisionCollectorImpl.h:213
Definition Array.h:36
bool empty() const
Returns true if there are no elements in the array.
Definition Array.h:314
const T & back() const
Last element in the array.
Definition Array.h:494
const_iterator begin() const
Iterators.
Definition Array.h:414
void clear()
Destruct all elements and set length to zero.
Definition Array.h:145
void push_back(const T &inValue)
Add element to the back of the array.
Definition Array.h:277
const_iterator end() const
Definition Array.h:419
Definition Body.h:39
Simple implementation that collects the closest / deepest hit.
Definition CollisionCollectorImpl.h:52
virtual void Reset() override
Definition CollisionCollectorImpl.h:58
virtual void AddHit(const ResultType &inResult) override
Definition CollisionCollectorImpl.h:66
ResultType mHit
Definition CollisionCollectorImpl.h:86
bool HadHit() const
Check if this collector has had a hit.
Definition CollisionCollectorImpl.h:81
typename CollectorType::ResultType ResultType
Redeclare ResultType.
Definition CollisionCollectorImpl.h:55
Implementation that collects the closest / deepest hit for each body and optionally sorts them on dis...
Definition CollisionCollectorImpl.h:95
virtual void Reset() override
Definition CollisionCollectorImpl.h:101
virtual void OnBodyEnd() override
Definition CollisionCollectorImpl.h:140
void Sort()
Order hits on closest first.
Definition CollisionCollectorImpl.h:156
virtual void OnBody(const Body &inBody) override
Definition CollisionCollectorImpl.h:110
bool HadHit() const
Check if any hits were collected.
Definition CollisionCollectorImpl.h:162
virtual void AddHit(const ResultType &inResult) override
Definition CollisionCollectorImpl.h:117
Array< ResultType > mHits
Definition CollisionCollectorImpl.h:167
typename CollectorType::ResultType ResultType
Redeclare ResultType.
Definition CollisionCollectorImpl.h:98