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 LayerMaskAll = 0xFFFFFFFF;
130 class ClipPlanes :
public QVector2D
133 constexpr inline ClipPlanes() : QVector2D(0.0f, 10000.0f) {}
134 constexpr inline ClipPlanes(
float n,
float f) : QVector2D(n, f) {}
135 constexpr float clipNear()
const noexcept {
return x(); }
136 constexpr float clipFar()
const noexcept {
return y(); }
138 constexpr inline void setClipNear(
float n)
noexcept { setX(n); }
139 constexpr inline void setClipFar(
float f)
noexcept { setY(f); }
142 class Magnification :
public QVector2D
145 constexpr inline Magnification() : QVector2D(1.0f, 1.0f) {}
146 constexpr inline Magnification(
float h,
float v) : QVector2D(h, v) {}
147 constexpr float horizontal()
const noexcept {
return x(); }
148 constexpr float vertical()
const noexcept {
return y(); }
150 constexpr inline void setHorizontal(
float h)
noexcept { setX(h); }
151 constexpr inline void setVertical(
float v)
noexcept { setY(v); }
168 void lookAt(
const QVector3D &inCameraPos,
const QVector3D &inUpDir,
const QVector3D &inTargetPos,
const QVector3D &pivot);
171
172
173
174
175 static bool calculateProjectionInternal(QSSGRenderCamera &camera,
176 const QRectF &inViewport,
177 Configuration config = {});
180
181
182
183
184
185
186
187
188
189
190
191 bool calculateProjection(
const QRectF &inViewport, Configuration config = {});
193 void setCustomProjection(
const QMatrix4x4 &proj);
195 static bool computeFrustumOrtho(QRectF inViewport,
196 QSSGRenderCamera::ClipPlanes clipPlanes,
197 QSSGRenderCamera::Magnification magnification,
198 Configuration config,
199 QMatrix4x4 &outProjection);
200 static bool computeFrustumPerspective(QRectF inViewport,
202 QSSGRenderCamera::ClipPlanes clipPlanes,
203 QMatrix4x4 &outProjection);
204 static bool computeCustomFrustum(QSSGRenderCamera::Frustum frustum,
205 QSSGRenderCamera::ClipPlanes clipPlanes,
206 QMatrix4x4 &outProjection);
208 static void calculateViewProjectionMatrix(
const QMatrix4x4 &globalTransform,
209 const QMatrix4x4 &projection,
210 QMatrix4x4 &outMatrix);
212 void calculateViewProjectionMatrix(
const QMatrix4x4 &globalTransform, QMatrix4x4 &outMatrix)
const;
213 void calculateViewProjectionWithoutTranslation(
const QMatrix4x4 &globalTransform,
float near,
float far, QMatrix4x4 &outMatrix)
const;
217 QSSGRenderRay unproject(
const QMatrix4x4 &globalTransform,
const QVector2D &inLayerRelativeMouseCoords,
const QRectF &inViewport)
const;
219 [[nodiscard]]
inline bool isDirty(DirtyFlag dirtyFlag = DirtyMask)
const
221 return ((cameraDirtyFlags & FlagT(dirtyFlag)) != 0)
222 || ((dirtyFlag == DirtyMask) && QSSGRenderNode::isDirty());
224 void markDirty(DirtyFlag dirtyFlag);
225 void clearDirty(DirtyFlag dirtyFlag);
227 float getLevelOfDetailMultiplier()
const;
229 float getDpr()
const {
return dpr; }
232 ClipPlanes clipPlanes;
234 Frustum customFrustum;
235 Magnification magnification;
236 QMatrix4x4 projection;
237 float levelOfDetailPixelThreshold = 1.0;
238 quint32 layerMask = LayerMaskAll;
239 bool enableFrustumClipping =
true;
244 QVector2D frustumScale;
246 QRectF previousInViewport;
248 FlagT cameraDirtyFlags = 0;