114 using Configuration = QSSGRenderCameraConfiguration;
115 using FieldOfView = QSSGRenderCameraFieldOfView;
117 explicit QSSGRenderCamera(QSSGRenderGraphObject::Type type);
119 enum class DirtyFlag : quint8
122 LayerMaskDirty = 0x2,
124 using FlagT = std::underlying_type_t<DirtyFlag>;
126 static constexpr DirtyFlag DirtyMask { std::numeric_limits<FlagT>::max() };
128 static constexpr quint32 ReservedLayerMask = 0xFF000000;
129 static constexpr quint32 LayerMaskUserAll = 0x00FFFFFF;
131 static constexpr quint32 LayerMaskAll = LayerMaskUserAll | ReservedLayerMask;
133 class ClipPlanes :
public QVector2D
136 constexpr inline ClipPlanes() : QVector2D(0.0f, 10000.0f) {}
137 constexpr inline ClipPlanes(
float n,
float f) : QVector2D(n, f) {}
138 constexpr float clipNear()
const noexcept {
return x(); }
139 constexpr float clipFar()
const noexcept {
return y(); }
141 constexpr inline void setClipNear(
float n)
noexcept { setX(n); }
142 constexpr inline void setClipFar(
float f)
noexcept { setY(f); }
145 class Magnification :
public QVector2D
148 constexpr inline Magnification() : QVector2D(1.0f, 1.0f) {}
149 constexpr inline Magnification(
float h,
float v) : QVector2D(h, v) {}
150 constexpr float horizontal()
const noexcept {
return x(); }
151 constexpr float vertical()
const noexcept {
return y(); }
153 constexpr inline void setHorizontal(
float h)
noexcept { setX(h); }
154 constexpr inline void setVertical(
float v)
noexcept { setY(v); }
171 void lookAt(
const QVector3D &inCameraPos,
const QVector3D &inUpDir,
const QVector3D &inTargetPos,
const QVector3D &pivot);
174
175
176
177
178 static bool calculateProjectionInternal(QSSGRenderCamera &camera,
179 const QRectF &inViewport,
180 Configuration config = {});
183
184
185
186
187
188
189
190
191
192
193
194 bool calculateProjection(
const QRectF &inViewport, Configuration config = {});
196 void setCustomProjection(
const QMatrix4x4 &proj);
198 static bool computeFrustumOrtho(QRectF inViewport,
199 QSSGRenderCamera::ClipPlanes clipPlanes,
200 QSSGRenderCamera::Magnification magnification,
201 Configuration config,
202 QMatrix4x4 &outProjection);
203 static bool computeFrustumPerspective(QRectF inViewport,
205 QSSGRenderCamera::ClipPlanes clipPlanes,
206 QMatrix4x4 &outProjection);
207 static bool computeCustomFrustum(QSSGRenderCamera::Frustum frustum,
208 QSSGRenderCamera::ClipPlanes clipPlanes,
209 QMatrix4x4 &outProjection);
211 static void calculateViewProjectionMatrix(
const QMatrix4x4 &globalTransform,
212 const QMatrix4x4 &projection,
213 QMatrix4x4 &outMatrix);
215 void calculateViewProjectionMatrix(
const QMatrix4x4 &globalTransform, QMatrix4x4 &outMatrix)
const;
216 void calculateViewProjectionWithoutTranslation(
const QMatrix4x4 &globalTransform,
float near,
float far, QMatrix4x4 &outMatrix)
const;
220 QSSGRenderRay unproject(
const QMatrix4x4 &globalTransform,
const QVector2D &inLayerRelativeMouseCoords,
const QRectF &inViewport)
const;
222 [[nodiscard]]
inline bool isDirty(DirtyFlag dirtyFlag = DirtyMask)
const
224 return ((cameraDirtyFlags & FlagT(dirtyFlag)) != 0)
225 || ((dirtyFlag == DirtyMask) && QSSGRenderNode::isDirty());
227 void markDirty(DirtyFlag dirtyFlag);
228 void clearDirty(DirtyFlag dirtyFlag);
230 float getLevelOfDetailMultiplier()
const;
232 float getDpr()
const {
return dpr; }
235 ClipPlanes clipPlanes;
237 Frustum customFrustum;
238 Magnification magnification;
239 QMatrix4x4 projection;
240 float levelOfDetailPixelThreshold = 1.0;
241 quint32 layerMask = LayerMaskAll;
242 bool enableFrustumClipping =
true;
247 QVector2D frustumScale;
249 QRectF previousInViewport;
251 FlagT cameraDirtyFlags = 0;