40struct Q_QUICK3DRUNTIMERENDER_EXPORT
QSSGRenderNode :
public QSSGRenderGraphObject
42 enum class LocalState : quint8
48 enum class GlobalState : quint8
54 enum class DirtyFlag : quint32
56 TransformDirty = 1 << 4,
57 OpacityDirty = 1 << 5,
59 PickableDirty = 1 << 7,
61 SubNodeDirty = 1 << 9,
63 GlobalValuesDirty = TransformDirty | OpacityDirty | ActiveDirty | PickableDirty,
64 DirtyMask = GlobalValuesDirty | SubNodeDirty
66 using FlagT = std::underlying_type_t<DirtyFlag>;
68 static constexpr QVector3D initScale { 1.0f, 1.0f, 1.0f };
77 float localOpacity = 1.0f;
80 FlagT flags { FlagT(DirtyFlag::GlobalValuesDirty) | FlagT(LocalState::Active) };
82 QMatrix4x4 localTransform;
85 QSSGRenderRoot **rootNodeRef =
nullptr;
86 QSSGRenderNode *parent =
nullptr;
87 QSSGRenderNode *nextSibling =
nullptr;
88 QSSGRenderNode *previousSibling =
nullptr;
89 QSSGRenderNode *instanceRoot =
nullptr;
92 QSSGRenderNodeHandle h;
93 QSSGRenderNodeTag tag;
95 using ChildList = QSSGInvasiveLinkedList<QSSGRenderNode, &QSSGRenderNode::previousSibling, &QSSGRenderNode::nextSibling>;
98 QString debugObjectName;
101 QSSGRenderNode(Type type, FlagT flags = 0);
102 ~QSSGRenderNode() override;
106 void markDirty(DirtyFlag dirtyFlag);
107 void clearDirty(DirtyFlag dirtyFlag);
108 [[nodiscard]]
inline constexpr bool isDirty(DirtyFlag dirtyFlag = DirtyFlag::DirtyMask)
const {
return ((flags & FlagT(dirtyFlag)) != 0); }
109 void setState(LocalState state,
bool on =
true);
110 [[nodiscard]]
inline constexpr bool getLocalState(LocalState stateFlag)
const {
return ((flags & FlagT(stateFlag)) != 0); }
111 [[nodiscard]]
inline constexpr bool getGlobalState(GlobalState stateFlag)
const {
return ((flags & FlagT(stateFlag)) != 0); }
113 void addChild(QSSGRenderNode &inChild);
114 void removeChild(QSSGRenderNode &inChild);
120 void removeFromGraph();
125 [[nodiscard]]
static QMatrix4x4 calculateTransformMatrix(QVector3D position, QVector3D scale, QVector3D pivot, QQuaternion rotation);
128 QSSGBounds3 getBounds(QSSGBufferManager &inManager,
129 bool inIncludeChildren =
true)
const;
130 QSSGBounds3 getChildBounds(QSSGBufferManager &inManager)
const;
132 [[nodiscard]]
static QVector3D getGlobalPos(
const QMatrix4x4 &globalTransform) {
return QVector3D(globalTransform(0, 3), globalTransform(1, 3), globalTransform(2, 3)); }
134 [[nodiscard]]
static QVector3D getDirection(
const QMatrix4x4 &globalTransform);
137 [[nodiscard]]
static QVector3D getScalingCorrectDirection(
const QMatrix4x4 &globalTransform);
141 static void calculateMVP(
const QMatrix4x4 &globalTransform,
142 const QMatrix4x4 &inViewProjection,
144 static void calculateNormalMatrix(
const QMatrix4x4 &globalTransform,
145 QMatrix3x3 &outNormalMatrix);
146 static void calculateMVPAndNormalMatrix(
const QMatrix4x4 &globalTransfor,
147 const QMatrix4x4 &inViewProjection,
149 QMatrix3x3 &outNormalMatrix);
154 [[nodiscard]]
static inline float signedSquared(
float val)
156 const float sign = (val >= 0.0f) ? 1.0f : -1.0f;
157 return sign * val * val;