19#include <QtQuick3DUtils/private/qtquick3dutilsglobal_p.h>
20#include <QtQuick3DUtils/private/qssgdataref_p.h>
22#include <QtGui/QVector2D>
23#include <QtGui/QVector3D>
24#include <QtGui/QQuaternion>
25#include <QtGui/QMatrix3x3>
26#include <QtGui/QMatrix4x4>
27#include <QtGui/QColor>
29#include <QtCore/qdebug.h>
30#include <QtCore/QString>
31#include <QtCore/qloggingcategory.h>
32#include <QtCore/QIODevice>
33#include <QtCore/qmath.h>
35class tst_RotationDataClass;
58 bool hasId()
const {
return m_id != 0; }
124 return a.m_value == b.m_value;
139template<
int MINATTENUATION = 0,
int MAXATTENUATION = 1000>
141template<
int MINATTENUATION = 0,
int MAXATTENUATION = 1000>
174inline void flip(QMatrix4x4 &matrix)
177 float *writePtr(matrix.data());
179 writePtr[0 * 4 + 2] *= -1;
180 writePtr[1 * 4 + 2] *= -1;
181 writePtr[2 * 4 + 0] *= -1;
182 writePtr[2 * 4 + 1] *= -1;
184 writePtr[3 * 4 + 2] *= -1;
209template<
typename TDataType>
212 return QSSGDataRef<TDataType>(byteSize ?
reinterpret_cast<TDataType *>(baseData + offset) :
nullptr,
213 byteSize /
sizeof(TDataType));
219 return QVector3D(qDegreesToRadians(v.x()), qDegreesToRadians(v.y()), qDegreesToRadians(v.z()));
223 return QVector3D(qRadiansToDegrees(v.x()), qRadiansToDegrees(v.y()), qRadiansToDegrees(v.z()));
230 return QVector2D(absoluteCoordinates.x() -
float(r.x()), absoluteCoordinates.y() -
float(r.y()));
235 return QVector2D(
float(r.width() / 2.0),
float(r.height() / 2.0));
243 const QVector2D relativeCoords(toRectRelative(r, absoluteCoordinates));
244 const QVector2D halfD(halfDims(r));
245 const QVector2D normalized((relativeCoords.x() / halfD.x()) - 1.0f, (relativeCoords.y() / halfD.y()) - 1.0f);
246 return QVector2D(normalized.x() * halfD.x(), normalized.y() * halfD.y());
251 return { (rectRelativeCoords.x() / halfDims(r).x()) - 1.0f, (rectRelativeCoords.y() / halfDims(r).y()) - 1.0f };
258 return relativeToNormalizedCoordinates(r, toRectRelative(r, absoluteCoordinates));
263 return QVector2D(inRelativeCoords.x() +
float(r.x()), inRelativeCoords.y() +
float(r.y()));
276 , m_dirty(Dirty::Quaternion)
281 , m_dirty(Dirty::Euler)
287 m_dirty = Dirty::Quaternion;
292 m_quatRot = r.normalized();
293 m_dirty = Dirty::Euler;
298 if (a.m_dirty == Dirty::None && b.m_dirty == Dirty::None)
299 return fuzzyQuaternionCompare(a.m_quatRot, b.m_quatRot);
301 return fuzzyQuaternionCompare(QQuaternion(a), QQuaternion(b));
308 if (a.m_dirty == Dirty::None)
309 return qFuzzyCompare(a.m_eulerRot, eulerRotation);
311 return qFuzzyCompare(QVector3D(a), eulerRotation);
313 friend inline bool operator !=(
const RotationData &a,
const QVector3D &eulerRotation) {
return !(a == eulerRotation); }
317 if (a.m_dirty == Dirty::None)
318 return fuzzyQuaternionCompare(a.m_quatRot, rotation);
320 return fuzzyQuaternionCompare(QQuaternion(a), rotation);
322 friend inline bool operator !=(
const RotationData &a,
const QQuaternion &rotation) {
return !(a == rotation); }
326 if (m_dirty == Dirty::Euler) {
327 m_eulerRot = m_quatRot.toEulerAngles();
328 m_dirty = Dirty::None;
336 if (m_dirty == Dirty::Quaternion) {
337 m_quatRot = QQuaternion::fromEulerAngles(m_eulerRot).normalized();
338 m_dirty = Dirty::None;
352 static constexpr double dotProduct(
const QQuaternion &q1,
const QQuaternion &q2)
noexcept
354 return double(q1.scalar()) *
double(q2.scalar())
355 +
double(q1.x()) *
double(q2.x())
356 +
double(q1.y()) *
double(q2.y())
357 +
double(q1.z()) *
double(q2.z());
360 [[
nodiscard]]
static constexpr bool fuzzyQuaternionCompare(
const QQuaternion &a,
const QQuaternion &b)
362 return qFuzzyCompare(qAbs(dotProduct(a, b)), 1.0);
372 mutable QQuaternion m_quatRot;
373 mutable QVector3D m_eulerRot;
374 mutable Dirty m_dirty { Dirty::None };
381 if (!node->debugObjectName.isEmpty())
383 node->debugObjectName = src->objectName();
384 if (node->debugObjectName.isEmpty())
385 node->debugObjectName = QString::fromLatin1(src->metaObject()->className());
386 if (node->debugObjectName.isEmpty())
387 node->debugObjectName = QString::asprintf(
"%p", src);
Class representing 3D range or axis aligned bounding box.
void clearFlags(quint32 v=0xFFFFFFFF)
friend bool operator!=(const QSSGRenderFlag &a, const QSSGRenderFlag &b)
QSSGRenderFlag(quint32 v)
friend bool operator==(const QSSGRenderFlag &a, const QSSGRenderFlag &b)
void setFlag(quint32 v, bool on=true)
bool isSet(quint32 v) const
QSSGRenderStorageHandle()=default
QSSGRenderStorageHandle(quint32 ctx, quint32 version, quint32 index)
RotationData(const QVector3D &r)
friend bool operator!=(const RotationData &a, const RotationData &b)
QVector3D getEulerRotation() const
friend bool operator!=(const RotationData &a, const QVector3D &eulerRotation)
friend bool operator==(const RotationData &a, const QVector3D &eulerRotation)
QMatrix3x3 toRotationMatrix() const
QQuaternion getQuaternionRotation() const
friend bool operator==(const RotationData &a, const RotationData &b)
RotationData & operator=(const QVector3D &r) noexcept
void ensureDebugObjectName(T *node, QObject *src)
Q_DECL_CONSTEXPR float translateLinearAttenuation(float attenuation)
Q_DECL_CONSTEXPR float translateConstantAttenuation(float attenuation)
Q_DECL_CONSTEXPR float translateQuadraticAttenuation(float attenuation)
void flip(QMatrix4x4 &matrix)
QVector2D toRectRelative(const QRectF &r, const QVector2D &absoluteCoordinates)
QVector2D halfDims(const QRectF &r)
QVector2D toAbsoluteCoords(const QRectF &r, const QVector2D &inRelativeCoords)
QVector2D absoluteToNormalizedCoordinates(const QRectF &r, const QVector2D &absoluteCoordinates)
QVector2D relativeToNormalizedCoordinates(const QRectF &r, QVector2D rectRelativeCoords)
QVector2D toNormalizedRectRelative(const QRectF &r, QVector2D absoluteCoordinates)
QVector3D radToDeg(const QVector3D &v)
QSSGDataRef< TDataType > PtrAtOffset(quint8 *baseData, quint32 offset, quint32 byteSize)
Q_QUICK3DUTILS_EXPORT const char * nonNull(const char *src)
QVector3D degToRad(const QVector3D &v)
QSSGRenderFlag QSSGRenderNodeTag
QSSGRenderStorageHandle< HandleType::Node > QSSGRenderNodeHandle
QSSGRenderStorageHandle< HandleType::Item2D > QSSGRenderItem2DHandle
QSSGRenderStorageHandle< HandleType::Model > QSSGRenderModelHandle
QSSGRenderStorageHandle< HandleType::Layer > QSSGRenderLayerHandle