1/****************************************************************************
2**
3** Copyright (C) 2016 Klaralvdalens Datakonsult AB (KDAB).
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt3D module of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
9** Commercial License Usage
10** Licensees holding valid commercial Qt licenses may use this file in
11** accordance with the commercial license agreement provided with the
12** Software or, alternatively, in accordance with the terms contained in
13** a written agreement between you and The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28
29#include <QtTest/QTest>
30#include <Qt3DRender/private/uniform_p.h>
31
32using namespace Qt3DRender;
33using namespace Qt3DRender::Render;
34
35class tst_Uniform : public QObject
36{
37 Q_OBJECT
38private Q_SLOTS:
39
40 void checkInitialState()
41 {
42 // GIVEN
43 UniformValue v;
44 // THEN
45 QVERIFY(v.constData<float>()[0] == 0.0f);
46 QVERIFY(v.constData<float>()[1] == 0.0f);
47 QVERIFY(v.constData<float>()[2] == 0.0f);
48 QVERIFY(v.constData<float>()[3] == 0.0f);
49 }
50
51 void checkDefaultCTors()
52 {
53 {
54 // GIVEN
55 UniformValue v(883);
56 // THEN
57 QCOMPARE(v.constData<int>()[0], 883);
58 QCOMPARE(v.constData<int>()[1], 0);
59 QCOMPARE(v.constData<int>()[2], 0);
60 QCOMPARE(v.constData<int>()[3], 0);
61 }
62 {
63 // GIVEN
64 UniformValue v(1584U);
65 // THEN
66 QCOMPARE(v.constData<uint>()[0], 1584U);
67 QCOMPARE(v.constData<uint>()[1], 0U);
68 QCOMPARE(v.constData<uint>()[2], 0U);
69 QCOMPARE(v.constData<uint>()[3], 0U);
70 }
71 {
72 // GIVEN
73 UniformValue v(454.0f);
74 // THEN
75 QCOMPARE(v.constData<float>()[0], 454.0f);
76 QCOMPARE(v.constData<float>()[1], 0.0f);
77 QCOMPARE(v.constData<float>()[2], 0.0f);
78 QCOMPARE(v.constData<float>()[3], 0.0f);
79 }
80 {
81 // GIVEN
82 UniformValue v(350.0);
83 // THEN
84 // Note: Uniform value does a double -> float conversion
85 QCOMPARE(v.constData<float>()[0], 350.0f);
86 QCOMPARE(v.constData<float>()[1], 0.0f);
87 QCOMPARE(v.constData<float>()[2], 0.0f);
88 QCOMPARE(v.constData<float>()[3], 0.0f);
89 }
90 {
91 // GIVEN
92 UniformValue v(true);
93 // THEN
94 QCOMPARE(v.constData<bool>()[0], true);
95 QCOMPARE(v.constData<bool>()[1], false);
96 QCOMPARE(v.constData<bool>()[2], false);
97 QCOMPARE(v.constData<bool>()[3], false);
98 }
99 {
100 // GIVEN
101 UniformValue v(QVector2D(355.0f, 383.0f));
102 // THEN
103 QCOMPARE(v.constData<float>()[0], 355.0f);
104 QCOMPARE(v.constData<float>()[1], 383.0f);
105 QCOMPARE(v.constData<float>()[2], 0.0f);
106 QCOMPARE(v.constData<float>()[3], 0.0f);
107 }
108 {
109 // GIVEN
110 UniformValue v(Vector3D(572.0f, 355.0f, 383.0f));
111 // THEN
112 QCOMPARE(v.constData<float>()[0], 572.0f);
113 QCOMPARE(v.constData<float>()[1], 355.0f);
114 QCOMPARE(v.constData<float>()[2], 383.0f);
115 QCOMPARE(v.constData<float>()[3], 0.0f);
116 }
117 {
118 // GIVEN
119 UniformValue v(Vector4D(355.0f, 383.0f, 1340.0f, 1603.0f));
120 // THEN
121 QCOMPARE(v.constData<float>()[0], 355.0f);
122 QCOMPARE(v.constData<float>()[1], 383.0f);
123 QCOMPARE(v.constData<float>()[2], 1340.0f);
124 QCOMPARE(v.constData<float>()[3], 1603.0f);
125 }
126 {
127 // GIVEN
128 const QMatrix4x4 m1;
129 QMatrix4x4 m2;
130 m2.rotate(angle: 90.0f, x: 1.0f, y: 0.0f, z: 0.0f);
131 QMatrix4x4 m3;
132 m3.scale(factor: 2.5f);
133 QMatrix4x4 m4;
134 m4.translate(x: 1.0f, y: 2.0f, z: 3.0f);
135
136 const QVector<QMatrix4x4> matrices = (QVector<QMatrix4x4>() << m1 << m2 << m3 << m4);
137 UniformValue v(matrices);
138
139 // THEN
140 for (int j = 0; j < matrices.size(); ++j) {
141 for (int i = 0; i < 16; ++i) {
142 QCOMPARE(v.constData<float>()[16 * j + i], matrices[j].constData()[i]);
143 }
144 }
145 }
146 {
147 // GIVEN
148 const Qt3DCore::QNodeId nodeId = Qt3DCore::QNodeId::createId();
149 UniformValue v(nodeId);
150
151 // THEN
152 QCOMPARE(uint(v.byteSize()), sizeof(Qt3DCore::QNodeId));
153 QCOMPARE(v.constData<Qt3DCore::QNodeId>()[0], nodeId);
154 }
155 }
156
157 void checkFromVariant()
158 {
159 {
160 // GIVEN
161 UniformValue v = UniformValue::fromVariant(variant: QVariant(883));
162 // THEN
163 QCOMPARE(v.constData<int>()[0], 883);
164 QCOMPARE(v.constData<int>()[1], 0);
165 QCOMPARE(v.constData<int>()[2], 0);
166 QCOMPARE(v.constData<int>()[3], 0);
167 }
168 {
169 // GIVEN
170 UniformValue v = UniformValue::fromVariant(variant: QVariant(1584U));
171 // THEN
172 QCOMPARE(v.constData<uint>()[0], 1584U);
173 QCOMPARE(v.constData<uint>()[1], 0U);
174 QCOMPARE(v.constData<uint>()[2], 0U);
175 QCOMPARE(v.constData<uint>()[3], 0U);
176 }
177 {
178 // GIVEN
179 UniformValue v = UniformValue::fromVariant(variant: QVariant(454.0f));
180 // THEN
181 QCOMPARE(v.constData<float>()[0], 454.0f);
182 QCOMPARE(v.constData<float>()[1], 0.0f);
183 QCOMPARE(v.constData<float>()[2], 0.0f);
184 QCOMPARE(v.constData<float>()[3], 0.0f);
185 }
186 {
187 // GIVEN
188 UniformValue v = UniformValue::fromVariant(variant: QVariant(350.0));
189 // THEN
190 // Note: Uniform value does a double -> float conversion
191 QCOMPARE(v.constData<float>()[0], 350.0f);
192 QCOMPARE(v.constData<float>()[1], 0.0f);
193 QCOMPARE(v.constData<float>()[2], 0.0f);
194 QCOMPARE(v.constData<float>()[3], 0.0f);
195 }
196 {
197 // GIVEN
198 UniformValue v = UniformValue::fromVariant(variant: QVariant(true));
199 // THEN
200 QCOMPARE(v.constData<bool>()[0], true);
201 QCOMPARE(v.constData<bool>()[1], false);
202 QCOMPARE(v.constData<bool>()[2], false);
203 QCOMPARE(v.constData<bool>()[3], false);
204 }
205 {
206 // GIVEN
207 UniformValue v = UniformValue::fromVariant(variant: QVariant::fromValue(value: QVector2D(355.0f, 383.0f)));
208 // THEN
209 QCOMPARE(v.constData<float>()[0], 355.0f);
210 QCOMPARE(v.constData<float>()[1], 383.0f);
211 QCOMPARE(v.constData<float>()[2], 0.0f);
212 QCOMPARE(v.constData<float>()[3], 0.0f);
213 }
214 {
215 // GIVEN
216 UniformValue v = UniformValue::fromVariant(variant: QVariant::fromValue(value: QVector3D(572.0f, 355.0f, 383.0f)));
217 // THEN
218 QCOMPARE(v.constData<float>()[0], 572.0f);
219 QCOMPARE(v.constData<float>()[1], 355.0f);
220 QCOMPARE(v.constData<float>()[2], 383.0f);
221 QCOMPARE(v.constData<float>()[3], 0.0f);
222 }
223 {
224 // GIVEN
225 UniformValue v = UniformValue::fromVariant(variant: QVariant::fromValue(value: QVector4D(355.0f, 383.0f, 1340.0f, 1603.0f)));
226 // THEN
227 QCOMPARE(v.constData<float>()[0], 355.0f);
228 QCOMPARE(v.constData<float>()[1], 383.0f);
229 QCOMPARE(v.constData<float>()[2], 1340.0f);
230 QCOMPARE(v.constData<float>()[3], 1603.0f);
231 }
232 {
233 // GIVEN
234 UniformValue v = UniformValue::fromVariant(variant: QVariant::fromValue(value: QPoint(427, 396)));
235 // THEN
236 QCOMPARE(v.constData<int>()[0], 427);
237 QCOMPARE(v.constData<int>()[1], 396);
238 QCOMPARE(v.constData<int>()[2], 0);
239 QCOMPARE(v.constData<int>()[3], 0);
240 }
241 {
242 // GIVEN
243 UniformValue v = UniformValue::fromVariant(variant: QVariant::fromValue(value: QSize(427, 396)));
244 // THEN
245 QCOMPARE(v.constData<int>()[0], 427);
246 QCOMPARE(v.constData<int>()[1], 396);
247 QCOMPARE(v.constData<int>()[2], 0);
248 QCOMPARE(v.constData<int>()[3], 0);
249 }
250 {
251 // GIVEN
252 UniformValue v = UniformValue::fromVariant(variant: QVariant::fromValue(value: QRect(427, 396, 454, 1584)));
253 // THEN
254 QCOMPARE(v.constData<int>()[0], 427);
255 QCOMPARE(v.constData<int>()[1], 396);
256 QCOMPARE(v.constData<int>()[2], 454);
257 QCOMPARE(v.constData<int>()[3], 1584);
258 }
259 {
260 // GIVEN
261 UniformValue v = UniformValue::fromVariant(variant: QVariant::fromValue(value: QPointF(427, 396)));
262 // THEN
263 QCOMPARE(v.constData<float>()[0], 427.0f);
264 QCOMPARE(v.constData<float>()[1], 396.0f);
265 QCOMPARE(v.constData<float>()[2], 0.0f);
266 QCOMPARE(v.constData<float>()[3], 0.0f);
267 }
268 {
269 // GIVEN
270 UniformValue v = UniformValue::fromVariant(variant: QVariant::fromValue(value: QSizeF(427, 396)));
271 // THEN
272 QCOMPARE(v.constData<float>()[0], 427.0f);
273 QCOMPARE(v.constData<float>()[1], 396.0f);
274 QCOMPARE(v.constData<float>()[2], 0.0f);
275 QCOMPARE(v.constData<float>()[3], 0.0f);
276 }
277 {
278 // GIVEN
279 UniformValue v = UniformValue::fromVariant(variant: QVariant::fromValue(value: QRectF(427, 396, 454, 1584)));
280 // THEN
281 QCOMPARE(v.constData<float>()[0], 427.0f);
282 QCOMPARE(v.constData<float>()[1], 396.0f);
283 QCOMPARE(v.constData<float>()[2], 454.0f);
284 QCOMPARE(v.constData<float>()[3], 1584.0f);
285 }
286 {
287 // GIVEN
288 UniformValue v = UniformValue::fromVariant(variant: QVariant::fromValue(value: QMatrix4x4()));
289 // THEN
290 QCOMPARE(v.constData<float>()[ 0], 1.0f);
291 QCOMPARE(v.constData<float>()[ 1], 0.0f);
292 QCOMPARE(v.constData<float>()[ 2], 0.0f);
293 QCOMPARE(v.constData<float>()[ 3], 0.0f);
294
295 QCOMPARE(v.constData<float>()[ 4], 0.0f);
296 QCOMPARE(v.constData<float>()[ 5], 1.0f);
297 QCOMPARE(v.constData<float>()[ 6], 0.0f);
298 QCOMPARE(v.constData<float>()[ 7], 0.0f);
299
300 QCOMPARE(v.constData<float>()[ 8], 0.0f);
301 QCOMPARE(v.constData<float>()[ 9], 0.0f);
302 QCOMPARE(v.constData<float>()[10], 1.0f);
303 QCOMPARE(v.constData<float>()[11], 0.0f);
304
305 QCOMPARE(v.constData<float>()[12], 0.0f);
306 QCOMPARE(v.constData<float>()[13], 0.0f);
307 QCOMPARE(v.constData<float>()[14], 0.0f);
308 QCOMPARE(v.constData<float>()[15], 1.0f);
309 }
310 {
311 // GIVEN
312 QVariant variants = QVariantList() << QVariant(427.0f) << QVariant(454.0f) << QVariant(883.0f) << QVariant(1340.0f);
313 UniformValue v = UniformValue::fromVariant(variant: variants);
314
315 // THEN
316 QCOMPARE(v.constData<float>()[0], 427.0f);
317 QCOMPARE(v.constData<float>()[1], 454.0f);
318 QCOMPARE(v.constData<float>()[2], 883.0f);
319 QCOMPARE(v.constData<float>()[3], 1340.0f);
320 }
321 {
322 // GIVEN
323 QVariant variants = QVariantList() << QVariant::fromValue(value: QVector4D(2.0f, 16.0f, 8.0f, 4.0f)) << QVariant(QVector4D(3.0f, 24.0f, 12.0f, 6.0f));
324 UniformValue v = UniformValue::fromVariant(variant: variants);
325
326 // THEN
327 QCOMPARE(v.constData<float>()[0], 2.0f);
328 QCOMPARE(v.constData<float>()[1], 16.0f);
329 QCOMPARE(v.constData<float>()[2], 8.0f);
330 QCOMPARE(v.constData<float>()[3], 4.0f);
331 QCOMPARE(v.constData<float>()[4], 3.0f);
332 QCOMPARE(v.constData<float>()[5], 24.0f);
333 QCOMPARE(v.constData<float>()[6], 12.0f);
334 QCOMPARE(v.constData<float>()[7], 6.0f);
335 }
336 {
337 // GIVEN
338 QVariant variants = QVariantList() << QVariant(427) << QVariant(454) << QVariant(883) << QVariant(1340);
339 UniformValue v = UniformValue::fromVariant(variant: variants);
340
341 // THEN
342 QCOMPARE(v.constData<int>()[0], 427);
343 QCOMPARE(v.constData<int>()[1], 454);
344 QCOMPARE(v.constData<int>()[2], 883);
345 QCOMPARE(v.constData<int>()[3], 1340);
346 }
347 }
348
349 void checkComparison()
350 {
351 // GIVEN
352 const UniformValue v1(Vector3D(454.0f, 883.0f, 572.0f));
353 UniformValue v2(454.0f);
354
355 // THEN
356 QVERIFY(!(v1 == v2));
357 QVERIFY(v1 != v2);
358
359 // WHEN
360 v2 = UniformValue::fromVariant(variant: QVariant::fromValue(value: Vector3D(454.0f, 883.0f, 572.0f)));
361 // THEN
362 QVERIFY(v1 == v2);
363 QVERIFY(!(v1 != v2));
364
365 // WHEN
366 v2 = UniformValue::fromVariant(variant: QVariant::fromValue(value: Vector3D(454.0f, 883.0f, 572.0f)));
367 // THEN
368 QVERIFY(v1 == v2);
369 QVERIFY(!(v1 != v2));
370
371 // WHEN
372 v2 = UniformValue::fromVariant(variant: 454.0f);
373 // THEN
374 QVERIFY(!(v1 == v2));
375 QVERIFY(v1 != v2);
376 }
377
378 void checkSetData()
379 {
380 // GIVEN
381 const QMatrix4x4 m1;
382 QMatrix4x4 m2;
383 m2.rotate(angle: 90.0f, x: 1.0f, y: 0.0f, z: 0.0f);
384 QMatrix4x4 m3;
385 m3.scale(factor: 2.5f);
386 QMatrix4x4 m4;
387 m4.translate(x: 1.0f, y: 2.0f, z: 3.0f);
388
389 const QVector<QMatrix4x4> matrices1 = (QVector<QMatrix4x4>() << m1 << m2 << m3 << m4);
390 UniformValue v(matrices1);
391
392 // WHEN
393 const QVector<QMatrix4x4> matrices2 = (QVector<QMatrix4x4>() << m4 << m3 << m2 << m1 << m4);
394 v.setData(matrices2);
395
396 // THEN
397 for (int j = 0; j < matrices2.size(); ++j) {
398 for (int i = 0; i < 16; ++i) {
399 QCOMPARE(v.constData<float>()[16 * j + i], matrices2[j].constData()[i]);
400 }
401 }
402
403 // GIVEN
404 const int positionCount = 10;
405 QVector<QVector3D> positions(positionCount);
406 for (int i = 0; i < positionCount; ++i) {
407 const QVector3D p(float(i), 10.0f * i, 100.0f * i);
408 positions[i] = p;
409 }
410
411 UniformValue positionsUniform;
412
413 // WHEN
414 positionsUniform.setData(positions);
415
416 // THEN
417 const QVector3D *data = positionsUniform.constData<QVector3D>();
418 for (int i = 0; i < positionCount; ++i) {
419 QCOMPARE(*(data + i), positions[i]);
420 }
421 }
422};
423
424
425QTEST_APPLESS_MAIN(tst_Uniform)
426
427#include "tst_uniform.moc"
428

source code of qt3d/tests/auto/render/uniform/tst_uniform.cpp