Sparkle 0.0.1
Loading...
Searching...
No Matches
spk_rigid_body_2d.hpp
1#pragma once
2
3#include "structure/engine/2d/spk_collision_mesh_2d.hpp"
4#include "structure/engine/2d/spk_component_2d.hpp"
5#include "structure/engine/2d/spk_mesh_2d.hpp"
6
7#include <functional>
8#include <set>
9#include <utility>
10
11namespace spk
12{
13 class Entity;
14
19 class RigidBody2D : public Component2D
20 {
21 public:
26 enum class TriggerMode
27 {
28 Trigger,
29 Blocking
30 };
31
33 using RegistryEntry = std::pair<spk::Entity *, spk::RigidBody2D *>;
34
35 private:
36 static std::set<RegistryEntry> _rigidBodies;
37
38 const Mesh2D *_mesh = nullptr;
39 CollisionMesh2D _collisionMesh;
40 Mesh2D::EditionContract _onMeshEditionContract;
41 TriggerMode _triggerMode = TriggerMode::Blocking;
42 std::function<void(spk::Entity *, spk::Entity *)> _triggerAction;
43
44 public:
49 explicit RigidBody2D(const std::wstring &p_name);
50
52 void start() override;
54 void stop() override;
55
60 void setMesh(const Mesh2D *p_mesh);
65 const Mesh2D *mesh() const;
70 const CollisionMesh2D &collisionMesh() const;
71
76 void setTriggerMode(TriggerMode p_mode);
82
87 void setTriggerAction(std::function<void(spk::Entity *, spk::Entity *)> p_action);
92 const std::function<void(spk::Entity *, spk::Entity *)> &triggerAction() const;
93
98 static const std::set<RegistryEntry> &rigidBodies();
104 bool collides(const RigidBody2D &p_other) const;
110 bool collides(const spk::Vector2 &p_worldPoint) const;
111 };
112}
Convex collision mesh built from 2D points.
Definition spk_collision_mesh_2d.hpp:21
Component2D(const std::wstring &p_name)
Builds a 2D component with a name.
Definition spk_component_2d.cpp:9
Hierarchical game object containing components and children.
Definition spk_entity.hpp:34
ContractProvider::Contract EditionContract
Definition spk_mesh.hpp:38
Renderable mesh composed of 2D vertices.
Definition spk_mesh_2d.hpp:30
const CollisionMesh2D & collisionMesh() const
Returns the collision mesh derived from the render mesh.
Definition spk_rigid_body_2d.cpp:51
std::pair< spk::Entity *, spk::RigidBody2D * > RegistryEntry
Registry entry associating an entity with a rigid body.
Definition spk_rigid_body_2d.hpp:33
TriggerMode
Defines collision response behavior.
Definition spk_rigid_body_2d.hpp:27
const std::function< void(spk::Entity *, spk::Entity *)> & triggerAction() const
Returns the trigger callback.
Definition spk_rigid_body_2d.cpp:71
bool collides(const RigidBody2D &p_other) const
Tests collision against another rigid body.
Definition spk_rigid_body_2d.cpp:81
void start() override
Registers the rigid body for collision updates.
Definition spk_rigid_body_2d.cpp:14
static const std::set< RegistryEntry > & rigidBodies()
Returns the registry of active rigid bodies.
Definition spk_rigid_body_2d.cpp:76
void stop() override
Unregisters the rigid body from collision updates.
Definition spk_rigid_body_2d.cpp:22
void setTriggerMode(TriggerMode p_mode)
Sets the trigger mode.
Definition spk_rigid_body_2d.cpp:56
RigidBody2D(const std::wstring &p_name)
Creates a rigid body component.
Definition spk_rigid_body_2d.cpp:9
void setMesh(const Mesh2D *p_mesh)
Sets the mesh used for collision.
Definition spk_rigid_body_2d.cpp:30
const Mesh2D * mesh() const
Returns the mesh used for collision.
Definition spk_rigid_body_2d.cpp:46
void setTriggerAction(std::function< void(spk::Entity *, spk::Entity *)> p_action)
Sets the trigger callback for collisions.
Definition spk_rigid_body_2d.cpp:66
TriggerMode triggerMode() const
Returns the trigger mode.
Definition spk_rigid_body_2d.cpp:61