40struct Q_QUICK3DRUNTIMERENDER_EXPORT
QSSGRenderNode :
public QSSGRenderGraphObject
42 enum class LocalState : quint8
49 enum class GlobalState : quint8
56 enum class DirtyFlag : quint32
58 TransformDirty = 1 << 6,
59 OpacityDirty = 1 << 7,
61 PickableDirty = 1 << 9,
63 ImportDirty = 1 << 11,
64 SubNodeDirty = 1 << 12,
65 StickyDirty = 1 << 13,
67 GlobalValuesDirty = TransformDirty | OpacityDirty | ActiveDirty | PickableDirty | ImportDirty,
68 SubtreeUpdateMask = GlobalValuesDirty | StickyDirty,
69 DirtyMask = GlobalValuesDirty | SubNodeDirty
71 using FlagT = std::underlying_type_t<DirtyFlag>;
73 static constexpr QVector3D initScale { 1.0f, 1.0f, 1.0f };
82 float localOpacity = 1.0f;
85 FlagT flags { FlagT(DirtyFlag::GlobalValuesDirty) | FlagT(LocalState::Active) };
87 QMatrix4x4 localTransform;
90 QSSGRenderRoot **rootNodeRef =
nullptr;
91 QSSGRenderNode *parent =
nullptr;
92 QSSGRenderNode *nextSibling =
nullptr;
93 QSSGRenderNode *previousSibling =
nullptr;
94 QSSGRenderNode *instanceRoot =
nullptr;
97 QSSGRenderNodeHandle h;
98 QSSGRenderNodeTag tag;
100 using ChildList = QSSGInvasiveLinkedList<QSSGRenderNode, &QSSGRenderNode::previousSibling, &QSSGRenderNode::nextSibling>;
103 QString debugObjectName;
106 QSSGRenderNode(Type type, FlagT flags = 0);
107 ~QSSGRenderNode() override;
111 void markDirty(DirtyFlag dirtyFlag);
112 void clearDirty(DirtyFlag dirtyFlag);
113 [[nodiscard]]
inline constexpr bool isDirty(DirtyFlag dirtyFlag = DirtyFlag::DirtyMask)
const {
return ((flags & FlagT(dirtyFlag)) != 0); }
114 void setState(LocalState state,
bool on =
true);
115 [[nodiscard]]
inline constexpr bool getLocalState(LocalState stateFlag)
const {
return ((flags & FlagT(stateFlag)) != 0); }
116 [[nodiscard]]
inline constexpr bool getGlobalState(GlobalState stateFlag)
const {
return ((flags & FlagT(stateFlag)) != 0); }
118 void addChild(QSSGRenderNode &inChild);
119 void removeChild(QSSGRenderNode &inChild);
125 void removeFromGraph();
130 [[nodiscard]]
static QMatrix4x4 calculateTransformMatrix(QVector3D position, QVector3D scale, QVector3D pivot, QQuaternion rotation);
133 QSSGBounds3 getBounds(QSSGBufferManager &inManager,
134 bool inIncludeChildren =
true)
const;
135 QSSGBounds3 getChildBounds(QSSGBufferManager &inManager)
const;
137 [[nodiscard]]
static QVector3D getGlobalPos(
const QMatrix4x4 &globalTransform) {
return QVector3D(globalTransform(0, 3), globalTransform(1, 3), globalTransform(2, 3)); }
139 [[nodiscard]]
static QVector3D getDirection(
const QMatrix4x4 &globalTransform);
142 [[nodiscard]]
static QVector3D getScalingCorrectDirection(
const QMatrix4x4 &globalTransform);
146 static void calculateMVP(
const QMatrix4x4 &globalTransform,
147 const QMatrix4x4 &inViewProjection,
149 static void calculateNormalMatrix(
const QMatrix4x4 &globalTransform,
150 QMatrix3x3 &outNormalMatrix);
151 static void calculateMVPAndNormalMatrix(
const QMatrix4x4 &globalTransfor,
152 const QMatrix4x4 &inViewProjection,
154 QMatrix3x3 &outNormalMatrix);
159 [[nodiscard]]
static inline float signedSquared(
float val)
161 const float sign = (val >= 0.0f) ? 1.0f : -1.0f;
162 return sign * val * val;