1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt scene graph research project.
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 <QtCore/QString>
30#include <QtTest/QtTest>
31
32#include <QtQuick/qsggeometry.h>
33
34class GeometryTest : public QObject
35{
36 Q_OBJECT
37
38public:
39
40private Q_SLOTS:
41 void testPoint2D();
42 void testTexturedPoint2D();
43 void testCustomGeometry();
44
45private:
46};
47
48void GeometryTest::testPoint2D()
49{
50 QSGGeometry geometry(QSGGeometry::defaultAttributes_Point2D(), 4, 0);
51
52 QCOMPARE(geometry.attributeCount(), 1);
53 QCOMPARE(geometry.sizeOfVertex(), (int) sizeof(float) * 2);
54 QCOMPARE(geometry.vertexCount(), 4);
55 QCOMPARE(geometry.indexCount(), 0);
56 QVERIFY(!geometry.indexData());
57
58 QSGGeometry::updateRectGeometry(g: &geometry, rect: QRectF(1, 2, 3, 4));
59
60 QSGGeometry::Point2D *pts = geometry.vertexDataAsPoint2D();
61 QVERIFY(pts != nullptr);
62
63 QCOMPARE(pts[0].x, (float) 1);
64 QCOMPARE(pts[0].y, (float) 2);
65 QCOMPARE(pts[3].x, (float) 4);
66 QCOMPARE(pts[3].y, (float) 6);
67
68 // Verify that resize gives me enough allocated data without crashing...
69 geometry.allocate(vertexCount: 100, indexCount: 100);
70 pts = geometry.vertexDataAsPoint2D();
71 quint16 *is = geometry.indexDataAsUShort();
72 for (int i=0; i<100; ++i) {
73 pts[i].x = i;
74 pts[i].y = i + 100;
75 is[i] = i;
76 }
77 QVERIFY(true);
78}
79
80
81void GeometryTest::testTexturedPoint2D()
82{
83 QSGGeometry geometry(QSGGeometry::defaultAttributes_TexturedPoint2D(), 4, 0);
84
85 QCOMPARE(geometry.attributeCount(), 2);
86 QCOMPARE(geometry.sizeOfVertex(), (int) sizeof(float) * 4);
87 QCOMPARE(geometry.vertexCount(), 4);
88 QCOMPARE(geometry.indexCount(), 0);
89 QVERIFY(!geometry.indexData());
90
91 QSGGeometry::updateTexturedRectGeometry(g: &geometry, rect: QRectF(1, 2, 3, 4), sourceRect: QRectF(5, 6, 7, 8));
92
93 QSGGeometry::TexturedPoint2D *pts = geometry.vertexDataAsTexturedPoint2D();
94 QVERIFY(pts != nullptr);
95
96 QCOMPARE(pts[0].x, (float) 1);
97 QCOMPARE(pts[0].y, (float) 2);
98 QCOMPARE(pts[0].tx, (float) 5);
99 QCOMPARE(pts[0].ty, (float) 6);
100
101 QCOMPARE(pts[3].x, (float) 4);
102 QCOMPARE(pts[3].y, (float) 6);
103 QCOMPARE(pts[3].tx, (float) 12);
104 QCOMPARE(pts[3].ty, (float) 14);
105
106 // Verify that resize gives me enough allocated data without crashing...
107 geometry.allocate(vertexCount: 100, indexCount: 100);
108 pts = geometry.vertexDataAsTexturedPoint2D();
109 quint16 *is = geometry.indexDataAsUShort();
110 for (int i=0; i<100; ++i) {
111 pts[i].x = i;
112 pts[i].y = i + 100;
113 pts[i].tx = i + 200;
114 pts[i].ty = i + 300;
115 is[i] = i;
116 }
117 QVERIFY(true);
118}
119
120void GeometryTest::testCustomGeometry()
121{
122 struct V {
123 float x, y;
124 unsigned char r, g, b, a;
125 float v1, v2, v3, v4;
126 };
127
128 static QSGGeometry::Attribute attributes[] = {
129 QSGGeometry::Attribute::create(pos: 0, tupleSize: 2, primitiveType: QSGGeometry::FloatType, isPosition: false),
130 QSGGeometry::Attribute::create(pos: 1, tupleSize: 4, primitiveType: QSGGeometry::UnsignedByteType, isPosition: false),
131 QSGGeometry::Attribute::create(pos: 2, tupleSize: 4, primitiveType: QSGGeometry::FloatType, isPosition: false)
132 };
133 static QSGGeometry::AttributeSet set = { .count: 4, .stride: 6 * sizeof(float) + 4 * sizeof(unsigned char), .attributes: attributes };
134
135 QSGGeometry geometry(set, 1000, 4000);
136
137 // Verify that space has been allocated.
138 quint16 *ii = geometry.indexDataAsUShort();
139 for (int i=0; i<geometry.indexCount(); ++i) {
140 ii[i] = i;
141 }
142
143 V *v = (V *) geometry.vertexData();
144 for (int i=0; i<geometry.vertexCount(); ++i) {
145 v[i].x = 0;
146 v[i].y = 1;
147 v[i].r = 2;
148 v[i].g = 3;
149 v[i].b = 4;
150 v[i].a = 5;
151 v[i].v1 = 6;
152 v[i].v2 = 7;
153 v[i].v3 = 8;
154 v[i].v4 = 9;
155 }
156
157 // Verify the data's integrity
158 for (int i=0; i<4000; ++i)
159 QCOMPARE(ii[i], (quint16) i);
160 for (int i=0; i<1000; ++i)
161 QCOMPARE(v[i].v1, float(6));
162
163}
164
165
166QTEST_MAIN(GeometryTest);
167
168#include "tst_geometry.moc"
169

source code of qtdeclarative/tests/auto/quick/geometry/tst_geometry.cpp