1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
#pragma once
#if ENABLE_2D_PHYSICS || DOXYGEN
#include "Runtime/Interfaces/IPhysics2D.h"
#include "Runtime/Math/Vector2.h"
#include "Runtime/Math/Quaternion.h"
#include "Runtime/Scripting/Backend/ScriptingTypes.h"
#include "Runtime/Utilities/dynamic_array.h"
#include "Runtime/Utilities/LinkedList.h"
class Rigidbody2D;
class Collider2D;
class b2World;
class b2Body;
class Ray;
struct Physics2DStats;
#define PHYSICS_2D_RAYCAST_DISTANCE (1e+5f)
#define PHYSICS_2D_LARGE_RANGE_CLAMP (1e+6f)
#define PHYSICS_2D_SMALL_RANGE_CLAMP (0.0001f)
// --------------------------------------------------------------------------
struct Rigidbody2DInterpolationInfo : public ListElement
{
Vector3f position;
Quaternionf rotation;
Rigidbody2D* body;
int disabled;
};
// --------------------------------------------------------------------------
struct RaycastHit2D
{
Vector2f point;
Vector2f normal;
float fraction;
Collider2D* collider;
};
// --------------------------------------------------------------------------
class Physics2DManager : public IPhysics2D
{
private:
typedef List<Rigidbody2DInterpolationInfo> InterpolatedBodiesList;
typedef InterpolatedBodiesList::iterator InterpolatedBodiesIterator;
public:
Physics2DManager();
// ~Physics2DManager() // declared-by-macro
// IPhysics2D interface
virtual void FixedUpdate ();
virtual void DynamicUpdate ();
virtual void ResetInterpolations ();
// 2D line-casts.
int Linecast (const Vector2f& pointA, const Vector2f& pointB, const int layerMask, const float minDepth, const float maxDepth, RaycastHit2D* outHits, const int outHitsSize);
int LinecastAll (const Vector2f& pointA, const Vector2f& pointB, const int layerMask, const float minDepth, const float maxDepth, dynamic_array<RaycastHit2D>* outHits);
// 2D ray-casts.
int Raycast (const Vector2f& origin, const Vector2f& direction, const float distance, const int layerMask, const float minDepth, const float maxDepth, RaycastHit2D* outHits, const int outHitsSize);
int RaycastAll (const Vector2f& origin, const Vector2f& direction, const float distance, const int layerMask, const float minDepth, const float maxDepth, dynamic_array<RaycastHit2D>* outHits);
// 3D ray-intersections.
int GetRayIntersection(const Vector3f& origin, const Vector3f& direction, const float distance, const int layerMask, RaycastHit2D* outHits, const int outHitsSize);
int GetRayIntersectionAll(const Vector3f& origin, const Vector3f& direction, const float distance, const int layerMask, dynamic_array<RaycastHit2D>* outHits);
// 2D geometry overlaps.
int OverlapPoint (const Vector2f& point, const int layerMask, const float minDepth, const float maxDepth, Collider2D** outHits, const int outHitsSize);
int OverlapPointAll (const Vector2f& point, const int layerMask, const float minDepth, const float maxDepth, dynamic_array<Collider2D*>* outHits);
int OverlapCircle (const Vector2f& point, const float radius, const int layerMask, const float minDepth, const float maxDepth, Collider2D** outHits, const int outHitsSize);
int OverlapCircleAll (const Vector2f& point, const float radius, const int layerMask, const float minDepth, const float maxDepth, dynamic_array<Collider2D*>* outHits);
int OverlapArea (const Vector2f& pointA, const Vector2f& pointB, const int layerMask, const float minDepth, const float maxDepth, Collider2D** outHits, const int outHitsSize);
int OverlapAreaAll (const Vector2f& pointA, const Vector2f& pointB, const int layerMask, const float minDepth, const float maxDepth, dynamic_array<Collider2D*>* outHits);
void InvalidateColliderCollisions (Collider2D* collider);
void DestroyColliderCollisions (Collider2D* collider);
inline bool IsTransformMessageEnabled() const { return m_RigidbodyTransformMessageEnabled; }
inline List<Rigidbody2DInterpolationInfo>& GetInterpolatedBodies() { return m_InterpolatedBodies; }
#if ENABLE_PROFILER
virtual void GetProfilerStats (Physics2DStats& stats);
#endif
private:
void SetTransformMessageEnabled (const bool enable);
private:
std::vector<SInt32> m_AllCollider2DTypes;
bool m_RigidbodyTransformMessageEnabled;
InterpolatedBodiesList m_InterpolatedBodies;
};
// --------------------------------------------------------------------------
void InitializePhysics2DManager ();
void CleanupPhysics2DManager ();
b2World* GetPhysics2DWorld ();
b2Body* GetPhysicsGroundBody ();
Physics2DManager& GetPhysics2DManager ();
#endif
|