112 using Configuration = QSSGRenderCameraConfiguration;
113 using FieldOfView = QSSGRenderCameraFieldOfView;
115 explicit QSSGRenderCamera(QSSGRenderGraphObject::Type type);
117 enum class DirtyFlag : quint8
120 LayerMaskDirty = 0x2,
122 using FlagT = std::underlying_type_t<DirtyFlag>;
124 static constexpr DirtyFlag DirtyMask { std::numeric_limits<FlagT>::max() };
126 static constexpr quint32 LayerMaskAll = 0xFFFFFFFF;
128 class ClipPlanes :
public QVector2D
131 constexpr inline ClipPlanes() : QVector2D(0.0f, 10000.0f) {}
132 constexpr inline ClipPlanes(
float n,
float f) : QVector2D(n, f) {}
133 constexpr float clipNear()
const noexcept {
return x(); }
134 constexpr float clipFar()
const noexcept {
return y(); }
136 constexpr inline void setClipNear(
float n)
noexcept { setX(n); }
137 constexpr inline void setClipFar(
float f)
noexcept { setY(f); }
140 class Magnification :
public QVector2D
143 constexpr inline Magnification() : QVector2D(1.0f, 1.0f) {}
144 constexpr inline Magnification(
float h,
float v) : QVector2D(h, v) {}
145 constexpr float horizontal()
const noexcept {
return x(); }
146 constexpr float vertical()
const noexcept {
return y(); }
148 constexpr inline void setHorizontal(
float h)
noexcept { setX(h); }
149 constexpr inline void setVertical(
float v)
noexcept { setY(v); }
166 void lookAt(
const QVector3D &inCameraPos,
const QVector3D &inUpDir,
const QVector3D &inTargetPos,
const QVector3D &pivot);
169
170
171
172
173 static bool calculateProjectionInternal(QSSGRenderCamera &camera,
174 const QRectF &inViewport,
175 Configuration config = {});
178
179
180
181
182
183
184
185
186
187
188
189 bool calculateProjection(
const QRectF &inViewport, Configuration config = {});
191 void setCustomProjection(
const QMatrix4x4 &proj);
193 static bool computeFrustumOrtho(QRectF inViewport,
194 QSSGRenderCamera::ClipPlanes clipPlanes,
195 QSSGRenderCamera::Magnification magnification,
196 Configuration config,
197 QMatrix4x4 &outProjection);
198 static bool computeFrustumPerspective(QRectF inViewport,
200 QSSGRenderCamera::ClipPlanes clipPlanes,
201 QMatrix4x4 &outProjection);
202 static bool computeCustomFrustum(QSSGRenderCamera::Frustum frustum,
203 QSSGRenderCamera::ClipPlanes clipPlanes,
204 QMatrix4x4 &outProjection);
206 static void calculateViewProjectionMatrix(
const QMatrix4x4 &globalTransform,
207 const QMatrix4x4 &projection,
208 QMatrix4x4 &outMatrix);
210 void calculateViewProjectionMatrix(
const QMatrix4x4 &globalTransform, QMatrix4x4 &outMatrix)
const;
211 void calculateViewProjectionWithoutTranslation(
const QMatrix4x4 &globalTransform,
float near,
float far, QMatrix4x4 &outMatrix)
const;
215 QSSGRenderRay unproject(
const QMatrix4x4 &globalTransform,
const QVector2D &inLayerRelativeMouseCoords,
const QRectF &inViewport)
const;
217 [[nodiscard]]
inline bool isDirty(DirtyFlag dirtyFlag = DirtyMask)
const
219 return ((cameraDirtyFlags & FlagT(dirtyFlag)) != 0)
220 || ((dirtyFlag == DirtyMask) && QSSGRenderNode::isDirty());
222 void markDirty(DirtyFlag dirtyFlag);
223 void clearDirty(DirtyFlag dirtyFlag);
225 float getLevelOfDetailMultiplier()
const;
227 float getDpr()
const {
return dpr; }
230 ClipPlanes clipPlanes;
232 Frustum customFrustum;
233 Magnification magnification;
234 QMatrix4x4 projection;
235 float levelOfDetailPixelThreshold = 1.0;
236 quint32 layerMask = LayerMaskAll;
237 bool enableFrustumClipping =
true;
242 QVector2D frustumScale;
244 QRectF previousInViewport;
246 FlagT cameraDirtyFlags = 0;