diff options
Diffstat (limited to 'src/crepe/system')
-rw-r--r-- | src/crepe/system/PhysicsSystem.cpp | 106 | ||||
-rw-r--r-- | src/crepe/system/PhysicsSystem.h | 17 | ||||
-rw-r--r-- | src/crepe/system/RenderSystem.cpp | 2 | ||||
-rw-r--r-- | src/crepe/system/ScriptSystem.cpp | 8 | ||||
-rw-r--r-- | src/crepe/system/ScriptSystem.h | 5 | ||||
-rw-r--r-- | src/crepe/system/System.h | 14 |
6 files changed, 94 insertions, 58 deletions
diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp index cea8062..eb54ad3 100644 --- a/src/crepe/system/PhysicsSystem.cpp +++ b/src/crepe/system/PhysicsSystem.cpp @@ -1,16 +1,15 @@ -#include <iostream> +#include <cmath> #include "../ComponentManager.h" -#include "../api/Force.h" +#include "../api/Config.h" #include "../api/Rigidbody.h" #include "../api/Transform.h" +#include "../api/Vector2.h" #include "PhysicsSystem.h" using namespace crepe; -PhysicsSystem::PhysicsSystem() {} - void PhysicsSystem::update() { ComponentManager & mgr = ComponentManager::get_instance(); std::vector<std::reference_wrapper<Rigidbody>> rigidbodies @@ -18,41 +17,86 @@ void PhysicsSystem::update() { std::vector<std::reference_wrapper<Transform>> transforms = mgr.get_components_by_type<Transform>(); + double gravity = Config::get_instance().physics.gravity; for (Rigidbody & rigidbody : rigidbodies) { + if (!rigidbody.active) continue; - switch (rigidbody.body_type) { - case BodyType::DYNAMIC: + switch (rigidbody.data.body_type) { + case Rigidbody::BodyType::DYNAMIC: for (Transform & transform : transforms) { if (transform.game_object_id == rigidbody.game_object_id) { - rigidbody.velocity_x = 0; - rigidbody.velocity_y = 0; - std::vector<std::reference_wrapper<Force>> forces - = mgr.get_components_by_id<Force>( - rigidbody.game_object_id); - rigidbody.velocity_y - += rigidbody.gravity_scale * 1 * rigidbody.mass; - - for (Force & force : forces) { - rigidbody.velocity_x += force.force_x; - rigidbody.velocity_y += force.force_y; - } - - std::cout << "before transform.postion.x " - << transform.position.x << std::endl; - std::cout << "before transform.postion.y " - << transform.position.y << std::endl; - transform.position.x += rigidbody.velocity_x; - transform.position.y += rigidbody.velocity_y; - std::cout << "after transform.postion.x " - << transform.position.x << std::endl; - std::cout << "after transform.postion.y " - << transform.position.y << std::endl; + + // Add gravity + if (rigidbody.data.use_gravity) { + rigidbody.data.linear_velocity.y + += (rigidbody.data.mass + * rigidbody.data.gravity_scale * gravity); + } + // Add damping + if (rigidbody.data.angular_damping != 0) { + rigidbody.data.angular_velocity + *= rigidbody.data.angular_damping; + } + if (rigidbody.data.linear_damping != Vector2{0, 0}) { + rigidbody.data.linear_velocity + *= rigidbody.data.linear_damping; + } + + // 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; + } + + if (rigidbody.data.linear_velocity.x + > rigidbody.data.max_linear_velocity.x) { + rigidbody.data.linear_velocity.x + = rigidbody.data.max_linear_velocity.x; + } else if (rigidbody.data.linear_velocity.x + < -rigidbody.data.max_linear_velocity.x) { + rigidbody.data.linear_velocity.x + = -rigidbody.data.max_linear_velocity.x; + } + + if (rigidbody.data.linear_velocity.y + > rigidbody.data.max_linear_velocity.y) { + rigidbody.data.linear_velocity.y + = rigidbody.data.max_linear_velocity.y; + } else if (rigidbody.data.linear_velocity.y + < -rigidbody.data.max_linear_velocity.y) { + rigidbody.data.linear_velocity.y + = -rigidbody.data.max_linear_velocity.y; + } + + // Move object + if (!rigidbody.data.constraints.rotation) { + transform.rotation + += rigidbody.data.angular_velocity; + 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; + } + if (!rigidbody.data.constraints.y) { + transform.position.y + += rigidbody.data.linear_velocity.y; + } } } break; - case BodyType::KINEMATIC: + case Rigidbody::BodyType::KINEMATIC: break; //(scripts) - case BodyType::STATIC: + case Rigidbody::BodyType::STATIC: break; //(unmoveable objects) default: break; diff --git a/src/crepe/system/PhysicsSystem.h b/src/crepe/system/PhysicsSystem.h index 33b4072..cc13b70 100644 --- a/src/crepe/system/PhysicsSystem.h +++ b/src/crepe/system/PhysicsSystem.h @@ -1,10 +1,23 @@ #pragma once namespace crepe { - +/** + * \brief System that controls all physics + * + * This class is a physics system that uses a rigidbody and transform + * to add physics to a game object. + */ class PhysicsSystem { public: - PhysicsSystem(); + /** + * Constructor is default + */ + PhysicsSystem() = default; + /** + * \brief updates the physics system. + * + * It calculates new velocties and changes the postion in the transform. + */ void update(); }; diff --git a/src/crepe/system/RenderSystem.cpp b/src/crepe/system/RenderSystem.cpp index 96c94e9..5a07cc2 100644 --- a/src/crepe/system/RenderSystem.cpp +++ b/src/crepe/system/RenderSystem.cpp @@ -2,9 +2,9 @@ #include <vector> #include "../ComponentManager.h" -#include "../facade/SDLContext.h" #include "../api/Sprite.h" #include "../api/Transform.h" +#include "../facade/SDLContext.h" #include "../util/log.h" #include "RenderSystem.h" diff --git a/src/crepe/system/ScriptSystem.cpp b/src/crepe/system/ScriptSystem.cpp index f1fae4d..f2673e7 100644 --- a/src/crepe/system/ScriptSystem.cpp +++ b/src/crepe/system/ScriptSystem.cpp @@ -12,14 +12,6 @@ using namespace std; using namespace crepe; -ScriptSystem::ScriptSystem() { dbg_trace(); } -ScriptSystem::~ScriptSystem() { dbg_trace(); } - -ScriptSystem & ScriptSystem::get_instance() { - static ScriptSystem instance; - return instance; -} - void ScriptSystem::update() { using namespace std; dbg_trace(); diff --git a/src/crepe/system/ScriptSystem.h b/src/crepe/system/ScriptSystem.h index 32e793c..4fa6141 100644 --- a/src/crepe/system/ScriptSystem.h +++ b/src/crepe/system/ScriptSystem.h @@ -10,14 +10,9 @@ class Script; class ScriptSystem : public System { public: - static ScriptSystem & get_instance(); void update(); private: - ScriptSystem(); - ~ScriptSystem(); - -private: // TODO: to forward_list<reference_wrapper> std::forward_list<Script *> get_scripts(); }; diff --git a/src/crepe/system/System.h b/src/crepe/system/System.h index ecbb7f5..3b81bef 100644 --- a/src/crepe/system/System.h +++ b/src/crepe/system/System.h @@ -4,19 +4,11 @@ namespace crepe { class System { public: - static System & get_instance(); virtual void update() = 0; -protected: - System() {}; - virtual ~System() {}; - -private: - // singleton - System(const System &) = delete; - System(System &&) = delete; - System & operator=(const System &) = delete; - System & operator=(System &&) = delete; +public: + System() = default; + virtual ~System() = default; }; } // namespace crepe |