aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJAROWMR <jarorutjes07@gmail.com>2024-12-07 15:43:00 +0100
committerJAROWMR <jarorutjes07@gmail.com>2024-12-07 15:43:00 +0100
commitfe8f985d2c7ea672a5f886d7d0df064f26bd2cb4 (patch)
treec09952570ac3732dfd821ae00fe379330e513e7c /src
parent478f5f6232c46e1a60c023bf5dcbe2a934f42d84 (diff)
improved physics for AI
Diffstat (limited to 'src')
-rw-r--r--src/crepe/api/Config.h2
-rw-r--r--src/crepe/system/AISystem.cpp2
-rw-r--r--src/crepe/system/CollisionSystem.cpp14
-rw-r--r--src/crepe/system/PhysicsSystem.cpp57
-rw-r--r--src/test/PhysicsTest.cpp2
5 files changed, 30 insertions, 47 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/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/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp
index 6b1954e..0483693 100644
--- a/src/crepe/system/CollisionSystem.cpp
+++ b/src/crepe/system/CollisionSystem.cpp
@@ -182,11 +182,7 @@ CollisionSystem::collision_handler(CollisionInternal & data1, CollisionInternal
vec2 collider_pos2 = this->get_current_position(collider2.offset, data2.transform,
data2.rigidbody);
resolution = this->get_circle_box_resolution(collider1, collider2, collider_pos1,
-<<<<<<< HEAD
collider_pos2);
-=======
- collider_pos2, false);
->>>>>>> 33a072db28d71ba65e59f9491abd42dbf9695fc4
break;
}
}
@@ -272,12 +268,7 @@ vec2 CollisionSystem::get_circle_circle_resolution(const CircleCollider & circle
vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_collider,
const BoxCollider & box_collider,
const vec2 & circle_position,
-<<<<<<< HEAD
const vec2 & box_position) const {
-=======
- const vec2 & box_position,
- bool inverse) const {
->>>>>>> 33a072db28d71ba65e59f9491abd42dbf9695fc4
vec2 delta = circle_position - box_position;
// Compute half-dimensions of the box
@@ -299,11 +290,6 @@ vec2 CollisionSystem::get_circle_box_resolution(const CircleCollider & circle_co
// Compute penetration depth
float penetration_depth = circle_collider.radius - distance;
-<<<<<<< HEAD
-
-=======
- if (inverse) collision_normal = -collision_normal;
->>>>>>> 33a072db28d71ba65e59f9491abd42dbf9695fc4
// Compute the resolution vector
vec2 resolution = collision_normal * penetration_depth;
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},
});