Revision control

Copy as Markdown

// Copyright (C) 2008-2012 NVIDIA Corporation.
// Copyright (C) 2019 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QSSG_RENDER_SHADOW_MAP_H
#define QSSG_RENDER_SHADOW_MAP_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtQuick3DRuntimeRender/private/qtquick3druntimerenderglobal_p.h>
#include <QtGui/QMatrix4x4>
#include <QtGui/QVector3D>
#include <QtQuick3DUtils/private/qssgrenderbasetypes_p.h>
#include <QtQuick3DRuntimeRender/private/qssgrenderableobjects_p.h>
QT_BEGIN_NAMESPACE
class QSSGRhiContext;
class QSSGRenderContextInterface;
class QRhiRenderBuffer;
class QRhiTextureRenderTarget;
class QRhiRenderPassDescriptor;
class QRhiTexture;
struct QSSGShadowMapEntry
{
QSSGShadowMapEntry();
static QSSGShadowMapEntry withAtlas(quint32 lightIdx);
void destroyRhiResources();
quint32 m_lightIndex; ///< the light index it belongs to
quint32 m_depthArrayIndex = 0; ///< shadow map texture array index
// Owned RHI Resoruces (just for point lights)
QRhiTexture *m_rhiDepthCube = nullptr; // shadow cube map
QRhiRenderBuffer *m_rhiDepthStencilCube = nullptr;
QRhiRenderPassDescriptor *m_rhiRenderPassDescCube = nullptr;
std::array<QRhiTextureRenderTarget *, 6> m_rhiRenderTargetCube = {};
QRhiShaderResourceBindings *m_cubeToAtlasFrontSrb = nullptr;
QRhiShaderResourceBindings *m_cubeToAtlasBackSrb = nullptr;
// Shared RHI Resources
std::array<QRhiTextureRenderTarget *, 4> m_rhiRenderTargets = {};
std::array<QRhiRenderPassDescriptor *, 4> m_rhiRenderPassDesc = {};
QMatrix4x4 m_lightViewProjection[4]; ///< light view projection matrix
QMatrix4x4 m_lightCubeView[6]; ///< light cubemap view matrices
QMatrix4x4 m_lightView; ///< light view transform
quint32 m_csmNumSplits = 0;
float m_csmSplits[4] = {};
float m_csmActive[4] = {};
float m_shadowMapFar = 0.f;
QMatrix4x4 m_fixedScaleBiasMatrix[4];
QVector4D m_dimensionsInverted[4]; ///< (x, y, z, 0) 4 vec4
struct AtlasEntry {
int layerIndex = 0;
float uOffset = 0.0f;
float vOffset = 0.0f;
float uvScale = 1.0f;
} m_atlasInfo[4];
};
class Q_QUICK3DRUNTIMERENDER_EXPORT QSSGRenderShadowMap
{
Q_DISABLE_COPY(QSSGRenderShadowMap)
public:
const QSSGRenderContextInterface &m_context;
explicit QSSGRenderShadowMap(const QSSGRenderContextInterface &inContext);
~QSSGRenderShadowMap();
void releaseCachedResources();
void addShadowMaps(const QSSGShaderLightList &renderableLights);
QSSGShadowMapEntry *shadowMapEntry(int lightIdx);
QRhiTextureRenderTarget *layerRenderTarget(int layerIndex);
QRhiRenderPassDescriptor *layerRenderPassDescriptor(int layerIndex);
QRhiTexture *shadowMapAtlasTexture() const;
QRhiTexture *shadowMapBlueNoiseTexture() const;
qsizetype shadowMapEntryCount() { return m_shadowMapList.size(); }
QRhiShaderResourceBindings *shadowClearSrb() const { return m_shadowClearSrb.get(); }
private:
QSSGShadowMapEntry *addShadowMap(quint32 lightIdx,
QSize size,
QVector<QSSGShadowMapEntry::AtlasEntry> atlasEntries,
quint32 csmNumSplits,
QRhiTexture::Format format,
bool isPointLight,
const QString &renderNodeObjName);
QVector<QSSGShadowMapEntry> m_shadowMapList;
std::unique_ptr<QRhiTexture> m_shadowMapAtlasTexture;
std::unique_ptr<QRhiTexture> m_shadowMapBlueNoiseTexture;
std::unique_ptr<QRhiSampler> m_sharedCubeToAtlasSampler;
std::unique_ptr<QRhiBuffer> m_sharedFrontCubeToAtlasUniformBuffer;
std::unique_ptr<QRhiBuffer> m_sharedBackCubeToAtlasUniformBuffer;
std::unique_ptr<QRhiShaderResourceBindings> m_shadowClearSrb;
QVector<QRhiRenderBuffer *> m_layerDepthStencilBuffers;
QVector<QRhiTextureRenderTarget *> m_layerRenderTargets;
QVector<QRhiRenderPassDescriptor *> m_layerRenderPassDescriptors;
};
using QSSGRenderShadowMapPtr = std::shared_ptr<QSSGRenderShadowMap>;
QT_END_NAMESPACE
#endif