1
// Copyright (C) 2008-2011 Colin MacDonald
2
// No rights reserved: this software is in the public domain.
13
// There's all sorts of minor and inevitable FP accuracy errors here, so use a sloppy comparison.
14
static bool sloppyComparePlanes(const plane3df plane1, const plane3df plane2)
16
return(equals(plane1.D, plane2.D, 0.001f) &&
17
equals(plane1.Normal.X, plane2.Normal.X, 0.001f) &&
18
equals(plane1.Normal.Y, plane2.Normal.Y, 0.001f) &&
19
equals(plane1.Normal.Z, plane2.Normal.Z, 0.001f));
22
static bool transformPlane(const vector3df & point, const vector3df & normal,
23
const matrix4 & matrix, const plane3df & expected)
25
plane3df plane(point, vector3df(normal).normalize());
27
logTestString("\n Pre: (%.3ff,%.3ff,%.3ff), %.3ff\n",
28
plane.Normal.X, plane.Normal.Y, plane.Normal.Z, plane.D);
30
matrix.transformPlane(plane);
32
logTestString(" Post: (%.3ff,%.3ff,%.3ff), %.3ff\n",
33
plane.Normal.X, plane.Normal.Y, plane.Normal.Z, plane.D);
35
logTestString("Expected: (%.3ff,%.3ff,%.3ff), %.3ff\n",
36
expected.Normal.X, expected.Normal.Y, expected.Normal.Z, expected.D);
38
if(!sloppyComparePlanes(plane, expected))
40
logTestString("Unexpected result\n");
49
static bool drawScaledOctree(void)
52
IrrlichtDevice *device = createDevice(video::EDT_BURNINGSVIDEO, dimension2d<u32>(160, 120), 32);
56
video::IVideoDriver* driver = device->getVideoDriver();
57
ISceneManager * smgr = device->getSceneManager();
59
bool added = device->getFileSystem()->addFileArchive("../media/map-20kdm2.pk3");
64
ISceneNode * node = smgr->addOctreeSceneNode(smgr->getMesh("20kdm2.bsp")->getMesh(0), 0, -1, 1024);
69
node->setMaterialFlag(EMF_LIGHTING, false);
70
node->setPosition(core::vector3df(-1300,-820,-1249));
71
node->setScale(core::vector3df(1, 5, 1));
73
(void)smgr->addCameraSceneNode(0, core::vector3df(0,0,0), core::vector3df(40,100,30));
75
driver->beginScene(true, true, video::SColor(255,255,255,0));
79
result = takeScreenshotAndCompareAgainstReference(driver, "-planeMatrix-scaledClip.png");
83
device->closeDevice();
91
// Test the ability to transform a plane with a matrix.
92
bool planeMatrix(void)
94
matrix4 rotationMatrix;
95
rotationMatrix.setRotationDegrees(vector3df(90, 0, 0));
97
matrix4 translationMatrix;
98
translationMatrix.setTranslation(vector3df(0, 3, 0));
101
scaleMatrix.setScale(vector3df(1, 2, 3));
105
matrix4 matrix = rotationMatrix;
106
logTestString("\nRotation matrix\n%02.02f %02.02f %02.02f %02.02f"
107
"\n%02.02f %02.02f %02.02f %02.02f"
108
"\n%02.02f %02.02f %02.02f %02.02f"
109
"\n%02.02f %02.02f %02.02f %02.02f\n",
110
matrix[0], matrix[1], matrix[2], matrix[3],
111
matrix[4], matrix[5], matrix[6], matrix[7],
112
matrix[8], matrix[9], matrix[10], matrix[11],
113
matrix[12], matrix[13], matrix[14], matrix[15]);
114
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-.707f, 0.f, -.707f), 0.f));
115
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(.707f, 0.f, .707f), 0.f));
116
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-.707f, 0.f, .707f), 0.f));
117
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(.707f, 0.f, -.707f), 0.f));
118
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-.707f, 0.f, -.707f), .707f));
119
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(.707f, 0.f, .707f), -.707f));
120
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-.707f, 0.f, .707f), -.707f));
121
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(.707f, 0.f, -.707f), .707f));
124
matrix = translationMatrix;
125
logTestString("\nTranslation matrix\n%02.02f %02.02f %02.02f %02.02f"
126
"\n%02.02f %02.02f %02.02f %02.02f"
127
"\n%02.02f %02.02f %02.02f %02.02f"
128
"\n%02.02f %02.02f %02.02f %02.02f\n",
129
matrix[0], matrix[1], matrix[2], matrix[3],
130
matrix[4], matrix[5], matrix[6], matrix[7],
131
matrix[8], matrix[9], matrix[10], matrix[11],
132
matrix[12], matrix[13], matrix[14], matrix[15]);
133
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,-0.707f,0.000f), 2.121f));
134
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,0.707f,0.000f), -2.121f));
135
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,0.707f,0.000f), -2.121f));
136
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,-0.707f,0.000f), 2.121f));
137
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,-0.707f,0.000f), 2.828f));
138
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,0.707f,0.000f), -2.828f));
139
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,0.707f,0.000f), -2.828f));
140
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,-0.707f,0.000f), 2.828f));
143
matrix = scaleMatrix;
144
logTestString("\nScale matrix\n%02.02f %02.02f %02.02f %02.02f"
145
"\n%02.02f %02.02f %02.02f %02.02f"
146
"\n%02.02f %02.02f %02.02f %02.02f"
147
"\n%02.02f %02.02f %02.02f %02.02f\n",
148
matrix[0], matrix[1], matrix[2], matrix[3],
149
matrix[4], matrix[5], matrix[6], matrix[7],
150
matrix[8], matrix[9], matrix[10], matrix[11],
151
matrix[12], matrix[13], matrix[14], matrix[15]);
152
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,-0.354f,0.000f), -0.000f));
153
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,0.354f,0.000f), -0.000f));
154
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,0.354f,0.000f), -0.000f));
155
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,-0.354f,0.000f), -0.000f));
156
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,-0.354f,0.000f), 0.707f));
157
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,0.354f,0.000f), -0.707f));
158
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,0.354f,0.000f), -0.707f));
159
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,-0.354f,0.000f), 0.707f));
161
matrix = rotationMatrix * translationMatrix;
162
logTestString("\nRotation * translation matrix\n%02.02f %02.02f %02.02f %02.02f"
163
"\n%02.02f %02.02f %02.02f %02.02f"
164
"\n%02.02f %02.02f %02.02f %02.02f"
165
"\n%02.02f %02.02f %02.02f %02.02f\n",
166
matrix[0], matrix[1], matrix[2], matrix[3],
167
matrix[4], matrix[5], matrix[6], matrix[7],
168
matrix[8], matrix[9], matrix[10], matrix[11],
169
matrix[12], matrix[13], matrix[14], matrix[15]);
170
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,0.000f,-0.707f), 2.121f));
171
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,-0.000f,0.707f), -2.121f));
172
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,-0.000f,0.707f), -2.121f));
173
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,0.000f,-0.707f), 2.121f));
174
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,0.000f,-0.707f), 2.828f));
175
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,-0.000f,0.707f), -2.828f));
176
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,-0.000f,0.707f), -2.828f));
177
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,0.000f,-0.707f), 2.828f));
179
matrix = rotationMatrix * scaleMatrix;
180
logTestString("\nRotation * scale matrix\n%02.02f %02.02f %02.02f %02.02f"
181
"\n%02.02f %02.02f %02.02f %02.02f"
182
"\n%02.02f %02.02f %02.02f %02.02f"
183
"\n%02.02f %02.02f %02.02f %02.02f\n",
184
matrix[0], matrix[1], matrix[2], matrix[3],
185
matrix[4], matrix[5], matrix[6], matrix[7],
186
matrix[8], matrix[9], matrix[10], matrix[11],
187
matrix[12], matrix[13], matrix[14], matrix[15]);
188
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,0.000f,-0.354f), -0.000f));
189
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,-0.000f,0.354f), -0.000f));
190
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,-0.000f,0.354f), -0.000f));
191
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,0.000f,-0.354f), -0.000f));
192
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,0.000f,-0.354f), 0.707f));
193
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,-0.000f,0.354f), -0.707f));
194
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,-0.000f,0.354f), -0.707f));
195
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,0.000f,-0.354f), 0.707f));
197
matrix = translationMatrix * scaleMatrix;
198
logTestString("\nTranslation * scale matrix\n%02.02f %02.02f %02.02f %02.02f"
199
"\n%02.02f %02.02f %02.02f %02.02f"
200
"\n%02.02f %02.02f %02.02f %02.02f"
201
"\n%02.02f %02.02f %02.02f %02.02f\n",
202
matrix[0], matrix[1], matrix[2], matrix[3],
203
matrix[4], matrix[5], matrix[6], matrix[7],
204
matrix[8], matrix[9], matrix[10], matrix[11],
205
matrix[12], matrix[13], matrix[14], matrix[15]);
206
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,-0.354f,0.000f), 1.061f));
207
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,0.354f,0.000f), -1.061f));
208
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,0.354f,0.000f), -1.061f));
209
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,-0.354f,0.000f), 1.061f));
210
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,-0.354f,0.000f), 1.768f));
211
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,0.354f,0.000f), -1.768f));
212
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,0.354f,0.000f), -1.768f));
213
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,-0.354f,0.000f), 1.768f));
215
matrix = rotationMatrix * translationMatrix * scaleMatrix;
216
logTestString("\nRotation * translation * scale matrix\n%02.02f %02.02f %02.02f %02.02f"
217
"\n%02.02f %02.02f %02.02f %02.02f"
218
"\n%02.02f %02.02f %02.02f %02.02f"
219
"\n%02.02f %02.02f %02.02f %02.02f\n",
220
matrix[0], matrix[1], matrix[2], matrix[3],
221
matrix[4], matrix[5], matrix[6], matrix[7],
222
matrix[8], matrix[9], matrix[10], matrix[11],
223
matrix[12], matrix[13], matrix[14], matrix[15]);
224
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,0.000f,-0.354f), 1.061f));
225
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,-0.000f,0.354f), -1.061f));
226
success &= transformPlane(vector3df(0, 0, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,-0.000f,0.354f), -1.061f));
227
success &= transformPlane(vector3df(0, 0, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,0.000f,-0.354f), 1.061f));
228
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, -1, 0), matrix, plane3df(vector3df(-0.707f,0.000f,-0.354f), 1.768f));
229
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, 1, 0), matrix, plane3df(vector3df(0.707f,-0.000f,0.354f), -1.768f));
230
success &= transformPlane(vector3df(0, 1, 0), vector3df(-1, 1, 0), matrix, plane3df(vector3df(-0.707f,-0.000f,0.354f), -1.768f));
231
success &= transformPlane(vector3df(0, 1, 0), vector3df(1, -1, 0), matrix, plane3df(vector3df(0.707f,0.000f,-0.354f), 1.768f));
233
success &= drawScaledOctree();