aboutsummaryrefslogtreecommitdiff
path: root/src/test/CollisionTest.cpp
blob: a3c85278851b2c4c6fc111d82c381bfd4cdb06c5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
#include <gtest/gtest.h>

#define private public
#define protected public

#include <crepe/ComponentManager.h>
#include <crepe/api/Event.h>
#include <crepe/api/EventManager.h>
#include <crepe/api/GameObject.h>
#include <crepe/api/Rigidbody.h>
#include <crepe/api/Script.h>
#include <crepe/api/Transform.h>
#include <crepe/system/CollisionSystem.h>
#include <crepe/system/ScriptSystem.h>
#include <crepe/types.h>
#include <crepe/util/Log.h>

using namespace std;
using namespace std::chrono_literals;
using namespace crepe;
using namespace testing;

class CollisionHandler : public Script {
public:
	int box_id;
	EventManager & evmgr = EventManager::get_instance();

	CollisionHandler(int box_id) {
		this->box_id = box_id;
	}

	bool on_collision(const CollisionEvent& ev) {
		Log::logf("Box {} event x={} y={}", box_id, ev.info.move_back_value.x, ev.info.move_back_value.y);
		return true;
	}

	void init() {
		Log::logf("Box {} script init()", box_id);

		subscribe<CollisionEvent>([this](const CollisionEvent & ev) {
			return this->on_collision(ev);
		});
	}
};

class CollisionTest : public Test {
public:
	ComponentManager mgr;
	CollisionSystem collision_sys{mgr};
	ScriptSystem script_sys{mgr};

	GameObject world = mgr.new_object("world");
	GameObject game_object1 = mgr.new_object("object1", "", { 0, 0 });
	GameObject game_object2 = mgr.new_object("object2", "", { 0, 0 });

	CollisionHandler * script_object1_ref = nullptr;
	CollisionHandler * script_object2_ref = nullptr;
	
	void SetUp() override {
		world.add_component<Rigidbody>(Rigidbody::Data{
			// TODO: remove unrelated properties:
			.body_type = Rigidbody::BodyType::STATIC,
			.bounce = false,
			.offset = {0,0},
		});
		// Create a box with an inner size of 10x10 units
		world.add_component<BoxCollider>(Vector2{5, 11}, 10, 2); // Top
		world.add_component<BoxCollider>(Vector2{5, -1}, 10, 2); // Bottom
		world.add_component<BoxCollider>(Vector2{-1, 5}, 2, 10); // Left
		world.add_component<BoxCollider>(Vector2{11, 5}, 2, 10); // right

		game_object1.add_component<Rigidbody>(Rigidbody::Data{
			.mass = 1,
			.gravity_scale = 0.01,
			.body_type = Rigidbody::BodyType::DYNAMIC,
			.linear_velocity = {1,0},
			.constraints = {0, 0, 0},
			.use_gravity = true,
			.bounce = true,
			.elastisity = 1,
			.offset = {0,0},
		});
		game_object1.add_component<BoxCollider>(Vector2{0, 0}, 20, 20);
		BehaviorScript & script_object1 = game_object1.add_component<BehaviorScript>().set_script<CollisionHandler>(1);
		script_object1_ref = static_cast<CollisionHandler*>(script_object1.script.get());
		ASSERT_NE(script_object1_ref, nullptr);
		
		game_object2.add_component<Rigidbody>(Rigidbody::Data{
			.mass = 1,
			.gravity_scale = 0.01,
			.body_type = Rigidbody::BodyType::DYNAMIC,
			.linear_velocity = {1,0},
			.constraints = {0, 0, 0},
			.use_gravity = true,
			.bounce = true,
			.elastisity = 1,
			.offset = {0,0},
		});
		game_object2.add_component<BoxCollider>(Vector2{0, 0}, 20, 20);
		BehaviorScript & script_object2 = game_object2.add_component<BehaviorScript>().set_script<CollisionHandler>(2);
		script_object2_ref = static_cast<CollisionHandler*>(script_object2.script.get());
		ASSERT_NE(script_object2_ref, nullptr);

		// Ensure Script::init() is called on all BehaviorScript instances
		script_sys.update();
	}
};

TEST_F(CollisionTest, collision_example) {
	collision_sys.update();
}

TEST_F(CollisionTest, collision_box_box_dynamic) {
	collision_sys.update();
}