vOOlkan
An object oriented approach to Vulkan
Foundations.h
Go to the documentation of this file.
1#ifndef VULKAN_FOUNDATIONS
2#define VULKAN_FOUNDATIONS
3
4
5#include <glm/glm.hpp>
6#include <functional>
7
8
9namespace Vulkan::Physics { class Vectorial; class Scalar; class Position; class DeltaSpace; class Speed; class Acceleration; class Force; class Impulse; class Mass; class Time; }
10
11
13public:
14 Vectorial(glm::vec3 vector = { 0.0f, 0.0f, 0.0f }) : vector{ vector } {}
15
16 Vectorial(float x, float y, float z) : vector{ x,y,z } {}
17
18
19
20 float x() const{
21 return vector.x;
22 }
23
24 float y() const {
25 return vector.y;
26 }
27
28 float z() const {
29 return vector.z;
30 }
31
32
33
34 operator glm::vec3() const {
35 return vector;
36 }
37
38
39
40 template<std::derived_from<Vectorial> V>
41 friend V operator+(V v1, V v2) {
42 return V{ v1.vector + v2.vector };
43 }
44
45
46 template<std::derived_from<Vectorial> V>
47 friend V operator-(V v1, V v2) {
48 return V{ v1.vector - v2.vector };
49 }
50
51
52 template<std::derived_from<Vectorial> V>
53 friend V operator-(V v) {
54 return V{ -v.vector };
55 }
56
57
58 template<std::derived_from<Vectorial> V>
59 friend V& operator+=(V& v1, V v2) {
60 v1.vector += v2.vector;
61 return v1;
62 }
63
64
65 template<std::derived_from<Vectorial> V>
66 friend V& operator-=(V& v1, V v2) {
67 v1.vector -= v2.vector;
68 return v1;
69 }
70
71
72 template<std::derived_from<Vectorial> V>
73 friend V operator*(V v, float x) {
74 return V{ v.vector * x };
75 }
76
77
78 template<std::derived_from<Vectorial> V>
79 friend V operator/(V v, float x) {
80 return V{ v.vector / x };
81 }
82
83
84 friend float operator*(Vectorial v1, Vectorial v2) {
85 return glm::dot(v1.vector, v2.vector);
86 }
87
88
89 template<std::derived_from<Vectorial> V>
90 friend auto operator<=>(const V& v1, float v2) {
91 if (glm::length(v1.vector) < v2) {
92 return -1;
93 }
94 else if (glm::length(v1.vector) > v2) {
95 return 1;
96 }
97 else {
98 return 0;
99 }
100 }
101
102
103 template<std::derived_from<Vectorial> V>
104 friend auto operator<=>(const V& v1, const V& v2) {
105 if (glm::length(v1.vector) < glm::length(v2.vector)) {
106 return -1;
107 }
108 else if (glm::length(v1.vector) > glm::length(v2.vector)) {
109 return 1;
110 }
111 else {
112 return 0;
113 }
114 }
115
116
117
118
119protected:
120 glm::vec3 vector;
121};
122
123
125public:
126 Scalar(float value = 0) : value{ value } {}
127
128 template<std::derived_from<Scalar> S>
129 friend S operator+(S s1, S s2) {
130 return S{ s1.value + s2.value };
131 }
132
133 template<std::derived_from<Scalar> S>
134 friend S operator-(S s1, S s2) {
135 return S{ s1.value - s2.value };
136 }
137
138 template<std::derived_from<Scalar> S>
139 friend S& operator+=(S& s1, S s2) {
140 s1.value += s2.value;
141 return s1;
142 }
143
144 template<std::derived_from<Scalar> S>
145 friend S& operator-=(S& s1, S s2) {
146 s1.value -= s2.value;
147 return s1;
148 }
149
150
151 explicit operator float() const {
152 return value;
153 }
154
155
156protected:
157 float value;
158};
159
160
162public:
163 Mass(float mass = 0) : Scalar{ mass }{}
164
165 friend Mass operator*(Mass m1, Mass m2); //not correct but it works for now
166 friend Mass operator/(Mass m1, Mass m2); //not correct but it works for now
167 friend Impulse operator*(Speed speed, Mass mass);
168 friend Speed operator/(Impulse impulse, Mass mass);
169 friend Acceleration operator/(Force force, Mass mass);
170};
171
172
173
174
176public:
177 Time(float time) : Scalar{ time } {}
178
179 friend DeltaSpace operator*(Speed speed, Time time);
180 friend Speed operator*(Acceleration speed, Time time);
181 friend Force operator/(Impulse impulse, Time time);
182};
183
184
185
186
188public:
189 Position(glm::vec3 position = { 0.0f, 0.0f, 0.0f }) : position{ position } {}
190
191 Position(float x, float y, float z) : Position{ glm::vec3{x, y, z} } {}
192
193
194 const float& x() const {
195 return position.x;
196 }
197
198 const float& y() const {
199 return position.y;
200 }
201
202 const float& z() const {
203 return position.z;
204 }
205
206
207 operator glm::vec3() const {
208 return position;
209 }
210
211 friend DeltaSpace operator-(Position p1, Position p2);
212 friend Position operator+(Position origin, DeltaSpace spaceCovered);
213 friend Position& operator+=(Position& origin, DeltaSpace spaceCovered);
214
216 return Position{ -position };
217 }
218
219 friend auto operator==(const Position& p1, const Position& p2) {
220 return p1.position == p2.position;
221 }
222
223private:
224 glm::vec3 position;
225};
226
227
228
229
231public:
232 DeltaSpace(glm::vec3 vector = { 0.0f, 0.0f, 0.0f }) : Vectorial{ vector } {}
233 DeltaSpace(float x, float y, float z) : Vectorial{ x,y,z } {}
234
235 friend Position operator+(Position origin, DeltaSpace spaceCovered);
236 friend Position& operator+=(Position& origin, DeltaSpace spaceCovered);
237};
238
239
240
241
243public:
244 Speed(glm::vec3 vector = { 0.0f, 0.0f, 0.0f }) : Vectorial{ vector } {}
245 Speed(float x, float y, float z) : Vectorial{ x,y,z } {}
246
247 friend DeltaSpace operator*(Speed speed, Time time);
248 friend Impulse operator*(Speed speed, Mass mass);
249};
250
251
252
253
255public:
256 Acceleration(glm::vec3 vector = { 0.0f, 0.0f, 0.0f }) : Vectorial{ vector } {}
257 Acceleration(float x, float y, float z) : Vectorial{ x,y,z } {}
258
259 friend Speed operator*(Acceleration speed, Time time);
260};
261
262
263
264
266public:
267 Force(glm::vec3 vector = { 0.0f, 0.0f, 0.0f }) : Vectorial{ vector } {}
268 Force(float x, float y, float z) : Vectorial{ x,y,z } {}
269
270 friend Acceleration operator/(Force force, Mass mass);
271};
272
273
274
275
277public:
278 Impulse(glm::vec3 vector = { 0.0f, 0.0f, 0.0f }) : Vectorial{ vector } {}
279 Impulse(float x, float y, float z) : Vectorial{ x,y,z } {}
280
281 friend Speed operator/(Impulse impulse, Mass mass);
282 friend Force operator/(Impulse impulse, Time time);
283};
284
285
286
287
288
289//operations
290namespace Vulkan::Physics {
291
293 return Mass{ m1.value * m2.value };
294 }
295
297 return Mass{ m1.value / m2.value };
298 }
299
300
301
303 return DeltaSpace{ p1.position - p2.position };
304 }
305
306
307 Position operator+(Position origin, DeltaSpace spaceCovered) {
308 return Position{ origin.position + spaceCovered.vector };
309 }
310
311
312 Position& operator+=(Position& origin, DeltaSpace spaceCovered) {
313 origin.position += spaceCovered.vector;
314 return origin;
315 }
316
317
318
319
321 return DeltaSpace{ speed.vector * time.value };
322 }
323
324
326 return Impulse{ speed.vector * mass.value };
327 }
328
329
330
331
332 Speed operator*(Acceleration acceleration, Time time) {
333 return Speed{ acceleration.vector * time.value };
334 }
335
336
337
338
340 return Acceleration{ force.vector / mass.value };
341 }
342
343
344
345 Speed operator/(Impulse impulse, Mass mass) {
346 return Speed{ impulse.vector / mass.value };
347 }
348
349
350 Force operator/(Impulse impulse, Time time) {
351 return Force{ impulse.vector / time.value };
352 }
353
354
355
356}
357
358#endif
Definition: Foundations.h:254
Acceleration(float x, float y, float z)
Definition: Foundations.h:257
Acceleration(glm::vec3 vector={ 0.0f, 0.0f, 0.0f })
Definition: Foundations.h:256
friend Speed operator*(Acceleration speed, Time time)
Definition: Foundations.h:332
Definition: Foundations.h:230
DeltaSpace(glm::vec3 vector={ 0.0f, 0.0f, 0.0f })
Definition: Foundations.h:232
DeltaSpace(float x, float y, float z)
Definition: Foundations.h:233
friend Position & operator+=(Position &origin, DeltaSpace spaceCovered)
Definition: Foundations.h:312
friend Position operator+(Position origin, DeltaSpace spaceCovered)
Definition: Foundations.h:307
Definition: Foundations.h:265
Force(float x, float y, float z)
Definition: Foundations.h:268
Force(glm::vec3 vector={ 0.0f, 0.0f, 0.0f })
Definition: Foundations.h:267
friend Acceleration operator/(Force force, Mass mass)
Definition: Foundations.h:339
Definition: Foundations.h:276
Impulse(float x, float y, float z)
Definition: Foundations.h:279
Impulse(glm::vec3 vector={ 0.0f, 0.0f, 0.0f })
Definition: Foundations.h:278
friend Speed operator/(Impulse impulse, Mass mass)
Definition: Foundations.h:345
Definition: Foundations.h:161
friend Mass operator*(Mass m1, Mass m2)
Definition: Foundations.h:292
Mass(float mass=0)
Definition: Foundations.h:163
friend Mass operator/(Mass m1, Mass m2)
Definition: Foundations.h:296
Definition: Foundations.h:187
Position(float x, float y, float z)
Definition: Foundations.h:191
const float & y() const
Definition: Foundations.h:198
friend auto operator==(const Position &p1, const Position &p2)
Definition: Foundations.h:219
friend Position & operator+=(Position &origin, DeltaSpace spaceCovered)
Definition: Foundations.h:312
Position(glm::vec3 position={ 0.0f, 0.0f, 0.0f })
Definition: Foundations.h:189
friend Position operator+(Position origin, DeltaSpace spaceCovered)
Definition: Foundations.h:307
const float & x() const
Definition: Foundations.h:194
Position operator-() const
Definition: Foundations.h:215
const float & z() const
Definition: Foundations.h:202
Definition: Foundations.h:124
friend S & operator+=(S &s1, S s2)
Definition: Foundations.h:139
float value
Definition: Foundations.h:157
friend S & operator-=(S &s1, S s2)
Definition: Foundations.h:145
Scalar(float value=0)
Definition: Foundations.h:126
friend S operator+(S s1, S s2)
Definition: Foundations.h:129
friend S operator-(S s1, S s2)
Definition: Foundations.h:134
Definition: Foundations.h:242
friend DeltaSpace operator*(Speed speed, Time time)
Definition: Foundations.h:320
Speed(float x, float y, float z)
Definition: Foundations.h:245
Speed(glm::vec3 vector={ 0.0f, 0.0f, 0.0f })
Definition: Foundations.h:244
Definition: Foundations.h:175
friend DeltaSpace operator*(Speed speed, Time time)
Definition: Foundations.h:320
friend Force operator/(Impulse impulse, Time time)
Definition: Foundations.h:350
Time(float time)
Definition: Foundations.h:177
Definition: Foundations.h:12
Vectorial(float x, float y, float z)
Definition: Foundations.h:16
friend V operator/(V v, float x)
Definition: Foundations.h:79
float x() const
Definition: Foundations.h:20
float z() const
Definition: Foundations.h:28
friend float operator*(Vectorial v1, Vectorial v2)
Definition: Foundations.h:84
friend V operator-(V v)
Definition: Foundations.h:53
friend V operator+(V v1, V v2)
Definition: Foundations.h:41
float y() const
Definition: Foundations.h:24
friend auto operator<=>(const V &v1, const V &v2)
Definition: Foundations.h:104
friend V & operator+=(V &v1, V v2)
Definition: Foundations.h:59
Vectorial(glm::vec3 vector={ 0.0f, 0.0f, 0.0f })
Definition: Foundations.h:14
friend auto operator<=>(const V &v1, float v2)
Definition: Foundations.h:90
glm::vec3 vector
Definition: Foundations.h:120
friend V operator-(V v1, V v2)
Definition: Foundations.h:47
friend V operator*(V v, float x)
Definition: Foundations.h:73
friend V & operator-=(V &v1, V v2)
Definition: Foundations.h:66
Definition: Cinematicable.h:9
Mass operator*(Mass m1, Mass m2)
Definition: Foundations.h:292
DeltaSpace operator-(Position p1, Position p2)
Definition: Foundations.h:302
Position & operator+=(Position &origin, DeltaSpace spaceCovered)
Definition: Foundations.h:312
Mass operator/(Mass m1, Mass m2)
Definition: Foundations.h:296
Position operator+(Position origin, DeltaSpace spaceCovered)
Definition: Foundations.h:307