42struct Q_QUICK3DRUNTIMERENDER_EXPORT
QSSGRenderNode :
public QSSGRenderGraphObject
44 enum class LocalState : quint8
51 enum class GlobalState : quint8
58 enum class DirtyFlag : quint32
60 TransformDirty = 1 << 6,
61 OpacityDirty = 1 << 7,
63 PickableDirty = 1 << 9,
65 ImportDirty = 1 << 11,
66 SubNodeDirty = 1 << 12,
67 StickyDirty = 1 << 13,
69 GlobalValuesDirty = TransformDirty | OpacityDirty | ActiveDirty | PickableDirty | ImportDirty,
70 SubtreeUpdateMask = GlobalValuesDirty | StickyDirty,
71 DirtyMask = GlobalValuesDirty | SubNodeDirty
73 using FlagT = std::underlying_type_t<DirtyFlag>;
75 static constexpr QVector3D initScale { 1.0f, 1.0f, 1.0f };
84 float localOpacity = 1.0f;
87 FlagT flags { FlagT(DirtyFlag::GlobalValuesDirty) | FlagT(LocalState::Active) };
89 QMatrix4x4 localTransform;
92 QSSGRenderRoot **rootNodeRef =
nullptr;
93 QSSGRenderNode *parent =
nullptr;
94 QSSGRenderNode *nextSibling =
nullptr;
95 QSSGRenderNode *previousSibling =
nullptr;
96 QSSGRenderNode *instanceRoot =
nullptr;
99 QSSGRenderNodeHandle h;
100 QSSGRenderNodeTag tag;
102 using ChildList = QSSGInvasiveLinkedList<QSSGRenderNode, &QSSGRenderNode::previousSibling, &QSSGRenderNode::nextSibling>;
105 QString debugObjectName;
108 QSSGRenderNode(Type type, FlagT flags = 0);
109 ~QSSGRenderNode() override;
113 void markDirty(DirtyFlag dirtyFlag);
114 void clearDirty(DirtyFlag dirtyFlag);
115 [[nodiscard]]
inline constexpr bool isDirty(DirtyFlag dirtyFlag = DirtyFlag::DirtyMask)
const {
return ((flags & FlagT(dirtyFlag)) != 0); }
116 void setState(LocalState state,
bool on =
true);
117 [[nodiscard]]
inline constexpr bool getLocalState(LocalState stateFlag)
const {
return ((flags & FlagT(stateFlag)) != 0); }
118 [[nodiscard]]
inline constexpr bool getGlobalState(GlobalState stateFlag)
const {
return ((flags & FlagT(stateFlag)) != 0); }
120 void addChild(QSSGRenderNode &inChild);
121 void removeChild(QSSGRenderNode &inChild);
127 void removeFromGraph();
132 [[nodiscard]]
static QMatrix4x4 calculateTransformMatrix(QVector3D position, QVector3D scale, QVector3D pivot, QQuaternion rotation);
135 QSSGBounds3 getBounds(QSSGBufferManager &inManager,
136 bool inIncludeChildren =
true)
const;
137 QSSGBounds3 getChildBounds(QSSGBufferManager &inManager)
const;
139 [[nodiscard]]
static QVector3D getGlobalPos(
const QMatrix4x4 &globalTransform) {
return QVector3D(globalTransform(0, 3), globalTransform(1, 3), globalTransform(2, 3)); }
141 [[nodiscard]]
static QVector3D getDirection(
const QMatrix4x4 &globalTransform);
144 [[nodiscard]]
static QVector3D getScalingCorrectDirection(
const QMatrix4x4 &globalTransform);
148 static void calculateMVP(
const QMatrix4x4 &globalTransform,
149 const QMatrix4x4 &inViewProjection,
151 static void calculateNormalMatrix(
const QMatrix4x4 &globalTransform,
152 QMatrix3x3 &outNormalMatrix);
153 static void calculateMVPAndNormalMatrix(
const QMatrix4x4 &globalTransfor,
154 const QMatrix4x4 &inViewProjection,
156 QMatrix3x3 &outNormalMatrix);
161 [[nodiscard]]
static inline float signedSquared(
float val)
163 const float sign = (val >= 0.0f) ? 1.0f : -1.0f;
164 return sign * val * val;
friend class QSSGLayerRenderData