aboutsummaryrefslogtreecommitdiff
path: root/src/crepe
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe')
-rw-r--r--src/crepe/api/Config.h2
-rw-r--r--src/crepe/api/Rigidbody.h2
-rw-r--r--src/crepe/system/AISystem.cpp2
-rw-r--r--src/crepe/system/PhysicsSystem.cpp57
4 files changed, 30 insertions, 33 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;
}
}
}