5#ifndef QSSG_RENDER_IMPL_RENDERABLE_OBJECTS_H
6#define QSSG_RENDER_IMPL_RENDERABLE_OBJECTS_H
19#include <QtQuick3DRuntimeRender/private/qssgrendermodel_p.h>
20#include <QtQuick3DRuntimeRender/private/qssgrenderdefaultmaterial_p.h>
21#include <QtQuick3DRuntimeRender/private/qssgrendercustommaterial_p.h>
22#include <QtQuick3DRuntimeRender/private/qssgrenderparticles_p.h>
23#include <QtQuick3DRuntimeRender/private/qssgrendermesh_p.h>
24#include <QtQuick3DRuntimeRender/private/qssgrendershaderkeys_p.h>
25#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
26#include <QtQuick3DRuntimeRender/private/qssgrenderableimage_p.h>
27#include <QtQuick3DRuntimeRender/private/qssgrenderlight_p.h>
28#include <QtQuick3DRuntimeRender/private/qssgrenderreflectionprobe_p.h>
29#include <QtQuick3DRuntimeRender/private/qssgrenderclippingfrustum_p.h>
31#include <QtQuick3DUtils/private/qssginvasivelinkedlist_p.h>
37struct QSSGRenderItem2D;
170 if (light->type < o.light->type)
192using QSSGShaderLightListView = QSSGDataView<QSSGShaderLight>;
205 QSSGRenderNode *
node =
nullptr;
216 }
mutable extOverrides;
220 QSSGRenderableNodeEntry(QSSGRenderNode &inNode) :
node(&inNode) {}
221 QSSGRenderableNodeEntry(QSSGRenderNode *inNode) :
node(inNode) {}
237using QSSGRenderableObjectList = QVector<QSSGRenderableObjectHandle>;
269 const QVector3D &inWorldCenterPt,
270 const QSSGBounds3 &inBounds,
272 float inMinThreshold = -1,
273 float inMaxThreshold = -1)
287Q_STATIC_ASSERT(std::is_trivially_destructible<QSSGRenderableObject>::value);
297using QSSGRenderCameraList = QVarLengthArray<QSSGRenderCamera *, 2>;
298using QSSGRenderCameraDataList = QVarLengthArray<QSSGRenderCameraData, 2>;
299using QSSGRenderMvpArray = std::array<QMatrix4x4, 2>;
301class QSSGSubsetRenderable;
308 Q_DISABLE_COPY_MOVE(QSSGModelContext)
310 QSSGModelContext(
const QSSGRenderModel &inModel,
311 const QMatrix4x4 &globalTransform,
312 const QMatrix3x3 &inNormalMatrix,
313 const QSSGRenderMvpArray &inModelViewProjections);
322Q_STATIC_ASSERT(std::is_trivially_destructible<QSSGModelContext>::value);
330 Q_DISABLE_COPY_MOVE(QSSGSubsetRenderable)
332 int reflectionProbeIndex = -1;
333 float distanceFromReflectionProbe;
334 quint32 subsetLevelOfDetail = 0;
335 QSSGShaderReflectionProbe reflectionProbe;
336 QSSGRenderer *renderer =
nullptr;
337 const QSSGModelContext &modelContext;
338 const QSSGRenderSubset ⊂
339 QRhiBuffer *instanceBuffer =
nullptr;
341 const QSSGRenderGraphObject &material;
342 QSSGRenderableImage *firstImage;
343 QSSGShaderDefaultMaterialKey shaderDescription;
344 const QSSGShaderLightListView &lights;
351 QRhiGraphicsPipeline *pipeline =
nullptr;
352 QRhiShaderResourceBindings *srb =
nullptr;
355 QRhiGraphicsPipeline *pipeline =
nullptr;
356 QRhiShaderResourceBindings *srb =
nullptr;
359 QRhiGraphicsPipeline *pipeline =
nullptr;
360 QRhiShaderResourceBindings *srb[6] = {};
363 QRhiGraphicsPipeline *pipeline =
nullptr;
364 QRhiShaderResourceBindings *srb[6] = {};
367 QRhiGraphicsPipeline *pipeline =
nullptr;
368 QRhiShaderResourceBindings *srb =
nullptr;
372 QSSGSubsetRenderable(Type type,
373 QSSGRenderableObjectFlags inFlags,
374 const QVector3D &inWorldCenterPt,
376 const QSSGRenderSubset &inSubset,
377 const QSSGModelContext &inModelContext,
379 quint32 inSubsetLevelOfDetail,
380 const QSSGRenderGraphObject &mat,
381 QSSGRenderableImage *inFirstImage,
382 QSSGShaderDefaultMaterialKey inShaderKey,
383 const QSSGShaderLightListView &inLights,
384 bool anyLightHasShadows);
386 [[nodiscard]]
const QSSGRenderGraphObject &getMaterial()
const {
return material; }
389Q_STATIC_ASSERT(std::is_trivially_destructible<QSSGSubsetRenderable>::value);
392
393
396 Q_DISABLE_COPY_MOVE(QSSGParticlesRenderable)
398 QSSGRenderer *renderer =
nullptr;
399 const QSSGRenderParticles &particles;
400 QSSGRenderableImage *firstImage;
401 QSSGRenderableImage *colorTable;
402 const QSSGShaderLightListView &lights;
403 QMatrix4x4 globalTransform;
411 QRhiGraphicsPipeline *pipeline =
nullptr;
412 QRhiShaderResourceBindings *srb =
nullptr;
415 QRhiGraphicsPipeline *pipeline =
nullptr;
416 QRhiShaderResourceBindings *srb =
nullptr;
419 QRhiGraphicsPipeline *pipeline =
nullptr;
420 QRhiShaderResourceBindings *srb[6] = {};
423 QRhiGraphicsPipeline *pipeline =
nullptr;
424 QRhiShaderResourceBindings *srb[6] = {};
428 QSSGParticlesRenderable(QSSGRenderableObjectFlags inFlags,
429 const QVector3D &inWorldCenterPt,
431 const QMatrix4x4 &inGlobalTransform,
432 const QSSGRenderParticles &inParticles,
433 QSSGRenderableImage *inFirstImage,
434 QSSGRenderableImage *inColorTable,
435 const QSSGShaderLightListView &inLights,
439Q_STATIC_ASSERT(std::is_trivially_destructible<QSSGParticlesRenderable>::value);
442using QSSGModelsView = QSSGDataView<QSSGRenderModel *>;
443using QSSGParticlesView = QSSGDataView<QSSGRenderParticles *>;
444using QSSGItem2DsView = QSSGDataView<QSSGRenderItem2D *>;
445using QSSGCamerasView = QSSGDataView<QSSGRenderCamera *>;
446using QSSGLightsView = QSSGDataView<QSSGRenderLight *>;
447using QSSGReflectionProbesView = QSSGDataView<QSSGRenderReflectionProbe *>;
QSSGRhiShaderPipelinePtr debugObjectShader
QSSGRhiGraphicsPipelineState ps
void renderPass(QSSGRenderer &renderer) final
Type passType() const final
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
void renderPass(QSSGRenderer &renderer) final
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiShaderPipelinePtr gridShader
void resetForFrame() final
Type passType() const final
Type passType() const final
std::vector< QSGRenderer * > prepdItem2DRenderers
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
QSSGShaderFeatures shaderFeatures
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiRenderableTexture * rhiAccumTexture
QRhiShaderResourceBindings * compositeSrb
QSSGRhiShaderPipelinePtr compositeShaderPipeline
QSSGRenderLayer::OITMethod method
void resetForFrame() final
Type passType() const final
QSSGRhiRenderableTexture * rhiRevealageTexture
void renderPass(QSSGRenderer &renderer) final
QSSGRhiGraphicsPipelineState ps
void setMethod(QSSGRenderLayer::OITMethod m)
QSSGRhiRenderableTexture * rhiRevealageTexture
void setMethod(QSSGRenderLayer::OITMethod m)
QSSGShaderFeatures shaderFeatures
QSSGRenderLayer::OITMethod method
QRhiShaderResourceBindings * clearSrb
QSSGRenderableObjectList sortedTransparentObjects
QRhiTextureRenderTarget * renderTarget
void resetForFrame() final
QSSGRhiShaderPipelinePtr clearPipeline
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiRenderableTexture * rhiDepthTexture
QSSGRhiGraphicsPipelineState ps
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
QSSGRhiRenderableTexture * rhiAccumTexture
static void prep(const QSSGRenderContextInterface &ctx, QSSGLayerRenderData &data, QSSGPassKey passKey, QSSGRhiGraphicsPipelineState &ps, QSSGShaderFeatures shaderFeatures, QRhiRenderPassDescriptor *rpDesc, const QSSGRenderableObjectList &sortedOpaqueObjects)
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
QSSGShaderFeatures shaderFeatures
QSSGRhiGraphicsPipelineState ps
static void render(const QSSGRenderContextInterface &ctx, const QSSGRhiGraphicsPipelineState &ps, const QSSGRenderableObjectList &sortedOpaqueObjects)
QSSGRenderableObjectList sortedOpaqueObjects
QRect viewport() const
Returns the viewport rectangle.
InstanceTransforms getInstanceTransforms(QSSGRenderNodeHandle h) const
float getGlobalOpacity(const QSSGRenderNode &node) const
LayerNodeView getLayerNodeView(const QSSGRenderLayer &layer) const
float getGlobalOpacity(QSSGRenderNodeHandle h, float defaultValue=1.0f) const
InstanceTransformStore instanceTransforms
~QSSGGlobalRenderNodeData()
size_t storageSize() const
QSSGGlobalRenderNodeData()
GlobalOpacityStore globalOpacities
QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h) const
QMatrix4x4 getGlobalTransform(const QSSGRenderNode &node) const
LayerNodeView getLayerNodeView(QSSGRenderLayerHandle h) const
QMatrix4x4 getGlobalTransform(QSSGRenderNodeHandle h, QMatrix4x4 defaultValue) const
InstanceTransforms getInstanceTransforms(const QSSGRenderNode &node) const
void reindex(QSSGRenderRoot *rootNode)
GlobalTransformStore globalTransforms
LayerNodeViewStore layerNodes
bool isLayerVisible() const
QSSGLayerRenderPreparationResult(const QRectF &inViewport, QSSGRenderLayer &inLayer)
QSize textureDimensions() const
void setState(State state)
QRectF getViewport() const
QSSGRenderLayer * getLayer() const
const QSSGLayerRenderPreparationResultFlags & getFlags() const
QSSGLayerRenderPreparationResult()=default
QSSGRenderMvpArray modelViewProjections
const QMatrix4x4 globalTransform
const QMatrix3x3 normalMatrix
QSSGDataRef< QSSGSubsetRenderable > subsets
friend class QSSGLayerRenderData
friend class QSSGRenderer
friend class QQuick3DWindowAttachment
static bool calcGlobalNodeData(QSSGRenderNode *node, const quint32 version, QSSGGlobalRenderNodeData::GlobalTransformStore &globalTransforms, QSSGGlobalRenderNodeData::GlobalOpacityStore &globalOpacities)
calcGlobalNodeData
static bool calcInstanceTransforms(QSSGRenderNode *node, const quint32 version, QSSGGlobalRenderNodeData::GlobalTransformStore &globalTransforms, QSSGGlobalRenderNodeData::InstanceTransformStore &instanceTransforms)
calcInstanceTransforms
static GlobalStateResult updateGlobalNodeState(QSSGRenderNode *node, const quint32 version)
updateGlobalNodeState
const std::unique_ptr< QRhiRenderPassDescriptor > & getItem2DRenderPassDescriptor() const
void releaseRenderData(const QSSGRenderItem2D &item)
void updateItem2DData(QSSGItem2DsView &items, QSSGRenderer *renderer, const QSSGRenderCameraDataList &renderCameraData)
Item2DRenderer getItem2DRenderer(const QSSGRenderItem2D &item) const
ModelViewProjections getModelViewProjection(QSSGRenderItem2DHandle h) const
const QSSGGlobalRenderNodeDataPtr & globalNodeData() const
ModelViewProjections getModelViewProjection(const QSSGRenderItem2D &item) const
void updateModelData(QSSGModelsView &models, QSSGRenderer *renderer, const QSSGRenderCameraDataList &renderCameraData)
QMatrix3x3 getNormalMatrix(QSSGRenderModelHandle h, QMatrix3x3 defaultValue) const
QMatrix3x3 getNormalMatrix(const QSSGRenderModel &model) const
QSSGRenderMesh * getMesh(QSSGRenderModelHandle h) const
const QSSGGlobalRenderNodeDataPtr & globalNodeData() const
MaterialList getMaterials(QSSGRenderModelHandle h) const
ModelViewProjections getModelViewProjection(QSSGRenderModelHandle h) const
QSSGRenderMesh * getMesh(const QSSGRenderModel &model) const
ModelViewProjections getModelViewProjection(const QSSGRenderModel &model) const
MaterialList getMaterials(const QSSGRenderModel &model) const
virtual ~QSSGRenderPass()
virtual void resetForFrame()=0
virtual Type passType() const =0
virtual void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data)=0
virtual void renderPass(QSSGRenderer &renderer)=0
const QSSGBounds3 & bounds
QSSGRenderableObjectFlags renderableFlags
QSSGBounds3 globalBoundsInstancing
QSSGDepthDrawMode depthWriteMode
QSSGRenderableObject(Type ty, QSSGRenderableObjectFlags inFlags, const QVector3D &inWorldCenterPt, const QSSGBounds3 &inBounds, float inDepthBias, float inMinThreshold=-1, float inMaxThreshold=-1)
QVector3D worldCenterPoint
void releaseItem2DData(const QSSGRenderItem2D &item2D)
const std::unique_ptr< QSSGRhiQuadRenderer > & rhiQuadRenderer() const
quint32 frameDepth() const
friend class QSSGRenderContextInterface
QRect scissorRect() const
void cleanupResources(QSet< QSSGRenderGraphObject * > &resources)
void setViewport(QRect inViewport)
void beginSubLayerRender(QSSGLayerRenderData &inLayer)
const std::unique_ptr< QSSGRhiCubeRenderer > & rhiCubeRenderer() const
void setScissorRect(QRect inScissorRect)
void endSubLayerRender(QSSGLayerRenderData &inLayer)
QSSGRenderContextInterface * contextInterface() const
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
std::shared_ptr< QSSGRenderReflectionMap > reflectionMapManager
QSSGRenderableObjectList reflectionPassObjects
QSSGRhiGraphicsPipelineState ps
QList< QSSGRenderReflectionProbe * > reflectionProbes
Type passType() const final
Type passType() const final
QSSGRhiRenderableTexture * rhiAoTexture
const QSSGRhiRenderableTexture * rhiDepthTexture
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
QSSGRhiShaderPipelinePtr ssaoShaderPipeline
QSSGAmbientOcclusionSettings aoSettings
void renderPass(QSSGRenderer &renderer) final
const QSSGRenderCamera * camera
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
QSSGRhiGraphicsPipelineState ps
Type passType() const final
std::optional< SkyboxPass > skyboxPass
QSSGShaderFeatures shaderFeatures
QSSGRenderableObjectList sortedOpaqueObjects
std::optional< SkyboxCubeMapPass > skyboxCubeMapPass
QSSGRhiRenderableTexture * rhiScreenTexture
QSSGRenderableObjectList sortedScreenTextureObjects
const QSSGRhiRenderableTexture * rhiScreenTexture
void renderPass(QSSGRenderer &renderer) final
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
Type passType() const final
QSSGRenderCamera * camera
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGBounds3 castingObjectsBox
QSSGShaderLightList globalLights
QSSGRenderableObjectList shadowPassObjects
QSSGRhiGraphicsPipelineState ps
QSSGBounds3 receivingObjectsBox
void resetForFrame() final
std::unique_ptr< QSSGRenderCamera > debugCamera
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
std::shared_ptr< QSSGRenderShadowMap > shadowMapManager
QRhiRenderPassDescriptor * rpDesc
void renderPass(QSSGRenderer &renderer) final
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRhiShaderPipelinePtr skyBoxCubeShader
QSSGRhiGraphicsPipelineState ps
void resetForFrame() final
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
void resetForFrame() final
QRhiRenderPassDescriptor * rpDesc
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
Type passType() const final
QSSGRhiGraphicsPipelineState ps
static void prep(const QSSGRenderContextInterface &ctx, QSSGLayerRenderData &data, QSSGPassKey passKey, QSSGRhiGraphicsPipelineState &ps, QSSGShaderFeatures shaderFeatures, QRhiRenderPassDescriptor *rpDesc, const QSSGRenderableObjectList &sortedTransparentObjects, bool oit=false)
QSSGRenderableObjectList sortedTransparentObjects
static void render(const QSSGRenderContextInterface &ctx, const QSSGRhiGraphicsPipelineState &ps, const QSSGRenderableObjectList &sortedTransparentObjects)
void renderPass(QSSGRenderer &renderer) final
QSSGShaderFeatures shaderFeatures
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
Type passType() const final
void renderPass(QSSGRenderer &renderer) final
QList< QSSGRenderExtension * > extensions
Type passType() const final
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
void resetForFrame() final
void resetForFrame() final
void renderPass(QSSGRenderer &renderer) final
QSSGRenderableObjectList renderedOpaqueDepthPrepassObjects
Type passType() const final
QSSGRhiGraphicsPipelineState ps
void renderPrep(QSSGRenderer &renderer, QSSGLayerRenderData &data) final
QSSGRenderableObjectList renderedDepthWriteObjects
QSSGLayerRenderPreparationResultFlag
@ MaterialHasCustomBlendMode
@ RequiresMipmapsForScreenTexture
Q_DECLARE_TYPEINFO(QSSGRenderableObjectHandle, Q_PRIMITIVE_TYPE)
@ HasAttributeTexCoordLightmap
@ HasAttributeMorphTarget
@ HasAttributeJointAndWeight
QVarLengthArray< QSSGShaderLight, 16 > QSSGShaderLightList
std::shared_ptr< QSSGGlobalRenderNodeData > QSSGGlobalRenderNodeDataPtr
static const char * effect_fragment_main_with_tonemapping
static const char * effect_vertex_main_post
static const char * effect_vertex_main_pre
static const char * effect_vertex_main_position
static const char * effect_fragment_main
QSqlQueryModel * model
[16]
QVector< QSSGRenderableObjectHandle > renderables
QSSGBakedLightingModel(const QSSGRenderModel *model, const QVector< QSSGRenderableObjectHandle > &renderables)
const QSSGRenderModel * model
QSSGDefaultMaterialPreparationResult(QSSGShaderDefaultMaterialKey inMaterialKey)
QSSGRenderableImage * firstImage
QSSGRenderableObjectFlags renderableFlags
QSSGShaderDefaultMaterialKey materialKey
bool requiresDepthTextureMS() const
void setRequiresSsaoPass(bool inValue)
void setRequiresScreenTexture(bool inValue)
bool wasLayerDataDirty() const
void setRequiresDepthTextureMS(bool inValue)
bool requiresDepthTexture() const
void setLayerDataDirty(bool inValue)
void setWasDirty(bool inValue)
bool requiresMipmapsForScreenTexture() const
bool requiresScreenTexture() const
bool hasCustomBlendMode() const
void setRequiresNormalTexture(bool inValue)
bool requiresShadowMapPass() const
void setRequiresMipmapsForScreenTexture(bool inValue)
void setRequiresDepthTexture(bool inValue)
bool requiresSsaoPass() const
void setRequiresShadowMapPass(bool inValue)
void setHasCustomBlendMode(bool inValue)
bool requiresNormalTexture() const
QRhiTextureRenderTarget * oitRenderTarget
QRhiRenderPassDescriptor * renderPassDescriptor
QMatrix4x4 viewProjection
std::optional< QSSGClippingFrustum > clippingFrustum
QVector< QSSGRenderGraphObject * > materials
QMatrix4x4 globalTransform
QSSGShaderLightListView lights
QSSGRenderableNodeEntry()=default
void setPointsTopology(bool v)
bool hasAttributeTexCoordLightmap() const
void setRendersWithLightmap(bool inRendersWithLightmap)
void setHasAttributeTexCoord1(bool b)
void setHasAttributePosition(bool b)
void setCompletelyTransparent(bool inTransparent)
bool receivesReflections() const
void setHasAttributeJointAndWeight(bool b)
bool hasAttributePosition() const
bool hasTransparency() const
void setHasAttributeNormal(bool b)
void setHasAttributeColor(bool b)
bool hasAttributeNormal() const
void setHasAttributeTangent(bool b)
bool receivesShadows() const
void setHasAttributeMorphTarget(bool b)
bool isCompletelyTransparent() const
bool requiresNormalTexture() const
void setHasAttributeTexCoordLightmap(bool b)
void setHasAttributeTexCoord0(bool b)
bool hasAttributeBinormal() const
void setCastsReflections(bool inCastsReflections)
bool hasAttributeMorphTarget() const
void setCastsShadows(bool inCastsShadows)
bool hasAttributeJointAndWeight() const
bool requiresScreenTexture() const
bool castsReflections() const
bool usedInBakedLighting() const
bool hasAttributeColor() const
void setReceivesReflections(bool inReceivesReflections)
void setUsedInBakedLighting(bool inUsedInBakedLighting)
bool hasAttributeTangent() const
void setRequiresScreenTexture(bool v)
bool castsShadows() const
bool hasAttributeTexCoord1() const
bool hasAttributeTexCoord0() const
bool isPointsTopology() const
void setHasTransparency(bool inHasTransparency)
bool rendersWithLightmap() const
void setHasAttributeBinormal(bool b)
void setRequiresNormalTexture(bool v)
void setDirty(bool inDirty)
void setReceivesShadows(bool inReceivesShadows)
QSSGRenderableObjectHandle(QSSGRenderableObject *o, float camDistSq)
QSSGRenderableObject * obj
QSSGRenderableObjectHandle()=default
bool operator<(const QSSGShaderLight &o) const
QVector3D probeCubeMapCenter