Qt 6.x
The Qt SDK
Loading...
Searching...
No Matches
qssglayerrenderdata_p.h
Go to the documentation of this file.
1// Copyright (C) 2008-2012 NVIDIA Corporation.
2// Copyright (C) 2022 The Qt Company Ltd.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
4
5#ifndef QSSG_LAYER_RENDER_DATA_H
6#define QSSG_LAYER_RENDER_DATA_H
7
8
9//
10// W A R N I N G
11// -------------
12//
13// This file is not part of the Qt API. It exists purely as an
14// implementation detail. This header file may change from version to
15// version without notice, or even be removed.
16//
17// We mean it.
18//
19
20#include <QtQuick3DRuntimeRender/private/qssgrenderitem2d_p.h>
21#include <QtQuick3DRuntimeRender/private/qssgrenderer_p.h>
22#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
23#include <QtQuick3DRuntimeRender/private/qssgrenderableobjects_p.h>
24#include <QtQuick3DRuntimeRender/private/qssgrenderclippingfrustum_p.h>
25#include <QtQuick3DRuntimeRender/private/qssgrendershadowmap_p.h>
26#include <QtQuick3DRuntimeRender/private/qssgrendereffect_p.h>
27#include <QtQuick3DRuntimeRender/private/qssgrenderresourceloader_p.h>
28#include <QtQuick3DRuntimeRender/private/qssgrenderreflectionmap_p.h>
29#include <QtQuick3DRuntimeRender/private/qssgrendercamera_p.h>
30#include <QtQuick3DRuntimeRender/private/qssgrhicontext_p.h>
31#include <QtQuick3DRuntimeRender/private/qssgrenderextensions_p.h>
32
33#include <QtQuick3DUtils/private/qssgrenderbasetypes_p.h>
34
35#include <optional>
36
37#include "qssgrenderpass_p.h"
38
39#define QSSG_RENDER_MINIMUM_RENDER_OPACITY .01f
40
42
44
46{
47 // Was the data in this layer dirty (meaning re-render to texture, possibly)
48 WasLayerDataDirty = 1 << 0,
49
50 // Was the data in this layer dirty *or* this layer *or* any effect dirty.
51 WasDirty = 1 << 1,
52
53 RequiresDepthTexture = 1 << 2,
54
55 // SSAO should be done in a separate pass
56 // Note that having an AO pass necessitates a DepthTexture so this flag should
57 // never be set without the RequiresDepthTexture flag as well.
58 RequiresSsaoPass = 1 << 3,
59
60 // if some light cause shadow
61 // we need a separate per light shadow map pass
62 RequiresShadowMapPass = 1 << 4,
63
64 RequiresScreenTexture = 1 << 5,
65
66 // set together with RequiresScreenTexture when SCREEN_MIP_TEXTURE is used
68};
69
70struct QSSGLayerRenderPreparationResultFlags : public QFlags<QSSGLayerRenderPreparationResultFlag>
71{
72 bool wasLayerDataDirty() const
73 {
75 }
76 void setLayerDataDirty(bool inValue)
77 {
79 }
80
83
85 {
87 }
88 void setRequiresDepthTexture(bool inValue)
89 {
91 }
92
94 void setRequiresSsaoPass(bool inValue)
95 {
97 }
98
100 {
102 }
103 void setRequiresShadowMapPass(bool inValue)
104 {
106 }
107
109 {
111 }
112 void setRequiresScreenTexture(bool inValue)
113 {
115 }
116
118 {
120 }
122 {
124 }
125};
126
128{
130 std::optional<QSSGClippingFrustum> clippingFrustum;
131 QVector3D direction { 0.0f, 0.0f, -1.0f };
133};
134
136{
140
142 QSSGLayerRenderPreparationResult(const QRectF &inViewport, QSSGRenderLayer &inLayer);
143
144 bool isLayerVisible() const;
145 QSize textureDimensions() const;
147};
148
150{
152 float opacity;
155 bool dirty;
156
158};
159
161{
163 : model(model),
165 { }
166
169};
170
171class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGLayerRenderData
172{
173public:
174 enum Enum {
175 MAX_AA_LEVELS = 8,
176 MAX_TEMPORAL_AA_LEVELS = 2,
177 };
178
179 using RenderableFilter = std::function<bool(QSSGModelContext *)>;
180
181 QSSGLayerRenderData(QSSGRenderLayer &inLayer, QSSGRenderer &inRenderer);
183
187
189 const QSSGShaderLightListView &lights, bool receivesShadows = true);
190
191 void prepareImageForRender(QSSGRenderImage &inImage,
193 QSSGRenderableImage *&ioFirstImage,
194 QSSGRenderableImage *&ioNextImage,
196 QSSGShaderDefaultMaterialKey &ioGeneratedShaderKey,
197 quint32 inImageIndex, QSSGRenderDefaultMaterial *inMaterial = nullptr);
198
199 void setVertexInputPresence(const QSSGRenderableObjectFlags &renderableFlags,
202
203 // Load meshes as needed
204 static void prepareModelMeshes(const QSSGRenderContextInterface &contextInterface,
205 RenderableNodeEntries &renderableModels);
206
207 static void prepareModelBoneTextures(const QSSGRenderContextInterface &contextInterface,
208 const RenderableNodeEntries &renderableModels);
209
210 // Helper functions used during PrepareForRender and PrepareAndRender
211 // Updates lights with model receivesShadows. Do not pass globalLights.
212 bool prepareModelsForRender(const RenderableNodeEntries &renderableModels,
214 const QSSGCameraRenderData &cameraData,
216 float lodThreshold = 0.0f);
217 bool prepareParticlesForRender(const RenderableNodeEntries &renderableParticles, const QSSGCameraRenderData &cameraData);
218 bool prepareItem2DsForRender(const QSSGRenderContextInterface &ctxIfc,
219 const RenderableItem2DEntries &renderableItem2Ds);
220
221 void prepareResourceLoaders();
222
223 void prepareForRender();
224 // Helper function used during prepareForRender
225 void prepareReflectionProbesForRender();
226
227 static qsizetype frustumCulling(const QSSGClippingFrustum &clipFrustum, const QSSGRenderableObjectList &renderables, QSSGRenderableObjectList &visibleRenderables);
228 [[nodiscard]] static qsizetype frustumCullingInline(const QSSGClippingFrustum &clipFrustum, QSSGRenderableObjectList &renderables);
229
230
231 // Per-frame cache of renderable objects post-sort (for the MAIN rendering camera, i.e., don't use these lists for rendering from a different camera).
232 const QSSGRenderableObjectList &getSortedOpaqueRenderableObjects();
233 // If layer depth test is false, this may also contain opaque objects.
234 const QSSGRenderableObjectList &getSortedTransparentRenderableObjects();
235 const QSSGRenderableObjectList &getSortedScreenTextureRenderableObjects();
236 const QVector<QSSGBakedLightingModel> &getSortedBakedLightingModels();
237 const RenderableItem2DEntries &getRenderableItem2Ds();
238 const QSSGRenderableObjectList &getSortedRenderedDepthWriteObjects();
239 const QSSGRenderableObjectList &getSortedrenderedOpaqueDepthPrepassObjects();
240
241 void resetForFrame();
242
243 void maybeBakeLightmap();
244
245 QSSGFrameData &getFrameData();
246
253 static constexpr size_t USERPASSES = 2; // See QSSGRenderLayer::RenderExtensionMode::Count
254 UserPass userPasses[USERPASSES];
256
257 // Built-in passes
259
262 // List of nodes we can render, not all may be active. Found by doing a depth-first
263 // search through m_FirstChild if length is zero.
264
265 // renderableNodes have all lights, but properties configured for specific node
272
273 // Results of prepare for render.
275 QSSGShaderLightList globalLights; // All non-scoped lights
280 // Sorted lists of the rendered objects. There may be other transforms applied so
281 // it is simplest to duplicate the lists.
289
290 std::optional<QSSGClippingFrustum> clippingFrustum;
291 std::optional<QSSGLayerRenderPreparationResult> layerPrepResult;
292 std::optional<QSSGCameraRenderData> cameraData;
293
295
296
297 bool tooManyLightsWarningShown = false;
298 bool tooManyShadowLightsWarningShown = false;
299
300 QSSGLightmapper *m_lightmapper = nullptr;
301
302 QSSGShaderFeatures getShaderFeatures() const { return features; }
304
305 bool interactiveLightmapBakingRequested = false;
307
308 bool plainSkyBoxPrepared = false;
309
310 [[nodiscard]] QSSGRenderableNodeEntry getNode(QSSGNodeId id) const;
311 [[nodiscard]] QSSGRenderableNodeEntry takeNode(QSSGNodeId id);
312
313 [[nodiscard]] QSSGRenderGraphObject *getResource(QSSGResourceId id) const;
314
315 [[nodiscard]] QSSGRenderCamera *activeCamera() const { return camera; }
316
317 [[nodiscard]] QSSGCameraRenderData getCameraRenderData(const QSSGRenderCamera *camera);
318 [[nodiscard]] QSSGCameraRenderData getCameraRenderData(const QSSGRenderCamera *camera) const;
319
320 void setLightmapTexture(const QSSGModelContext &modelContext, QRhiTexture *lightmapTexture);
321 [[nodiscard]] QRhiTexture *getLightmapTexture(const QSSGModelContext &modelContext) const;
322
323 void setBonemapTexture(const QSSGModelContext &modelContext, QRhiTexture *bonemapTexture);
324 [[nodiscard]] QRhiTexture *getBonemapTexture(const QSSGModelContext &modelContext) const;
325
326 [[nodiscard]] QSSGRenderContextInterface *contextInterface() const;
327
328 // Temp. API. Ideally there shouldn't be a reason for anyone to hold onto these,
329 // but we follow the existing pattern for now.
330 const QSSGRenderShadowMapPtr &requestShadowMapManager();
331 const QSSGRenderReflectionMapPtr &requestReflectionMapManager();
332 const QSSGRenderShadowMapPtr &getShadowMapManager() const { return shadowMapManager; }
333 const QSSGRenderReflectionMapPtr &getReflectionMapManager() const { return reflectionMapManager; }
334
335private:
336 friend class QSSGRenderer;
337 friend class QSSGFrameData;
338 friend class QSSGModelHelpers;
339 friend class QSSGRenderHelpers;
340
341 [[nodiscard]] QSSGCameraRenderData getCachedCameraData();
342 void updateSortedDepthObjectsListImp();
343
344 [[nodiscard]] static QSSGLayerRenderData *getCurrent(const QSSGRenderer &renderer) { return renderer.m_currentLayer; }
345
346 QSSGDefaultMaterialPreparationResult prepareDefaultMaterialForRender(QSSGRenderDefaultMaterial &inMaterial,
347 QSSGRenderableObjectFlags &inExistingFlags,
348 float inOpacity,
349 const QSSGShaderLightListView &lights,
351
352 QSSGDefaultMaterialPreparationResult prepareCustomMaterialForRender(QSSGRenderCustomMaterial &inMaterial,
353 QSSGRenderableObjectFlags &inExistingFlags,
354 float inOpacity, bool alreadyDirty,
355 const QSSGShaderLightListView &lights,
357
358
359 static void prepareModelMeshesForRenderInternal(const QSSGRenderContextInterface &contextInterface,
360 RenderableNodeEntries &renderableModels,
361 bool globalPickingEnabled);
362
363 QSSGFrameData frameData;
364 QSSGRhiGraphicsPipelineState ps; // Base pipleline state
365 QSSGShaderFeatures features; // Base feature set
366 bool particlesEnabled = true;
367 QSSGRenderShadowMapPtr shadowMapManager;
368 QSSGRenderReflectionMapPtr reflectionMapManager;
371};
372
374
375#endif // QSSG_LAYER_RENDER_DATA_H
376
constexpr QFlags operator&(int mask) const noexcept
Definition qflags.h:112
constexpr QFlags & setFlag(QSSGLayerRenderPreparationResultFlag flag, bool on=true) noexcept
Definition qflags.h:130
\inmodule QtCore
Definition qhash.h:818
Definition qlist.h:74
The QMatrix4x4 class represents a 4x4 transformation matrix in 3D space.
Definition qmatrix4x4.h:25
\inmodule QtCore\reentrant
Definition qrect.h:483
\inmodule QtGui
Definition qrhi.h:883
\inmodule QtQuick3DRuntimeRender
QVector< QSSGBakedLightingModel > renderedBakedLightingModels
QSSGLightmapper::Callback lightmapBakingOutputCallback
QSSGRenderableObjectList renderedOpaqueObjects
QSSGRenderCamera * activeCamera() const
QSSGRenderableObjectList renderedTransparentObjects
QSSGShaderFeatures getShaderFeatures() const
QVector< QSSGBakedLightingModel > bakedLightingModels
std::optional< QSSGClippingFrustum > clippingFrustum
QSSGRenderableObjectList renderedDepthWriteObjects
const QSSGRenderReflectionMapPtr & getReflectionMapManager() const
QVarLengthArray< QSSGRenderPass *, 12 > activePasses
QSSGRenderableObjectList opaqueObjects
QSSGRhiGraphicsPipelineState getPipelineState() const
ReflectionMapPass reflectionMapPass
RenderableNodeEntries renderableModels
QVector< QSSGModelContext * > TModelContextPtrList
QSSGRenderableObjectList renderedOpaqueDepthPrepassObjects
QSSGRenderableObjectList transparentObjects
RenderableItem2DEntries renderedItem2Ds
std::optional< QSSGLayerRenderPreparationResult > layerPrepResult
QSSGRenderableObjectList renderedScreenTextureObjects
static void prepareModelBoneTextures(const QSSGRenderContextInterface &contextInterface, const RenderableNodeEntries &renderableModels)
QVector< QSSGRenderLight * > lights
QSSGRenderableObjectList screenTextureObjects
QVector< QSSGRenderItem2D * > renderableItem2Ds
QVector< QSSGRenderReflectionProbe * > reflectionProbes
const QSSGRenderShadowMapPtr & getShadowMapManager() const
QVector< QSSGRenderCamera * > cameras
std::function< bool(QSSGModelContext *)> RenderableFilter
QSSGShaderLightList globalLights
TModelContextPtrList modelContexts
RenderableNodeEntries renderableParticles
std::optional< QSSGCameraRenderData > cameraData
std::function< void(BakingStatus, std::optional< QString >, BakingControl *)> Callback
\inmodule QtCore
Definition qsize.h:25
The QVector3D class represents a vector or vertex in 3D space.
Definition qvectornd.h:171
QCamera * camera
Definition camera.cpp:19
Combined button and popup list for selecting options.
EGLOutputLayerEXT layer
GLuint64 key
GLint GLint GLint GLint GLint GLint GLint GLbitfield GLenum filter
quintptr QSSGResourceId
quintptr QSSGNodeId
QSSGLayerRenderPreparationResultFlag
std::shared_ptr< QSSGRenderReflectionMap > QSSGRenderReflectionMapPtr
std::shared_ptr< QSSGRenderShadowMap > QSSGRenderShadowMapPtr
unsigned int quint32
Definition qtypes.h:45
ptrdiff_t qsizetype
Definition qtypes.h:70
QSvgRenderer * renderer
[0]
QVector< QSSGRenderableObjectHandle > renderables
QSSGBakedLightingModel(const QSSGRenderModel *model, const QVector< QSSGRenderableObjectHandle > &renderables)
const QSSGRenderModel * model
std::optional< QSSGClippingFrustum > clippingFrustum
QSSGShaderDefaultMaterialKey materialKey
QSSGLayerRenderPreparationResultFlags flags
QSSGCameraGlobalCalculationResult setupCameraForRender(QSSGRenderCamera &inCamera)