Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
godotengine
GitHub Repository: godotengine/godot
Path: blob/master/tests/scene/test_camera_2d.cpp
45991 views
1
/**************************************************************************/
2
/* test_camera_2d.cpp */
3
/**************************************************************************/
4
/* This file is part of: */
5
/* GODOT ENGINE */
6
/* https://godotengine.org */
7
/**************************************************************************/
8
/* Copyright (c) 2014-present Godot Engine contributors (see AUTHORS.md). */
9
/* Copyright (c) 2007-2014 Juan Linietsky, Ariel Manzur. */
10
/* */
11
/* Permission is hereby granted, free of charge, to any person obtaining */
12
/* a copy of this software and associated documentation files (the */
13
/* "Software"), to deal in the Software without restriction, including */
14
/* without limitation the rights to use, copy, modify, merge, publish, */
15
/* distribute, sublicense, and/or sell copies of the Software, and to */
16
/* permit persons to whom the Software is furnished to do so, subject to */
17
/* the following conditions: */
18
/* */
19
/* The above copyright notice and this permission notice shall be */
20
/* included in all copies or substantial portions of the Software. */
21
/* */
22
/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
23
/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
24
/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
25
/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
26
/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
27
/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
28
/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
29
/**************************************************************************/
30
31
#include "tests/test_macros.h"
32
33
TEST_FORCE_LINK(test_camera_2d)
34
35
#include "scene/2d/camera_2d.h"
36
#include "scene/main/scene_tree.h"
37
#include "scene/main/viewport.h"
38
#include "scene/main/window.h"
39
40
namespace TestCamera2D {
41
42
TEST_CASE("[SceneTree][Camera2D] Getters and setters") {
43
Camera2D *test_camera = memnew(Camera2D);
44
45
SUBCASE("AnchorMode") {
46
test_camera->set_anchor_mode(Camera2D::AnchorMode::ANCHOR_MODE_FIXED_TOP_LEFT);
47
CHECK(test_camera->get_anchor_mode() == Camera2D::AnchorMode::ANCHOR_MODE_FIXED_TOP_LEFT);
48
test_camera->set_anchor_mode(Camera2D::AnchorMode::ANCHOR_MODE_DRAG_CENTER);
49
CHECK(test_camera->get_anchor_mode() == Camera2D::AnchorMode::ANCHOR_MODE_DRAG_CENTER);
50
}
51
52
SUBCASE("ProcessCallback") {
53
test_camera->set_process_callback(Camera2D::Camera2DProcessCallback::CAMERA2D_PROCESS_PHYSICS);
54
CHECK(test_camera->get_process_callback() == Camera2D::Camera2DProcessCallback::CAMERA2D_PROCESS_PHYSICS);
55
test_camera->set_process_callback(Camera2D::Camera2DProcessCallback::CAMERA2D_PROCESS_IDLE);
56
CHECK(test_camera->get_process_callback() == Camera2D::Camera2DProcessCallback::CAMERA2D_PROCESS_IDLE);
57
}
58
59
SUBCASE("Drag") {
60
constexpr float drag_left_margin = 0.8f;
61
constexpr float drag_top_margin = 0.8f;
62
constexpr float drag_right_margin = 0.8f;
63
constexpr float drag_bottom_margin = 0.8f;
64
constexpr float drag_horizontal_offset1 = 0.5f;
65
constexpr float drag_horizontal_offset2 = -0.5f;
66
constexpr float drag_vertical_offset1 = 0.5f;
67
constexpr float drag_vertical_offset2 = -0.5f;
68
test_camera->set_drag_margin(SIDE_LEFT, drag_left_margin);
69
CHECK(test_camera->get_drag_margin(SIDE_LEFT) == drag_left_margin);
70
test_camera->set_drag_margin(SIDE_TOP, drag_top_margin);
71
CHECK(test_camera->get_drag_margin(SIDE_TOP) == drag_top_margin);
72
test_camera->set_drag_margin(SIDE_RIGHT, drag_right_margin);
73
CHECK(test_camera->get_drag_margin(SIDE_RIGHT) == drag_right_margin);
74
test_camera->set_drag_margin(SIDE_BOTTOM, drag_bottom_margin);
75
CHECK(test_camera->get_drag_margin(SIDE_BOTTOM) == drag_bottom_margin);
76
test_camera->set_drag_horizontal_enabled(true);
77
CHECK(test_camera->is_drag_horizontal_enabled());
78
test_camera->set_drag_horizontal_enabled(false);
79
CHECK_FALSE(test_camera->is_drag_horizontal_enabled());
80
test_camera->set_drag_horizontal_offset(drag_horizontal_offset1);
81
CHECK(test_camera->get_drag_horizontal_offset() == drag_horizontal_offset1);
82
test_camera->set_drag_horizontal_offset(drag_horizontal_offset2);
83
CHECK(test_camera->get_drag_horizontal_offset() == drag_horizontal_offset2);
84
test_camera->set_drag_vertical_enabled(true);
85
CHECK(test_camera->is_drag_vertical_enabled());
86
test_camera->set_drag_vertical_enabled(false);
87
CHECK_FALSE(test_camera->is_drag_vertical_enabled());
88
test_camera->set_drag_vertical_offset(drag_vertical_offset1);
89
CHECK(test_camera->get_drag_vertical_offset() == drag_vertical_offset1);
90
test_camera->set_drag_vertical_offset(drag_vertical_offset2);
91
CHECK(test_camera->get_drag_vertical_offset() == drag_vertical_offset2);
92
}
93
94
SUBCASE("Drawing") {
95
test_camera->set_margin_drawing_enabled(true);
96
CHECK(test_camera->is_margin_drawing_enabled());
97
test_camera->set_margin_drawing_enabled(false);
98
CHECK_FALSE(test_camera->is_margin_drawing_enabled());
99
test_camera->set_limit_drawing_enabled(true);
100
CHECK(test_camera->is_limit_drawing_enabled());
101
test_camera->set_limit_drawing_enabled(false);
102
CHECK_FALSE(test_camera->is_limit_drawing_enabled());
103
test_camera->set_screen_drawing_enabled(true);
104
CHECK(test_camera->is_screen_drawing_enabled());
105
test_camera->set_screen_drawing_enabled(false);
106
CHECK_FALSE(test_camera->is_screen_drawing_enabled());
107
}
108
109
SUBCASE("Enabled") {
110
test_camera->set_enabled(true);
111
CHECK(test_camera->is_enabled());
112
test_camera->set_enabled(false);
113
CHECK_FALSE(test_camera->is_enabled());
114
}
115
116
SUBCASE("Rotation") {
117
constexpr float rotation_smoothing_speed = 20.0f;
118
test_camera->set_ignore_rotation(true);
119
CHECK(test_camera->is_ignoring_rotation());
120
test_camera->set_ignore_rotation(false);
121
CHECK_FALSE(test_camera->is_ignoring_rotation());
122
test_camera->set_rotation_smoothing_enabled(true);
123
CHECK(test_camera->is_rotation_smoothing_enabled());
124
test_camera->set_rotation_smoothing_speed(rotation_smoothing_speed);
125
CHECK(test_camera->get_rotation_smoothing_speed() == rotation_smoothing_speed);
126
}
127
128
SUBCASE("Zoom") {
129
const Vector2 zoom = Vector2(4, 4);
130
test_camera->set_zoom(zoom);
131
CHECK(test_camera->get_zoom() == zoom);
132
}
133
134
SUBCASE("Offset") {
135
const Vector2 offset = Vector2(100, 100);
136
test_camera->set_offset(offset);
137
CHECK(test_camera->get_offset() == offset);
138
}
139
140
SUBCASE("Limit") {
141
constexpr int limit_left = 100;
142
constexpr int limit_top = 100;
143
constexpr int limit_right = 100;
144
constexpr int limit_bottom = 100;
145
test_camera->set_limit_smoothing_enabled(true);
146
CHECK(test_camera->is_limit_smoothing_enabled());
147
test_camera->set_limit_smoothing_enabled(false);
148
CHECK_FALSE(test_camera->is_limit_smoothing_enabled());
149
test_camera->set_limit(SIDE_LEFT, limit_left);
150
CHECK(test_camera->get_limit(SIDE_LEFT) == limit_left);
151
test_camera->set_limit(SIDE_TOP, limit_top);
152
CHECK(test_camera->get_limit(SIDE_TOP) == limit_top);
153
test_camera->set_limit(SIDE_RIGHT, limit_right);
154
CHECK(test_camera->get_limit(SIDE_RIGHT) == limit_right);
155
test_camera->set_limit(SIDE_BOTTOM, limit_bottom);
156
CHECK(test_camera->get_limit(SIDE_BOTTOM) == limit_bottom);
157
}
158
159
SUBCASE("Position") {
160
constexpr float smoothing_speed = 20.0f;
161
test_camera->set_position_smoothing_enabled(true);
162
CHECK(test_camera->is_position_smoothing_enabled());
163
test_camera->set_position_smoothing_speed(smoothing_speed);
164
CHECK(test_camera->get_position_smoothing_speed() == smoothing_speed);
165
}
166
167
memdelete(test_camera);
168
}
169
170
TEST_CASE("[SceneTree][Camera2D] Camera positioning") {
171
SubViewport *mock_viewport = memnew(SubViewport);
172
Camera2D *test_camera = memnew(Camera2D);
173
174
mock_viewport->set_size(Vector2(400, 200));
175
SceneTree::get_singleton()->get_root()->add_child(mock_viewport);
176
mock_viewport->add_child(test_camera);
177
178
SUBCASE("Anchor mode") {
179
test_camera->set_anchor_mode(Camera2D::ANCHOR_MODE_DRAG_CENTER);
180
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(0, 0)));
181
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(0, 0)));
182
183
test_camera->set_anchor_mode(Camera2D::ANCHOR_MODE_FIXED_TOP_LEFT);
184
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(200, 100)));
185
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(0, 0)));
186
}
187
188
SUBCASE("Offset") {
189
test_camera->set_offset(Vector2(100, 100));
190
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(100, 100)));
191
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(0, 0)));
192
193
test_camera->set_offset(Vector2(-100, 300));
194
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(-100, 300)));
195
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(0, 0)));
196
197
test_camera->set_offset(Vector2(0, 0));
198
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(0, 0)));
199
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(0, 0)));
200
}
201
202
SUBCASE("Limits") {
203
test_camera->set_limit(SIDE_LEFT, 100);
204
test_camera->set_limit(SIDE_TOP, 50);
205
206
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(300, 150)));
207
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(0, 0)));
208
209
test_camera->set_limit(SIDE_LEFT, 0);
210
test_camera->set_limit(SIDE_TOP, 0);
211
212
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(200, 100)));
213
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(0, 0)));
214
}
215
216
SUBCASE("Drag") {
217
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(0, 0)));
218
219
// horizontal
220
test_camera->set_drag_horizontal_enabled(true);
221
test_camera->set_drag_margin(SIDE_RIGHT, 0.5);
222
223
test_camera->set_position(Vector2(100, 100));
224
test_camera->force_update_scroll();
225
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(0, 100)));
226
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(0, 100)));
227
test_camera->set_position(Vector2(101, 101));
228
test_camera->force_update_scroll();
229
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(1, 101)));
230
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(1, 101)));
231
232
// test align
233
test_camera->set_position(Vector2(0, 0));
234
test_camera->align();
235
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(0, 0)));
236
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(0, 0)));
237
238
// vertical
239
test_camera->set_drag_vertical_enabled(true);
240
test_camera->set_drag_horizontal_enabled(false);
241
test_camera->set_drag_margin(SIDE_TOP, 0.3);
242
243
test_camera->set_position(Vector2(200, -20));
244
test_camera->force_update_scroll();
245
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(200, 0)));
246
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(200, 0)));
247
test_camera->set_position(Vector2(250, -55));
248
test_camera->force_update_scroll();
249
CHECK(test_camera->get_camera_position().is_equal_approx(Vector2(250, -25)));
250
CHECK(test_camera->get_camera_screen_center().is_equal_approx(Vector2(250, -25)));
251
}
252
253
memdelete(test_camera);
254
memdelete(mock_viewport);
255
}
256
257
TEST_CASE("[SceneTree][Camera2D] Transforms") {
258
SubViewport *mock_viewport = memnew(SubViewport);
259
Camera2D *test_camera = memnew(Camera2D);
260
261
mock_viewport->set_size(Vector2(400, 200));
262
SceneTree::get_singleton()->get_root()->add_child(mock_viewport);
263
mock_viewport->add_child(test_camera);
264
265
SUBCASE("Default camera") {
266
Transform2D xform = mock_viewport->get_canvas_transform();
267
// x,y are basis vectors, origin = screen center
268
Transform2D test_xform = Transform2D(Vector2(1, 0), Vector2(0, 1), Vector2(200, 100));
269
CHECK(xform.is_equal_approx(test_xform));
270
}
271
272
SUBCASE("Zoom") {
273
test_camera->set_zoom(Vector2(0.5, 2));
274
Transform2D xform = mock_viewport->get_canvas_transform();
275
Transform2D test_xform = Transform2D(Vector2(0.5, 0), Vector2(0, 2), Vector2(200, 100));
276
CHECK(xform.is_equal_approx(test_xform));
277
278
test_camera->set_zoom(Vector2(10, 10));
279
xform = mock_viewport->get_canvas_transform();
280
test_xform = Transform2D(Vector2(10, 0), Vector2(0, 10), Vector2(200, 100));
281
CHECK(xform.is_equal_approx(test_xform));
282
283
test_camera->set_zoom(Vector2(1, 1));
284
xform = mock_viewport->get_canvas_transform();
285
test_xform = Transform2D(Vector2(1, 0), Vector2(0, 1), Vector2(200, 100));
286
CHECK(xform.is_equal_approx(test_xform));
287
}
288
289
SUBCASE("Rotation") {
290
test_camera->set_rotation(Math::PI / 2);
291
Transform2D xform = mock_viewport->get_canvas_transform();
292
Transform2D test_xform = Transform2D(Vector2(1, 0), Vector2(0, 1), Vector2(200, 100));
293
CHECK(xform.is_equal_approx(test_xform));
294
295
test_camera->set_ignore_rotation(false);
296
xform = mock_viewport->get_canvas_transform();
297
test_xform = Transform2D(Vector2(0, -1), Vector2(1, 0), Vector2(200, 100));
298
CHECK(xform.is_equal_approx(test_xform));
299
300
test_camera->set_rotation(-1 * Math::PI);
301
test_camera->force_update_scroll();
302
xform = mock_viewport->get_canvas_transform();
303
test_xform = Transform2D(Vector2(-1, 0), Vector2(0, -1), Vector2(200, 100));
304
CHECK(xform.is_equal_approx(test_xform));
305
306
test_camera->set_rotation(0);
307
test_camera->force_update_scroll();
308
xform = mock_viewport->get_canvas_transform();
309
test_xform = Transform2D(Vector2(1, 0), Vector2(0, 1), Vector2(200, 100));
310
CHECK(xform.is_equal_approx(test_xform));
311
}
312
313
memdelete(test_camera);
314
memdelete(mock_viewport);
315
}
316
317
} // namespace TestCamera2D
318
319