Repository navigation
Expand file tree
/
Copy pathCollisionSystem.h
More file actions
63 lines (53 loc) · 1.68 KB
/
Copy pathCollisionSystem.h
File metadata and controls
63 lines (53 loc) · 1.68 KB
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
#pragma once
#include <vector>
#include "../OWEngine/OWEngine.h"
#include "../Actor/ColliderBounds.h"
class OWCollider;
class OWRay;
class OWActor;
class OWENGINE_API OWCollisionSystem
{
public:
OWCollisionSystem(Scene* _scene);
void addCollider(OWCollider* coll, OWActor* a, OWSize componentId);
void addRay(OWCollider* coll, OWActor* a, OWSize componentId);
void deleteRay(OWActor* r);
void sort();
void collide();
private:
class BodyEx
{
public:
std::string id;
BodyEx(const OWCollider* _o)
:o(_o) {}
const OWCollider* o;
glm::vec3 left() const { return o->left(); }
glm::vec3 right() const { return o->right(); }
};
struct BodyPairEx
{
BodyEx b1;
BodyEx b2;
friend auto operator<=>(const BodyPairEx& lhs, const BodyPairEx& rhs)
{
if (lhs.b1.o == rhs.b1.o)
{
if (lhs.b2.o == rhs.b2.o)
return 0;
return lhs.b2.o->componentIndex() < rhs.b2.o->componentIndex() ? -1 : 1;
}
return lhs.b1.o->componentIndex() < rhs.b1.o->componentIndex() ? -1 : 1;
}
};
typedef std::set<BodyPairEx> BodyCollisionsEx;
typedef std::vector<BodyEx> SortedBodiesEx;
typedef std::set<BodyPairEx> BodyCollisionsEx;
glm::uvec3 gPriorityAxis = { 0,1,2 };
SortedBodiesEx bodies;
Scene* mScene = nullptr;
OWColliderBounds mVisualBounds;
void buildSweepAndPrune(OWCollider* o);
void doInsertionSortEx(SortedBodiesEx& edges, unsigned int primAxis);
void collideSweepAndPruneEx(std::vector<BodyEx>& sortedBodies, const glm::uvec3& priAxis, BodyCollisionsEx& collisions);
};