Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qquick3dparticleshapedatautils.cpp
Go to the documentation of this file.
1// Copyright (C) 2021 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3// Qt-Security score:significant reason:default
4
5
7#include <QtCore/QRect>
8#include <QtGui/QVector2D>
9#include <QtGui/QVector3D>
10#include <QtGui/QVector4D>
11#include <QtGui/QQuaternion>
12#include <QtGui/QColor>
13
15
16// This file contains useful methods to read & write shape
17// CBOR binary files and understand the format.
18
19// Read property 'type' value from CBOR and return it as QVariant.
20QVariant QQuick3DParticleShapeDataUtils::readValue(QCborStreamReader &reader, QMetaType::Type type)
21{
22 switch (type) {
23 case QMetaType::Bool: {
24 bool b = reader.toBool();
25 reader.next();
26 return QVariant(b);
27 }
28 case QMetaType::Int: {
29 int i = reader.toInteger();
30 reader.next();
31 return QVariant(i);
32 }
33 case QMetaType::Float: {
34 float f = reader.toFloat();
35 reader.next();
36 return QVariant(f);
37 }
38 case QMetaType::Double: {
39 double d = reader.toDouble();
40 reader.next();
41 return QVariant(d);
42 }
43 case QMetaType::QString: {
44 QString s = reader.readString().data;
45 return QVariant(s);
46 }
47 case QMetaType::QVector2D: {
48 QVector2D v;
49 v.setX(reader.toFloat());
50 reader.next();
51 v.setY(reader.toFloat());
52 reader.next();
53 return QVariant(v);
54 }
55 case QMetaType::QVector3D: {
56 QVector3D v;
57 v.setX(reader.toFloat());
58 reader.next();
59 v.setY(reader.toFloat());
60 reader.next();
61 v.setZ(reader.toFloat());
62 reader.next();
63 return QVariant(v);
64 }
65 case QMetaType::QVector4D: {
66 QVector4D v;
67 v.setX(reader.toFloat());
68 reader.next();
69 v.setY(reader.toFloat());
70 reader.next();
71 v.setZ(reader.toFloat());
72 reader.next();
73 v.setW(reader.toFloat());
74 reader.next();
75 return QVariant(v);
76 }
77 case QMetaType::QQuaternion: {
78 QQuaternion q;
79 q.setScalar(reader.toFloat());
80 reader.next();
81 q.setX(reader.toFloat());
82 reader.next();
83 q.setY(reader.toFloat());
84 reader.next();
85 q.setZ(reader.toFloat());
86 reader.next();
87 return QVariant(q);
88 }
89 case QMetaType::QColor: {
90 QColor c;
91 c.setRed(reader.toInteger());
92 reader.next();
93 c.setGreen(reader.toInteger());
94 reader.next();
95 c.setBlue(reader.toInteger());
96 reader.next();
97 c.setAlpha(reader.toInteger());
98 reader.next();
99 return QVariant(c);
100 }
101 case QMetaType::QRect: {
102 QRect r;
103 r.setX(reader.toInteger());
104 reader.next();
105 r.setY(reader.toInteger());
106 reader.next();
107 r.setWidth(reader.toInteger());
108 reader.next();
109 r.setHeight(reader.toInteger());
110 reader.next();
111 return QVariant(r);
112 }
113 default: {
114 qWarning() << "Property type not handled:" << type;
115 }
116 }
117
118 return QVariant();
119}
120
121// Read a string from CBOR.
122QString QQuick3DParticleShapeDataUtils::readString(QCborStreamReader &reader)
123{
124 QString result;
125 auto r = reader.readString();
126 while (r.status == QCborStreamReader::Ok) {
127 result += r.data;
128 r = reader.readString();
129 }
130
131 if (r.status == QCborStreamReader::Error) {
132 // handle error condition
133 result.clear();
134 }
135 return result;
136}
137
138// Read a real (double or float) from CBOR.
139double QQuick3DParticleShapeDataUtils::readReal(QCborStreamReader &reader)
140{
141 double result = 0.0;
142 if (reader.isDouble()) {
143 result = reader.toDouble();
144 reader.next();
145 } else if (reader.isFloat()) {
146 result = reader.toFloat();
147 reader.next();
148 }
149 return result;
150}
151
152// Read shape file header and return the version.
153// If header is not valid, -1 is returned.
154int QQuick3DParticleShapeDataUtils::readShapeHeader(QCborStreamReader &reader)
155{
156 int version = -1;
157 if (reader.lastError() == QCborError::NoError && reader.isArray()) {
158 // Start root array
159 reader.enterContainer();
160 if (reader.isString()) {
161 QString header = readString(reader);
162 if (header == QStringLiteral("QQ3D_SHAPE")) {
163 if (reader.isInteger()) {
164 version = reader.toInteger();
165 reader.next();
166 } else {
167 qWarning() << "Invalid shape version";
168 }
169 } else {
170 qWarning() << "Invalid shape header";
171 }
172 } else {
173 qWarning() << "Invalid shape container";
174 }
175 }
176 return version;
177}
178
179#if QT_CONFIG(cborstreamwriter)
180void QQuick3DParticleShapeDataUtils::writeShapeHeader(QCborStreamWriter &writer, int version)
181{
182 // Root array
183 writer.startArray();
184 // header name
185 writer.append("QQ3D_SHAPE");
186 // file version
187 writer.append(version);
188}
189
190// Write QVariant value into CBOR in correct type.
191void QQuick3DParticleShapeDataUtils::writeValue(QCborStreamWriter &writer, const QVariant &value)
192{
193 const QMetaType type = value.metaType();
194 switch (type.id()) {
195 case QMetaType::Bool: {
196 bool b = value.toBool();
197 writer.append(b);
198 break;
199 }
200 case QMetaType::Int: {
201 int i = value.toInt();
202 writer.append(i);
203 break;
204 }
205 case QMetaType::Float: {
206 float f = value.toFloat();
207 writer.append(f);
208 break;
209 }
210 case QMetaType::Double: {
211 double d = value.toDouble();
212 writer.append(d);
213 break;
214 }
215 case QMetaType::QVector2D: {
216 QVector2D v = value.value<QVector2D>();
217 writer.append(v.x());
218 writer.append(v.y());
219 break;
220 }
221 case QMetaType::QVector3D: {
222 QVector3D v = value.value<QVector3D>();
223 writer.append(v.x());
224 writer.append(v.y());
225 writer.append(v.z());
226 break;
227 }
228 case QMetaType::QVector4D: {
229 QVector4D v = value.value<QVector4D>();
230 writer.append(v.x());
231 writer.append(v.y());
232 writer.append(v.z());
233 writer.append(v.w());
234 break;
235 }
236 case QMetaType::QQuaternion: {
237 QQuaternion q = value.value<QQuaternion>();
238 writer.append(q.scalar());
239 writer.append(q.x());
240 writer.append(q.y());
241 writer.append(q.z());
242 break;
243 }
244 case QMetaType::QColor: {
245 QColor c = value.value<QColor>();
246 writer.append(c.red());
247 writer.append(c.green());
248 writer.append(c.blue());
249 writer.append(c.alpha());
250 break;
251 }
252 case QMetaType::QRect: {
253 QRect r = value.value<QRect>();
254 writer.append(r.x());
255 writer.append(r.y());
256 writer.append(r.width());
257 writer.append(r.height());
258 break;
259 }
260 default: {
261 qDebug() << "Not able to add:" << value << "of type:" << type.name();
262 qDebug() << "Please add support for this type into generator.";
263 break;
264 }
265 }
266}
267#endif
268
269QT_END_NAMESPACE
Combined button and popup list for selecting options.