From 428182f45797de73b0bc2335916d25762b0d719b Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sun, 10 Nov 2024 19:49:10 +0100 Subject: created colliders --- src/crepe/Collider.cpp | 2 +- src/crepe/Collider.h | 6 +++--- src/crepe/api/BoxCollider.cpp | 8 ++++++++ src/crepe/api/BoxCollider.h | 15 +++++++++++++++ src/crepe/api/CircleCollider.cpp | 8 ++++++++ src/crepe/api/CircleCollider.h | 7 ++++--- 6 files changed, 39 insertions(+), 7 deletions(-) create mode 100644 src/crepe/api/BoxCollider.cpp create mode 100644 src/crepe/api/BoxCollider.h create mode 100644 src/crepe/api/CircleCollider.cpp (limited to 'src/crepe') diff --git a/src/crepe/Collider.cpp b/src/crepe/Collider.cpp index bbec488..0706371 100644 --- a/src/crepe/Collider.cpp +++ b/src/crepe/Collider.cpp @@ -2,4 +2,4 @@ using namespace crepe; -Collider::Collider(game_object_id_t id) : Component(id) {} +Collider::Collider(game_object_id_t id, Vector2 offset) : Component(id), offset(offset) {} diff --git a/src/crepe/Collider.h b/src/crepe/Collider.h index 827f83d..54695b1 100644 --- a/src/crepe/Collider.h +++ b/src/crepe/Collider.h @@ -1,14 +1,14 @@ #pragma once #include "Component.h" +#include "api/Vector2.h" namespace crepe { class Collider : public Component { public: - Collider(game_object_id_t id); - - int size; + Collider(game_object_id_t id, Vector2 offset); + Vector2 offset; }; } // namespace crepe diff --git a/src/crepe/api/BoxCollider.cpp b/src/crepe/api/BoxCollider.cpp new file mode 100644 index 0000000..c3cb60c --- /dev/null +++ b/src/crepe/api/BoxCollider.cpp @@ -0,0 +1,8 @@ +#pragma once + +#include "BoxCollider.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) {} diff --git a/src/crepe/api/BoxCollider.h b/src/crepe/api/BoxCollider.h new file mode 100644 index 0000000..2461636 --- /dev/null +++ b/src/crepe/api/BoxCollider.h @@ -0,0 +1,15 @@ +#pragma once + +#include "Vector2.h" +#include "../Collider.h" + +namespace crepe { + +class BoxCollider : public Collider { +public: + BoxCollider(game_object_id_t game_object_id,Vector2 offset, int width, int height); + double width; + double height; +}; + +} // namespace crepe diff --git a/src/crepe/api/CircleCollider.cpp b/src/crepe/api/CircleCollider.cpp new file mode 100644 index 0000000..9365793 --- /dev/null +++ b/src/crepe/api/CircleCollider.cpp @@ -0,0 +1,8 @@ +#pragma once + +#include "CircleCollider.h" + +using namespace crepe; + + +CircleCollider::CircleCollider(game_object_id_t game_object_id,Vector2 offset, int radius) : Collider(game_object_id,offset), radius(radius) {} diff --git a/src/crepe/api/CircleCollider.h b/src/crepe/api/CircleCollider.h index caa7e43..3a66355 100644 --- a/src/crepe/api/CircleCollider.h +++ b/src/crepe/api/CircleCollider.h @@ -1,13 +1,14 @@ #pragma once + +#include "Vector2.h" #include "../Collider.h" namespace crepe { class CircleCollider : public Collider { public: - CircleCollider(game_object_id_t game_object_id, int radius) - : Collider(game_object_id), radius(radius) {} - int radius; + CircleCollider(game_object_id_t game_object_id,Vector2 offset, int radius); + double radius; }; } // namespace crepe -- cgit v1.2.3 From 47dd27c42f375b65ee53f8b1e8c1b25327315a92 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Sun, 10 Nov 2024 21:38:58 +0100 Subject: box-box collision --- src/crepe/api/BoxCollider.cpp | 5 +-- src/crepe/api/BoxCollider.h | 2 +- src/crepe/api/CMakeLists.txt | 4 ++ src/crepe/api/CircleCollider.cpp | 2 - src/crepe/api/CircleCollider.h | 1 + src/crepe/api/Rigidbody.h | 2 + src/crepe/system/CollisionSystem.cpp | 82 +++++++++++++++++++++++++++++++++++- src/crepe/system/CollisionSystem.h | 14 ++++++ src/example/CMakeLists.txt | 1 + src/example/collision.cpp | 42 ++++++++++++++++++ 10 files changed, 148 insertions(+), 7 deletions(-) create mode 100644 src/example/collision.cpp (limited to 'src/crepe') 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 + #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> boxcolliders = mgr.get_components_by_type(); + + Transform & transform1 = mgr.get_components_by_id(boxcolliders[0].get().game_object_id).front().get(); + Rigidbody & rigidbody1 = mgr.get_components_by_id(boxcolliders[0].get().game_object_id).front().get(); + Transform & transform2 = mgr.get_components_by_id(boxcolliders[1].get().game_object_id).front().get(); + Rigidbody & rigidbody2 = mgr.get_components_by_id(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& colliders1, const std::vector& 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 + 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& colliders1, const std::vector& 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 +#include +#include +#include +#include +#include +#include + +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::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(Vector2{5, 5}, 100, 50); + + GameObject game_object2(1, "Name", "Tag", Vector2{20, 2}, 90, 1); + game_object2.add_component(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(Vector2{6, 6}, 100, 50); + CollisionSystem coltest; + coltest.update(); + return 0; +} -- cgit v1.2.3 From f2e5b685fd1357b55beeea967b12b353c5d65fb5 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Mon, 11 Nov 2024 20:49:55 +0100 Subject: fixed build issue --- src/crepe/api/Vector2.cpp | 10 +++++++--- src/crepe/api/Vector2.h | 13 ++++++++----- src/example/collision.cpp | 12 ++++++------ 3 files changed, 21 insertions(+), 14 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Vector2.cpp b/src/crepe/api/Vector2.cpp index 09bb59b..947c49e 100644 --- a/src/crepe/api/Vector2.cpp +++ b/src/crepe/api/Vector2.cpp @@ -3,7 +3,7 @@ namespace crepe { // Constructor with initial values -Vector2::Vector2(float x, float y) : x(x), y(y) {} +Vector2::Vector2(double x, double y) : x(x), y(y) {} // Subtracts another vector from this vector and returns the result. Vector2 Vector2::operator-(const Vector2 & other) const { @@ -16,7 +16,7 @@ Vector2 Vector2::operator+(const Vector2 & other) const { } // Multiplies this vector by a scalar and returns the result. -Vector2 Vector2::operator*(float scalar) const { +Vector2 Vector2::operator*(double scalar) const { return {x * scalar, y * scalar}; } @@ -35,7 +35,7 @@ Vector2 & Vector2::operator+=(const Vector2 & other) { } // Adds a scalar value to both components of this vector and updates this vector. -Vector2 & Vector2::operator+=(float other) { +Vector2 & Vector2::operator+=(double other) { x += other; y += other; return *this; @@ -54,4 +54,8 @@ bool Vector2::operator!=(const Vector2 & other) const { return !(*this == other); } +double Vector2::dot(const Vector2& other) const { + return this->x * other.x + this->y * other.y; +} + } // namespace crepe diff --git a/src/crepe/api/Vector2.h b/src/crepe/api/Vector2.h index 741951b..90d9d57 100644 --- a/src/crepe/api/Vector2.h +++ b/src/crepe/api/Vector2.h @@ -6,15 +6,15 @@ namespace crepe { class Vector2 { public: //! X component of the vector - float x; + double x; //! Y component of the vector - float y; + double y; //! Default constructor Vector2() = default; //! Constructor with initial values - Vector2(float x, float y); + Vector2(double x, double y); //! Subtracts another vector from this vector and returns the result. Vector2 operator-(const Vector2 & other) const; @@ -23,7 +23,7 @@ public: Vector2 operator+(const Vector2 & other) const; //! Multiplies this vector by a scalar and returns the result. - Vector2 operator*(float scalar) const; + Vector2 operator*(double scalar) const; //! Multiplies this vector by another vector element-wise and updates this vector. Vector2 & operator*=(const Vector2 & other); @@ -32,7 +32,7 @@ public: Vector2 & operator+=(const Vector2 & other); //! Adds a scalar value to both components of this vector and updates this vector. - Vector2 & operator+=(float other); + Vector2 & operator+=(double other); //! Returns the negation of this vector. Vector2 operator-() const; @@ -42,6 +42,9 @@ public: //! Checks if this vector is not equal to another vector. bool operator!=(const Vector2 & other) const; + + //! + double dot(const Vector2& other) const; }; } // namespace crepe diff --git a/src/example/collision.cpp b/src/example/collision.cpp index 9faac69..dc97c81 100644 --- a/src/example/collision.cpp +++ b/src/example/collision.cpp @@ -13,7 +13,7 @@ using namespace std; int main(int argc, char * argv[]) { - GameObject game_object1(0, "Name", "Tag", Vector2{1, 1}, 90, 1); + GameObject game_object1(0, "Name", "Tag", Vector2{10, 10}, 0, 1); game_object1.add_component(Rigidbody::Data{ .mass = 1, .gravity_scale = 1, @@ -21,11 +21,11 @@ int main(int argc, char * argv[]) { .constraints = {0, 0, 0}, .use_gravity = true, .bounce = false, - .offset = {3,3} + .offset = {0,0} }); - game_object1.add_component(Vector2{5, 5}, 100, 50); + game_object1.add_component(Vector2{5, 5}, 5, 5); - GameObject game_object2(1, "Name", "Tag", Vector2{20, 2}, 90, 1); + GameObject game_object2(1, "Name", "Tag", Vector2{20, 0}, 90, 1); game_object2.add_component(Rigidbody::Data{ .mass = 1, .gravity_scale = 1, @@ -33,9 +33,9 @@ int main(int argc, char * argv[]) { .constraints = {0, 0, 0}, .use_gravity = true, .bounce = false, - .offset = {4,4} + .offset = {0,0} }); - game_object2.add_component(Vector2{6, 6}, 100, 50); + game_object2.add_component(Vector2{5, 5}, 5, 5); CollisionSystem coltest; coltest.update(); return 0; -- cgit v1.2.3 From 73127fd15a3b074cb3c964da448b6bb3d237ee73 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Tue, 12 Nov 2024 16:09:43 +0100 Subject: added collision methodes --- src/crepe/system/CollisionSystem.cpp | 156 ++++++++++++++++++++++++++--------- src/crepe/system/CollisionSystem.h | 7 +- src/example/collision.cpp | 26 ++++++ 3 files changed, 147 insertions(+), 42 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 75d5c58..71bca6b 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -1,4 +1,6 @@ #include +#include +#include #include "CollisionSystem.h" @@ -19,48 +21,55 @@ CollisionSystem::CollisionSystem() {} void CollisionSystem::update() { ComponentManager & mgr = ComponentManager::get_instance(); std::vector> boxcolliders = mgr.get_components_by_type(); - - Transform & transform1 = mgr.get_components_by_id(boxcolliders[0].get().game_object_id).front().get(); - Rigidbody & rigidbody1 = mgr.get_components_by_id(boxcolliders[0].get().game_object_id).front().get(); - Transform & transform2 = mgr.get_components_by_id(boxcolliders[1].get().game_object_id).front().get(); - Rigidbody & rigidbody2 = mgr.get_components_by_id(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; + std::vector> circlecolliders = mgr.get_components_by_type(); + check_collisions(boxcolliders,circlecolliders); } +void CollisionSystem::check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) { + ComponentManager & mgr = ComponentManager::get_instance(); + //if no colliders skip + //check if colliders has rigibocdy if not skip + + //if amount is higer than lets say 16 for now use quadtree otwerwise skip + //quadtree code + //quadtree is placed over the input vector + + //check collision + for (size_t i = 0; i < boxcolliders.size(); ++i) { + for (size_t j = i + 1; j < boxcolliders.size(); ++j) { + if(boxcolliders[i].get().game_object_id == boxcolliders[j].get().game_object_id){continue;} + Transform & transform1 = mgr.get_components_by_id(boxcolliders[i].get().game_object_id).front().get(); + Rigidbody & rigidbody1 = mgr.get_components_by_id(boxcolliders[i].get().game_object_id).front().get(); + Transform & transform2 = mgr.get_components_by_id(boxcolliders[j].get().game_object_id).front().get(); + Rigidbody & rigidbody2 = mgr.get_components_by_id(boxcolliders[j].get().game_object_id).front().get(); + check_box_box_collision(boxcolliders[i], boxcolliders[j], transform1, transform2, rigidbody1, rigidbody2); + } + for (size_t j = 0; j < circlecolliders.size(); ++j) { + if(boxcolliders[i].get().game_object_id == circlecolliders[j].get().game_object_id){continue;} + Transform & transform1 = mgr.get_components_by_id(boxcolliders[i].get().game_object_id).front().get(); + Rigidbody & rigidbody1 = mgr.get_components_by_id(boxcolliders[i].get().game_object_id).front().get(); + Transform & transform2 = mgr.get_components_by_id(circlecolliders[j].get().game_object_id).front().get(); + Rigidbody & rigidbody2 = mgr.get_components_by_id(circlecolliders[j].get().game_object_id).front().get(); + check_box_circle_collision(boxcolliders[i], circlecolliders[j], transform1, transform2, rigidbody1, rigidbody2); + } + } + for (size_t i = 0; i < circlecolliders.size(); ++i) { + for (size_t j = i + 1; j < circlecolliders.size(); ++j) { + if(circlecolliders[i].get().game_object_id == circlecolliders[j].get().game_object_id){continue;} + Transform & transform1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); + Rigidbody & rigidbody1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); + Transform & transform2 = mgr.get_components_by_id(circlecolliders[j].get().game_object_id).front().get(); + Rigidbody & rigidbody2 = mgr.get_components_by_id(circlecolliders[j].get().game_object_id).front().get(); + check_circle_circle_collision(circlecolliders[i], circlecolliders[j], transform1, transform2, rigidbody1, rigidbody2); + } + } +} - -bool CollisionSystem::check_collisions(const std::vector& colliders1, const std::vector& 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); + // Get current positions of colliders + Vector2 final_position1 = current_position(box1,transform1,rigidbody1); + Vector2 final_position2 = current_position(box2,transform2,rigidbody2); // Log final positions for debugging purposes std::cout << "Final Position of Box 1: (" << final_position1.x << ", " << final_position1.y << ")" << std::endl; @@ -83,5 +92,74 @@ bool CollisionSystem::check_box_box_collision(const BoxCollider& box1, const Box 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) {} + +bool CollisionSystem::check_box_circle_collision(const BoxCollider& box1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2) { + // Get current positions of colliders + Vector2 final_position1 = current_position(box1, transform1, rigidbody1); + Vector2 final_position2 = current_position(circle2, transform2, rigidbody2); + + // Log final positions for debugging purposes + std::cout << "Final Position of Box: (" << final_position1.x << ", " << final_position1.y << ")" << std::endl; + std::cout << "Final Position of Circle: (" << final_position2.x << ", " << final_position2.y << ")" << std::endl; + + // Calculate box half-extents + double half_width = box1.width / 2.0; + double half_height = box1.height / 2.0; + + // Find the closest point on the box to the circle's center + double closest_x = std::clamp(final_position2.x, final_position1.x - half_width, final_position1.x + half_width); + double closest_y = std::clamp(final_position2.y, final_position1.y - half_height, final_position1.y + half_height); + + // Calculate the distance squared between the circle's center and the closest point on the box + double distance_x = final_position2.x - closest_x; + double distance_y = final_position2.y - closest_y; + double distance_squared = distance_x * distance_x + distance_y * distance_y; + + // Compare distance squared with the square of the circle's radius + return distance_squared <= circle2.radius * circle2.radius; +} + +bool CollisionSystem::check_circle_circle_collision(const CircleCollider& circle1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2) { + // Get current positions of colliders + Vector2 final_position1 = current_position(circle1,transform1,rigidbody1); + Vector2 final_position2 = current_position(circle2,transform2,rigidbody2); + + // Log final positions for debugging purposes + std::cout << "Final Position of Circle 1: (" << final_position1.x << ", " << final_position1.y << ")" << std::endl; + std::cout << "Final Position of Circle 2: (" << final_position2.x << ", " << final_position2.y << ")" << std::endl; + + // Log rotation values for debugging (circles do not rotate, so this might not be needed for circles) + std::cout << "Rotation of Circle 1: " << transform1.rotation << " degrees" << std::endl; + std::cout << "Rotation of Circle 2: " << transform2.rotation << " degrees" << std::endl; + + double distance_x = final_position1.x - final_position2.x; + double distance_y = final_position1.y - final_position2.y; + double distance_squared = distance_x * distance_x + distance_y * distance_y; + + // Calculate the sum of the radii + double radius_sum = circle1.radius + circle2.radius; + + // Check if the distance between the centers is less than or equal to the sum of the radii + return distance_squared <= radius_sum * radius_sum; +} + +Vector2 CollisionSystem::current_position(const Collider& collider, const Transform& transform, const Rigidbody& rigidbody) { + // 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(transform.rotation); + + // Calculate total offset with scale + Vector2 total_offset = (rigidbody.data.offset + collider.offset) * transform.scale; + + // Rotate + double rotated_total_offset_x1 = total_offset.x * cos(radians1) - total_offset.y * sin(radians1); + double rotated_total_offset_y1 = total_offset.x * sin(radians1) + total_offset.y * cos(radians1); + + // Final positions considering scaling and rotation + return(transform.position + Vector2(rotated_total_offset_x1, rotated_total_offset_y1)); + +} \ No newline at end of file diff --git a/src/crepe/system/CollisionSystem.h b/src/crepe/system/CollisionSystem.h index 402ba64..a369ee9 100644 --- a/src/crepe/system/CollisionSystem.h +++ b/src/crepe/system/CollisionSystem.h @@ -16,10 +16,11 @@ public: CollisionSystem(); void update(); private: - bool check_collisions(const std::vector& colliders1, const std::vector& colliders2); + void check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) ; 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); + bool check_box_circle_collision(const BoxCollider& box1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); + bool check_circle_circle_collision(const CircleCollider& circle1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); + Vector2 current_position(const Collider& collider, const Transform& transform, const Rigidbody& rigidbody); }; } // namespace crepe diff --git a/src/example/collision.cpp b/src/example/collision.cpp index dc97c81..e82b493 100644 --- a/src/example/collision.cpp +++ b/src/example/collision.cpp @@ -7,11 +7,24 @@ #include #include #include +#include +#include + +#include +#include +#include +#include +#include +#include + +#include +#include using namespace crepe; using namespace std; int main(int argc, char * argv[]) { + Color color(0, 0, 0, 0); GameObject game_object1(0, "Name", "Tag", Vector2{10, 10}, 0, 1); game_object1.add_component(Rigidbody::Data{ @@ -24,6 +37,10 @@ int main(int argc, char * argv[]) { .offset = {0,0} }); game_object1.add_component(Vector2{5, 5}, 5, 5); + // game_object1.add_component( + // make_shared("/home/jaro/crepe/asset/texture/img.png"), color, + // FlipSettings{true, true}); + GameObject game_object2(1, "Name", "Tag", Vector2{20, 0}, 90, 1); game_object2.add_component(Rigidbody::Data{ @@ -36,7 +53,16 @@ int main(int argc, char * argv[]) { .offset = {0,0} }); game_object2.add_component(Vector2{5, 5}, 5, 5); + // game_object2.add_component( + // make_shared("/home/jaro/crepe/asset/texture/img.png"), color, + // FlipSettings{true, true}); + CollisionSystem coltest; coltest.update(); + // auto & sys = crepe::RenderSystem::get_instance(); + // auto start = std::chrono::steady_clock::now(); + // while (std::chrono::steady_clock::now() - start < std::chrono::seconds(5)) { + // sys.update(); + // } return 0; } -- cgit v1.2.3 From 6e0da5ae80aaa8b7de265c61294e91d574cd9cc2 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Tue, 12 Nov 2024 16:28:48 +0100 Subject: added comments to system --- src/crepe/system/CollisionSystem.cpp | 80 ++++++++++++++++++++++++++++-------- src/crepe/system/CollisionSystem.h | 2 +- 2 files changed, 63 insertions(+), 19 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 71bca6b..a6cf891 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -22,11 +22,18 @@ void CollisionSystem::update() { ComponentManager & mgr = ComponentManager::get_instance(); std::vector> boxcolliders = mgr.get_components_by_type(); std::vector> circlecolliders = mgr.get_components_by_type(); - check_collisions(boxcolliders,circlecolliders); + std::vector> collided = check_collisions(boxcolliders,circlecolliders); + for (const auto& collision : collided) { + std::cout << "Object " << collision.first << " collided with Object " << collision.second << std::endl; + } + if(collided.empty()) { + std::cout << "No objects collided" << std::endl; + } } -void CollisionSystem::check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) { - ComponentManager & mgr = ComponentManager::get_instance(); +std::vector> CollisionSystem::check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) { + ComponentManager & mgr = ComponentManager::get_instance(); + std::vector> collisions_ret; //if no colliders skip //check if colliders has rigibocdy if not skip @@ -34,35 +41,71 @@ void CollisionSystem::check_collisions(const std::vector(game_object_id_1).front().get(); + Rigidbody& rigidbody1 = mgr.get_components_by_id(game_object_id_1).front().get(); + + // Check CircleCollider vs CircleCollider for (size_t j = i + 1; j < boxcolliders.size(); ++j) { - if(boxcolliders[i].get().game_object_id == boxcolliders[j].get().game_object_id){continue;} - Transform & transform1 = mgr.get_components_by_id(boxcolliders[i].get().game_object_id).front().get(); - Rigidbody & rigidbody1 = mgr.get_components_by_id(boxcolliders[i].get().game_object_id).front().get(); + + // Skip self collision + int game_object_id_2 = boxcolliders[j].get().game_object_id; + if (game_object_id_1 == game_object_id_2) continue; + + // Fetch components for the second box collider Transform & transform2 = mgr.get_components_by_id(boxcolliders[j].get().game_object_id).front().get(); Rigidbody & rigidbody2 = mgr.get_components_by_id(boxcolliders[j].get().game_object_id).front().get(); - check_box_box_collision(boxcolliders[i], boxcolliders[j], transform1, transform2, rigidbody1, rigidbody2); + + // Check collision + if (check_box_box_collision(boxcolliders[i], boxcolliders[j], transform1, transform2, rigidbody1, rigidbody2)) { + collisions_ret.emplace_back(game_object_id_1, game_object_id_2); + } } + + // Check BoxCollider vs CircleCollider for (size_t j = 0; j < circlecolliders.size(); ++j) { - if(boxcolliders[i].get().game_object_id == circlecolliders[j].get().game_object_id){continue;} - Transform & transform1 = mgr.get_components_by_id(boxcolliders[i].get().game_object_id).front().get(); - Rigidbody & rigidbody1 = mgr.get_components_by_id(boxcolliders[i].get().game_object_id).front().get(); + + // Skip self collision + int game_object_id_2 = boxcolliders[j].get().game_object_id; + if (game_object_id_1 == game_object_id_2) continue; + + // Fetch components for the second collider (circle) Transform & transform2 = mgr.get_components_by_id(circlecolliders[j].get().game_object_id).front().get(); Rigidbody & rigidbody2 = mgr.get_components_by_id(circlecolliders[j].get().game_object_id).front().get(); - check_box_circle_collision(boxcolliders[i], circlecolliders[j], transform1, transform2, rigidbody1, rigidbody2); + + // Check collision + if (check_box_circle_collision(boxcolliders[i], circlecolliders[j], transform1, transform2, rigidbody1, rigidbody2)) { + collisions_ret.emplace_back(game_object_id_1, game_object_id_2); + } } } + // Check CircleCollider vs CircleCollider for (size_t i = 0; i < circlecolliders.size(); ++i) { + + // Fetch components for the first circle collider + int game_object_id_1 = boxcolliders[i].get().game_object_id; + Transform & transform1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); + Rigidbody & rigidbody1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); for (size_t j = i + 1; j < circlecolliders.size(); ++j) { - if(circlecolliders[i].get().game_object_id == circlecolliders[j].get().game_object_id){continue;} - Transform & transform1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); - Rigidbody & rigidbody1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); + + // Skip self collision + int game_object_id_2 = boxcolliders[j].get().game_object_id; + if (game_object_id_1 == game_object_id_2) continue; + + // Fetch components for the second circle collider Transform & transform2 = mgr.get_components_by_id(circlecolliders[j].get().game_object_id).front().get(); Rigidbody & rigidbody2 = mgr.get_components_by_id(circlecolliders[j].get().game_object_id).front().get(); - check_circle_circle_collision(circlecolliders[i], circlecolliders[j], transform1, transform2, rigidbody1, rigidbody2); + + // Check collision + if (check_circle_circle_collision(circlecolliders[i], circlecolliders[j], transform1, transform2, rigidbody1, rigidbody2)) { + collisions_ret.emplace_back(game_object_id_1, game_object_id_2); + } } } + return collisions_ret; } bool CollisionSystem::check_box_box_collision(const BoxCollider& box1, const BoxCollider& box2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2) @@ -107,8 +150,9 @@ bool CollisionSystem::check_box_circle_collision(const BoxCollider& box1, const double half_height = box1.height / 2.0; // Find the closest point on the box to the circle's center - double closest_x = std::clamp(final_position2.x, final_position1.x - half_width, final_position1.x + half_width); - double closest_y = std::clamp(final_position2.y, final_position1.y - half_height, final_position1.y + half_height); + double closest_x = std::max(final_position1.x - half_width, std::min(final_position2.x, final_position1.x + half_width)); + double closest_y = std::max(final_position1.y - half_height, std::min(final_position2.y, final_position1.y + half_height)); + // Calculate the distance squared between the circle's center and the closest point on the box double distance_x = final_position2.x - closest_x; diff --git a/src/crepe/system/CollisionSystem.h b/src/crepe/system/CollisionSystem.h index a369ee9..23e8245 100644 --- a/src/crepe/system/CollisionSystem.h +++ b/src/crepe/system/CollisionSystem.h @@ -16,7 +16,7 @@ public: CollisionSystem(); void update(); private: - void check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) ; + std::vector> check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) ; 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& box1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); bool check_circle_circle_collision(const CircleCollider& circle1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); -- cgit v1.2.3 From 15c4cf103c4da7808b7173581ead22ab7190632d Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Thu, 14 Nov 2024 18:49:17 +0100 Subject: updated test --- src/crepe/system/CollisionSystem.cpp | 3 +- src/test/CMakeLists.txt | 1 + src/test/CollisionTest.cpp | 107 ++++++++++++++--------------------- src/test/PhysicsTest.cpp | 1 + 4 files changed, 46 insertions(+), 66 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index a6cf891..0d056a5 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -23,6 +23,7 @@ void CollisionSystem::update() { std::vector> boxcolliders = mgr.get_components_by_type(); std::vector> circlecolliders = mgr.get_components_by_type(); std::vector> collided = check_collisions(boxcolliders,circlecolliders); + std::cout << "DEBUG INFO" << std::endl; for (const auto& collision : collided) { std::cout << "Object " << collision.first << " collided with Object " << collision.second << std::endl; } @@ -206,4 +207,4 @@ Vector2 CollisionSystem::current_position(const Collider& collider, const Transf // Final positions considering scaling and rotation return(transform.position + Vector2(rotated_total_offset_x1, rotated_total_offset_y1)); -} \ No newline at end of file +} diff --git a/src/test/CMakeLists.txt b/src/test/CMakeLists.txt index 0e4eaed..8618ae6 100644 --- a/src/test/CMakeLists.txt +++ b/src/test/CMakeLists.txt @@ -2,5 +2,6 @@ target_sources(test_main PUBLIC dummy.cpp # audio.cpp PhysicsTest.cpp + CollisionTest.cpp ) diff --git a/src/test/CollisionTest.cpp b/src/test/CollisionTest.cpp index 1dfe808..1c4c325 100644 --- a/src/test/CollisionTest.cpp +++ b/src/test/CollisionTest.cpp @@ -6,7 +6,7 @@ #include #include #include -#include +#include #include using namespace std; @@ -17,70 +17,42 @@ class CollisionTest : public ::testing::Test { protected: GameObject * game_object1; GameObject * game_object2; - PhysicsSystem physics_system; + CollisionSystem collision_system; void SetUp() override { ComponentManager & mgr = ComponentManager::get_instance(); + mgr.delete_all_components(); std::vector> transforms = mgr.get_components_by_id(0); - if (transforms.empty()) { - double width,height,radius = 10; - // ob 1 - game_object1 = new GameObject(0, "", "", Vector2{0, 0}, 0, 0); - game_object1->add_component(Rigidbody::Data{ - .mass = 1, - .gravity_scale = 1, - .body_type = Rigidbody::BodyType::DYNAMIC, - .max_linear_velocity = Vector2{10, 10}, - .max_angular_velocity = 10, - .constraints = {0, 0}, - .use_gravity = true, - .bounce = false, - }); - - game_object1->add_component(Vector2{0,0},width,height); - game_object1->add_component(Vector2{0,0},radius); - //ob 2 - game_object2 = new GameObject(0, "", "", Vector2{0, 0}, 0, 0); - game_object2->add_component(Rigidbody::Data{ - .mass = 1, - .gravity_scale = 1, - .body_type = Rigidbody::BodyType::DYNAMIC, - .max_linear_velocity = Vector2{10, 10}, - .max_angular_velocity = 10, - .constraints = {0, 0}, - .use_gravity = true, - .bounce = false, - }); - game_object2->add_component(Vector2{0,0},width,height); - game_object2->add_component(Vector2{0,0},radius); - - } - for (int i = 0; i < 2; i ++) { - transforms = mgr.get_components_by_id(i); - Transform & transform = transforms.front().get(); - transform.position.x = 0.0; - transform.position.y = 0.0; - transform.rotation = 0.0; - std::vector> rigidbodies - = mgr.get_components_by_id(i); - Rigidbody & rigidbody = rigidbodies.front().get(); - rigidbody.data.angular_velocity = 0; - rigidbody.data.linear_velocity.x = 0; - rigidbody.data.linear_velocity.y = 0; - std::vector> boxcolliders - = mgr.get_components_by_id(i); - BoxCollider & box_collider = boxcolliders.front().get(); - box_collider.offset = {0,0}; - box_collider.width = 10; - box_collider.height = 10; - std::vector> circlecolliders - = mgr.get_components_by_id(i); - CircleCollider & circle_collider = circlecolliders.front().get(); - circle_collider.offset = {0,0}; - circle_collider.radius = 10; - } + // ob 1 + game_object1 = new GameObject(0, "", "", Vector2{0, 0}, 0, 0); + game_object1->add_component(Rigidbody::Data{ + .mass = 1, + .gravity_scale = 1, + .body_type = Rigidbody::BodyType::DYNAMIC, + .max_linear_velocity = Vector2{10, 10}, + .max_angular_velocity = 10, + .constraints = {0, 0, 0}, + .use_gravity = false, + .bounce = false, + }); + + game_object1->add_component(Vector2{0,0},10,10); + + //ob 2 + game_object2 = new GameObject(1, "", "", Vector2{50, 50}, 0, 0); + game_object2->add_component(Rigidbody::Data{ + .mass = 1, + .gravity_scale = 1, + .body_type = Rigidbody::BodyType::DYNAMIC, + .max_linear_velocity = Vector2{10, 10}, + .max_angular_velocity = 10, + .constraints = {0, 0, 0}, + .use_gravity = false, + .bounce = false, + }); + game_object2->add_component(Vector2{0,0},10,10); } }; @@ -89,12 +61,17 @@ TEST_F(CollisionTest, box_box_collision) { ComponentManager & mgr = ComponentManager::get_instance(); std::vector> transforms = mgr.get_components_by_id(0); - const Transform & transform = transforms.front().get(); + Transform & transform = transforms.front().get(); ASSERT_FALSE(transforms.empty()); - EXPECT_EQ(transform.position.y, 0); - physics_system.update(); - EXPECT_EQ(transform.position.y, 1); - physics_system.update(); - EXPECT_EQ(transform.position.y, 3); + transform.position = {39,50}; + collision_system.update(); + transform.position = {40,50}; + collision_system.update(); + transform.position = {41,50}; + collision_system.update(); + transform.position = {44,50}; + collision_system.update(); + transform.position = {50,50}; + collision_system.update(); } diff --git a/src/test/PhysicsTest.cpp b/src/test/PhysicsTest.cpp index 5385962..3332f74 100644 --- a/src/test/PhysicsTest.cpp +++ b/src/test/PhysicsTest.cpp @@ -16,6 +16,7 @@ protected: PhysicsSystem physics_system; void SetUp() override { ComponentManager & mgr = ComponentManager::get_instance(); + mgr.delete_all_components(); std::vector> transforms = mgr.get_components_by_id(0); if (transforms.empty()) { -- cgit v1.2.3 From b748691ea7aab8bd12ed76e81f9e9b4539e7d2f7 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Thu, 14 Nov 2024 19:07:07 +0100 Subject: fixed bugs in collision system --- src/crepe/system/CollisionSystem.cpp | 6 +++--- src/test/CollisionTest.cpp | 14 ++++++++++---- 2 files changed, 13 insertions(+), 7 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 0d056a5..a3c59e3 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -70,7 +70,7 @@ std::vector> CollisionSystem::check_collisions(const std::ve for (size_t j = 0; j < circlecolliders.size(); ++j) { // Skip self collision - int game_object_id_2 = boxcolliders[j].get().game_object_id; + int game_object_id_2 = circlecolliders[j].get().game_object_id; if (game_object_id_1 == game_object_id_2) continue; // Fetch components for the second collider (circle) @@ -87,13 +87,13 @@ std::vector> CollisionSystem::check_collisions(const std::ve for (size_t i = 0; i < circlecolliders.size(); ++i) { // Fetch components for the first circle collider - int game_object_id_1 = boxcolliders[i].get().game_object_id; + int game_object_id_1 = circlecolliders[i].get().game_object_id; Transform & transform1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); Rigidbody & rigidbody1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); for (size_t j = i + 1; j < circlecolliders.size(); ++j) { // Skip self collision - int game_object_id_2 = boxcolliders[j].get().game_object_id; + int game_object_id_2 = circlecolliders[j].get().game_object_id; if (game_object_id_1 == game_object_id_2) continue; // Fetch components for the second circle collider diff --git a/src/test/CollisionTest.cpp b/src/test/CollisionTest.cpp index 1c4c325..3e43479 100644 --- a/src/test/CollisionTest.cpp +++ b/src/test/CollisionTest.cpp @@ -52,7 +52,7 @@ protected: .use_gravity = false, .bounce = false, }); - game_object2->add_component(Vector2{0,0},10,10); + game_object2->add_component(Vector2{0,0},5); } }; @@ -67,11 +67,17 @@ TEST_F(CollisionTest, box_box_collision) { collision_system.update(); transform.position = {40,50}; collision_system.update(); - transform.position = {41,50}; + transform.position = {50,39}; collision_system.update(); - transform.position = {44,50}; + transform.position = {50,40}; collision_system.update(); - transform.position = {50,50}; + transform.position = {50,60}; + collision_system.update(); + transform.position = {50,61}; + collision_system.update(); + transform.position = {60,50}; + collision_system.update(); + transform.position = {61,50}; collision_system.update(); } -- cgit v1.2.3 From c9c132989053c5fcfb2b7e8d9f2c48a1896764f3 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Thu, 14 Nov 2024 21:04:39 +0100 Subject: improving how to save collisions --- src/crepe/system/CollisionSystem.cpp | 48 ++++++++++++++++++++++++++---------- src/crepe/system/CollisionSystem.h | 6 ++++- 2 files changed, 40 insertions(+), 14 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index a3c59e3..e6172b7 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -1,6 +1,7 @@ #include #include #include +#include #include "CollisionSystem.h" @@ -22,19 +23,39 @@ void CollisionSystem::update() { ComponentManager & mgr = ComponentManager::get_instance(); std::vector> boxcolliders = mgr.get_components_by_type(); std::vector> circlecolliders = mgr.get_components_by_type(); - std::vector> collided = check_collisions(boxcolliders,circlecolliders); - std::cout << "DEBUG INFO" << std::endl; - for (const auto& collision : collided) { - std::cout << "Object " << collision.first << " collided with Object " << collision.second << std::endl; + std::vector> collided = check_collisions(boxcolliders,circlecolliders); + std::cout << "DEBUG INFO" << std::endl; + for (const std::pair& collision : collided) { + + if (const BoxCollider* box_collider1 = std::get_if(&collision.first)) { + std::cout << "Processing a BoxCollider\n"; + if (const BoxCollider* box_collider2 = std::get_if(&collision.second)) { + std::cout << "Processing a BoxCollider\n"; + } else if (const CircleCollider* circle_collider2 = std::get_if(&collision.first)) { + std::cout << "Processing a CircleCollider\n"; + } + } else if (const CircleCollider* circle_collider1 = std::get_if(&collision.first)) { + std::cout << "Processing a CircleCollider\n"; + if (const BoxCollider* box_collider2 = std::get_if(&collision.first)) { + std::cout << "Processing a BoxCollider\n"; + } else if (const CircleCollider* circle_collider2 = std::get_if(&collision.first)) { + std::cout << "Processing a CircleCollider\n"; + } + } + } if(collided.empty()) { std::cout << "No objects collided" << std::endl; } } -std::vector> CollisionSystem::check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) { +void CollisionSystem::call_collision_handler(const Rigidbody& rigidbody1,const Rigidbody& rigidbody2){ + +} + +std::vector> CollisionSystem::check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) { ComponentManager & mgr = ComponentManager::get_instance(); - std::vector> collisions_ret; + std::vector> collisions_ret; //if no colliders skip //check if colliders has rigibocdy if not skip @@ -45,13 +66,14 @@ std::vector> CollisionSystem::check_collisions(const std::ve // Check collisions for (size_t i = 0; i < boxcolliders.size(); ++i) { // Fetch components for the first box collider + if(!boxcolliders[i].get().active) continue; int game_object_id_1 = boxcolliders[i].get().game_object_id; Transform& transform1 = mgr.get_components_by_id(game_object_id_1).front().get(); Rigidbody& rigidbody1 = mgr.get_components_by_id(game_object_id_1).front().get(); // Check CircleCollider vs CircleCollider for (size_t j = i + 1; j < boxcolliders.size(); ++j) { - + if(!boxcolliders[j].get().active) continue; // Skip self collision int game_object_id_2 = boxcolliders[j].get().game_object_id; if (game_object_id_1 == game_object_id_2) continue; @@ -62,13 +84,13 @@ std::vector> CollisionSystem::check_collisions(const std::ve // Check collision if (check_box_box_collision(boxcolliders[i], boxcolliders[j], transform1, transform2, rigidbody1, rigidbody2)) { - collisions_ret.emplace_back(game_object_id_1, game_object_id_2); + collisions_ret.emplace_back(boxcolliders[i], boxcolliders[j]); } } // Check BoxCollider vs CircleCollider for (size_t j = 0; j < circlecolliders.size(); ++j) { - + if(!circlecolliders[j].get().active) continue; // Skip self collision int game_object_id_2 = circlecolliders[j].get().game_object_id; if (game_object_id_1 == game_object_id_2) continue; @@ -79,19 +101,19 @@ std::vector> CollisionSystem::check_collisions(const std::ve // Check collision if (check_box_circle_collision(boxcolliders[i], circlecolliders[j], transform1, transform2, rigidbody1, rigidbody2)) { - collisions_ret.emplace_back(game_object_id_1, game_object_id_2); + collisions_ret.emplace_back(boxcolliders[i], circlecolliders[j]); } } } // Check CircleCollider vs CircleCollider for (size_t i = 0; i < circlecolliders.size(); ++i) { - + if(!circlecolliders[i].get().active) continue; // Fetch components for the first circle collider int game_object_id_1 = circlecolliders[i].get().game_object_id; Transform & transform1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); Rigidbody & rigidbody1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); for (size_t j = i + 1; j < circlecolliders.size(); ++j) { - + if(!circlecolliders[j].get().active) continue; // Skip self collision int game_object_id_2 = circlecolliders[j].get().game_object_id; if (game_object_id_1 == game_object_id_2) continue; @@ -102,7 +124,7 @@ std::vector> CollisionSystem::check_collisions(const std::ve // Check collision if (check_circle_circle_collision(circlecolliders[i], circlecolliders[j], transform1, transform2, rigidbody1, rigidbody2)) { - collisions_ret.emplace_back(game_object_id_1, game_object_id_2); + collisions_ret.emplace_back(circlecolliders[i], circlecolliders[j]); } } } diff --git a/src/crepe/system/CollisionSystem.h b/src/crepe/system/CollisionSystem.h index 23e8245..a4c6ecb 100644 --- a/src/crepe/system/CollisionSystem.h +++ b/src/crepe/system/CollisionSystem.h @@ -2,6 +2,7 @@ #include "Collider.h" #include +#include namespace crepe { @@ -16,7 +17,10 @@ public: CollisionSystem(); void update(); private: - std::vector> check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) ; + using collider_stor = std::variant; +private: + void call_collision_handler(const Rigidbody& rigidbody1,const Rigidbody& rigidbody2); + std::vector> check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders); 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& box1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); bool check_circle_circle_collision(const CircleCollider& circle1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); -- cgit v1.2.3 From b58765b671969aa810b9a345be55423523e893fb Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Thu, 14 Nov 2024 22:22:49 +0100 Subject: saved reference in storage struct to send to handeler --- src/crepe/system/CollisionSystem.cpp | 78 ++++++++++++++++++++++++------------ src/crepe/system/CollisionSystem.h | 22 +++++----- 2 files changed, 65 insertions(+), 35 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index e6172b7..a9d05ad 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include #include "CollisionSystem.h" @@ -23,39 +25,57 @@ void CollisionSystem::update() { ComponentManager & mgr = ComponentManager::get_instance(); std::vector> boxcolliders = mgr.get_components_by_type(); std::vector> circlecolliders = mgr.get_components_by_type(); - std::vector> collided = check_collisions(boxcolliders,circlecolliders); + std::vector> collided = check_collisions(boxcolliders,circlecolliders); std::cout << "DEBUG INFO" << std::endl; - for (const std::pair& collision : collided) { - - if (const BoxCollider* box_collider1 = std::get_if(&collision.first)) { - std::cout << "Processing a BoxCollider\n"; - if (const BoxCollider* box_collider2 = std::get_if(&collision.second)) { - std::cout << "Processing a BoxCollider\n"; - } else if (const CircleCollider* circle_collider2 = std::get_if(&collision.first)) { - std::cout << "Processing a CircleCollider\n"; - } - } else if (const CircleCollider* circle_collider1 = std::get_if(&collision.first)) { - std::cout << "Processing a CircleCollider\n"; - if (const BoxCollider* box_collider2 = std::get_if(&collision.first)) { - std::cout << "Processing a BoxCollider\n"; - } else if (const CircleCollider* circle_collider2 = std::get_if(&collision.first)) { - std::cout << "Processing a CircleCollider\n"; - } - } - + for (const auto& collision_pair : collided) { + call_collision_handler(collision_pair.first,collision_pair.second); // First collider + call_collision_handler(collision_pair.second,collision_pair.first); // First collider } + if(collided.empty()) { std::cout << "No objects collided" << std::endl; } } -void CollisionSystem::call_collision_handler(const Rigidbody& rigidbody1,const Rigidbody& rigidbody2){ - +void CollisionSystem::call_collision_handler(const CollidedInfoStor& data1,const CollidedInfoStor& data2){ + game_object_id_t first = 0,second = 0; + // if (std::holds_alternative(collider1)) { + // if (std::holds_alternative(collider2)) { + // const BoxCollider& box_collider1 = std::get(collider1); + // const BoxCollider& box_collider2 = std::get(collider2); + // first = box_collider1.game_object_id; + // second = box_collider2.game_object_id; + // } + // else { + // const BoxCollider& box_collider = std::get(collider1); + // const CircleCollider& circle_collider = std::get(collider2); + // first = box_collider.game_object_id; + // second = circle_collider.game_object_id; + // } + // } + // else { + // if (std::holds_alternative(collider2)) { + // const CircleCollider& circle_collider1 = std::get(collider1); + // const CircleCollider& circle_collider2 = std::get(collider2); + // first = circle_collider1.game_object_id; + // second = circle_collider2.game_object_id; + // } + // else { + // const CircleCollider& circle_collider = std::get(collider1); + // const BoxCollider& box_collider = std::get(collider2); + // first = circle_collider.game_object_id; + // second = box_collider.game_object_id; + // } + // } + + // Rigidbody rigidbody1 = mgr.get_components_by_id(first).front().get(); + // Rigidbody rigidbody2 = mgr.get_components_by_id(second).front().get(); + } -std::vector> CollisionSystem::check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) { +std::vector> CollisionSystem::check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) { ComponentManager & mgr = ComponentManager::get_instance(); - std::vector> collisions_ret; + std::vector> collisions_ret; //if no colliders skip //check if colliders has rigibocdy if not skip @@ -84,7 +104,9 @@ std::vector #include #include namespace crepe { -class Collider; -class BoxCollider; -class CircleCollider; -class Transform; -class Rigidbody; class CollisionSystem { +private: + using collider_stor = std::variant; +private: + struct CollidedInfoStor { + std::tuple collider_info; +}; public: CollisionSystem(); void update(); private: - using collider_stor = std::variant; -private: - void call_collision_handler(const Rigidbody& rigidbody1,const Rigidbody& rigidbody2); - std::vector> check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders); + void call_collision_handler(const CollidedInfoStor& data1,const CollidedInfoStor& data2); + std::vector> check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders); 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& box1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); bool check_circle_circle_collision(const CircleCollider& circle1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); -- cgit v1.2.3 From 355b0178eaaf3602b00975adb8f56e2141dcd982 Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Thu, 14 Nov 2024 22:39:08 +0100 Subject: added function to call collision handlers --- src/crepe/system/CollisionSystem.cpp | 102 +++++++++++++++++++++-------------- src/crepe/system/CollisionSystem.h | 6 ++- 2 files changed, 66 insertions(+), 42 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index a9d05ad..ac35026 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -38,39 +38,47 @@ void CollisionSystem::update() { } void CollisionSystem::call_collision_handler(const CollidedInfoStor& data1,const CollidedInfoStor& data2){ + + // Check collision type and get values for handler game_object_id_t first = 0,second = 0; - // if (std::holds_alternative(collider1)) { - // if (std::holds_alternative(collider2)) { - // const BoxCollider& box_collider1 = std::get(collider1); - // const BoxCollider& box_collider2 = std::get(collider2); - // first = box_collider1.game_object_id; - // second = box_collider2.game_object_id; - // } - // else { - // const BoxCollider& box_collider = std::get(collider1); - // const CircleCollider& circle_collider = std::get(collider2); - // first = box_collider.game_object_id; - // second = circle_collider.game_object_id; - // } - // } - // else { - // if (std::holds_alternative(collider2)) { - // const CircleCollider& circle_collider1 = std::get(collider1); - // const CircleCollider& circle_collider2 = std::get(collider2); - // first = circle_collider1.game_object_id; - // second = circle_collider2.game_object_id; - // } - // else { - // const CircleCollider& circle_collider = std::get(collider1); - // const BoxCollider& box_collider = std::get(collider2); - // first = circle_collider.game_object_id; - // second = box_collider.game_object_id; - // } - // } - - // Rigidbody rigidbody1 = mgr.get_components_by_id(first).front().get(); - // Rigidbody rigidbody2 = mgr.get_components_by_id(second).front().get(); - + if (std::holds_alternative(data1.collider)) { + if (std::holds_alternative(data2.collider)) { + const BoxCollider& box_collider1 = std::get(data1.collider); + const BoxCollider& box_collider2 = std::get(data2.collider); + first = box_collider1.game_object_id; + second = box_collider2.game_object_id; + } + else { + const BoxCollider& box_collider = std::get(data1.collider); + const CircleCollider& circle_collider = std::get(data2.collider); + first = box_collider.game_object_id; + second = circle_collider.game_object_id; + } + } + else { + if (std::holds_alternative(data2.collider)) { + const CircleCollider& circle_collider1 = std::get(data1.collider); + const CircleCollider& circle_collider2 = std::get(data2.collider); + first = circle_collider1.game_object_id; + second = circle_collider2.game_object_id; + } + else { + const CircleCollider& circle_collider = std::get(data1.collider); + const BoxCollider& box_collider = std::get(data2.collider); + first = circle_collider.game_object_id; + second = box_collider.game_object_id; + } + } + + // check rigidbody type + if(data1.rigidbody.data.body_type != Rigidbody::BodyType::STATIC) + { + // If second body is static move back + if(data2.rigidbody.data.body_type == Rigidbody::BodyType::STATIC) return; + //call static handler (is bounce true?) + + // call script handler + } } std::vector> CollisionSystem::check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders) { @@ -89,8 +97,10 @@ std::vector(game_object_id_1).front().get(); + if(!transform1.active) continue; Rigidbody& rigidbody1 = mgr.get_components_by_id(game_object_id_1).front().get(); - + if(!rigidbody1.active) continue; + // Check CircleCollider vs CircleCollider for (size_t j = i + 1; j < boxcolliders.size(); ++j) { if(!boxcolliders[j].get().active) continue; @@ -100,13 +110,15 @@ std::vector(boxcolliders[j].get().game_object_id).front().get(); + if(!transform2.active) continue; Rigidbody & rigidbody2 = mgr.get_components_by_id(boxcolliders[j].get().game_object_id).front().get(); - + if(!rigidbody2.active) continue; // Check collision if (check_box_box_collision(boxcolliders[i], boxcolliders[j], transform1, transform2, rigidbody1, rigidbody2)) { collisions_ret.emplace_back(std::make_pair( - std::make_tuple(boxcolliders[i], transform1,rigidbody1), - std::make_tuple(boxcolliders[j], transform2,rigidbody2))); + CollidedInfoStor{boxcolliders[i], transform1, rigidbody1}, + CollidedInfoStor{boxcolliders[j], transform2, rigidbody2} + )); } } @@ -119,13 +131,17 @@ std::vector(circlecolliders[j].get().game_object_id).front().get(); + if(!transform2.active) continue; Rigidbody & rigidbody2 = mgr.get_components_by_id(circlecolliders[j].get().game_object_id).front().get(); + if(!rigidbody2.active) continue; // Check collision if (check_box_circle_collision(boxcolliders[i], circlecolliders[j], transform1, transform2, rigidbody1, rigidbody2)) { + collisions_ret.emplace_back(std::make_pair( - std::make_tuple(boxcolliders[i], transform1,rigidbody1), - std::make_tuple(circlecolliders[j], transform2,rigidbody2))); + CollidedInfoStor{boxcolliders[i], transform1, rigidbody1}, + CollidedInfoStor{circlecolliders[j], transform2, rigidbody2} + )); } } } @@ -135,7 +151,10 @@ std::vector(circlecolliders[i].get().game_object_id).front().get(); + if(!transform1.active) continue; Rigidbody & rigidbody1 = mgr.get_components_by_id(circlecolliders[i].get().game_object_id).front().get(); + if(!rigidbody1.active) continue; + for (size_t j = i + 1; j < circlecolliders.size(); ++j) { if(!circlecolliders[j].get().active) continue; // Skip self collision @@ -144,13 +163,16 @@ std::vector(circlecolliders[j].get().game_object_id).front().get(); + if(!transform2.active) continue; Rigidbody & rigidbody2 = mgr.get_components_by_id(circlecolliders[j].get().game_object_id).front().get(); + if(!rigidbody2.active) continue; // Check collision if (check_circle_circle_collision(circlecolliders[i], circlecolliders[j], transform1, transform2, rigidbody1, rigidbody2)) { collisions_ret.emplace_back(std::make_pair( - std::make_tuple(circlecolliders[i], transform1,rigidbody1), - std::make_tuple(circlecolliders[j], transform2,rigidbody2))); + CollidedInfoStor{circlecolliders[i], transform1, rigidbody1}, + CollidedInfoStor{circlecolliders[j], transform2, rigidbody2} + )); } } } diff --git a/src/crepe/system/CollisionSystem.h b/src/crepe/system/CollisionSystem.h index 4970579..9a72948 100644 --- a/src/crepe/system/CollisionSystem.h +++ b/src/crepe/system/CollisionSystem.h @@ -17,8 +17,10 @@ private: using collider_stor = std::variant; private: struct CollidedInfoStor { - std::tuple collider_info; -}; + collider_stor collider; // Store either BoxCollider or CircleCollider + Transform transform; // Transform data + Rigidbody rigidbody; // Rigidbody data + }; public: CollisionSystem(); void update(); -- cgit v1.2.3 From e6bc46a30152a7585dda24fde66622575349d25e Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Fri, 15 Nov 2024 15:05:19 +0100 Subject: added data struct for event --- src/crepe/api/Event.h | 6 +++++- src/crepe/system/CollisionSystem.cpp | 28 ++++++++++++++++++++++------ src/crepe/system/CollisionSystem.h | 15 +++++++++++++-- 3 files changed, 40 insertions(+), 9 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index 701ecdf..3431f29 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -3,6 +3,7 @@ #include #include #include +#include "system/CollisionSystem.h" class Event { public: @@ -45,7 +46,10 @@ public: }; class CollisionEvent : public Event { public: - //Collision collisionData; + crepe::CollisionSystem::CollisionInfo info; + CollisionEvent(const crepe::CollisionSystem::CollisionInfo& collisionInfo) + : info(collisionInfo) {} + }; class TextSubmitEvent : public Event { public: diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index ac35026..56f07cc 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -1,11 +1,12 @@ #include #include #include -#include #include #include #include "CollisionSystem.h" +#include "../api/Event.h" +#include "../api/EventManager.h" #include "../ComponentManager.h" #include "../api/BoxCollider.h" @@ -38,19 +39,24 @@ void CollisionSystem::update() { } void CollisionSystem::call_collision_handler(const CollidedInfoStor& data1,const CollidedInfoStor& data2){ - + const Collider* collider1 = nullptr; + const Collider* collider2 = nullptr; // Check collision type and get values for handler game_object_id_t first = 0,second = 0; if (std::holds_alternative(data1.collider)) { if (std::holds_alternative(data2.collider)) { const BoxCollider& box_collider1 = std::get(data1.collider); const BoxCollider& box_collider2 = std::get(data2.collider); + collider1 = &box_collider1; + collider2 = &box_collider2; first = box_collider1.game_object_id; second = box_collider2.game_object_id; } else { const BoxCollider& box_collider = std::get(data1.collider); const CircleCollider& circle_collider = std::get(data2.collider); + collider1 = &box_collider; + collider2 = &circle_collider; first = box_collider.game_object_id; second = circle_collider.game_object_id; } @@ -59,12 +65,16 @@ void CollisionSystem::call_collision_handler(const CollidedInfoStor& data1,const if (std::holds_alternative(data2.collider)) { const CircleCollider& circle_collider1 = std::get(data1.collider); const CircleCollider& circle_collider2 = std::get(data2.collider); + collider1 = &circle_collider1; + collider2 = &circle_collider2; first = circle_collider1.game_object_id; second = circle_collider2.game_object_id; } else { const CircleCollider& circle_collider = std::get(data1.collider); const BoxCollider& box_collider = std::get(data2.collider); + collider1 = &circle_collider; + collider2 = &box_collider; first = circle_collider.game_object_id; second = box_collider.game_object_id; } @@ -74,10 +84,16 @@ void CollisionSystem::call_collision_handler(const CollidedInfoStor& data1,const if(data1.rigidbody.data.body_type != Rigidbody::BodyType::STATIC) { // If second body is static move back - if(data2.rigidbody.data.body_type == Rigidbody::BodyType::STATIC) return; - //call static handler (is bounce true?) - - // call script handler + if(data2.rigidbody.data.body_type == Rigidbody::BodyType::STATIC){ + //call static handler (is bounce true?) + }; + + crepe::CollisionSystem::CollisionInfo collision_info{ + { *collider1, data1.transform, data1.rigidbody }, + { *collider2, data2.transform, data2.rigidbody } + }; + CollisionEvent data(collision_info); + EventManager::get_instance().trigger_event(data, 0); } } diff --git a/src/crepe/system/CollisionSystem.h b/src/crepe/system/CollisionSystem.h index 9a72948..c7e8e0b 100644 --- a/src/crepe/system/CollisionSystem.h +++ b/src/crepe/system/CollisionSystem.h @@ -17,8 +17,9 @@ private: using collider_stor = std::variant; private: struct CollidedInfoStor { - collider_stor collider; // Store either BoxCollider or CircleCollider - Transform transform; // Transform data + //! Store either BoxCollider or CircleCollider + collider_stor collider; + Transform transform; Rigidbody rigidbody; // Rigidbody data }; public: @@ -31,6 +32,16 @@ private: bool check_box_circle_collision(const BoxCollider& box1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); bool check_circle_circle_collision(const CircleCollider& circle1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); Vector2 current_position(const Collider& collider, const Transform& transform, const Rigidbody& rigidbody); +public: + struct ColliderInfo { + Collider collider; + Transform transform; + Rigidbody rigidbody; + }; + struct CollisionInfo{ + ColliderInfo first; + ColliderInfo second; + }; }; } // namespace crepe -- cgit v1.2.3 From b019b401c3a1de0ffea7e6776242ae73599651ef Mon Sep 17 00:00:00 2001 From: JAROWMR Date: Fri, 15 Nov 2024 16:10:45 +0100 Subject: collision handeling example --- src/crepe/api/Event.h | 1 - src/crepe/api/Rigidbody.h | 5 +++-- src/crepe/api/Script.h | 2 +- src/crepe/system/CollisionSystem.cpp | 2 +- src/crepe/system/CollisionSystem.h | 2 +- src/crepe/system/ScriptSystem.cpp | 6 +++++- src/example/collision.cpp | 39 ++++++++++++++++++++++++++++++++---- 7 files changed, 46 insertions(+), 11 deletions(-) (limited to 'src/crepe') diff --git a/src/crepe/api/Event.h b/src/crepe/api/Event.h index 3431f29..bd6a541 100644 --- a/src/crepe/api/Event.h +++ b/src/crepe/api/Event.h @@ -49,7 +49,6 @@ public: crepe::CollisionSystem::CollisionInfo info; CollisionEvent(const crepe::CollisionSystem::CollisionInfo& collisionInfo) : info(collisionInfo) {} - }; class TextSubmitEvent : public Event { public: diff --git a/src/crepe/api/Rigidbody.h b/src/crepe/api/Rigidbody.h index b9edec2..a45623f 100644 --- a/src/crepe/api/Rigidbody.h +++ b/src/crepe/api/Rigidbody.h @@ -1,5 +1,6 @@ #pragma once +#include #include #include "../Component.h" @@ -60,13 +61,13 @@ public: //! linear velocity of object Vector2 linear_velocity; //! maximum linear velocity of object - Vector2 max_linear_velocity; + Vector2 max_linear_velocity = {INFINITY ,INFINITY}; //! linear damping of object Vector2 linear_damping; //! angular velocity of object double angular_velocity = 0.0; //! max angular velocity of object - double max_angular_velocity = 0.0; + double max_angular_velocity = INFINITY; //! angular damping of object double angular_damping = 0.0; //! movements constraints of object diff --git a/src/crepe/api/Script.h b/src/crepe/api/Script.h index 49e625f..0a10848 100644 --- a/src/crepe/api/Script.h +++ b/src/crepe/api/Script.h @@ -28,7 +28,7 @@ protected: template std::vector> get_components(); -private: +public: friend class crepe::BehaviorScript; BehaviorScript * parent = nullptr; }; diff --git a/src/crepe/system/CollisionSystem.cpp b/src/crepe/system/CollisionSystem.cpp index 56f07cc..b9366df 100644 --- a/src/crepe/system/CollisionSystem.cpp +++ b/src/crepe/system/CollisionSystem.cpp @@ -93,7 +93,7 @@ void CollisionSystem::call_collision_handler(const CollidedInfoStor& data1,const { *collider2, data2.transform, data2.rigidbody } }; CollisionEvent data(collision_info); - EventManager::get_instance().trigger_event(data, 0); + EventManager::get_instance().trigger_event(data, first); } } diff --git a/src/crepe/system/CollisionSystem.h b/src/crepe/system/CollisionSystem.h index c7e8e0b..a31ac48 100644 --- a/src/crepe/system/CollisionSystem.h +++ b/src/crepe/system/CollisionSystem.h @@ -27,7 +27,7 @@ public: void update(); private: void call_collision_handler(const CollidedInfoStor& data1,const CollidedInfoStor& data2); - std::vector> check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders); + std::vector> check_collisions(const std::vector>& boxcolliders, const std::vector>& circlecolliders); 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& box1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); bool check_circle_circle_collision(const CircleCollider& circle1, const CircleCollider& circle2, const Transform& transform1, const Transform& transform2, const Rigidbody& rigidbody1, const Rigidbody& rigidbody2); diff --git a/src/crepe/system/ScriptSystem.cpp b/src/crepe/system/ScriptSystem.cpp index f2673e7..e41961e 100644 --- a/src/crepe/system/ScriptSystem.cpp +++ b/src/crepe/system/ScriptSystem.cpp @@ -17,7 +17,11 @@ void ScriptSystem::update() { dbg_trace(); forward_list