7#include <QtQuick3DRuntimeRender/private/qssgrendernode_p.h>
8#include <QtQuick3DUtils/private/qssgutils_p.h>
9#include <QtQuick3D/private/qquick3dobject_p.h>
51 q->setRotation(rotation);
158 return d->m_position.x();
172 return d->m_position.y();
186 return d->m_position.z();
198 return d->m_rotation;
211 return d->m_position;
275 return d->m_staticFlags;
377 if (
d->m_sceneTransformDirty)
379 return d->m_sceneTransform;
395 if (privateParent->m_sceneTransformDirty)
396 privateParent->calculateGlobalVariables();
403 const QVector3D ps = privateParent->m_scale;
428 return rotationMatrix;
444 QVector3D prevForward, prevUp, prevRight;
448 if (emitDirectionChanges) {
463 if (emitDirectionChanges) {
470 const bool positionChanged = prevPosition != newPosition;
471 const bool rotationChanged = prevRotation != newRotation;
472 const bool scaleChanged = !
qFuzzyCompare(prevScale, newScale);
474 if (!positionChanged && !rotationChanged && !scaleChanged)
477 emit q->sceneTransformChanged();
480 emit q->scenePositionChanged();
482 emit q->sceneRotationChanged();
484 emit q->sceneScaleChanged();
485 if (emitDirectionChanges) {
486 const bool forwardChanged = prevForward != newForward;
487 const bool upChanged = prevUp != newUp;
488 const bool rightChanged = prevRight != newRight;
507 return (
signal == sceneTransformSignal
508 ||
signal == scenePositionSignal
509 ||
signal == sceneRotationSignal
510 ||
signal == sceneScaleSignal);
521 return (
signal == forwardSignal
523 ||
signal == rightSignal);
533 if (
d->isSceneTransformRelatedSignal(
signal))
534 d->m_sceneTransformConnectionCount++;
535 if (
d->isDirectionRelatedSignal(
signal))
536 d->m_directionConnectionCount++;
542 if (
d->isSceneTransformRelatedSignal(
signal))
543 d->m_sceneTransformConnectionCount--;
544 if (
d->isDirectionRelatedSignal(
signal))
545 d->m_directionConnectionCount--;
552 if (
d->m_sceneTransformConnectionCount > 0 ||
d->m_directionConnectionCount > 0)
553 d->emitChangesToSceneTransform();
578 if (
auto node = qobject_cast<QQuick3DNode *>(
child)) {
590 d->m_position.setX(
x);
591 d->markSceneTransformDirty();
603 d->m_position.setY(
y);
604 d->markSceneTransformDirty();
616 d->m_position.setZ(
z);
617 d->markSceneTransformDirty();
629 d->m_hasExplicitLocalTransform =
false;
631 d->markSceneTransformDirty();
649 d->markSceneTransformDirty();
659 d->m_hasExplicitLocalTransform =
false;
670 d->m_hasExplicitLocalTransform =
false;
672 d->markSceneTransformDirty();
683 d->m_hasExplicitLocalTransform =
false;
685 d->markSceneTransformDirty();
729 d->m_hasExplicitLocalTransform =
false;
733 d->markSceneTransformDirty();
757 const QQuaternion addRotationQuat = QQuaternion::fromAxisAndAngle(axis,
float(degrees));
763 newRotationMatrix =
d->localRotationMatrix() * addRotationMatrix;
766 newRotationMatrix = addRotationMatrix *
d->localRotationMatrix();
772 newRotationMatrix = prm.inverted() * addRotationMatrix * prm * lrm;
774 newRotationMatrix =
d->localRotationMatrix() * addRotationMatrix;
781 if (
d->m_rotation == newRotationQuaternion)
784 d->m_hasExplicitLocalTransform =
false;
785 d->m_rotation = newRotationQuaternion;
786 d->markSceneTransformDirty();
803 bool transformIsDirty =
false;
805 if (spacialNode->pivot !=
d->m_pivot) {
806 transformIsDirty =
true;
807 spacialNode->
pivot =
d->m_pivot;
811 spacialNode->localOpacity =
d->m_opacity;
815 if (
d->m_hasExplicitLocalTransform) {
816 spacialNode->localTransform =
d->m_localTransform;
818 d->m_hasExplicitLocalTransform =
false;
821 transformIsDirty =
true;
824 transformIsDirty =
true;
827 transformIsDirty =
true;
829 if (transformIsDirty) {
835 spacialNode->staticFlags =
d->m_staticFlags;
838 if (
d->m_isHiddenInEditor)
904 const auto scenePositionOther = node ? node->
mapPositionToScene(localPosition) : localPosition;
941 theDirMatrix = theDirMatrix.transposed();
983 const auto sceneDirectionOther = node ? node->
mapDirectionToScene(localDirection) : localDirection;
991 d->markSceneTransformDirty();
1009 return d->m_rotation;
1014 if (change == QQuick3DObject::ItemParentHasChanged)
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
QMatrix3x3 normalMatrix() const
Returns the normal matrix corresponding to this 4x4 transformation.
The QQuaternion class represents a quaternion consisting of a vector and scalar.
void setIsHiddenInEditor(bool isHidden)
bool isDirectionRelatedSignal(const QMetaMethod &signal) const
QMatrix4x4 localRotationMatrix() const
QMatrix4x4 sceneRotationMatrix() const
QQuick3DNodePrivate(QQuick3DObjectPrivate::Type t)
int m_directionConnectionCount
void markSceneTransformDirty()
QMatrix4x4 m_sceneTransform
void emitChangesToSceneTransform()
void calculateGlobalVariables()
int m_sceneTransformConnectionCount
bool m_hasExplicitLocalTransform
bool isSceneTransformRelatedSignal(const QMetaMethod &signal) const
QMatrix4x4 m_localTransform
void setLocalTransform(const QMatrix4x4 &transform)
bool m_hasInheritedUniformScale
bool m_sceneTransformDirty
static QQuick3DNodePrivate * get(QQuick3DNode *node)
void eulerRotationChanged()
void setRotation(const QQuaternion &rotation)
void setVisible(bool visible)
void connectNotify(const QMetaMethod &signal) override
virtual void itemChange(ItemChange, const ItemChangeData &) override
Q_INVOKABLE QVector3D mapDirectionFromNode(const QQuick3DNode *node, const QVector3D &localDirection) const
\qmlmethod vector3d QtQuick3D::Node::mapDirectionFromNode(QtQuick3D::Node node, vector3d localDirecti...
Q_INVOKABLE QVector3D mapPositionFromScene(const QVector3D &scenePosition) const
\qmlmethod vector3d QtQuick3D::Node::mapPositionFromScene(vector3d scenePosition)
void disconnectNotify(const QMetaMethod &signal) override
Q_INVOKABLE QVector3D mapDirectionFromScene(const QVector3D &sceneDirection) const
\qmlmethod vector3d QtQuick3D::Node::mapDirectionFromScene(vector3d sceneDirection)
void setEulerRotation(const QVector3D &eulerRotation)
void setScale(const QVector3D &scale)
Q_INVOKABLE void rotate(qreal degrees, const QVector3D &axis, QQuick3DNode::TransformSpace space)
\qmlmethod QtQuick3D::Node::rotate(real degrees, vector3d axis, enumeration space)
Q_INVOKABLE QVector3D mapPositionFromNode(const QQuick3DNode *node, const QVector3D &localPosition) const
\qmlmethod vector3d QtQuick3D::Node::mapPositionFromNode(QtQuick3D::Node node, vector3d localPosition...
void setPivot(const QVector3D &pivot)
void localOpacityChanged()
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
void setStaticFlags(int staticFlags)
void setLocalOpacity(float opacity)
void markAllDirty() override
QMatrix4x4 sceneTransform
void setPosition(const QVector3D &position)
Q_INVOKABLE QVector3D mapPositionToScene(const QVector3D &localPosition) const
\qmlmethod vector3d QtQuick3D::Node::mapPositionToScene(vector3d localPosition)
void sceneRotationChanged()
QQuick3DNode * parentNode() const
Q_INVOKABLE QVector3D mapPositionToNode(const QQuick3DNode *node, const QVector3D &localPosition) const
\qmlmethod vector3d QtQuick3D::Node::mapPositionToNode(QtQuick3D::Node node, vector3d localPosition)
void scenePositionChanged()
QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node) override
float localOpacity() const
\qmlproperty real QtQuick3D::Node::opacity
Q_INVOKABLE QVector3D mapDirectionToScene(const QVector3D &localDirection) const
\qmlmethod vector3d QtQuick3D::Node::mapDirectionToScene(vector3d localDirection)
void sceneTransformChanged()
Q_INVOKABLE QVector3D mapDirectionToNode(const QQuick3DNode *node, const QVector3D &localDirection) const
\qmlmethod vector3d QtQuick3D::Node::mapDirectionToNode(QtQuick3D::Node node, vector3d localDirection...
QQuick3DNode(QQuick3DNode *parent=nullptr)
\qmltype Node \inherits Object3D \inqmlmodule QtQuick3D
void staticFlagsChanged()
QQuaternion sceneRotation
QQmlListProperty< QQuick3DObject > children()
static QQuick3DObjectPrivate * get(QQuick3DObject *item)
\qmltype Object3D \inqmlmodule QtQuick3D \instantiates QQuick3DObject \inherits QtObject
void componentComplete() override
Invoked after the root component that caused this instantiation has completed construction.
QQuick3DObject * parent
\qmlproperty Object3D QtQuick3D::Object3D::parent This property holds the parent of the Object3D in a...
virtual QSSGRenderGraphObject * updateSpatialNode(QSSGRenderGraphObject *node)
virtual void markAllDirty()
static constexpr bool isNodeType(Type type) noexcept
The QVector3D class represents a vector or vertex in 3D space.
QVector3D normalized() const noexcept
Returns the normalized unit vector form of this vector.
constexpr float y() const noexcept
Returns the y coordinate of this point.
constexpr float x() const noexcept
Returns the x coordinate of this point.
constexpr float z() const noexcept
Returns the z coordinate of this point.
QMatrix3x3 toRotationMatrix() const
void ensureDebugObjectName(T *node, QObject *src)
QVector3D Q_QUICK3DUTILS_EXPORT transform(const QMatrix3x3 &m, const QVector3D &v)
QMatrix3x3 Q_QUICK3DUTILS_EXPORT getUpper3x3(const QMatrix4x4 &m)
QVector3D Q_QUICK3DUTILS_EXPORT transform(const QMatrix4x4 &m, const QVector3D &v)
void Q_QUICK3DUTILS_EXPORT normalize(QMatrix4x4 &m)
QVector3D Q_QUICK3DUTILS_EXPORT getScale(const QMatrix4x4 &m)
QVector3D Q_QUICK3DUTILS_EXPORT getPosition(const QMatrix4x4 &m)
bool Q_QUICK3DUTILS_EXPORT decompose(const QMatrix4x4 &m, QVector3D &position, QVector3D &scale, QQuaternion &rotation)
Combined button and popup list for selecting options.
bool qFuzzyCompare(qfloat16 p1, qfloat16 p2) noexcept
GLuint GLfloat GLfloat GLfloat GLfloat GLfloat z
GLint GLint GLint GLint GLint x
[0]
GLuint GLenum GLenum transform
GLdouble GLdouble GLdouble GLdouble q
GLenum GLenum GLenum GLenum GLenum scale
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
#define Q_ASSERT_X(cond, x, msg)
static QMatrix4x4 calculateTransformMatrix(QVector3D position, QVector3D scale, QVector3D pivot, QQuaternion rotation)