Jolt Physics
A multi core friendly Game Physics Engine
Loading...
Searching...
No Matches
CollisionCollector.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
8
9class Body;
11
14{
15public:
17 static constexpr float InitialEarlyOutFraction = 1.0f + FLT_EPSILON;
18 static constexpr float ShouldEarlyOutFraction = 0.0f;
19};
20
23{
24public:
26 static constexpr float InitialEarlyOutFraction = 1.0f + FLT_EPSILON;
27 static constexpr float ShouldEarlyOutFraction = -FLT_MAX;
28};
29
32{
33public:
35 static constexpr float InitialEarlyOutFraction = FLT_MAX;
36 static constexpr float ShouldEarlyOutFraction = -FLT_MAX;
37};
38
41
43template <class ResultTypeArg, class TraitsType>
45{
46public:
48 using ResultType = ResultTypeArg;
49
51 CollisionCollector() = default;
52
54 template <class ResultTypeArg2>
55 explicit CollisionCollector(const CollisionCollector<ResultTypeArg2, TraitsType> &inRHS) : mEarlyOutFraction(inRHS.GetEarlyOutFraction()), mContext(inRHS.GetContext()) { }
57
59 virtual ~CollisionCollector() = default;
60
62 virtual void Reset() { mEarlyOutFraction = TraitsType::InitialEarlyOutFraction; }
63
67 virtual void OnBody([[maybe_unused]] const Body &inBody) { /* Collects nothing by default */ }
68
70 void SetContext(const TransformedShape *inContext) { mContext = inContext; }
71 const TransformedShape *GetContext() const { return mContext; }
72
74 virtual void SetUserData(uint64 inUserData) { /* Does nothing by default */ }
75
77 virtual void AddHit(const ResultType &inResult) = 0;
78
80 inline void UpdateEarlyOutFraction(float inFraction) { JPH_ASSERT(inFraction <= mEarlyOutFraction); mEarlyOutFraction = inFraction; }
81
83 inline void ResetEarlyOutFraction(float inFraction = TraitsType::InitialEarlyOutFraction) { mEarlyOutFraction = inFraction; }
84
86 inline void ForceEarlyOut() { mEarlyOutFraction = TraitsType::ShouldEarlyOutFraction; }
87
89 inline bool ShouldEarlyOut() const { return mEarlyOutFraction <= TraitsType::ShouldEarlyOutFraction; }
90
92 inline float GetEarlyOutFraction() const { return mEarlyOutFraction; }
93
95 inline float GetPositiveEarlyOutFraction() const { return max(FLT_MIN, mEarlyOutFraction); }
96
97private:
99 float mEarlyOutFraction = TraitsType::InitialEarlyOutFraction;
100
102 const TransformedShape *mContext = nullptr;
103};
104
std::uint64_t uint64
Definition: Core.h:456
#define JPH_NAMESPACE_END
Definition: Core.h:378
#define JPH_NAMESPACE_BEGIN
Definition: Core.h:372
#define JPH_ASSERT(...)
Definition: IssueReporting.h:33
Definition: Body.h:35
Virtual interface that allows collecting multiple collision results.
Definition: CollisionCollector.h:45
void ForceEarlyOut()
Force the collision detection algorithm to terminate as soon as possible. Call this from the AddHit f...
Definition: CollisionCollector.h:86
void ResetEarlyOutFraction(float inFraction=TraitsType::InitialEarlyOutFraction)
Reset the early out fraction to a specific value.
Definition: CollisionCollector.h:83
CollisionCollector()=default
Default constructor.
virtual ~CollisionCollector()=default
Destructor.
bool ShouldEarlyOut() const
When true, the collector will no longer accept any additional hits and the collision detection routin...
Definition: CollisionCollector.h:89
virtual void AddHit(const ResultType &inResult)=0
This function will be called for every hit found, it's up to the application to decide how to store t...
virtual void Reset()
If you want to reuse this collector, call Reset()
Definition: CollisionCollector.h:62
CollisionCollector(const CollisionCollector< ResultTypeArg2, TraitsType > &inRHS)
Constructor to initialize from another collector.
Definition: CollisionCollector.h:55
CollisionCollector(const CollisionCollector< ResultTypeArg, TraitsType > &inRHS)=default
float GetEarlyOutFraction() const
Get the current early out value.
Definition: CollisionCollector.h:92
const TransformedShape * GetContext() const
Definition: CollisionCollector.h:71
virtual void OnBody(const Body &inBody)
Definition: CollisionCollector.h:67
void UpdateEarlyOutFraction(float inFraction)
Update the early out fraction (should be lower than before)
Definition: CollisionCollector.h:80
ResultTypeArg ResultType
Declare ResultType so that derived classes can use it.
Definition: CollisionCollector.h:48
void SetContext(const TransformedShape *inContext)
Set by the collision detection functions to the current TransformedShape that we're colliding against...
Definition: CollisionCollector.h:70
float GetPositiveEarlyOutFraction() const
Get the current early out value but make sure it's bigger than zero, this is used for shape casting a...
Definition: CollisionCollector.h:95
virtual void SetUserData(uint64 inUserData)
This function can be used to set some user data on the collision collector.
Definition: CollisionCollector.h:74
Traits to use for CastRay.
Definition: CollisionCollector.h:14
static constexpr float InitialEarlyOutFraction
For rays the early out fraction is the fraction along the line to order hits.
Definition: CollisionCollector.h:17
static constexpr float ShouldEarlyOutFraction
Closest hit: Fraction is 0.
Definition: CollisionCollector.h:18
Traits to use for CastShape.
Definition: CollisionCollector.h:23
static constexpr float InitialEarlyOutFraction
For rays the early out fraction is the fraction along the line to order hits.
Definition: CollisionCollector.h:26
static constexpr float ShouldEarlyOutFraction
Deepest hit: Penetration is infinite.
Definition: CollisionCollector.h:27
Traits to use for CollideShape.
Definition: CollisionCollector.h:32
static constexpr float InitialEarlyOutFraction
For shape collisions we use -penetration depth to order hits.
Definition: CollisionCollector.h:35
static constexpr float ShouldEarlyOutFraction
Deepest hit: Penetration is infinite.
Definition: CollisionCollector.h:36
Definition: TransformedShape.h:26