diff options
| author | JAROWMR <jarorutjes07@gmail.com> | 2024-11-10 21:38:58 +0100 | 
|---|---|---|
| committer | JAROWMR <jarorutjes07@gmail.com> | 2024-11-10 21:38:58 +0100 | 
| commit | 47dd27c42f375b65ee53f8b1e8c1b25327315a92 (patch) | |
| tree | c3206a49e7826e4e6f8a506e0d596d58393c2d6b /src | |
| parent | 428182f45797de73b0bc2335916d25762b0d719b (diff) | |
box-box collision
Diffstat (limited to 'src')
| -rw-r--r-- | src/crepe/api/BoxCollider.cpp | 5 | ||||
| -rw-r--r-- | src/crepe/api/BoxCollider.h | 2 | ||||
| -rw-r--r-- | src/crepe/api/CMakeLists.txt | 4 | ||||
| -rw-r--r-- | src/crepe/api/CircleCollider.cpp | 2 | ||||
| -rw-r--r-- | src/crepe/api/CircleCollider.h | 1 | ||||
| -rw-r--r-- | src/crepe/api/Rigidbody.h | 2 | ||||
| -rw-r--r-- | src/crepe/system/CollisionSystem.cpp | 82 | ||||
| -rw-r--r-- | src/crepe/system/CollisionSystem.h | 14 | ||||
| -rw-r--r-- | src/example/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | src/example/collision.cpp | 42 | 
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; +} |