Translated using Weblate (Italian)
[oweals/minetest.git] / src / unittest / test_collision.cpp
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 class TestCollision : public TestBase {
25 public:
26         TestCollision() { TestManager::registerTestModule(this); }
27         const char *getName() { return "TestCollision"; }
28
29         void runTests(IGameDef *gamedef);
30
31         void testAxisAlignedCollision();
32 };
33
34 static TestCollision g_test_instance;
35
36 void TestCollision::runTests(IGameDef *gamedef)
37 {
38         TEST(testAxisAlignedCollision);
39 }
40
41 ////////////////////////////////////////////////////////////////////////////////
42
43 void TestCollision::testAxisAlignedCollision()
44 {
45         for (s16 bx = -3; bx <= 3; bx++)
46         for (s16 by = -3; by <= 3; by++)
47         for (s16 bz = -3; bz <= 3; bz++) {
48                 // X-
49                 {
50                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
51                         aabb3f m(bx-2, by, bz, bx-1, by+1, bz+1);
52                         v3f v(1, 0, 0);
53                         f32 dtime = 1.0f;
54                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 0);
55                         UASSERT(fabs(dtime - 1.000) < 0.001);
56                 }
57                 {
58                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
59                         aabb3f m(bx-2, by, bz, bx-1, by+1, bz+1);
60                         v3f v(-1, 0, 0);
61                         f32 dtime = 1.0f;
62                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == -1);
63                 }
64                 {
65                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
66                         aabb3f m(bx-2, by+1.5, bz, bx-1, by+2.5, bz-1);
67                         v3f v(1, 0, 0);
68                         f32 dtime = 1.0f;
69                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == -1);
70                 }
71                 {
72                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
73                         aabb3f m(bx-2, by-1.5, bz, bx-1.5, by+0.5, bz+1);
74                         v3f v(0.5, 0.1, 0);
75                         f32 dtime = 3.0f;
76                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 0);
77                         UASSERT(fabs(dtime - 3.000) < 0.001);
78                 }
79                 {
80                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
81                         aabb3f m(bx-2, by-1.5, bz, bx-1.5, by+0.5, bz+1);
82                         v3f v(0.5, 0.1, 0);
83                         f32 dtime = 3.0f;
84                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 0);
85                         UASSERT(fabs(dtime - 3.000) < 0.001);
86                 }
87
88                 // X+
89                 {
90                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
91                         aabb3f m(bx+2, by, bz, bx+3, by+1, bz+1);
92                         v3f v(-1, 0, 0);
93                         f32 dtime = 1.0f;
94                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 0);
95                         UASSERT(fabs(dtime - 1.000) < 0.001);
96                 }
97                 {
98                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
99                         aabb3f m(bx+2, by, bz, bx+3, by+1, bz+1);
100                         v3f v(1, 0, 0);
101                         f32 dtime = 1.0f;
102                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == -1);
103                 }
104                 {
105                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
106                         aabb3f m(bx+2, by, bz+1.5, bx+3, by+1, bz+3.5);
107                         v3f v(-1, 0, 0);
108                         f32 dtime = 1.0f;
109                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == -1);
110                 }
111                 {
112                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
113                         aabb3f m(bx+2, by-1.5, bz, bx+2.5, by-0.5, bz+1);
114                         v3f v(-0.5, 0.2, 0);
115                         f32 dtime = 2.5f;
116                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 1);  // Y, not X!
117                         UASSERT(fabs(dtime - 2.500) < 0.001);
118                 }
119                 {
120                         aabb3f s(bx, by, bz, bx+1, by+1, bz+1);
121                         aabb3f m(bx+2, by-1.5, bz, bx+2.5, by-0.5, bz+1);
122                         v3f v(-0.5, 0.3, 0);
123                         f32 dtime = 2.0f;
124                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 0);
125                         UASSERT(fabs(dtime - 2.000) < 0.001);
126                 }
127
128                 // TODO: Y-, Y+, Z-, Z+
129
130                 // misc
131                 {
132                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
133                         aabb3f m(bx+2.3, by+2.29, bz+2.29, bx+4.2, by+4.2, bz+4.2);
134                         v3f v(-1./3, -1./3, -1./3);
135                         f32 dtime = 1.0f;
136                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 0);
137                         UASSERT(fabs(dtime - 0.9) < 0.001);
138                 }
139                 {
140                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
141                         aabb3f m(bx+2.29, by+2.3, bz+2.29, bx+4.2, by+4.2, bz+4.2);
142                         v3f v(-1./3, -1./3, -1./3);
143                         f32 dtime = 1.0f;
144                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 1);
145                         UASSERT(fabs(dtime - 0.9) < 0.001);
146                 }
147                 {
148                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
149                         aabb3f m(bx+2.29, by+2.29, bz+2.3, bx+4.2, by+4.2, bz+4.2);
150                         v3f v(-1./3, -1./3, -1./3);
151                         f32 dtime = 1.0f;
152                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 2);
153                         UASSERT(fabs(dtime - 0.9) < 0.001);
154                 }
155                 {
156                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
157                         aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.3, by-2.29, bz-2.29);
158                         v3f v(1./7, 1./7, 1./7);
159                         f32 dtime = 17.0f;
160                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 0);
161                         UASSERT(fabs(dtime - 16.1) < 0.001);
162                 }
163                 {
164                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
165                         aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.29, by-2.3, bz-2.29);
166                         v3f v(1./7, 1./7, 1./7);
167                         f32 dtime = 17.0f;
168                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 1);
169                         UASSERT(fabs(dtime - 16.1) < 0.001);
170                 }
171                 {
172                         aabb3f s(bx, by, bz, bx+2, by+2, bz+2);
173                         aabb3f m(bx-4.2, by-4.2, bz-4.2, bx-2.29, by-2.29, bz-2.3);
174                         v3f v(1./7, 1./7, 1./7);
175                         f32 dtime = 17.0f;
176                         UASSERT(axisAlignedCollision(s, m, v, &dtime) == 2);
177                         UASSERT(fabs(dtime - 16.1) < 0.001);
178                 }
179         }
180 }