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_SHADER_MATERIAL_ADAPTER_H |
6 | #define QSSG_SHADER_MATERIAL_ADAPTER_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/qssgrendershaderlibrarymanager_p.h> |
24 | |
25 | QT_BEGIN_NAMESPACE |
26 | |
27 | struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGShaderMaterialAdapter |
28 | { |
29 | static QSSGShaderMaterialAdapter *create(const QSSGRenderGraphObject &materialNode); |
30 | virtual ~QSSGShaderMaterialAdapter(); |
31 | |
32 | virtual bool isPrincipled() = 0; |
33 | virtual bool isSpecularGlossy() = 0; |
34 | virtual bool isMetalnessEnabled() = 0; |
35 | virtual bool isSpecularEnabled() = 0; |
36 | virtual bool isVertexColorsEnabled() = 0; |
37 | virtual bool isVertexColorsMaskEnabled() = 0; |
38 | virtual bool isInvertOpacityMapValue() = 0; |
39 | virtual bool isBaseColorSingleChannelEnabled() = 0; |
40 | virtual bool isSpecularAmountSingleChannelEnabled() = 0; |
41 | virtual bool isEmissiveSingleChannelEnabled() = 0; |
42 | virtual bool isFresnelScaleBiasEnabled() = 0; |
43 | virtual bool isClearcoatFresnelScaleBiasEnabled() = 0; |
44 | virtual bool isClearcoatEnabled() = 0; |
45 | virtual bool isTransmissionEnabled() = 0; |
46 | virtual bool hasLighting() = 0; |
47 | virtual bool usesCustomSkinning() = 0; |
48 | virtual bool usesCustomMorphing() = 0; |
49 | virtual QSSGRenderDefaultMaterial::MaterialSpecularModel specularModel() = 0; |
50 | virtual QSSGRenderDefaultMaterial::MaterialAlphaMode alphaMode() = 0; |
51 | virtual QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorRedMask() = 0; |
52 | virtual QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorGreenMask() = 0; |
53 | virtual QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorBlueMask() = 0; |
54 | virtual QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorAlphaMask() = 0; |
55 | |
56 | virtual QSSGRenderImage *iblProbe() = 0; |
57 | virtual QVector3D emissiveColor() = 0; |
58 | virtual QVector4D color() = 0; |
59 | virtual QVector3D specularTint() = 0; |
60 | virtual float ior() = 0; |
61 | virtual float fresnelScale() = 0; |
62 | virtual float fresnelBias() = 0; |
63 | virtual float fresnelPower() = 0; |
64 | virtual float clearcoatFresnelScale() = 0; |
65 | virtual float clearcoatFresnelBias() = 0; |
66 | virtual float clearcoatFresnelPower() = 0; |
67 | virtual float metalnessAmount() = 0; |
68 | virtual float specularAmount() = 0; |
69 | virtual float specularRoughness() = 0; |
70 | virtual float bumpAmount() = 0; |
71 | virtual float translucentFallOff() = 0; |
72 | virtual float diffuseLightWrap() = 0; |
73 | virtual float occlusionAmount() = 0; |
74 | virtual float alphaCutOff() = 0; |
75 | virtual float pointSize() = 0; |
76 | virtual float lineWidth() = 0; |
77 | virtual float heightAmount() = 0; |
78 | virtual float minHeightSamples() = 0; |
79 | virtual float maxHeightSamples() = 0; |
80 | virtual float clearcoatAmount() = 0; |
81 | virtual float clearcoatRoughnessAmount() = 0; |
82 | virtual float clearcoatNormalStrength() = 0; |
83 | virtual float transmissionFactor() = 0; |
84 | virtual float thicknessFactor() = 0; |
85 | virtual float attenuationDistance() = 0; |
86 | virtual QVector3D attenuationColor() = 0; |
87 | |
88 | virtual bool isUnshaded(); |
89 | virtual bool hasCustomShaderSnippet(QSSGShaderCache::ShaderType type); |
90 | virtual QByteArray customShaderSnippet(QSSGShaderCache::ShaderType type, |
91 | QSSGShaderLibraryManager &shaderLibraryManager, |
92 | bool multiViewCompatible); |
93 | virtual bool hasCustomShaderFunction(QSSGShaderCache::ShaderType shaderType, |
94 | const QByteArray &funcName, |
95 | QSSGShaderLibraryManager &shaderLibraryManager); |
96 | virtual void setCustomPropertyUniforms(char *ubufData, |
97 | QSSGRhiShaderPipeline &shaderPipeline, |
98 | const QSSGRenderContextInterface &context); |
99 | virtual bool usesSharedVariables(); |
100 | }; |
101 | |
102 | struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGShaderDefaultMaterialAdapter final : public QSSGShaderMaterialAdapter |
103 | { |
104 | QSSGShaderDefaultMaterialAdapter(const QSSGRenderDefaultMaterial &material); |
105 | |
106 | bool isPrincipled() override; |
107 | bool isSpecularGlossy() override; |
108 | bool isMetalnessEnabled() override; |
109 | bool isSpecularEnabled() override; |
110 | bool isVertexColorsEnabled() override; |
111 | bool isVertexColorsMaskEnabled() override; |
112 | bool isInvertOpacityMapValue() override; |
113 | bool isBaseColorSingleChannelEnabled() override; |
114 | bool isSpecularAmountSingleChannelEnabled() override; |
115 | bool isEmissiveSingleChannelEnabled() override; |
116 | bool isClearcoatEnabled() override; |
117 | bool isTransmissionEnabled() override; |
118 | bool isFresnelScaleBiasEnabled() override; |
119 | bool isClearcoatFresnelScaleBiasEnabled() override; |
120 | bool hasLighting() override; |
121 | bool usesCustomSkinning() override; |
122 | bool usesCustomMorphing() override; |
123 | QSSGRenderDefaultMaterial::MaterialSpecularModel specularModel() override; |
124 | QSSGRenderDefaultMaterial::MaterialAlphaMode alphaMode() override; |
125 | QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorRedMask() override; |
126 | QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorGreenMask() override; |
127 | QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorBlueMask() override; |
128 | QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorAlphaMask() override; |
129 | |
130 | QSSGRenderImage *iblProbe() override; |
131 | QVector3D emissiveColor() override; |
132 | QVector4D color() override; |
133 | QVector3D specularTint() override; |
134 | float ior() override; |
135 | float fresnelScale() override; |
136 | float fresnelBias() override; |
137 | float fresnelPower() override; |
138 | float clearcoatFresnelScale() override; |
139 | float clearcoatFresnelBias() override; |
140 | float clearcoatFresnelPower() override; |
141 | float metalnessAmount() override; |
142 | float specularAmount() override; |
143 | float specularRoughness() override; |
144 | float bumpAmount() override; |
145 | float translucentFallOff() override; |
146 | float diffuseLightWrap() override; |
147 | float occlusionAmount() override; |
148 | float alphaCutOff() override; |
149 | float pointSize() override; |
150 | float lineWidth() override; |
151 | float heightAmount() override; |
152 | float minHeightSamples() override; |
153 | float maxHeightSamples() override; |
154 | float clearcoatAmount() override; |
155 | float clearcoatRoughnessAmount() override; |
156 | float clearcoatNormalStrength() override; |
157 | float transmissionFactor() override; |
158 | float thicknessFactor() override; |
159 | float attenuationDistance() override; |
160 | QVector3D attenuationColor() override; |
161 | |
162 | private: |
163 | const QSSGRenderDefaultMaterial &m_material; |
164 | }; |
165 | |
166 | struct Q_QUICK3DRUNTIMERENDER_EXPORT QSSGShaderCustomMaterialAdapter final : public QSSGShaderMaterialAdapter |
167 | { |
168 | QSSGShaderCustomMaterialAdapter(const QSSGRenderCustomMaterial &material); |
169 | |
170 | bool isPrincipled() override; |
171 | bool isSpecularGlossy() override; |
172 | bool isMetalnessEnabled() override; |
173 | bool isSpecularEnabled() override; |
174 | bool isVertexColorsEnabled() override; |
175 | bool isVertexColorsMaskEnabled() override; |
176 | bool isInvertOpacityMapValue() override; |
177 | bool isBaseColorSingleChannelEnabled() override; |
178 | bool isSpecularAmountSingleChannelEnabled() override; |
179 | bool isEmissiveSingleChannelEnabled() override; |
180 | bool isClearcoatEnabled() override; |
181 | bool isTransmissionEnabled() override; |
182 | bool isFresnelScaleBiasEnabled() override; |
183 | bool isClearcoatFresnelScaleBiasEnabled() override; |
184 | bool hasLighting() override; |
185 | bool usesCustomSkinning() override; |
186 | bool usesCustomMorphing() override; |
187 | QSSGRenderDefaultMaterial::MaterialSpecularModel specularModel() override; |
188 | QSSGRenderDefaultMaterial::MaterialAlphaMode alphaMode() override; |
189 | QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorRedMask() override; |
190 | QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorGreenMask() override; |
191 | QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorBlueMask() override; |
192 | QSSGRenderDefaultMaterial::VertexColorMaskFlags vertexColorAlphaMask() override; |
193 | |
194 | QSSGRenderImage *iblProbe() override; |
195 | QVector3D emissiveColor() override; |
196 | QVector4D color() override; |
197 | QVector3D specularTint() override; |
198 | float ior() override; |
199 | float fresnelScale() override; |
200 | float fresnelBias() override; |
201 | float fresnelPower() override; |
202 | float clearcoatFresnelScale() override; |
203 | float clearcoatFresnelBias() override; |
204 | float clearcoatFresnelPower() override; |
205 | float metalnessAmount() override; |
206 | float specularAmount() override; |
207 | float specularRoughness() override; |
208 | float bumpAmount() override; |
209 | float translucentFallOff() override; |
210 | float diffuseLightWrap() override; |
211 | float occlusionAmount() override; |
212 | float alphaCutOff() override; |
213 | float pointSize() override; |
214 | float lineWidth() override; |
215 | float heightAmount() override; |
216 | float minHeightSamples() override; |
217 | float maxHeightSamples() override; |
218 | float clearcoatAmount() override; |
219 | float clearcoatRoughnessAmount() override; |
220 | float clearcoatNormalStrength() override; |
221 | float transmissionFactor() override; |
222 | float thicknessFactor() override; |
223 | float attenuationDistance() override; |
224 | QVector3D attenuationColor() override; |
225 | |
226 | bool isUnshaded() override; |
227 | bool hasCustomShaderSnippet(QSSGShaderCache::ShaderType type) override; |
228 | QByteArray customShaderSnippet(QSSGShaderCache::ShaderType type, |
229 | QSSGShaderLibraryManager &shaderLibraryManager, |
230 | bool multiViewCompatible) override; |
231 | bool hasCustomShaderFunction(QSSGShaderCache::ShaderType shaderType, |
232 | const QByteArray &funcName, |
233 | QSSGShaderLibraryManager &shaderLibraryManager) override; |
234 | void setCustomPropertyUniforms(char *ubufData, |
235 | QSSGRhiShaderPipeline &shaderPipeline, |
236 | const QSSGRenderContextInterface &context) override; |
237 | bool usesSharedVariables() override; |
238 | |
239 | using StringPair = QPair<QByteArray, QByteArray>; |
240 | using StringPairList = QVarLengthArray<StringPair, 16>; |
241 | using ShaderCodeAndMetaData = QPair<QByteArray, QSSGCustomShaderMetaData>; |
242 | static ShaderCodeAndMetaData prepareCustomShader(QByteArray &dst, |
243 | const QByteArray &shaderCode, |
244 | QSSGShaderCache::ShaderType type, |
245 | const StringPairList &baseUniforms, |
246 | const StringPairList &baseInputs = StringPairList(), |
247 | const StringPairList &baseOutputs = StringPairList(), |
248 | bool multiViewCompatible = false, |
249 | const StringPairList &multiViewDependentSamplers = {}); |
250 | |
251 | private: |
252 | const QSSGRenderCustomMaterial &m_material; |
253 | }; |
254 | |
255 | struct QSSGCustomMaterialVariableSubstitution |
256 | { |
257 | QByteArrayView builtin; |
258 | QByteArrayView actualName; |
259 | bool multiViewDependent; |
260 | }; |
261 | |
262 | namespace QtQuick3DEditorHelpers { |
263 | // NOTE: Returns a copy of the actual list, cache as needed! |
264 | namespace CustomMaterial { |
265 | [[nodiscard]] Q_QUICK3DRUNTIMERENDER_EXPORT QList<QByteArrayView> preprocessorVars(); |
266 | } |
267 | } |
268 | |
269 | QT_END_NAMESPACE |
270 | |
271 | #endif |
272 | |