diff options
| -rw-r--r-- | src/crepe/api/LoopManager.cpp | 8 | ||||
| -rw-r--r-- | src/crepe/api/LoopTimer.h | 19 | ||||
| -rw-r--r-- | src/crepe/system/AISystem.cpp | 2 | ||||
| -rw-r--r-- | src/crepe/system/PhysicsSystem.cpp | 114 | 
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: |