Line data Source code
1 : /*
2 : Minetest
3 : Copyright (C) 2013 celeron55, Perttu Ahola <celeron55@gmail.com>
4 :
5 : This program is free software; you can redistribute it and/or modify
6 : it under the terms of the GNU Lesser General Public License as published by
7 : the Free Software Foundation; either version 2.1 of the License, or
8 : (at your option) any later version.
9 :
10 : This program is distributed in the hope that it will be useful,
11 : but WITHOUT ANY WARRANTY; without even the implied warranty of
12 : MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13 : GNU Lesser General Public License for more details.
14 :
15 : You should have received a copy of the GNU Lesser General Public License along
16 : with this program; if not, write to the Free Software Foundation, Inc.,
17 : 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
18 : */
19 :
20 : #include "test.h"
21 :
22 : #include "collision.h"
23 :
24 1 : class TestCollision : public TestBase {
25 : public:
26 1 : TestCollision() { TestManager::registerTestModule(this); }
27 0 : const char *getName() { return "TestCollision"; }
28 :
29 : void runTests(IGameDef *gamedef);
30 :
31 : void testAxisAlignedCollision();
32 : };
33 :
34 1 : static TestCollision g_test_instance;
35 :
36 0 : void TestCollision::runTests(IGameDef *gamedef)
37 : {
38 0 : TEST(testAxisAlignedCollision);
39 0 : }
40 :
41 : ////////////////////////////////////////////////////////////////////////////////
42 :
43 0 : void TestCollision::testAxisAlignedCollision()
44 : {
45 0 : for (s16 bx = -3; bx <= 3; bx++)
46 0 : for (s16 by = -3; by <= 3; by++)
47 0 : for (s16 bz = -3; bz <= 3; bz++) {
48 : // X-
49 : {
50 0 : aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
51 0 : aabb3f m(bx-2, by, bz, bx-1, by+1, bz+1);
52 0 : v3f v(1, 0, 0);
53 0 : f32 dtime = 0;
54 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
55 0 : UASSERT(fabs(dtime - 1.000) < 0.001);
56 : }
57 : {
58 0 : aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
59 0 : aabb3f m(bx-2, by, bz, bx-1, by+1, bz+1);
60 0 : v3f v(-1, 0, 0);
61 0 : f32 dtime = 0;
62 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
63 : }
64 : {
65 0 : aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
66 0 : aabb3f m(bx-2, by+1.5, bz, bx-1, by+2.5, bz-1);
67 0 : v3f v(1, 0, 0);
68 : f32 dtime;
69 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
70 : }
71 : {
72 0 : aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
73 0 : aabb3f m(bx-2, by-1.5, bz, bx-1.5, by+0.5, bz+1);
74 0 : v3f v(0.5, 0.1, 0);
75 : f32 dtime;
76 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
77 0 : UASSERT(fabs(dtime - 3.000) < 0.001);
78 : }
79 : {
80 0 : aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
81 0 : aabb3f m(bx-2, by-1.5, bz, bx-1.5, by+0.5, bz+1);
82 0 : v3f v(0.5, 0.1, 0);
83 : f32 dtime;
84 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
85 0 : UASSERT(fabs(dtime - 3.000) < 0.001);
86 : }
87 :
88 : // X+
89 : {
90 0 : aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
91 0 : aabb3f m(bx+2, by, bz, bx+3, by+1, bz+1);
92 0 : v3f v(-1, 0, 0);
93 : f32 dtime;
94 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
95 0 : UASSERT(fabs(dtime - 1.000) < 0.001);
96 : }
97 : {
98 0 : aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
99 0 : aabb3f m(bx+2, by, bz, bx+3, by+1, bz+1);
100 0 : v3f v(1, 0, 0);
101 : f32 dtime;
102 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
103 : }
104 : {
105 0 : aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
106 0 : aabb3f m(bx+2, by, bz+1.5, bx+3, by+1, bz+3.5);
107 0 : v3f v(-1, 0, 0);
108 : f32 dtime;
109 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == -1);
110 : }
111 : {
112 0 : aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
113 0 : aabb3f m(bx+2, by-1.5, bz, bx+2.5, by-0.5, bz+1);
114 0 : v3f v(-0.5, 0.2, 0);
115 : f32 dtime;
116 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1); // Y, not X!
117 0 : UASSERT(fabs(dtime - 2.500) < 0.001);
118 : }
119 : {
120 0 : aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
121 0 : aabb3f m(bx+2, by-1.5, bz, bx+2.5, by-0.5, bz+1);
122 0 : v3f v(-0.5, 0.3, 0);
123 : f32 dtime;
124 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
125 0 : UASSERT(fabs(dtime - 2.000) < 0.001);
126 : }
127 :
128 : // TODO: Y-, Y+, Z-, Z+
129 :
130 : // misc
131 : {
132 0 : aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
133 0 : aabb3f m(bx+2.3, by+2.29, bz+2.29, bx+4.2, by+4.2, bz+4.2);
134 0 : v3f v(-1./3, -1./3, -1./3);
135 : f32 dtime;
136 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
137 0 : UASSERT(fabs(dtime - 0.9) < 0.001);
138 : }
139 : {
140 0 : aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
141 0 : aabb3f m(bx+2.29, by+2.3, bz+2.29, bx+4.2, by+4.2, bz+4.2);
142 0 : v3f v(-1./3, -1./3, -1./3);
143 : f32 dtime;
144 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1);
145 0 : UASSERT(fabs(dtime - 0.9) < 0.001);
146 : }
147 : {
148 0 : aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
149 0 : aabb3f m(bx+2.29, by+2.29, bz+2.3, bx+4.2, by+4.2, bz+4.2);
150 0 : v3f v(-1./3, -1./3, -1./3);
151 : f32 dtime;
152 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 2);
153 0 : UASSERT(fabs(dtime - 0.9) < 0.001);
154 : }
155 : {
156 0 : aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
157 0 : aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.3, by-2.29, bz-2.29);
158 0 : v3f v(1./7, 1./7, 1./7);
159 : f32 dtime;
160 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 0);
161 0 : UASSERT(fabs(dtime - 16.1) < 0.001);
162 : }
163 : {
164 0 : aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
165 0 : aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.29, by-2.3, bz-2.29);
166 0 : v3f v(1./7, 1./7, 1./7);
167 : f32 dtime;
168 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 1);
169 0 : UASSERT(fabs(dtime - 16.1) < 0.001);
170 : }
171 : {
172 0 : aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
173 0 : aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.29, by-2.29, bz-2.3);
174 0 : v3f v(1./7, 1./7, 1./7);
175 : f32 dtime;
176 0 : UASSERT(axisAlignedCollision(s, m, v, 0, dtime) == 2);
177 0 : UASSERT(fabs(dtime - 16.1) < 0.001);
178 : }
179 : }
180 3 : }
|