aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/crepe/api/BoxCollider.cpp5
-rw-r--r--src/crepe/api/BoxCollider.h2
-rw-r--r--src/crepe/api/CMakeLists.txt4
-rw-r--r--src/crepe/api/CircleCollider.cpp2
-rw-r--r--src/crepe/api/CircleCollider.h1
-rw-r--r--src/crepe/api/Rigidbody.h2
-rw-r--r--src/crepe/system/CollisionSystem.cpp82
-rw-r--r--src/crepe/system/CollisionSystem.h14
-rw-r--r--src/example/CMakeLists.txt1
-rw-r--r--src/example/collision.cpp42
10 files changed, 148 insertions, 7 deletions
diff --git a/src/crepe/api/BoxCollider.cpp b/src/crepe/api/BoxCollider.cpp
index c3cb60c..eafbdb2 100644
--- a/src/crepe/api/BoxCollider.cpp
+++ b/src/crepe/api/BoxCollider.cpp
@@ -1,8 +1,7 @@
-#pragma once
-
#include "BoxCollider.h"
+#include "../Collider.h"
using namespace crepe;
-BoxCollider::BoxCollider(game_object_id_t game_object_id,Vector2 offset, int width, int height) : Collider(game_object_id,offset), width(width), height(height) {}
+BoxCollider::BoxCollider(game_object_id_t game_object_id,Vector2 offset, double width, double height) : Collider(game_object_id,offset), width(width), height(height) {}
diff --git a/src/crepe/api/BoxCollider.h b/src/crepe/api/BoxCollider.h
index 2461636..357c979 100644
--- a/src/crepe/api/BoxCollider.h
+++ b/src/crepe/api/BoxCollider.h
@@ -7,7 +7,7 @@ namespace crepe {
class BoxCollider : public Collider {
public:
- BoxCollider(game_object_id_t game_object_id,Vector2 offset, int width, int height);
+ BoxCollider(game_object_id_t game_object_id,Vector2 offset, double width, double height);
double width;
double height;
};
diff --git a/src/crepe/api/CMakeLists.txt b/src/crepe/api/CMakeLists.txt
index 87cbb09..6915074 100644
--- a/src/crepe/api/CMakeLists.txt
+++ b/src/crepe/api/CMakeLists.txt
@@ -18,6 +18,8 @@ target_sources(crepe PUBLIC
Vector2.cpp
Camera.cpp
Animator.cpp
+ BoxCollider.cpp
+ CircleCollider.cpp
)
target_sources(crepe PUBLIC FILE_SET HEADERS FILES
@@ -42,4 +44,6 @@ target_sources(crepe PUBLIC FILE_SET HEADERS FILES
SceneManager.hpp
Camera.h
Animator.h
+ BoxCollider.h
+ CircleCollider.h
)
diff --git a/src/crepe/api/CircleCollider.cpp b/src/crepe/api/CircleCollider.cpp
index 9365793..04a4995 100644
--- a/src/crepe/api/CircleCollider.cpp
+++ b/src/crepe/api/CircleCollider.cpp
@@ -1,5 +1,3 @@
-#pragma once
-
#include "CircleCollider.h"
using namespace crepe;
diff --git a/src/crepe/api/CircleCollider.h b/src/crepe/api/CircleCollider.h
index 3a66355..29a9c1e 100644
--- a/src/crepe/api/CircleCollider.h
+++ b/src/crepe/api/CircleCollider.h
@@ -1,6 +1,7 @@
#pragma once
#include "Vector2.h"
+
#include "../Collider.h"
namespace crepe {
diff --git a/src/crepe/api/Rigidbody.h b/src/crepe/api/Rigidbody.h
index 68481f4..b9edec2 100644
--- a/src/crepe/api/Rigidbody.h
+++ b/src/crepe/api/Rigidbody.h
@@ -75,6 +75,8 @@ public:
bool use_gravity = true;
//! if object bounces
bool bounce = false;
+ //! offset of all colliders
+ Vector2 offset;
};
public:
diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp
index 55e0fdc..75d5c58 100644
--- a/src/crepe/system/CollisionSystem.cpp
+++ b/src/crepe/system/CollisionSystem.cpp
@@ -1,7 +1,87 @@
+#include <cmath>
+
#include "CollisionSystem.h"
+#include "../ComponentManager.h"
+#include "../api/BoxCollider.h"
+#include "../api/CircleCollider.h"
+#include "../api/Vector2.h"
+#include "../api/Rigidbody.h"
+#include "../api/Transform.h"
+
+#include "Collider.h"
+#include "iostream"
+
using namespace crepe;
CollisionSystem::CollisionSystem() {}
-void CollisionSystem::update() {}
+void CollisionSystem::update() {
+ ComponentManager & mgr = ComponentManager::get_instance();
+ std::vector<std::reference_wrapper<BoxCollider>> boxcolliders = mgr.get_components_by_type<BoxCollider>();
+
+ Transform & transform1 = mgr.get_components_by_id<Transform>(boxcolliders[0].get().game_object_id).front().get();
+ Rigidbody & rigidbody1 = mgr.get_components_by_id<Rigidbody>(boxcolliders[0].get().game_object_id).front().get();
+ Transform & transform2 = mgr.get_components_by_id<Transform>(boxcolliders[1].get().game_object_id).front().get();
+ Rigidbody & rigidbody2 = mgr.get_components_by_id<Rigidbody>(boxcolliders[1].get().game_object_id).front().get();
+ BoxCollider & collider1 = boxcolliders[0].get();
+ BoxCollider & collider2 = boxcolliders[1].get();
+ bool test = check_box_box_collision(collider1, collider2, transform1, transform2, rigidbody1, rigidbody2);
+ std::cout << "collided? " << test << std::endl;
+}
+
+
+
+bool CollisionSystem::check_collisions(const std::vector<Collider*>& colliders1, const std::vector<Collider*>& colliders2) {}
+bool CollisionSystem::check_box_box_collision(const BoxCollider& box1, const BoxCollider& box2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2)
+{
+ // Function to convert degrees to radians
+ auto degrees_to_radians = [](double degrees) {
+ return degrees * (M_PI / 180.0);
+ };
+
+ // Get the rotation in radians
+ double radians1 = degrees_to_radians(transform1.rotation);
+ double radians2 = degrees_to_radians(transform2.rotation);
+
+ // Calculate the scale factor (for both rigidbody and box offsets)
+ double scale1 = transform1.scale;
+ double scale2 = transform2.scale;
+
+ Vector2 total_offset1 = (rigidbody1.data.offset + box1.offset) * transform1.scale;
+ Vector2 total_offset2 = (rigidbody2.data.offset + box2.offset) * transform2.scale;
+
+ // Rotate
+ double rotated_total_offset_x1 = total_offset1.x * cos(radians1) - total_offset1.y * sin(radians1);
+ double rotated_total_offset_y1 = total_offset1.x * sin(radians1) + total_offset1.y * cos(radians1);
+
+ double rotated_total_offset_x2 = total_offset2.x * cos(radians2) - total_offset2.y * sin(radians2);
+ double rotated_total_offset_y2 = total_offset2.x * sin(radians2) + total_offset2.y * cos(radians2);
+
+ // Final positions considering scaling and rotation
+ Vector2 final_position1 = transform1.position + Vector2(rotated_total_offset_x1, rotated_total_offset_y1);
+ Vector2 final_position2 = transform2.position + Vector2(rotated_total_offset_x2, rotated_total_offset_y2);
+
+ // Log final positions for debugging purposes
+ std::cout << "Final Position of Box 1: (" << final_position1.x << ", " << final_position1.y << ")" << std::endl;
+ std::cout << "Final Position of Box 2: (" << final_position2.x << ", " << final_position2.y << ")" << std::endl;
+
+ // Log rotation values for debugging
+ std::cout << "Rotation of Box 1: " << transform1.rotation << " degrees" << std::endl;
+ std::cout << "Rotation of Box 2: " << transform2.rotation << " degrees" << std::endl;
+
+
+ // Calculate half-extents (half width and half height)
+ double half_width1 = box1.width / 2.0;
+ double half_height1 = box1.height / 2.0;
+ double half_width2 = box2.width / 2.0;
+ double 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
+}
+bool CollisionSystem::check_box_circle_collision(const BoxCollider& box, const CircleCollider& circle) {}
+bool CollisionSystem::check_circle_circle_collision(const CircleCollider& circle1, const CircleCollider& circle2) {}
diff --git a/src/crepe/system/CollisionSystem.h b/src/crepe/system/CollisionSystem.h
index 1e9f1aa..402ba64 100644
--- a/src/crepe/system/CollisionSystem.h
+++ b/src/crepe/system/CollisionSystem.h
@@ -1,11 +1,25 @@
#pragma once
+#include "Collider.h"
+#include <vector>
+
namespace crepe {
+class Collider;
+class BoxCollider;
+class CircleCollider;
+class Transform;
+class Rigidbody;
+
class CollisionSystem {
public:
CollisionSystem();
void update();
+private:
+ bool check_collisions(const std::vector<Collider*>& colliders1, const std::vector<Collider*>& colliders2);
+ bool check_box_box_collision(const BoxCollider& box1, const BoxCollider& box2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2);
+ bool check_box_circle_collision(const BoxCollider& box, const CircleCollider& circle);
+ bool check_circle_circle_collision(const CircleCollider& circle1, const CircleCollider& circle2);
};
} // namespace crepe
diff --git a/src/example/CMakeLists.txt b/src/example/CMakeLists.txt
index 36f9d4d..d43d56c 100644
--- a/src/example/CMakeLists.txt
+++ b/src/example/CMakeLists.txt
@@ -28,4 +28,5 @@ add_example(proxy)
add_example(db)
add_example(ecs)
add_example(scene_manager)
+add_example(collision)
diff --git a/src/example/collision.cpp b/src/example/collision.cpp
new file mode 100644
index 0000000..9faac69
--- /dev/null
+++ b/src/example/collision.cpp
@@ -0,0 +1,42 @@
+#include "api/BoxCollider.h"
+#include "system/CollisionSystem.h"
+#include <crepe/Component.h>
+#include <crepe/ComponentManager.h>
+#include <crepe/api/GameObject.h>
+#include <crepe/api/Rigidbody.h>
+#include <crepe/api/BoxCollider.h>
+#include <crepe/api/Transform.h>
+#include <crepe/system/PhysicsSystem.h>
+
+using namespace crepe;
+using namespace std;
+
+int main(int argc, char * argv[]) {
+
+ GameObject game_object1(0, "Name", "Tag", Vector2{1, 1}, 90, 1);
+ game_object1.add_component<Rigidbody>(Rigidbody::Data{
+ .mass = 1,
+ .gravity_scale = 1,
+ .body_type = Rigidbody::BodyType::DYNAMIC,
+ .constraints = {0, 0, 0},
+ .use_gravity = true,
+ .bounce = false,
+ .offset = {3,3}
+ });
+ game_object1.add_component<BoxCollider>(Vector2{5, 5}, 100, 50);
+
+ GameObject game_object2(1, "Name", "Tag", Vector2{20, 2}, 90, 1);
+ game_object2.add_component<Rigidbody>(Rigidbody::Data{
+ .mass = 1,
+ .gravity_scale = 1,
+ .body_type = Rigidbody::BodyType::DYNAMIC,
+ .constraints = {0, 0, 0},
+ .use_gravity = true,
+ .bounce = false,
+ .offset = {4,4}
+ });
+ game_object2.add_component<BoxCollider>(Vector2{6, 6}, 100, 50);
+ CollisionSystem coltest;
+ coltest.update();
+ return 0;
+}