summaryrefslogtreecommitdiffstats
path: root/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderMaterialShaderGenerator.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderMaterialShaderGenerator.h')
-rw-r--r--src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderMaterialShaderGenerator.h152
1 files changed, 152 insertions, 0 deletions
diff --git a/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderMaterialShaderGenerator.h b/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderMaterialShaderGenerator.h
new file mode 100644
index 00000000..e8b9880d
--- /dev/null
+++ b/src/Runtime/ogl-runtime/src/runtimerender/Qt3DSRenderMaterialShaderGenerator.h
@@ -0,0 +1,152 @@
+/****************************************************************************
+**
+** Copyright (C) 2008-2012 NVIDIA Corporation.
+** Copyright (C) 2017 The Qt Company Ltd.
+** Contact: https://www.qt.io/licensing/
+**
+** This file is part of Qt 3D Studio.
+**
+** $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$
+**
+****************************************************************************/
+#pragma once
+#ifndef QT3DS_RENDER_MATERIAL_SHADER_GENERATOR_H
+#define QT3DS_RENDER_MATERIAL_SHADER_GENERATOR_H
+#include "Qt3DSRender.h"
+#include "foundation/Qt3DSRefCounted.h"
+#include "Qt3DSRenderShaderKeys.h"
+#include "Qt3DSRenderShaderCache.h"
+#include "Qt3DSRenderShaderCodeGeneratorV2.h"
+
+namespace qt3ds {
+namespace render {
+
+// these are our current shader limits
+#define QT3DS_MAX_NUM_LIGHTS 16
+#define QT3DS_MAX_NUM_SHADOWS 8
+
+ // note this struct must exactly match the memory layout of the
+ // struct sampleLight.glsllib and sampleArea.glsllib. If you make changes here you need
+ // to adjust the code in sampleLight.glsllib and sampleArea.glsllib as well
+ struct SLightSourceShader
+ {
+ QT3DSVec4 m_position;
+ QT3DSVec4 m_direction; // Specifies the light direction in world coordinates.
+ QT3DSVec4 m_up;
+ QT3DSVec4 m_right;
+ QT3DSVec4 m_diffuse;
+ QT3DSVec4 m_ambient;
+ QT3DSVec4 m_specular;
+ QT3DSF32 m_spotExponent; // Specifies the intensity distribution of the light.
+ QT3DSF32 m_spotCutoff; // Specifies the maximum spread angle of the light.
+ QT3DSF32 m_constantAttenuation; // Specifies the constant light attenuation factor.
+ QT3DSF32 m_linearAttenuation; // Specifies the linear light attenuation factor.
+ QT3DSF32 m_quadraticAttenuation; // Specifies the quadratic light attenuation factor.
+ QT3DSF32 m_range; // Specifies the maximum distance of the light influence
+ QT3DSF32 m_width; // Specifies the width of the area light surface.
+ QT3DSF32 m_height; // Specifies the height of the area light surface;
+ QT3DSVec4 m_shadowControls;
+ QT3DSMat44 m_shadowView;
+ QT3DSI32 m_shadowIdx;
+ QT3DSF32 m_padding1[3];
+ };
+
+ struct SLayerGlobalRenderProperties
+ {
+ const SLayer &m_Layer;
+ SCamera &m_Camera;
+ QT3DSVec3 m_CameraDirection;
+ NVDataRef<SLight *> m_Lights;
+ NVDataRef<QT3DSVec3> m_LightDirections;
+ Qt3DSShadowMap *m_ShadowMapManager;
+ NVRenderTexture2D *m_DepthTexture;
+ NVRenderTexture2D *m_SSaoTexture;
+ SImage *m_LightProbe;
+ SImage *m_LightProbe2;
+ QT3DSF32 m_ProbeHorizon;
+ QT3DSF32 m_ProbeBright;
+ QT3DSF32 m_Probe2Window;
+ QT3DSF32 m_Probe2Pos;
+ QT3DSF32 m_Probe2Fade;
+ QT3DSF32 m_ProbeFOV;
+
+ SLayerGlobalRenderProperties(const SLayer &inLayer, SCamera &inCamera,
+ QT3DSVec3 inCameraDirection, NVDataRef<SLight *> inLights,
+ NVDataRef<QT3DSVec3> inLightDirections,
+ Qt3DSShadowMap *inShadowMapManager,
+ NVRenderTexture2D *inDepthTexture,
+ NVRenderTexture2D *inSSaoTexture, SImage *inLightProbe,
+ SImage *inLightProbe2, QT3DSF32 inProbeHorizon,
+ QT3DSF32 inProbeBright, QT3DSF32 inProbe2Window, QT3DSF32 inProbe2Pos,
+ QT3DSF32 inProbe2Fade, QT3DSF32 inProbeFOV)
+ : m_Layer(inLayer)
+ , m_Camera(inCamera)
+ , m_CameraDirection(inCameraDirection)
+ , m_Lights(inLights)
+ , m_LightDirections(inLightDirections)
+ , m_ShadowMapManager(inShadowMapManager)
+ , m_DepthTexture(inDepthTexture)
+ , m_SSaoTexture(inSSaoTexture)
+ , m_LightProbe(inLightProbe)
+ , m_LightProbe2(inLightProbe2)
+ , m_ProbeHorizon(inProbeHorizon)
+ , m_ProbeBright(inProbeBright)
+ , m_Probe2Window(inProbe2Window)
+ , m_Probe2Pos(inProbe2Pos)
+ , m_Probe2Fade(inProbe2Fade)
+ , m_ProbeFOV(inProbeFOV)
+ {
+ }
+ };
+
+ class IMaterialShaderGenerator : public NVRefCounted
+ {
+ public:
+ struct SImageVariableNames
+ {
+ const char8_t *m_ImageSampler;
+ const char8_t *m_ImageFragCoords;
+ };
+
+ virtual SImageVariableNames GetImageVariableNames(QT3DSU32 inIdx) = 0;
+ virtual void GenerateImageUVCoordinates(IShaderStageGenerator &inVertexPipeline, QT3DSU32 idx,
+ QT3DSU32 uvSet, SRenderableImage &image) = 0;
+
+ // inPipelineName needs to be unique else the shader cache will just return shaders from
+ // different pipelines.
+ virtual NVRenderShaderProgram *GenerateShader(
+ const SGraphObject &inMaterial, SShaderDefaultMaterialKey inShaderDescription,
+ IShaderStageGenerator &inVertexPipeline, TShaderFeatureSet inFeatureSet,
+ NVDataRef<SLight *> inLights, SRenderableImage *inFirstImage, bool inHasTransparency,
+ const char8_t *inVertexPipelineName, const char8_t *inCustomMaterialName = "") = 0;
+
+ // Also sets the blend function on the render context.
+ virtual void
+ SetMaterialProperties(NVRenderShaderProgram &inProgram, const SGraphObject &inMaterial,
+ const QT3DSVec2 &inCameraVec, const QT3DSMat44 &inModelViewProjection,
+ const QT3DSMat33 &inNormalMatrix, const QT3DSMat44 &inGlobalTransform,
+ SRenderableImage *inFirstImage, QT3DSF32 inOpacity,
+ SLayerGlobalRenderProperties inRenderProperties) = 0;
+ };
+}
+}
+
+#endif