TheAtlasEngine
 
Loading...
Searching...
No Matches
physics_context.hpp
1#pragma once
2#include <core/core.hpp>
3#include <Jolt/Jolt.h>
4#include <drivers/jolt-cpp/jolt_components.hpp>
5#include <drivers/jolt-cpp/jolt-imports.hpp>
6#include <physics/components.hpp>
7#include <core/scene/components.hpp>
8#include <flecs.h>
9#include <core/event/event_bus.hpp>
10
11namespace atlas::physics {
21 public:
22 virtual ~physics_context() = default;
23
25 void destroy() { return destroy_bodies(); }
26
29 void update(float p_delta_time) {
30 return update_simulation(p_delta_time);
31 }
32
39 void prepare() { return prepare_and_finalize(); }
40
49 void add_box_collider(uint32_t p_entity_id,
50 const transform* p_transform,
51 const physics_body* p_body,
52 const box_collider* p_collider) {
54 p_entity_id, p_transform, p_body, p_collider);
55 }
56
65 void add_sphere_collider(uint32_t p_entity_id,
66 const transform* p_transform,
67 const physics_body* p_body,
68 const sphere_collider* p_collider) {
69 return emplace_sphere_collider(
70 p_entity_id, p_transform, p_body, p_collider);
71 }
72
81 void add_capsule_collider(uint32_t p_entity_id,
82 const transform* p_transform,
83 const physics_body* p_body,
84 const capsule_collider* p_collider) {
85 return emplace_capsule_collider(
86 p_entity_id, p_transform, p_body, p_collider);
87 }
88
94 transform read_transform(uint32_t p_id) {
95 return context_read_transform(p_id);
96 }
97
104 return context_read_physics_body(p_id);
105 }
106
107 void set_linear_velocity(uint64_t p_id,
108 const glm::vec3& p_linear_velocity) {
109 return linear_velocity(p_id, p_linear_velocity);
110 }
111
112 void set_angular_velocity(uint64_t p_id,
113 const glm::vec3& p_angular_velocity) {
114 return angular_velocity(p_id, p_angular_velocity);
115 }
116
117 void set_force(uint64_t p_id, const glm::vec3& p_force) {
118 return force(p_id, p_force);
119 }
120
121 void set_force_and_torque(uint64_t p_id,
122 const glm::vec3& p_force,
123 const glm::vec3& p_torque) {
124 add_force_and_torque(p_id, p_force, p_torque);
125 }
126
127 void set_impulse(uint64_t p_id, const glm::vec3& p_impulse) {
128 add_impulse(p_id, p_impulse);
129 }
130
131 private:
132 virtual void destroy_bodies() = 0;
133
143 virtual void emplace_box_collider(uint32_t p_entity_id,
144 const transform* p_transform,
145 const physics_body* p_body,
146 const box_collider* p_collider) = 0;
147
148 virtual void emplace_sphere_collider(
149 uint32_t p_entity_id,
150 const transform* p_transform,
151 const physics_body* p_body,
152 const sphere_collider* p_collider) = 0;
153
154 virtual void emplace_capsule_collider(
155 uint32_t p_entity_id,
156 const transform* p_transform,
157 const physics_body* p_body,
158 const capsule_collider* p_collider) = 0;
159
160 virtual transform context_read_transform(uint32_t p_id) = 0;
161
162 virtual physics_body context_read_physics_body(uint32_t p_id) = 0;
163
164 virtual void prepare_and_finalize() = 0;
165
166 virtual void update_simulation(float p_delta_time) = 0;
167
168 virtual void linear_velocity(uint64_t p_id, const glm::vec3&) = 0;
169
170 virtual void angular_velocity(uint64_t p_id, const glm::vec3&) = 0;
171
172 virtual void force(uint64_t p_id,
173 const glm::vec3& p_cumulative_force) = 0;
174
175 virtual void add_force_and_torque(uint64_t p_id,
176 const glm::vec3& p_force,
177 const glm::vec3& p_torque) = 0;
178
179 virtual void add_impulse(uint64_t p_id, const glm::vec3& p_impulse) = 0;
180 };
181
185 ref<physics_context> initialize_physics_context(
186 const jolt_settings& p_settings,
187 event::event_bus& p_bus);
188};
Event bus that holds the responsibility to reroute events to the subscribers of those particular even...
Definition event_bus.hpp:13
The context is the way to interact with specific backend context implementation such as JoltPhysics a...
Definition physics_context.hpp:20
virtual void emplace_box_collider(uint32_t p_entity_id, const transform *p_transform, const physics_body *p_body, const box_collider *p_collider)=0
Any emplace_* specific function are specific collider implementation-specific to the backend (context...
void add_sphere_collider(uint32_t p_entity_id, const transform *p_transform, const physics_body *p_body, const sphere_collider *p_collider)
Definition physics_context.hpp:65
physics_body read_physics_body(uint32_t p_id)
Definition physics_context.hpp:103
transform read_transform(uint32_t p_id)
Definition physics_context.hpp:94
void add_box_collider(uint32_t p_entity_id, const transform *p_transform, const physics_body *p_body, const box_collider *p_collider)
Definition physics_context.hpp:49
void add_capsule_collider(uint32_t p_entity_id, const transform *p_transform, const physics_body *p_body, const capsule_collider *p_collider)
Definition physics_context.hpp:81
void prepare()
As soon all physics bodies/colliders are created.
Definition physics_context.hpp:39
void update(float p_delta_time)
updates our simulation using delta time and works with a fixed timestep
Definition physics_context.hpp:29
void destroy()
Performs cleanup when simulation stops.
Definition physics_context.hpp:25
Types are still be filled out. When this is completed to_jph() can be removed.
Definition jolt_broad_phase.hpp:5
ref< physics_context > initialize_physics_context(const jolt_settings &p_settings, event::event_bus &p_bus)
initializes the physics backend. SHOULD have an API associated with but for now, we assume we only ha...
Definition components.hpp:59
Definition components.hpp:63
Jolt-specific context configurations These are going to be internally integrated to jolt_context.
Definition jolt_components.hpp:53
physics body data-driven representative
Definition components.hpp:34
Definition components.hpp:68
Definition components.hpp:10