-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCollisionModel.h
More file actions
199 lines (178 loc) · 4.61 KB
/
CollisionModel.h
File metadata and controls
199 lines (178 loc) · 4.61 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
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
//
// Created by Ben Dickson on 5/9/17.
//
#ifndef LIBRARY_COLLISIONMODEL_H
#define LIBRARY_COLLISIONMODEL_H
#include <cstdlib>
#include <list>
#include <map>
#include "Point.h"
class PhysicalModel;
using namespace std;
class CollisionModel
{
public:
enum Shape{BOX,CIRCLE};
private:
double origin_x = 0.0f,origin_y = 0.0f,box_bottom=-1.0f,box_top=1.0f,box_left=-1.0f,box_right=1.0f,circle_radius=1.0f;
int angle = 0;
Shape model;
PhysicalModel* parentElement;
enum ConType{INT,DOUBLE,STRING,ENUM};
static map<string,ConType> conImport;
// import values
bool importDouble(string var , double value);
bool importInt(string var, int value);
bool importString(string var, string value);
public:
inline Shape getModel() const;
inline Point getGlobalPos() const;
inline Point* getRectPoints() const;
inline PhysicalModel* getParentElement() const;
double getRadius() const
{
return circle_radius;
}
static inline bool pointInRectangle(Point co, Point a , Point b , Point c , Point d)
{
return false;
};
static inline bool intersectsCircle(Point co, double cr, Point la , Point lb)
{
return false;
};
static inline bool intersectsRectangle(Point ra , Point rb , Point rc , Point rd, Point la, Point lb)
{
return false;
};
inline bool collidesCC(const CollisionModel &cm) const;
inline bool collidesCB(const CollisionModel &cm) const;
inline bool collidesBB(const CollisionModel &cm) const;
inline bool parseConstructorPair(pair<string,string> p)
{
map<string,ConType>::iterator it = conImport.find(p.first);
if(it!=conImport.end())
{
switch((*it).second)
{
case DOUBLE:
return importDouble(p.first,stod(p.second));
case INT:
return importInt(p.first,stoi(p.second));
case STRING:
return importString(p.first,p.second);
}
}
return false;
}
CollisionModel(Shape s, PhysicalModel* p)
{
model = s;
parentElement = p;
}
/**
* Constructor for a circle
* @param ox
* @param oy
* @param cr
* @param p
*/
CollisionModel(double ox, double oy, double cr, PhysicalModel* p)
{
model = CIRCLE;
parentElement = p;
origin_x = ox;
origin_y = oy;
circle_radius = cr;
}
/**
* Constructor for a box
* @param ox
* @param oy
* @param bt
* @param bb
* @param bl
* @param br
* @param p
*/
CollisionModel(double ox, double oy, double oa, double bt, double bb, double bl, double br, PhysicalModel* p)
{
model = BOX;
parentElement = p;
origin_x = ox;
origin_y = oy;
angle = oa;
box_top = bt;
box_bottom = bb;
box_left = bl;
box_right = br;
}
};
/**
* Overriding equality operator to mean two objects collide or not
* @param a
* @param b
* @return
*/
inline bool operator==(const CollisionModel &a, const CollisionModel &b)
{
if(a.getModel()==CollisionModel::Shape::CIRCLE)
{
if(b.getModel()==CollisionModel::Shape::CIRCLE)
{
return a.collidesCC(b);
}
else if(b.getModel()==CollisionModel::Shape::BOX)
{
return a.collidesCB(b);
}
}
else if(a.getModel()==CollisionModel::Shape::BOX)
{
if(b.getModel()==CollisionModel::Shape::CIRCLE)
{
return b.collidesCB(a);
}
else if(b.getModel()==CollisionModel::Shape::BOX)
{
return a.collidesBB(b);
}
}
// Note - should never get here, but if it does, fail to no collision
return false;
}
/**
* Overriding inequality operator to mean two objects don't collide
* @param a
* @param b
* @return
*/
inline bool operator!=(const CollisionModel &a, const CollisionModel &b)
{
// invert equality operator
return !(a == b);
}
class CollisionPipeline
{
private:
list<CollisionModel*> pipeline;
int size=0;
list<CollisionModel*>::iterator it;
public:
inline void addModel(CollisionModel* model);
inline CollisionModel* nextModel();
inline CollisionModel* popModel();
inline void resetIterator()
{
it = pipeline.begin();
}
};
inline CollisionModel& operator>>(CollisionModel& cm , CollisionPipeline& cp)
{
cp.addModel(&cm);
}
inline CollisionModel& operator<<(CollisionModel& cm , CollisionPipeline& cp)
{
return *cp.nextModel();
}
#endif //LIBRARY_COLLISIONMODEL_H