vOOlkan
An object oriented approach to Vulkan
Hitbox.h
Go to the documentation of this file.
1#ifndef VULKAN_HITBOX
2#define VULKAN_HITBOX
3
4#include <functional>
5
6#include "Cinematicable.h"
7#include "Segment.h"
8
9
11 Force emptyField(const Position&, const Cinematicable&);
12}
13
14namespace Vulkan::Physics {
15
19 class Hitbox : public Cinematicable {
20 public:
21 Hitbox(Position position = {0.0f, 0.0f, 0.0f}, float scaleFactor = 1.0f, Mass mass = 1.0f, Speed initialSpeed = {0.0f, 0.0f, 0.0f}, Acceleration initialAcceleration = {0.0f, 0.0f, 0.0f}, Force internalForce = {0.0f, 0.0f, 0.0f}, Field emittedField = Field{ {0.0f, 0.0f, 0.0f}, FieldFunctions::emptyField }) :
22 Cinematicable{ position, { 0.0f, 0.0f, 0.0f }, mass, initialSpeed, initialAcceleration, internalForce, 0.0f, emittedField }, scaleFactor{ scaleFactor }, onCollisionAction{ [](Hitbox&) {} }
23 {}
24
25 virtual float getScaleFactor() const {
26 std::scoped_lock lock{ mutex };
27 return scaleFactor;
28 }
29
30 virtual void setScaleFactor(float scaleFactor) {
31 std::scoped_lock lock{ mutex };
32 this->scaleFactor = scaleFactor;
33 }
34
35 virtual void onCollision(Hitbox& collidingObject) {
36 onCollisionAction(collidingObject);
37 }
38
39 virtual void setCollisionAction(const std::function<void(Hitbox&)>& action) {
40 onCollisionAction = action;
41 }
42
43 protected:
45 std::function<void(Hitbox&)> onCollisionAction;
46
47 };
48
49
50
54 class CircleHitbox : public Hitbox {
55 public:
56
57 CircleHitbox(float radius, Position position = { 0.0f, 0.0f, 0.0f }, float scaleFactor = 1.0f, Mass mass = std::numeric_limits<float>::max()/10.0f, Speed initialSpeed = {0.0f, 0.0f, 0.0f}, Acceleration initialAcceleration = {0.0f, 0.0f, 0.0f}, Force internalForce = {0.0f, 0.0f, 0.0f}, Field emittedField = Field{{0.0f, 0.0f, 0.0f}, FieldFunctions::emptyField}) :
58 Hitbox{ position, scaleFactor, mass, initialSpeed, initialAcceleration, internalForce, emittedField }
59 {
60 setRadius(radius);
61 }
62
63
64 float getRadius() const {
65 return radius;
66 }
67
68 void setRadius(float radius) {
69 this->radius = radius * this->scaleFactor;
70 }
71
72 virtual void setScaleFactor(float scaleFactor) override {
73 this->scaleFactor = scaleFactor;
74 setRadius(radius);
75 }
76
77 private:
78 float radius;
79
80 };
81
82
83
84 class FrameHitbox : public Hitbox {
85 public:
86
87 //FIXTHIS std::numeric_limits<float>::max() / 10.0f this is an hack to deal with masses up to 10.0f
88 template<std::same_as<Position>... P> requires (sizeof...(P) >= 2)
89 FrameHitbox(Position position, float scaleFactor, P... frameVertices) : Hitbox{ position, scaleFactor, std::numeric_limits<float>::max() / 10.0f} {
90 (vertices.push_back(frameVertices), ...);
91 }
92
93
94 template<std::same_as<Position>... P> requires (sizeof...(P) >= 2)
95 FrameHitbox(Position position, float scaleFactor, Mass mass, P... frameVertices) : Hitbox{ position, scaleFactor, mass } {
96 (vertices.push_back(frameVertices), ...);
97 }
98
99
100 const Segment& operator[](int i) const {
101 auto v1 = Moveable::getRotation() * glm::vec3(vertices[i]);
102 auto v2 = Moveable::getRotation() * glm::vec3(vertices[i + 1]);
103 return Segment{ v1 + (getPosition() - Position{}), v2 + (getPosition() - Position{})}; //returns the i-th segment in the "real" reference system
104 }
105
106
108 return vertices.size() - 1;
109 }
110
111
112 private:
113 std::vector<Position> vertices; //these vertices are considered in a reference system with origin in the center of this hitbox
114 };
115
116}
117
118
119#endif
A Cinematicable object is a Movable object which obeys to physics laws.
Definition: Cinematicable.h:21
Mass mass
Definition: Cinematicable.h:124
Cinematicable(Position position={ 0.0f, 0.0f, 0.0f }, glm::vec3 rotationEuler={ 0.0f, 0.0f, 0.0f }, Mass mass=1.0f, Speed initialSpeed={ 0.0f, 0.0f, 0.0f }, Acceleration initialAcceleration={ 0.0f, 0.0f, 0.0f }, Force internalForce={ 0.0f, 0.0f, 0.0f }, float angularSpeed=0.0f, Field emittedField=Field{ {0.0f, 0.0f, 0.0f}, FieldFunctions::emptyField })
Definition: Cinematicable.h:24
Force internalForce
Definition: Cinematicable.h:127
Field emittedField
Definition: Cinematicable.h:129
A CircleHitbox is the Hitbox for circular-like objects. It is idendified by its center and radius.
Definition: Hitbox.h:54
void setRadius(float radius)
Definition: Hitbox.h:68
float getRadius() const
Definition: Hitbox.h:64
virtual void setScaleFactor(float scaleFactor) override
Definition: Hitbox.h:72
CircleHitbox(float radius, Position position={ 0.0f, 0.0f, 0.0f }, float scaleFactor=1.0f, Mass mass=std::numeric_limits< float >::max()/10.0f, Speed initialSpeed={0.0f, 0.0f, 0.0f}, Acceleration initialAcceleration={0.0f, 0.0f, 0.0f}, Force internalForce={0.0f, 0.0f, 0.0f}, Field emittedField=Field{{0.0f, 0.0f, 0.0f}, FieldFunctions::emptyField})
Definition: Hitbox.h:57
Definition: Hitbox.h:84
FrameHitbox(Position position, float scaleFactor, Mass mass, P... frameVertices)
Definition: Hitbox.h:95
const Segment & operator[](int i) const
Definition: Hitbox.h:100
int getNumberOfSegments() const
Definition: Hitbox.h:107
FrameHitbox(Position position, float scaleFactor, P... frameVertices)
Definition: Hitbox.h:89
A Hitbox is a Cinematicable object which can directly interact with other objects upon collision.
Definition: Hitbox.h:19
virtual float getScaleFactor() const
Definition: Hitbox.h:25
float scaleFactor
Definition: Hitbox.h:44
virtual void onCollision(Hitbox &collidingObject)
Definition: Hitbox.h:35
virtual void setCollisionAction(const std::function< void(Hitbox &)> &action)
Definition: Hitbox.h:39
virtual void setScaleFactor(float scaleFactor)
Definition: Hitbox.h:30
std::function< void(Hitbox &)> onCollisionAction
Definition: Hitbox.h:45
Hitbox(Position position={0.0f, 0.0f, 0.0f}, float scaleFactor=1.0f, Mass mass=1.0f, Speed initialSpeed={0.0f, 0.0f, 0.0f}, Acceleration initialAcceleration={0.0f, 0.0f, 0.0f}, Force internalForce={0.0f, 0.0f, 0.0f}, Field emittedField=Field{ {0.0f, 0.0f, 0.0f}, FieldFunctions::emptyField })
Definition: Hitbox.h:21
Definition: Foundations.h:161
virtual const glm::quat & getRotation() const
Definition: Moveable.h:43
virtual const Position & getPosition() const
Definition: Moveable.h:28
std::mutex mutex
Definition: Moveable.h:74
Definition: Foundations.h:187
Definition: Segment.h:10
Definition: Foundations.h:242
Definition: Cinematicable.h:9
Force emptyField(const Position &, const Cinematicable &)
Definition: FieldFunctions.h:10
Definition: Cinematicable.h:9