1// Copyright (C) 2008-2012 NVIDIA Corporation.
2// Copyright (C) 2019 The Qt Company Ltd.
3// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
4
5#ifndef QSSG_RENDER_DEFAULT_MATERIAL_SHADER_GENERATOR_H
6#define QSSG_RENDER_DEFAULT_MATERIAL_SHADER_GENERATOR_H
7
8//
9// W A R N I N G
10// -------------
11//
12// This file is not part of the Qt API. It exists purely as an
13// implementation detail. This header file may change from version to
14// version without notice, or even be removed.
15//
16// We mean it.
17//
18
19#include <QtQuick3DRuntimeRender/private/qssgrendershadercodegenerator_p.h>
20#include <QtQuick3DRuntimeRender/private/qssgrendershadowmap_p.h>
21#include <QtQuick3DRuntimeRender/private/qssgrenderlight_p.h>
22#include <QtQuick3DRuntimeRender/private/qssgrenderableimage_p.h>
23#include <QtQuick3DRuntimeRender/private/qssgrenderableobjects_p.h>
24#include <QtQuick3DRuntimeRender/private/qssgrendershaderkeys_p.h>
25
26QT_BEGIN_NAMESPACE
27
28struct QSSGShaderDefaultMaterialKeyProperties;
29struct QSSGShaderDefaultMaterialKey;
30struct QSSGLayerGlobalRenderProperties;
31struct QSSGMaterialVertexPipeline;
32
33struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGMaterialShaderGenerator
34{
35 struct LightVariableNames
36 {
37 QByteArray lightColor;
38 QByteArray lightSpecularColor;
39 QByteArray lightAttenuation;
40 QByteArray lightConstantAttenuation;
41 QByteArray lightLinearAttenuation;
42 QByteArray lightQuadraticAttenuation;
43 QByteArray normalizedDirection;
44 QByteArray lightDirection;
45 QByteArray lightPos;
46 QByteArray lightConeAngle;
47 QByteArray lightInnerConeAngle;
48 QByteArray relativeDistance;
49 QByteArray relativeDirection;
50 QByteArray spotAngle;
51 };
52
53 struct ShadowVariableNames
54 {
55 QByteArray shadowCube;
56 QByteArray shadowData;
57 QByteArray shadowMapTexture;
58 };
59
60 ~QSSGMaterialShaderGenerator() = default;
61
62 static const char* getSamplerName(QSSGRenderableImage::Type type);
63
64 static QSSGRhiShaderPipelinePtr generateMaterialRhiShader(const QByteArray &inShaderKeyPrefix,
65 QSSGMaterialVertexPipeline &vertexGenerator,
66 const QSSGShaderDefaultMaterialKey &key,
67 const QSSGShaderDefaultMaterialKeyProperties &inProperties,
68 const QSSGShaderFeatures &inFeatureSet,
69 const QSSGRenderGraphObject &inMaterial,
70 const QSSGShaderLightListView &inLights,
71 QSSGRenderableImage *inFirstImage,
72 QSSGShaderLibraryManager &shaderLibraryManager,
73 QSSGShaderCache &theCache);
74
75 static void setRhiMaterialProperties(const QSSGRenderContextInterface &,
76 QSSGRhiShaderPipeline &shaders,
77 char *ubufData,
78 QSSGRhiGraphicsPipelineState *inPipelineState,
79 const QSSGRenderGraphObject &inMaterial,
80 const QSSGShaderDefaultMaterialKey &inKey,
81 const QSSGShaderDefaultMaterialKeyProperties &inProperties,
82 const QSSGRenderCameraList &inCameras,
83 const QSSGRenderMvpArray &inModelViewProjections,
84 const QMatrix3x3 &inNormalMatrix,
85 const QMatrix4x4 &inGlobalTransform,
86 const QMatrix4x4 &clipSpaceCorrMatrix,
87 const QMatrix4x4 &localInstanceTransform,
88 const QMatrix4x4 &globalInstanceTransform,
89 const QSSGDataView<float> &inMorphWeights,
90 QSSGRenderableImage *inFirstImage,
91 float inOpacity,
92 const QSSGLayerRenderData &inRenderProperties,
93 const QSSGShaderLightListView &inLights,
94 const QSSGShaderReflectionProbe &reflectionProbe,
95 bool receivesShadows,
96 bool receivesReflections,
97 const QVector2D *shadowDepthAdjust,
98 QRhiTexture *lightmapTexture);
99
100 static const char *directionalLightProcessorArgumentList();
101 static const char *pointLightProcessorArgumentList();
102 static const char *spotLightProcessorArgumentList();
103 static const char *ambientLightProcessorArgumentList();
104 static const char *specularLightProcessorArgumentList();
105 static const char *shadedFragmentMainArgumentList();
106 static const char *postProcessorArgumentList();
107 static const char *iblProbeProcessorArgumentList();
108 static const char *vertexMainArgumentList();
109 static const char *vertexInstancedMainArgumentList();
110
111private:
112 QSSGMaterialShaderGenerator() = delete;
113 Q_DISABLE_COPY(QSSGMaterialShaderGenerator)
114};
115
116namespace QtQuick3DEditorHelpers {
117namespace CustomMaterial {
118// NOTE: Returns a copy of the actual list, cache as needed!
119[[nodiscard]] Q_QUICK3DRUNTIMERENDER_EXPORT QList<QByteArrayView> reservedArgumentNames();
120}
121}
122
123QT_END_NAMESPACE
124#endif
125

source code of qtquick3d/src/runtimerender/qssgrenderdefaultmaterialshadergenerator_p.h