aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/api/Rigidbody.h
diff options
context:
space:
mode:
authorjaroWMR <jarorutjes07@gmail.com>2024-11-07 18:39:56 +0100
committerjaroWMR <jarorutjes07@gmail.com>2024-11-07 18:39:56 +0100
commite2f3ace383b43cc3f140629e577b97c6f69c9856 (patch)
tree690eb146e11a4bc134840ec82bfbea4805daba61 /src/crepe/api/Rigidbody.h
parent156906dca0b84d3fd3c889e1bcda12308b8fe793 (diff)
added physics system
Diffstat (limited to 'src/crepe/api/Rigidbody.h')
-rw-r--r--src/crepe/api/Rigidbody.h102
1 files changed, 86 insertions, 16 deletions
diff --git a/src/crepe/api/Rigidbody.h b/src/crepe/api/Rigidbody.h
index 02ced2e..0c069d8 100644
--- a/src/crepe/api/Rigidbody.h
+++ b/src/crepe/api/Rigidbody.h
@@ -4,26 +4,96 @@
#include "../Component.h"
-namespace crepe {
+#include "Vector2.h"
-// FIXME: can't this enum be defined inside the class declaration of Rigidbody?
-enum class BodyType {
- //! Does not move (e.g. walls, ground ...)
- STATIC,
- //! Moves and responds to forces (e.g. player, physics objects ...)
- DYNAMIC,
- //! Moves but does not respond to forces (e.g. moving platforms ...)
- KINEMATIC,
-};
+namespace crepe {
+/**
+ * \brief Rigidbody class
+ *
+ * This class is used by the physics sytem and collision system.
+ * It configures how to system interact with the gameobject for movement and collisions.
+ */
class Rigidbody : public Component {
public:
- Rigidbody(game_object_id_t id, int mass, int gravity_scale, BodyType body_type);
- int32_t velocity_x;
- int32_t velocity_y;
- int mass;
- int gravity_scale;
- BodyType body_type;
+ /**
+ * \brief BodyType enum
+ *
+ * This enum provides three bodytypes the physics sytem and collision system use.
+ */
+ enum class BodyType {
+ //! Does not move (e.g. walls, ground ...)
+ STATIC,
+ //! Moves and responds to forces (e.g. player, physics objects ...)
+ DYNAMIC,
+ //! Moves but does not respond to forces (e.g. moving platforms ...)
+ KINEMATIC,
+ };
+ /**
+ * \brief PhysicsConstraints to constrain movement
+ *
+ * This struct configures the movement constraint for this object.
+ * If a constraint is enabled the systems will not move the object.
+ */
+ struct PhysicsConstraints {
+ //! X constraint
+ bool x = 0;
+ //! Y constraint
+ bool y = 0;
+ //! rotation constraint
+ bool rotation = 0;
+ };
+public:
+ /**
+ * This struct holds the data for the Rigidbody.
+ */
+ struct RigidbodyData{
+ //! objects mass
+ double mass = 0.0;
+ //! gravtiy scale
+ double gravity_scale = 0.0;
+ //! Changes if physics apply
+ BodyType body_type = BodyType::DYNAMIC;
+ //! linear velocity of object
+ Vector2 linear_velocity;
+ //! maximum linear velocity of object
+ Vector2 max_linear_velocity;
+ //! linear damping of object
+ Vector2 linear_damping;
+ //! angular velocity of object
+ double angular_velocity = 0.0;
+ //! max angular velocity of object
+ double max_angular_velocity = 0.0;
+ //! angular damping of object
+ double angular_damping = 0.0;
+ //! movements constraints of object
+ PhysicsConstraints constraints;
+ //! if gravity applies
+ bool use_gravity = true;
+ //! if object bounces
+ bool bounce = false;
+ };
+public:
+ /**
+ * \param game_object_id id of the gameobject the rigibody is added to.
+ * \param data struct to configure the rigidbody.
+ */
+ Rigidbody(uint32_t game_object_id,const RigidbodyData& data);
+ //! struct to hold data of rigidbody
+ RigidbodyData data;
+public:
+ /**
+ * \brief add a linear force to the Rigidbody.
+ *
+ * \param force Vector2 that is added to the linear force.
+ */
+ void add_force_linear(const Vector2 & force);
+ /**
+ * \brief add a angular force to the Rigidbody.
+ *
+ * \param force Vector2 that is added to the angular force.
+ */
+ void add_force_angular(double force);
};
} // namespace crepe