diff options
| -rw-r--r-- | src/crepe/api/Config.h | 2 | ||||
| -rw-r--r-- | src/crepe/api/Rigidbody.h | 2 | ||||
| -rw-r--r-- | src/crepe/system/AISystem.cpp | 2 | ||||
| -rw-r--r-- | src/crepe/system/PhysicsSystem.cpp | 57 | ||||
| -rw-r--r-- | src/test/PhysicsTest.cpp | 2 | 
5 files changed, 31 insertions, 34 deletions
| diff --git a/src/crepe/api/Config.h b/src/crepe/api/Config.h index a9745c3..c31cf4a 100644 --- a/src/crepe/api/Config.h +++ b/src/crepe/api/Config.h @@ -63,7 +63,7 @@ public:  		 *  		 * Gravity value of game.  		 */ -		double gravity = 1; +		float gravity = 1;  	} physics;  	//! default window settings diff --git a/src/crepe/api/Rigidbody.h b/src/crepe/api/Rigidbody.h index 40c6bf1..f641fff 100644 --- a/src/crepe/api/Rigidbody.h +++ b/src/crepe/api/Rigidbody.h @@ -79,7 +79,7 @@ public:  		//! Linear velocity of the object (speed and direction).  		vec2 linear_velocity;  		//! Maximum linear velocity of the object. This limits the object's speed. -		vec2 max_linear_velocity = {INFINITY, INFINITY}; +		float max_linear_velocity = INFINITY;  		//! Linear velocity coefficient. This scales the object's velocity for adjustment or damping.  		vec2 linear_velocity_coefficient = {1, 1};  		//! \} diff --git a/src/crepe/system/AISystem.cpp b/src/crepe/system/AISystem.cpp index 55dc14c..324ee5f 100644 --- a/src/crepe/system/AISystem.cpp +++ b/src/crepe/system/AISystem.cpp @@ -130,7 +130,7 @@ vec2 AISystem::arrive(const AI & ai) {  	float distance = to_target.length();  	if (distance > 0.0f) {  		float speed = distance / ai.arrive_deceleration; -		speed = std::min(speed, rigidbody.data.max_linear_velocity.length()); +		speed = std::min(speed, rigidbody.data.max_linear_velocity);  		vec2 desired_velocity = to_target * (speed / distance);  		return desired_velocity - rigidbody.data.linear_velocity; diff --git a/src/crepe/system/PhysicsSystem.cpp b/src/crepe/system/PhysicsSystem.cpp index ebf4439..ab77b35 100644 --- a/src/crepe/system/PhysicsSystem.cpp +++ b/src/crepe/system/PhysicsSystem.cpp @@ -11,11 +11,12 @@  using namespace crepe;  void PhysicsSystem::update() { +	double dt = LoopTimer::get_instance().get_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>(); -	double gravity = Config::get_instance().physics.gravity; +	float gravity = Config::get_instance().physics.gravity;  	for (Rigidbody & rigidbody : rigidbodies) {  		if (!rigidbody.active) continue; @@ -28,17 +29,27 @@ void PhysicsSystem::update() {  						if (rigidbody.data.gravity_scale > 0) {  							rigidbody.data.linear_velocity.y  								+= (rigidbody.data.mass * rigidbody.data.gravity_scale -									* gravity); +									* gravity * dt);  						} -						// Add damping +						// Add coefficient rotation  						if (rigidbody.data.angular_velocity_coefficient > 0) {  							rigidbody.data.angular_velocity -								*= rigidbody.data.angular_velocity_coefficient; +								*= std::pow(rigidbody.data.angular_velocity_coefficient, dt); +								  						} -						if (rigidbody.data.linear_velocity_coefficient.x > 0 -							&& rigidbody.data.linear_velocity_coefficient.y > 0) { -							rigidbody.data.linear_velocity -								*= rigidbody.data.linear_velocity_coefficient; + +						// 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);  						}  						// Max velocity check @@ -51,40 +62,26 @@ void PhysicsSystem::update() {  							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; +						 +						// 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; +							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; +							transform.position.x += rigidbody.data.linear_velocity.x * dt;  						}  						if (!rigidbody.data.constraints.y) { -							transform.position.y += rigidbody.data.linear_velocity.y; +							transform.position.y += rigidbody.data.linear_velocity.y * dt;  						}  					}  				} diff --git a/src/test/PhysicsTest.cpp b/src/test/PhysicsTest.cpp index 43d2931..4af34f5 100644 --- a/src/test/PhysicsTest.cpp +++ b/src/test/PhysicsTest.cpp @@ -27,7 +27,7 @@ public:  				.mass = 1,  				.gravity_scale = 1,  				.body_type = Rigidbody::BodyType::DYNAMIC, -				.max_linear_velocity = vec2{10, 10}, +				.max_linear_velocity = 10,  				.max_angular_velocity = 10,  				.constraints = {0, 0},  			}); |