aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJAROWMR <jarorutjes07@gmail.com>2024-12-07 22:42:35 +0100
committerJAROWMR <jarorutjes07@gmail.com>2024-12-07 22:42:35 +0100
commit31e4ba33bec0cc5c33d9668cd0244972523bf8ad (patch)
tree46bf64344db34b02f9a77f4c1aeb57ddecd53f08
parent289ecc3a3829e9b3acff0b1778f75bc526173977 (diff)
parent9b4f6f24f29e8873a14989ba8c9fccfbc460af7f (diff)
Merge branch 'jaro/physics-system-improvement' into jaro/particle-system-improvement
-rw-r--r--src/crepe/api/LoopManager.cpp8
-rw-r--r--src/crepe/api/LoopTimer.h19
-rw-r--r--src/crepe/system/AISystem.cpp2
-rw-r--r--src/crepe/system/PhysicsSystem.cpp114
4 files changed, 71 insertions, 72 deletions
diff --git a/src/crepe/api/LoopManager.cpp b/src/crepe/api/LoopManager.cpp
index fec9f51..0c1caaa 100644
--- a/src/crepe/api/LoopManager.cpp
+++ b/src/crepe/api/LoopManager.cpp
@@ -37,10 +37,10 @@ void LoopManager::fixed_update() {
// TODO: retrieve EventManager from direct member after singleton refactor
EventManager & ev = this->mediator.event_manager;
ev.dispatch_events();
- this->get_system<ScriptSystem>().update();
- this->get_system<AISystem>().update();
- this->get_system<PhysicsSystem>().update();
- this->get_system<CollisionSystem>().update();
+ this->get_system<ScriptSystem>().update(); // past velocity en locatie aan.
+ this->get_system<AISystem>().update(); // past velocity aan (2x) maxforce
+ this->get_system<PhysicsSystem>().update(); // past velocity aan en locatie
+ this->get_system<CollisionSystem>().update(); // past velocity aan en locate
}
void LoopManager::loop() {
diff --git a/src/crepe/api/LoopTimer.h b/src/crepe/api/LoopTimer.h
index 9393439..8d0b2f9 100644
--- a/src/crepe/api/LoopTimer.h
+++ b/src/crepe/api/LoopTimer.h
@@ -58,6 +58,16 @@ public:
* \param game_scale The desired game scale (0 = pause, 1 = normal speed, > 1 = speed up).
*/
void set_game_scale(double game_scale);
+
+ /**
+ * \brief Get the fixed delta time for consistent updates.
+ *
+ * Fixed delta time is used for operations that require uniform time steps, such as physics
+ * calculations.
+ *
+ * \return Fixed delta time in seconds.
+ */
+ double get_fixed_delta_time() const;
private:
friend class LoopManager;
@@ -77,15 +87,6 @@ private:
*/
void enforce_frame_rate();
- /**
- * \brief Get the fixed delta time for consistent updates.
- *
- * Fixed delta time is used for operations that require uniform time steps, such as physics
- * calculations.
- *
- * \return Fixed delta time in seconds.
- */
- double get_fixed_delta_time() const;
/**
* \brief Get the accumulated lag in the game loop.
diff --git a/src/crepe/system/AISystem.cpp b/src/crepe/system/AISystem.cpp
index 324ee5f..64e93fc 100644
--- a/src/crepe/system/AISystem.cpp
+++ b/src/crepe/system/AISystem.cpp
@@ -17,7 +17,7 @@ void AISystem::update() {
ComponentManager & mgr = mediator.component_manager;
RefVector<AI> ai_components = mgr.get_components_by_type<AI>();
- double dt = LoopTimer::get_instance().get_delta_time();
+ double dt = LoopTimer::get_instance().get_fixed_delta_time();
for (AI & ai : ai_components) {
RefVector<Rigidbody> rigidbodies
diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp
index ab77b35..be768f9 100644
--- a/src/crepe/system/PhysicsSystem.cpp
+++ b/src/crepe/system/PhysicsSystem.cpp
@@ -11,79 +11,77 @@
using namespace crepe;
void PhysicsSystem::update() {
- double dt = LoopTimer::get_instance().get_delta_time();
+ double dt = LoopTimer::get_instance().get_fixed_delta_time();
ComponentManager & mgr = this->mediator.component_manager;
RefVector<Rigidbody> rigidbodies = mgr.get_components_by_type<Rigidbody>();
- RefVector<Transform> transforms = mgr.get_components_by_type<Transform>();
+
float gravity = Config::get_instance().physics.gravity;
for (Rigidbody & rigidbody : rigidbodies) {
if (!rigidbody.active) continue;
+ Transform & transform = mgr.get_components_by_id<Transform>(rigidbody.game_object_id).front().get();
switch (rigidbody.data.body_type) {
case Rigidbody::BodyType::DYNAMIC:
- for (Transform & transform : transforms) {
- if (transform.game_object_id == rigidbody.game_object_id) {
-
- // Add gravity
- if (rigidbody.data.gravity_scale > 0) {
- rigidbody.data.linear_velocity.y
- += (rigidbody.data.mass * rigidbody.data.gravity_scale
- * gravity * dt);
- }
- // Add coefficient rotation
- if (rigidbody.data.angular_velocity_coefficient > 0) {
- rigidbody.data.angular_velocity
- *= std::pow(rigidbody.data.angular_velocity_coefficient, dt);
-
- }
+ if (transform.game_object_id == rigidbody.game_object_id) {
+ // Add gravity
+ if (rigidbody.data.gravity_scale > 0) {
+ rigidbody.data.linear_velocity.y
+ += (rigidbody.data.mass * rigidbody.data.gravity_scale
+ * gravity * dt);
+ }
+ // Add coefficient rotation
+ if (rigidbody.data.angular_velocity_coefficient > 0) {
+ rigidbody.data.angular_velocity
+ *= std::pow(rigidbody.data.angular_velocity_coefficient, dt);
+
+ }
- // Add coefficient movement horizontal
- if (rigidbody.data.linear_velocity_coefficient.x > 0)
- {
- rigidbody.data.linear_velocity.x
- *= std::pow(rigidbody.data.linear_velocity_coefficient.x, dt);
- }
+ // Add coefficient movement horizontal
+ if (rigidbody.data.linear_velocity_coefficient.x > 0)
+ {
+ rigidbody.data.linear_velocity.x
+ *= std::pow(rigidbody.data.linear_velocity_coefficient.x, dt);
+ }
- // Add coefficient movement horizontal
- if (rigidbody.data.linear_velocity_coefficient.y > 0)
- {
- rigidbody.data.linear_velocity.y
- *= std::pow(rigidbody.data.linear_velocity_coefficient.y, dt);
- }
+ // Add coefficient movement horizontal
+ if (rigidbody.data.linear_velocity_coefficient.y > 0)
+ {
+ rigidbody.data.linear_velocity.y
+ *= std::pow(rigidbody.data.linear_velocity_coefficient.y, dt);
+ }
- // Max velocity check
- if (rigidbody.data.angular_velocity
- > rigidbody.data.max_angular_velocity) {
- rigidbody.data.angular_velocity
- = rigidbody.data.max_angular_velocity;
- } else if (rigidbody.data.angular_velocity
- < -rigidbody.data.max_angular_velocity) {
- rigidbody.data.angular_velocity
- = -rigidbody.data.max_angular_velocity;
- }
-
- // Set max velocity to maximum length
- if(rigidbody.data.linear_velocity.length() > rigidbody.data.max_linear_velocity) {
- rigidbody.data.linear_velocity.normalize();
- rigidbody.data.linear_velocity *= rigidbody.data.max_linear_velocity;
- }
+ // Max velocity check
+ if (rigidbody.data.angular_velocity
+ > rigidbody.data.max_angular_velocity) {
+ rigidbody.data.angular_velocity
+ = rigidbody.data.max_angular_velocity;
+ } else if (rigidbody.data.angular_velocity
+ < -rigidbody.data.max_angular_velocity) {
+ rigidbody.data.angular_velocity
+ = -rigidbody.data.max_angular_velocity;
+ }
+
+ // Set max velocity to maximum length
+ if(rigidbody.data.linear_velocity.length() > rigidbody.data.max_linear_velocity) {
+ rigidbody.data.linear_velocity.normalize();
+ rigidbody.data.linear_velocity *= rigidbody.data.max_linear_velocity;
+ }
- // Move object
- if (!rigidbody.data.constraints.rotation) {
- transform.rotation += rigidbody.data.angular_velocity * dt;
- transform.rotation = std::fmod(transform.rotation, 360.0);
- if (transform.rotation < 0) {
- transform.rotation += 360.0;
- }
- }
- if (!rigidbody.data.constraints.x) {
- transform.position.x += rigidbody.data.linear_velocity.x * dt;
- }
- if (!rigidbody.data.constraints.y) {
- transform.position.y += rigidbody.data.linear_velocity.y * dt;
+ // Move object
+ if (!rigidbody.data.constraints.rotation) {
+ transform.rotation += rigidbody.data.angular_velocity * dt;
+ transform.rotation = std::fmod(transform.rotation, 360.0);
+ if (transform.rotation < 0) {
+ transform.rotation += 360.0;
}
}
+ if (!rigidbody.data.constraints.x) {
+ transform.position.x += rigidbody.data.linear_velocity.x * dt;
+ }
+ if (!rigidbody.data.constraints.y) {
+ transform.position.y += rigidbody.data.linear_velocity.y * dt;
+ }
}
break;
case Rigidbody::BodyType::KINEMATIC: