blob: 4c5533f646e6739e820a3066b04cadc8f42e8d16 [file] [log] [blame]
/****************************************************************************
**
** Copyright (C) 2008-2012 NVIDIA Corporation.
** Copyright (C) 2019 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of Qt Quick 3D.
**
** $QT_BEGIN_LICENSE:GPL$
** Commercial License Usage
** Licensees holding valid commercial Qt licenses may use this file in
** accordance with the commercial license agreement provided with the
** Software or, alternatively, in accordance with the terms contained in
** a written agreement between you and The Qt Company. For licensing terms
** and conditions see https://www.qt.io/terms-conditions. For further
** information use the contact form at https://www.qt.io/contact-us.
**
** GNU General Public License Usage
** Alternatively, this file may be used under the terms of the GNU
** General Public License version 3 or (at your option) any later version
** approved by the KDE Free Qt Foundation. The licenses are as published by
** the Free Software Foundation and appearing in the file LICENSE.GPL3
** included in the packaging of this file. Please review the following
** information to ensure the GNU General Public License requirements will
** be met: https://www.gnu.org/licenses/gpl-3.0.html.
**
** $QT_END_LICENSE$
**
****************************************************************************/
#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/qssgrendercontextcore_p.h>
#include <QtGui/QMatrix4x4>
#include <QtGui/QVector3D>
#include <QtQuick3DRender/private/qssgrenderbasetypes_p.h>
QT_BEGIN_NAMESPACE
struct QSSGLayerRenderData;
enum class ShadowMapModes
{
SSM, ///< standard shadow mapping
VSM, ///< variance shadow mapping
CUBE, ///< cubemap omnidirectional shadows
};
enum class ShadowFilterValues
{
NONE = 1 << 0, ///< hard shadows
PCF = 1 << 1, ///< Percentage close filtering
BLUR = 1 << 2, ///< Gausian Blur
};
struct QSSGShadowMapEntry
{
QSSGShadowMapEntry()
: m_lightIndex(std::numeric_limits<quint32>::max())
, m_shadowMapMode(ShadowMapModes::SSM)
, m_shadowFilterFlags(ShadowFilterValues::NONE)
{
}
QSSGShadowMapEntry(quint32 index,
ShadowMapModes mode,
ShadowFilterValues filter,
QSSGRef<QSSGRenderTexture2D> depthMap,
QSSGRef<QSSGRenderTexture2D> depthCopy,
QSSGRef<QSSGRenderTexture2D> depthTemp)
: m_lightIndex(index)
, m_shadowMapMode(mode)
, m_shadowFilterFlags(filter)
, m_depthMap(depthMap)
, m_depthCopy(depthCopy)
, m_depthCube(nullptr)
, m_cubeCopy(nullptr)
, m_depthRender(depthTemp)
{
}
QSSGShadowMapEntry(quint32 index,
ShadowMapModes mode,
ShadowFilterValues filter,
QSSGRef<QSSGRenderTextureCube> depthCube,
QSSGRef<QSSGRenderTextureCube> cubeTmp,
QSSGRef<QSSGRenderTexture2D> depthTemp)
: m_lightIndex(index)
, m_shadowMapMode(mode)
, m_shadowFilterFlags(filter)
, m_depthMap(nullptr)
, m_depthCopy(nullptr)
, m_depthCube(depthCube)
, m_cubeCopy(cubeTmp)
, m_depthRender(depthTemp)
{
}
quint32 m_lightIndex; ///< the light index it belongs to
ShadowMapModes m_shadowMapMode; ///< shadow map method
ShadowFilterValues m_shadowFilterFlags; ///< shadow filter mode
// PKC : Adding the DepthRender buffer allows us to have a depth+stencil format when filling
// the shadow maps (depth+stencil is necessary), but use a more compact format for the
// actual
// shadow map used at shade time. See if it's worth adding.
QSSGRef<QSSGRenderTexture2D> m_depthMap; ///< shadow map texture
QSSGRef<QSSGRenderTexture2D> m_depthCopy; ///< shadow map buffer used during blur passes
QSSGRef<QSSGRenderTextureCube> m_depthCube; ///< shadow cube map
QSSGRef<QSSGRenderTextureCube> m_cubeCopy; ///< cube map buffer used during the blur passes
QSSGRef<QSSGRenderTexture2D> m_depthRender; ///< shadow depth+stencil map used during rendering
QMatrix4x4 m_lightVP; ///< light view projection matrix
QMatrix4x4 m_lightCubeView[6]; ///< light cubemap view matrices
QMatrix4x4 m_lightView; ///< light view transform
};
class QSSGRenderShadowMap
{
typedef QVector<QSSGShadowMapEntry> TShadowMapEntryList;
public:
QAtomicInt ref;
QSSGRef<QSSGRenderContextInterface> m_context;
QSSGRenderShadowMap(const QSSGRef<QSSGRenderContextInterface> &inContext);
~QSSGRenderShadowMap();
/*
* @brief Add a shadow map entry
* This creates a new shadow map if it does not exist or changed
*
* @param[in] index shadow map entry index
* @param[in] width shadow map width
* @param[in] height shadow map height
* @param[in] format shadow map format
* @param[in] samples shadow map sample count
* @param[in] mode shadow map mode like SSM, VCM
* @param[in] filter soft shadow map mode filter like PCF
*
* @ return no return
*/
void addShadowMapEntry(qint32 index,
qint32 width,
qint32 height,
QSSGRenderTextureFormat format,
qint32 samples,
ShadowMapModes mode,
ShadowFilterValues filter);
/*
* @brief Get a shadow map entry
*
* @param[in] index shadow map entry index
*
* @ return shadow map entry or nullptr
*/
QSSGShadowMapEntry *getShadowMapEntry(int index);
/*
* @brief Get shadow map entry count
*
* @ return count of shadow map entries
*/
qint32 getShadowMapEntryCount() { return m_shadowMapList.size(); }
static QSSGRef<QSSGRenderShadowMap> create(const QSSGRef<QSSGRenderContextInterface> &inContext);
private:
TShadowMapEntryList m_shadowMapList; ///< List of shadow map entries
};
QT_END_NAMESPACE
#endif