Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qssgutils_p.h
Go to the documentation of this file.
1// Copyright (C) 2008-2012 NVIDIA Corporation.
2// Copyright (C) 2019 The Qt Company Ltd.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
4
5#ifndef QSSGUTILS_H
6#define QSSGUTILS_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtQuick3DUtils/private/qtquick3dutilsglobal_p.h>
20#include <QtQuick3DUtils/private/qssgdataref_p.h>
21
22#include <QtGui/QVector2D>
23#include <QtGui/QVector3D>
24#include <QtGui/QQuaternion>
25#include <QtGui/QMatrix3x3>
26#include <QtGui/QMatrix4x4>
27#include <QtGui/QColor>
28
29#include <QtCore/qdebug.h>
30#include <QtCore/QString>
31#include <QtCore/qloggingcategory.h>
32#include <QtCore/QIODevice>
33#include <QtCore/qmath.h>
34
35class tst_RotationDataClass;
36
38
39namespace aux {
40Q_DECL_CONSTEXPR inline float translateConstantAttenuation(float attenuation) { return attenuation; }
41template<int MINATTENUATION = 0, int MAXATTENUATION = 1000>
42Q_DECL_CONSTEXPR inline float translateLinearAttenuation(float attenuation) { return qBound(float(MINATTENUATION), attenuation, float(MAXATTENUATION)) * .01f; }
43template<int MINATTENUATION = 0, int MAXATTENUATION = 1000>
44Q_DECL_CONSTEXPR inline float translateQuadraticAttenuation(float attenuation) { return qBound(float(MINATTENUATION), attenuation, float(MAXATTENUATION)) * .0001f; }
45}
46
47namespace vec2 {
48float Q_QUICK3DUTILS_EXPORT magnitude(const QVector2D &v);
49}
50
51namespace vec3 {
52inline QVector3D minimum(const QVector3D &v1, const QVector3D &v2) Q_DECL_NOTHROW { return { qMin(v1.x(), v2.x()), qMin(v1.y(), v2.y()), qMin(v1.z(), v2.z()) }; }
53inline QVector3D maximum(const QVector3D &v1, const QVector3D &v2) Q_DECL_NOTHROW { return { qMax(v1.x(), v2.x()), qMax(v1.y(), v2.y()), qMax(v1.z(), v2.z()) }; }
54bool Q_QUICK3DUTILS_EXPORT isFinite(const QVector3D &v);
55float Q_QUICK3DUTILS_EXPORT magnitude(const QVector3D &v);
56float Q_QUICK3DUTILS_EXPORT magnitudeSquared(const QVector3D &v);
57float Q_QUICK3DUTILS_EXPORT normalize(QVector3D &v);
58}
59
60namespace mat33 {
61QVector3D Q_QUICK3DUTILS_EXPORT transform(const QMatrix3x3 &m, const QVector3D &v);
62}
63
64namespace mat44 {
65QMatrix3x3 Q_QUICK3DUTILS_EXPORT getUpper3x3(const QMatrix4x4 &m);
66void Q_QUICK3DUTILS_EXPORT normalize(QMatrix4x4 &m);
67QVector3D Q_QUICK3DUTILS_EXPORT rotate(const QMatrix4x4 &m, const QVector3D &v);
68QVector4D Q_QUICK3DUTILS_EXPORT rotate(const QMatrix4x4 &m, const QVector4D &v);
69QVector3D Q_QUICK3DUTILS_EXPORT transform(const QMatrix4x4 &m, const QVector3D &v);
70QVector4D Q_QUICK3DUTILS_EXPORT transform(const QMatrix4x4 &m, const QVector4D &v);
71QVector3D Q_QUICK3DUTILS_EXPORT getPosition(const QMatrix4x4 &m);
72QVector3D Q_QUICK3DUTILS_EXPORT getScale(const QMatrix4x4 &m);
73
74inline void flip(QMatrix4x4 &matrix)
75{
76 // Flip between left-handed and right-handed orientation
77 float *writePtr(matrix.data());
78 // rotation conversion
79 writePtr[0 * 4 + 2] *= -1;
80 writePtr[1 * 4 + 2] *= -1;
81 writePtr[2 * 4 + 0] *= -1;
82 writePtr[2 * 4 + 1] *= -1;
83 // translation conversion
84 writePtr[3 * 4 + 2] *= -1;
85}
86
87}
88
89namespace quant {
90bool Q_QUICK3DUTILS_EXPORT isFinite(const QQuaternion &q);
91
92float Q_QUICK3DUTILS_EXPORT magnitude(const QQuaternion &q);
93
94bool Q_QUICK3DUTILS_EXPORT isSane(const QQuaternion &q);
95
96bool Q_QUICK3DUTILS_EXPORT isUnit(const QQuaternion &q);
97
98QVector3D Q_QUICK3DUTILS_EXPORT rotated(const QQuaternion &q, const QVector3D &v);
99
100QVector3D Q_QUICK3DUTILS_EXPORT inverseRotated(const QQuaternion &q, const QVector3D &v);
101}
102
103namespace color {
104QVector4D Q_QUICK3DUTILS_EXPORT sRGBToLinear(const QColor &color);
105QColor Q_QUICK3DUTILS_EXPORT sRGBToLinearColor(const QColor &color);
106}
107
108template<typename TDataType>
110{
111 return QSSGDataRef<TDataType>(byteSize ? reinterpret_cast<TDataType *>(baseData + offset) : nullptr,
112 byteSize / sizeof(TDataType));
113}
114
115Q_QUICK3DUTILS_EXPORT const char *nonNull(const char *src);
116
119}
120
123}
124
126{
127public:
128 RotationData() = default;
129 explicit RotationData(const QVector3D &r)
130 : m_quatRot()
131 , m_eulerRot(r)
132 , m_dirty(Dirty::Quaternion)
133 {}
134 explicit RotationData(const QQuaternion &r)
135 : m_quatRot(r.normalized())
136 , m_eulerRot()
137 , m_dirty(Dirty::Euler)
138 {}
139
141 {
142 m_eulerRot = r;
143 m_dirty = Dirty::Quaternion;
144 return *this;
145 }
147 {
148 m_quatRot = r.normalized();
149 m_dirty = Dirty::Euler;
150 return *this;
151 }
152
153 friend inline bool operator ==(const RotationData &a, const RotationData &b) {
154 if (a.m_dirty == Dirty::None && b.m_dirty == Dirty::None)
155 return fuzzyQuaternionCompare(a.m_quatRot, b.m_quatRot);
156
157 return fuzzyQuaternionCompare(QQuaternion(a), QQuaternion(b));
158 }
159
160 friend inline bool operator !=(const RotationData &a, const RotationData &b) { return !(a == b); }
161
162 friend inline bool operator ==(const RotationData &a, const QVector3D &eulerRotation)
163 {
164 if (a.m_dirty == Dirty::None)
165 return qFuzzyCompare(a.m_eulerRot, eulerRotation);
166
167 return qFuzzyCompare(QVector3D(a), eulerRotation);
168 }
169 friend inline bool operator !=(const RotationData &a, const QVector3D &eulerRotation) { return !(a == eulerRotation); }
170
171 friend inline bool operator ==(const RotationData &a, const QQuaternion &rotation)
172 {
173 if (a.m_dirty == Dirty::None)
174 return fuzzyQuaternionCompare(a.m_quatRot, rotation);
175
176 return fuzzyQuaternionCompare(QQuaternion(a), rotation);
177 }
178 friend inline bool operator !=(const RotationData &a, const QQuaternion &rotation) { return !(a == rotation); }
179
180 [[nodiscard]] inline QVector3D getEulerRotation() const
181 {
182 if (m_dirty == Dirty::Euler) {
183 m_eulerRot = m_quatRot.toEulerAngles();
184 m_dirty = Dirty::None;
185 }
186
187 return m_eulerRot;
188 }
189
190 [[nodiscard]] inline QQuaternion getQuaternionRotation() const
191 {
192 if (m_dirty == Dirty::Quaternion) {
193 m_quatRot = QQuaternion::fromEulerAngles(m_eulerRot).normalized();
194 m_dirty = Dirty::None;
195 }
196
197 return m_quatRot;
198 }
199
200 [[nodiscard]] inline QMatrix3x3 toRotationMatrix() const { return getQuaternionRotation().toRotationMatrix(); }
201
202 [[nodiscard]] inline operator QQuaternion() const { return getQuaternionRotation(); }
203 [[nodiscard]] inline operator QVector3D() const { return getEulerRotation(); }
204
205private:
206 friend class ::tst_RotationDataClass;
207
208 [[nodiscard]] constexpr static inline bool fuzzyQuaternionCompare(const QQuaternion &a, const QQuaternion &b)
209 {
210 // This 'e' will give better precision than qtbase's qFuzzyCompare for QQuaternion
211 constexpr float e = std::numeric_limits<float>::epsilon();
212 return (qAbs(1.0f - qAbs(QQuaternion::dotProduct(a, b))) <= e);
213 }
214
215 enum class Dirty
216 {
217 None,
218 Quaternion = 0x1,
219 Euler = 0x2
220 };
221
222 mutable QQuaternion m_quatRot; // Should always be normalized
223 mutable QVector3D m_eulerRot;
224 mutable Dirty m_dirty { Dirty::None };
225};
226
228template<typename T>
229inline void ensureDebugObjectName(T *node, QObject *src)
230{
231 if (!node->debugObjectName.isEmpty())
232 return;
233 node->debugObjectName = src->objectName();
234 if (node->debugObjectName.isEmpty())
235 node->debugObjectName = QString::fromLatin1(src->metaObject()->className());
236 if (node->debugObjectName.isEmpty())
237 node->debugObjectName = QString::asprintf("%p", src);
238}
239}
240
242
243#endif // QSSGUTILS_H
The QColor class provides colors based on RGB, HSV or CMYK values.
Definition qcolor.h:31
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
Definition qmatrix4x4.h:25
\inmodule QtCore
Definition qobject.h:90
The QQuaternion class represents a quaternion consisting of a vector and scalar.
Definition qquaternion.h:21
static QQuaternion fromEulerAngles(const QVector3D &eulerAngles)
QQuaternion normalized() const
Returns the normalized unit form of this quaternion.
static constexpr float dotProduct(const QQuaternion &q1, const QQuaternion &q2)
QMatrix3x3 toRotationMatrix() const
QVector3D toEulerAngles() const
static QString fromLatin1(QByteArrayView ba)
This is an overloaded member function, provided for convenience. It differs from the above function o...
Definition qstring.cpp:5710
static QString static QString asprintf(const char *format,...) Q_ATTRIBUTE_FORMAT_PRINTF(1
Definition qstring.cpp:7005
The QVector2D class represents a vector or vertex in 2D space.
Definition qvectornd.h:31
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
The QVector4D class represents a vector or vertex in 4D space.
Definition qvectornd.h:330
RotationData(const QVector3D &r)
friend bool operator!=(const RotationData &a, const RotationData &b)
RotationData & operator=(const QQuaternion &r) noexcept
QVector3D getEulerRotation() const
QMatrix3x3 toRotationMatrix() const
RotationData(const QQuaternion &r)
RotationData()=default
QQuaternion getQuaternionRotation() const
friend bool operator==(const RotationData &a, const RotationData &b)
RotationData & operator=(const QVector3D &r) noexcept
double e
void ensureDebugObjectName(T *node, QObject *src)
Combined button and popup list for selecting options.
Q_DECL_CONSTEXPR float translateConstantAttenuation(float attenuation)
Definition qssgutils_p.h:40
Q_DECL_CONSTEXPR float translateQuadraticAttenuation(float attenuation)
Definition qssgutils_p.h:44
Q_DECL_CONSTEXPR float translateLinearAttenuation(float attenuation)
Definition qssgutils_p.h:42
QVector4D Q_QUICK3DUTILS_EXPORT sRGBToLinear(const QColor &color)
QColor Q_QUICK3DUTILS_EXPORT sRGBToLinearColor(const QColor &color)
QMatrix3x3 Q_QUICK3DUTILS_EXPORT getUpper3x3(const QMatrix4x4 &m)
Definition qssgutils.cpp:51
void Q_QUICK3DUTILS_EXPORT normalize(QMatrix4x4 &m)
Definition qssgutils.cpp:57
void flip(QMatrix4x4 &matrix)
Definition qssgutils_p.h:74
QVector3D Q_QUICK3DUTILS_EXPORT rotate(const QMatrix4x4 &m, const QVector3D &v)
Definition qssgutils.cpp:75
QVector3D Q_QUICK3DUTILS_EXPORT getScale(const QMatrix4x4 &m)
QVector3D Q_QUICK3DUTILS_EXPORT getPosition(const QMatrix4x4 &m)
Definition qssgutils.cpp:97
QVector3D Q_QUICK3DUTILS_EXPORT rotated(const QQuaternion &q, const QVector3D &v)
bool Q_QUICK3DUTILS_EXPORT isFinite(const QQuaternion &q)
bool Q_QUICK3DUTILS_EXPORT isSane(const QQuaternion &q)
bool Q_QUICK3DUTILS_EXPORT isUnit(const QQuaternion &q)
float Q_QUICK3DUTILS_EXPORT magnitude(const QQuaternion &q)
QVector3D Q_QUICK3DUTILS_EXPORT inverseRotated(const QQuaternion &q, const QVector3D &v)
float Q_QUICK3DUTILS_EXPORT magnitude(const QVector2D &v)
Definition qssgutils.cpp:13
float Q_QUICK3DUTILS_EXPORT magnitude(const QVector3D &v)
Definition qssgutils.cpp:23
float Q_QUICK3DUTILS_EXPORT magnitudeSquared(const QVector3D &v)
Definition qssgutils.cpp:28
QVector3D minimum(const QVector3D &v1, const QVector3D &v2) Q_DECL_NOTHROW
Definition qssgutils_p.h:52
float Q_QUICK3DUTILS_EXPORT normalize(QVector3D &v)
Definition qssgutils.cpp:35
QVector3D maximum(const QVector3D &v1, const QVector3D &v2) Q_DECL_NOTHROW
Definition qssgutils_p.h:53
bool Q_QUICK3DUTILS_EXPORT isFinite(const QVector3D &v)
Definition qssgutils.cpp:18
#define Q_DECL_NOTHROW
#define Q_DECL_CONSTEXPR
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
Definition qfloat16.h:287
constexpr float qRadiansToDegrees(float radians)
Definition qmath.h:281
constexpr float qDegreesToRadians(float degrees)
Definition qmath.h:260
constexpr const T & qMin(const T &a, const T &b)
Definition qminmax.h:40
constexpr const T & qBound(const T &min, const T &val, const T &max)
Definition qminmax.h:44
constexpr const T & qMax(const T &a, const T &b)
Definition qminmax.h:42
constexpr T qAbs(const T &t)
Definition qnumeric.h:328
GLint GLfloat GLfloat GLfloat v2
GLboolean GLboolean GLboolean b
GLsizei const GLfloat * v
[13]
const GLfloat * m
GLboolean GLboolean GLboolean GLboolean a
[7]
GLboolean r
[2]
GLenum src
GLint GLfloat GLfloat v1
GLenum GLuint GLintptr offset
GLuint GLenum GLenum transform
GLuint GLenum matrix
GLdouble GLdouble GLdouble GLdouble q
Definition qopenglext.h:259
GLint GLenum GLboolean normalized
Definition qopenglext.h:752
QSSGDataRef< TDataType > PtrAtOffset(quint8 *baseData, quint32 offset, quint32 byteSize)
QVector3D radToDeg(const QVector3D &v)
QVector3D degToRad(const QVector3D &v)
Q_QUICK3DUTILS_EXPORT const char * nonNull(const char *src)
unsigned int quint32
Definition qtypes.h:45
unsigned char quint8
Definition qtypes.h:41