From 529e55a28a7e51bf3dd0f08fa9d6f0192445a7b4 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sat, 7 Dec 2024 19:26:12 +0100 Subject: fixed transform --- src/crepe/api/LoopManager.cpp | 8 +-- src/crepe/system/PhysicsSystem.cpp | 112 ++++++++++++++++++------------------- 2 files changed, 59 insertions(+), 61 deletions(-) (limited to 'src/crepe') 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().update(); - this->get_system().update(); - this->get_system().update(); - this->get_system().update(); + this->get_system().update(); // past velocity en locatie aan. + this->get_system().update(); // past velocity aan (2x) maxforce + this->get_system().update(); // past velocity aan en locatie + this->get_system().update(); // past velocity aan en locate } void LoopManager::loop() { diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp index ab77b35..7e66567 100644 --- a/src/crepe/system/PhysicsSystem.cpp +++ b/src/crepe/system/PhysicsSystem.cpp @@ -14,76 +14,74 @@ void PhysicsSystem::update() { double dt = LoopTimer::get_instance().get_delta_time(); ComponentManager & mgr = this->mediator.component_manager; RefVector rigidbodies = mgr.get_components_by_type(); - RefVector transforms = mgr.get_components_by_type(); + float gravity = Config::get_instance().physics.gravity; for (Rigidbody & rigidbody : rigidbodies) { if (!rigidbody.active) continue; + Transform & transform = mgr.get_components_by_id(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: -- cgit v1.2.3 From 9b4f6f24f29e8873a14989ba8c9fccfbc460af7f Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sat, 7 Dec 2024 20:42:38 +0100 Subject: use fixed delta time --- src/crepe/api/LoopTimer.h | 19 ++++++++++--------- src/crepe/system/AISystem.cpp | 2 +- src/crepe/system/PhysicsSystem.cpp | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) (limited to 'src/crepe') 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_components = mgr.get_components_by_type(); - double dt = LoopTimer::get_instance().get_delta_time(); + double dt = LoopTimer::get_instance().get_fixed_delta_time(); for (AI & ai : ai_components) { RefVector rigidbodies diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp index 7e66567..be768f9 100644 --- a/src/crepe/system/PhysicsSystem.cpp +++ b/src/crepe/system/PhysicsSystem.cpp @@ -11,7 +11,7 @@ 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 rigidbodies = mgr.get_components_by_type(); -- cgit v1.2.3