aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/api
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/api')
-rw-r--r--src/crepe/api/BoxCollider.cpp2
-rw-r--r--src/crepe/api/BoxCollider.h10
-rw-r--r--src/crepe/api/Rigidbody.h128
3 files changed, 116 insertions, 24 deletions
diff --git a/src/crepe/api/BoxCollider.cpp b/src/crepe/api/BoxCollider.cpp
index 1069e90..f94ced7 100644
--- a/src/crepe/api/BoxCollider.cpp
+++ b/src/crepe/api/BoxCollider.cpp
@@ -4,4 +4,4 @@
using namespace crepe;
-BoxCollider::BoxCollider(game_object_id_t game_object_id,const vec2& offset, float width, float height) : Collider(game_object_id,offset), width(width), height(height) {}
+BoxCollider::BoxCollider(game_object_id_t game_object_id,const vec2& offset, const vec2& dimensions) : Collider(game_object_id,offset), dimensions(dimensions) {}
diff --git a/src/crepe/api/BoxCollider.h b/src/crepe/api/BoxCollider.h
index c83d54a..1f5f1c1 100644
--- a/src/crepe/api/BoxCollider.h
+++ b/src/crepe/api/BoxCollider.h
@@ -2,6 +2,7 @@
#include "Vector2.h"
#include "../Collider.h"
+#include "types.h"
namespace crepe {
@@ -12,13 +13,10 @@ namespace crepe {
*/
class BoxCollider : public Collider {
public:
- BoxCollider(game_object_id_t game_object_id,const vec2& offset, float width, float height);
+ BoxCollider(game_object_id_t game_object_id,const vec2& offset, const vec2& dimensions);
- //! Width of box collider
- float width;
-
- //! Height of box collider
- float height;
+ //! Width and height of the box collider
+ vec2 dimensions;
};
} // namespace crepe
diff --git a/src/crepe/api/Rigidbody.h b/src/crepe/api/Rigidbody.h
index 63b1b51..9cdf3f5 100644
--- a/src/crepe/api/Rigidbody.h
+++ b/src/crepe/api/Rigidbody.h
@@ -36,11 +36,11 @@ public:
* the systems will not move the object.
*/
struct PhysicsConstraints {
- //! X constraint
+ //! Prevent movement along X axis
bool x = false;
- //! Y constraint
+ //! Prevent movement along Y axis
bool y = false;
- //! rotation constraint
+ //! Prevent rotation
bool rotation = false;
};
@@ -53,27 +53,112 @@ public:
struct Data {
//! objects mass
float mass = 0.0;
- //! gravtiy scale
+ /**
+ * \brief Gravity scale factor.
+ *
+ * The `gravity_scale` controls how much gravity affects the object. It is a multiplier applied to the default
+ * gravity force, allowing for fine-grained control over how the object responds to gravity.
+ *
+ * - A value of `0.0` means that gravity has **no effect** on the object (i.e., the object is completely immune to gravity).
+ * - A value of `1.0` means that gravity is applied at its **normal intensity** (the default behavior).
+ * - A value greater than `1.0` means the object is affected by gravity more strongly than normal.
+ * - A value less than `1.0` (but greater than `0.0`) reduces the effect of gravity on the object.
+ *
+ * This is useful in cases where you need objects to behave differently under gravity, such as lighter objects (like feathers),
+ * objects that float in water, or heavier objects that fall faster.
+ */
float gravity_scale = 0;
- //! Changes if physics apply
+ /**
+ * \brief Defines the type of the physics body, which determines how the physics system interacts with the object.
+ *
+ * - **Static**: The object does not move and is not affected by forces. It is used for immovable objects like walls or terrain. Does not have collision detection.
+ * - **Dynamic**: The object is fully affected by physics forces, including gravity, collisions, and other physical interactions. It can move and be moved by forces.
+ * - **Kinematic**: The object does not move and is not affected by forces. It is typically controlled by external factors (e.g., animations or user input), and collision detection is handled without affecting its velocity.
+ *
+ * The `body_type` defines the behavior of the object in the physics system.
+ *
+ * \default BodyType::DYNAMIC
+ */
BodyType body_type = BodyType::DYNAMIC;
- //! linear velocity of object
+
+ /**
+ * \name Linear (positional) motion
+ *
+ * These variables define the linear motion (movement along the position) of an object.
+ * The linear velocity is applied to the object's position in each update of the PhysicsSystem.
+ * The motion is affected by the object's linear velocity, its maximum velocity, and a coefficient
+ * that can scale the velocity over time.
+ *
+ * \{
+ */
+ //! Linear velocity of the object (speed and direction).
vec2 linear_velocity;
- //! maximum linear velocity of object
+ //! Maximum linear velocity of the object. This limits the object's speed.
vec2 max_linear_velocity = {INFINITY ,INFINITY};
- //! linear damping of object
- vec2 linear_velocity_factor;
- //! angular velocity of object
+ //! Linear velocity coefficient. This scales the object's velocity for adjustment or damping.
+ vec2 linear_velocity_coefficient = {1,1};
+ //! \}
+
+ /**
+ * \name Angular (rotational) motion
+ *
+ * These variables define the angular motion (rotation) of an object.
+ * The angular velocity determines how quickly the object rotates, while the maximum angular velocity
+ * sets a limit on the rotation speed. The angular velocity coefficient applies damping or scaling
+ * to the angular velocity, which can be used to simulate friction or other effects that slow down rotation.
+ *
+ * \{
+ */
+ //! Angular velocity of the object, representing the rate of rotation (in radians per second).
float angular_velocity = 1;
- //! max angular velocity of object
+ //! Maximum angular velocity of the object. This limits the maximum rate of rotation.
float max_angular_velocity = INFINITY;
- //! angular damping of object
- float angular_velocity_factor = 1;
- //! movements constraints of object
+ //! Angular velocity coefficient. This scales the object's angular velocity, typically used for damping.
+ float angular_velocity_coefficient = 1;
+ //! \}
+
+ /**
+ * \brief Movement constraints for an object.
+ *
+ * The `PhysicsConstraints` struct defines the constraints that restrict an object's movement
+ * in certain directions or prevent rotation. These constraints effect only the physics system
+ * to prevent the object from moving or rotating in specified ways.
+ *
+ * - **X Constraint**: If enabled, the object cannot move along the X-axis.
+ * - **Y Constraint**: If enabled, the object cannot move along the Y-axis.
+ * - **Rotation Constraint**: If enabled, the object cannot rotate.
+ *
+ * These constraints allow you to restrict movement for specific scenarios (e.g., a platform that shouldn't move
+ * or a character that should only move horizontally).
+ */
PhysicsConstraints constraints;
- //! bounce factor of material. 0.0 <= means all velocity is lost, 1.0 means it gets the same momentum but the mirrored direction. 0.5 is half of the velocity is saved.
- float elastisity = 0.0;
- //! offset of all colliders relative to transform position
+
+ /**
+ * \brief Elasticity factor of the material (bounce factor).
+ *
+ * The `elasticity_coefficient` controls how much of the object's velocity is retained after a collision.
+ * It represents the material's ability to bounce or recover velocity upon impact. The coefficient is a value
+ * between 0.0 and 1.0, where:
+ *
+ * - **0.0** means no velocity is retained after the collision (all velocity is lost, and the object does not bounce).
+ * - **1.0** means the object retains its full velocity but in the opposite direction (perfect elastic bounce).
+ * - **0.5** means the object retains half of its velocity, resulting in a bounce with reduced speed.
+ *
+ * This factor can be used to simulate different materials, such as rubber (high elasticity) or concrete (low elasticity).
+ */
+ float elastisity_coefficient = 0.0;
+
+ /**
+ * \brief Offset of all colliders relative to the object's transform position.
+ *
+ * The `offset` defines a positional shift applied to all colliders associated with the object, relative to the object's
+ * transform position. This allows for the colliders to be placed at a different position than the object's actual
+ * position, without modifying the object's transform itself.
+ *
+ * - The `offset` is typically used to adjust the collider's position in cases where all colluders should be moved.
+ * - For example, if a character has a animation where all colliders should be moved this offset can be used to
+ * achieve this.
+ */
vec2 offset;
};
@@ -99,6 +184,15 @@ public:
* \param force Vector2 that is added to the angular force.
*/
void add_force_angular(float force);
+
+protected:
+ /**
+ * Ensures there is at most one Rigidbody component per entity.
+ * \return Always returns 1, indicating this constraint.
+ */
+ virtual int get_instances_max() const { return 1; }
+ //! ComponentManager instantiates all components
+ friend class ComponentManager;
};
} // namespace crepe