aboutsummaryrefslogtreecommitdiff
path: root/src/crepe/system
diff options
context:
space:
mode:
Diffstat (limited to 'src/crepe/system')
-rw-r--r--src/crepe/system/CollisionSystem.cpp30
1 files changed, 17 insertions, 13 deletions
diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp
index f61a1dd..6f2c39d 100644
--- a/src/crepe/system/CollisionSystem.cpp
+++ b/src/crepe/system/CollisionSystem.cpp
@@ -5,7 +5,6 @@
#include <utility>
#include <variant>
#include <optional>
-#include <tuple>
#include "api/Event.h"
#include "api/EventManager.h"
@@ -61,18 +60,22 @@ void CollisionSystem::collision_handler_request(CollidedInfoStor& data1,Collided
case ColliderStorType::BOX_BOX:{
collider1 = std::get<std::reference_wrapper<BoxCollider>>(data1.collider);
collider2 = std::get<std::reference_wrapper<BoxCollider>>(data2.collider);
+ break;
}
case ColliderStorType::BOX_CIRCLE:{
collider1 = std::get<std::reference_wrapper<BoxCollider>>(data1.collider);
collider2 = std::get<std::reference_wrapper<CircleCollider>>(data2.collider);
+ break;
}
case ColliderStorType::CIRCLE_BOX:{
collider1 = std::get<std::reference_wrapper<CircleCollider>>(data1.collider);
collider2 = std::get<std::reference_wrapper<BoxCollider>>(data2.collider);
+ break;
}
case ColliderStorType::CIRCLE_CIRCLE:{
collider1 = std::get<std::reference_wrapper<CircleCollider>>(data1.collider);
collider2 = std::get<std::reference_wrapper<CircleCollider>>(data2.collider);
+ break;
}
}
@@ -233,17 +236,17 @@ std::vector<std::pair<CollisionSystem::CollidedInfoStor,CollisionSystem::Collide
std::vector<std::pair<CollidedInfoStor,CollidedInfoStor>> collisions_ret;
for (size_t i = 0; i < colliders.size(); ++i) {
std::visit([&](auto& inner_collider_ref) {
- if (inner_collider_ref.get().active) return;
+ if (!inner_collider_ref.get().active) return;
auto inner_components = get_active_transform_and_rigidbody(inner_collider_ref.get().game_object_id);
- if (inner_components) return;
+ if (!inner_components) return;
for (size_t j = i + 1; j < colliders.size(); ++j) {
std::visit([&](auto& outer_collider_ref) {
- if (outer_collider_ref.get().active) return;
+ if (!outer_collider_ref.get().active) return;
if (inner_collider_ref.get().game_object_id == outer_collider_ref.get().game_object_id) return;
- auto outer_components = get_active_transform_and_rigidbody(inner_collider_ref.get().game_object_id);
- if (outer_components) return;
+ auto outer_components = get_active_transform_and_rigidbody(outer_collider_ref.get().game_object_id);
+ if (!outer_components) return;
ColliderStorType type = check_collider_type(colliders[i],colliders[j]);
- check_collision(colliders[i],*inner_components,colliders[j],*outer_components,type);
+ if(!check_collision(colliders[i],*inner_components,colliders[j],*outer_components,type)) return;
collisions_ret.emplace_back(
CollidedInfoStor{colliders[i], inner_components->first.get(), inner_components->second.get()},
CollidedInfoStor{colliders[j], outer_components->first.get(), outer_components->second.get()}
@@ -295,11 +298,12 @@ bool CollisionSystem::check_collision(const collider_stor& collider1,std::pair<s
return check_circle_circle_collision(circle_collider1,circle_collider2,components1.first.get(),components2.first.get(),components1.second.get(),components2.second.get());
}
case ColliderStorType::CIRCLE_BOX: {
- const BoxCollider & box_collider = std::get<std::reference_wrapper<BoxCollider>>(collider1);
- const CircleCollider & circle_collider = std::get<std::reference_wrapper<CircleCollider>>(collider2);
+ const CircleCollider & circle_collider = std::get<std::reference_wrapper<CircleCollider>>(collider1);
+ const BoxCollider & box_collider = std::get<std::reference_wrapper<BoxCollider>>(collider2);
return check_box_circle_collision(box_collider,circle_collider,components1.first.get(),components2.first.get(),components1.second.get(),components2.second.get());
}
}
+ return false;
}
@@ -316,10 +320,10 @@ bool CollisionSystem::check_box_box_collision(const BoxCollider& box1, const Box
float half_height2 = box2.height / 2.0;
// Check if the boxes overlap along the X and Y axes
- return !(final_position1.x + half_width1 <= final_position2.x - half_width2 || // box1 is left of box2
- final_position1.x - half_width1 >= final_position2.x + half_width2 || // box1 is right of box2
- final_position1.y + half_height1 <= final_position2.y - half_height2 || // box1 is above box2
- final_position1.y - half_height1 >= final_position2.y + half_height2); // box1 is below box2
+ return (final_position1.x + half_width1 > final_position2.x - half_width2 && // not left
+ final_position1.x - half_width1 < final_position2.x + half_width2 && // not right
+ final_position1.y + half_height1 > final_position2.y - half_height2 && // not above
+ final_position1.y - half_height1 < final_position2.y + half_height2); // not below
}
bool CollisionSystem::check_box_circle_collision(const BoxCollider& box1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2) {