7#include <QtQuick3DRuntimeRender/private/qssgrenderer_p.h>
8#include <QtQuick3DRuntimeRender/private/qssgrenderlight_p.h>
9#include <QtQuick3DRuntimeRender/private/qssgrendercontextcore_p.h>
10#include <QtQuick3DRuntimeRender/private/qssgrendershadercache_p.h>
11#include <QtQuick3DRuntimeRender/private/qssgrendershaderlibrarymanager_p.h>
12#include <QtQuick3DRuntimeRender/private/qssgrendershadercodegenerator_p.h>
13#include <QtQuick3DRuntimeRender/private/qssgrenderdefaultmaterialshadergenerator_p.h>
14#include <QtQuick3DRuntimeRender/private/qssgshadermaterialadapter_p.h>
21 : m_programGenerator(&programGen)
22 , defaultMaterialShaderKeyProperties(materialProperties)
23 , materialAdapter(materialAdapter)
24 , hasCustomShadedMain(
false)
25 , skipCustomFragmentSnippet(
false)
29static inline void insertProcessorArgs(
QByteArray &snippet,
const char *argKey,
const char* (*argListFunc)(),
bool usesShared =
false,
bool isSharedInout =
false)
31 const int argKeyLen = int(strlen(argKey));
32 const int argKeyPos = snippet.
indexOf(argKey);
35 snippet = snippet.
left(argKeyPos) + argListFunc() + snippet.
mid(argKeyPos + argKeyLen);
37 const char *inoutString = isSharedInout ?
", inout " :
", in ";
38 snippet = snippet.
left(argKeyPos) + argListFunc() + inoutString +
QByteArrayLiteral(
"QT_SHARED_VARS SHARED") + snippet.
mid(argKeyPos + argKeyLen);
96 return " qt_customMain(qt_vertPosition.xyz, qt_vertNormal, qt_vertUV0, qt_vertUV1, qt_vertTangent, qt_vertBinormal, qt_vertJoints, qt_vertWeights, qt_vertColor, qt_instancedModelMatrix, qt_instancedMVPMatrix);";
98 return " qt_customMain(qt_vertPosition.xyz, qt_vertNormal, qt_vertUV0, qt_vertUV1, qt_vertTangent, qt_vertBinormal, qt_vertJoints, qt_vertWeights, qt_vertColor);\n";
139 vertexShader.
addIncoming(
"qt_instanceTransform0",
"vec4");
140 vertexShader.
addIncoming(
"qt_instanceTransform1",
"vec4");
141 vertexShader.
addIncoming(
"qt_instanceTransform2",
"vec4");
142 vertexShader.
addIncoming(
"qt_instanceColor",
"vec4");
143 vertexShader.
addIncoming(
"qt_instanceData",
"vec4");
145 if (blendParticles) {
147 vertexShader.
addUniform(
"qt_particleTexture",
"sampler2D");
148 vertexShader.
addUniform(
"qt_countPerSlice",
"uint");
149 vertexShader.
addUniform(
"qt_oneOverParticleImageSize",
"vec2");
150 vertexShader.
addUniform(
"qt_particleMatrix",
"mat4");
151 vertexShader.
addUniform(
"qt_particleIndexOffset",
"uint");
156 if (usesFloatJointIndices)
162 vertexShader.
addUniform(
"qt_boneTexture",
"sampler2D");
167 vertexShader.
addUniform(
"qt_morphTargetTexture",
"sampler2DArray");
172 if (hasCustomVertexShader) {
174 shaderLibraryManager);
177 shaderLibraryManager))
186 vertexShader.
addUniform(
"qt_boneTexture",
"sampler2D");
191 vertexShader.
addInclude(
"morphanim_custom.glsllib");
194 vertexShader.
addUniform(
"qt_morphTargetTexture",
"sampler2DArray");
202 vertexShader << snippet;
205 vertexShader <<
"void main()"
212 vertexShader.
append(
" vec4 qt_vertPosition = vec4(attr_pos, 1.0);");
213 vertexShader.
append(
" vec3 qt_vertNormal = vec3(0.0);");
214 vertexShader.
append(
" vec3 qt_vertTangent = vec3(0.0);");
215 vertexShader.
append(
" vec3 qt_vertBinormal = vec3(0.0);");
216 if (meshHasTexCoord0 || hasCustomVertexShader)
217 vertexShader.
append(
" vec2 qt_vertUV0 = vec2(0.0);");
218 if (meshHasTexCoord1 || hasCustomVertexShader)
219 vertexShader.
append(
" vec2 qt_vertUV1 = vec2(0.0);");
221 vertexShader.
append(
" ivec4 qt_vertJoints = ivec4(0);");
222 if (meshHasJointsAndWeights ||
m_hasSkinning || hasCustomVertexShader)
223 vertexShader.
append(
" vec4 qt_vertWeights = vec4(0.0);");
224 if (meshHasColors ||
usesInstancing || blendParticles || hasCustomVertexShader || hasCustomFragmentShader)
225 vertexShader.
append(
" vec4 qt_vertColor = vec4(1.0);");
228 vertexShader.
addUniform(
"qt_modelViewProjection",
"mat4");
231 vertexShader.
addUniform(
"qt_modelMatrix",
"mat4");
232 vertexShader.
addUniform(
"qt_parentMatrix",
"mat4");
233 vertexShader.
addUniform(
"qt_viewProjectionMatrix",
"mat4");
244 if (hasCustomVertexShader || hasCustomFragmentShader) {
249 vertexShader.
addUniform(
"qt_viewProjectionMatrix",
"mat4");
250 vertexShader.
addUniform(
"qt_modelMatrix",
"mat4");
251 vertexShader.
addUniform(
"qt_viewMatrix",
"mat4");
252 vertexShader.
addUniform(
"qt_normalMatrix",
"mat3");
253 vertexShader.
addUniform(
"qt_cameraPosition",
"vec3");
254 vertexShader.
addUniform(
"qt_cameraDirection",
"vec3");
255 vertexShader.
addUniform(
"qt_cameraProperties",
"vec2");
256 if (usesProjectionMatrix)
257 vertexShader.
addUniform(
"qt_projectionMatrix",
"mat4");
258 if (usesInvProjectionMatrix)
259 vertexShader.
addUniform(
"qt_inverseProjectionMatrix",
"mat4");
262 if (meshHasNormals) {
263 vertexShader.
append(
" qt_vertNormal = attr_norm;");
266 if (meshHasTexCoord0) {
267 vertexShader.
append(
" qt_vertUV0 = attr_uv0;");
270 if (meshHasTexCoord1) {
271 vertexShader.
append(
" qt_vertUV1 = attr_uv1;");
274 if (meshHasTexCoordLightmap) {
275 vertexShader.
append(
" vec2 qt_vertLightmapUV = attr_lightmapuv;");
276 vertexShader.
addIncoming(
"attr_lightmapuv",
"vec2");
278 if (meshHasTangents) {
279 vertexShader.
append(
" qt_vertTangent = attr_textan;");
282 if (meshHasBinormals) {
283 vertexShader.
append(
" qt_vertBinormal = attr_binormal;");
287 vertexShader.
append(
" qt_vertColor = attr_color;");
291 if (meshHasJointsAndWeights && (
m_hasSkinning || hasCustomVertexShader)) {
292 if (usesFloatJointIndices) {
294 vertexShader.
append(
" qt_vertJoints = ivec4(attr_joints);");
297 vertexShader.
append(
" qt_vertJoints = attr_joints;");
300 vertexShader.
append(
" qt_vertWeights = attr_weights;");
304 vertexShader.
append(
" qt_vertColor *= qt_instanceColor;");
305 vertexShader.
append(
" mat4 qt_instanceMatrix = mat4(qt_instanceTransform0, qt_instanceTransform1, qt_instanceTransform2, vec4(0.0, 0.0, 0.0, 1.0));");
307 vertexShader.
append(
" mat4 qt_instancedModelMatrix = qt_parentMatrix * transpose(qt_instanceMatrix);");
309 vertexShader.
append(
" mat4 qt_instancedModelMatrix = qt_parentMatrix * transpose(qt_instanceMatrix) * qt_modelMatrix;");
310 vertexShader.
append(
" mat3 qt_instancedNormalMatrix = mat3(transpose(inverse(qt_instancedModelMatrix)));");
311 vertexShader.
append(
" mat4 qt_instancedMVPMatrix = qt_viewProjectionMatrix * qt_instancedModelMatrix;");
315 vertexShader <<
" vec3 qt_uTransform;\n";
316 vertexShader <<
" vec3 qt_vTransform;\n";
322 vertexShader.
append(
" qt_vertPosition.xyz = qt_getTargetPosition(qt_vertPosition.xyz);");
325 vertexShader.
append(
" mat4 skinMat = mat4(1);");
326 vertexShader.
append(
" if (qt_vertWeights != vec4(0.0)) {");
327 vertexShader.
append(
" skinMat = qt_getSkinMatrix(qt_vertJoints, qt_vertWeights);");
328 vertexShader.
append(
" qt_vertPosition = skinMat * qt_vertPosition;");
329 vertexShader.
append(
" }");
331 if (blendParticles) {
332 vertexShader.
append(
" qt_vertPosition.xyz = qt_applyParticle(qt_vertPosition.xyz, qt_vertNormal, qt_vertColor, qt_vertNormal, qt_vertColor, qt_particleMatrix);");
337 vertexShader.
append(
" gl_Position = qt_modelViewProjection * qt_vertPosition;");
339 vertexShader.
append(
" gl_Position = qt_instancedMVPMatrix * qt_vertPosition;");
343 if (usesPointsTopology && !hasCustomVertexShader) {
344 vertexShader.
addUniform(
"qt_materialPointSize",
"float");
345 vertexShader.
append(
" gl_PointSize = qt_materialPointSize;");
356 shaderLibraryManager);
377 fragment() <<
" float qt_objectOpacity = qt_material_properties.a;\n";
382 vertex() <<
" " << inVarName <<
" = " << inVarValue <<
";\n";
390 vertexGenerator.
addUniform(
"qt_normalMatrix",
"mat3");
392 vertexGenerator.
append(
" qt_vertNormal = qt_getTargetNormal(qt_vertNormal);");
394 vertexGenerator.
append(
" if (qt_vertWeights != vec4(0.0))");
395 vertexGenerator.
append(
" qt_vertNormal = qt_getSkinNormalMatrix(qt_vertJoints, qt_vertWeights) * qt_vertNormal;");
401 vertexGenerator.
append(
" vec3 qt_world_normal = normalize(qt_vertNormal);");
403 vertexGenerator.
append(
" vec3 qt_world_normal = normalize(qt_normalMatrix * qt_vertNormal);");
405 vertexGenerator.
append(
" vec3 qt_world_normal = normalize(qt_instancedNormalMatrix * qt_vertNormal);");
407 vertexGenerator.
append(
" qt_varNormal = qt_world_normal;");
413 vertex() <<
" qt_vertTangent = qt_getTargetTangent(qt_vertTangent);\n";
415 vertex() <<
" if (qt_vertWeights != vec4(0.0))\n"
416 <<
" qt_vertTangent = (skinMat * vec4(qt_vertTangent, 0.0)).xyz;\n";
422 vertex() <<
" qt_varTangent = (qt_modelMatrix * vec4(qt_vertTangent, 0.0)).xyz;\n";
424 vertex() <<
" qt_varTangent = qt_vertTangent;\n";
426 vertex() <<
" qt_varTangent = (qt_instancedModelMatrix * vec4(qt_vertTangent, 0.0)).xyz;\n";
433 vertex() <<
" qt_vertBinormal = qt_getTargetBinormal(qt_vertBinormal);\n";
435 vertex() <<
" if (qt_vertWeights != vec4(0.0))\n"
436 <<
" qt_vertBinormal = (skinMat * vec4(qt_vertBinormal, 0.0)).xyz;\n";
441 vertex() <<
" qt_varBinormal = (qt_modelMatrix * vec4(qt_vertBinormal, 0.0)).xyz;\n";
443 vertex() <<
" qt_varBinormal = qt_vertBinormal;\n";
445 vertex() <<
" qt_varBinormal = (qt_instancedModelMatrix * vec4(qt_vertBinormal, 0.0)).xyz;\n";
465 fragment() <<
" qt_customMain();\n";
qsizetype indexOf(char c, qsizetype from=0) const
This is an overloaded member function, provided for convenience. It differs from the above function o...
QByteArray left(qsizetype len) const
Returns a byte array that contains the first len bytes of this byte array.
QByteArray mid(qsizetype index, qsizetype len=-1) const
Returns a byte array containing len bytes from this byte array, starting at position pos.
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
static constexpr QSSGShaderGeneratorStageFlags defaultFlags()
void beginProgram(QSSGShaderGeneratorStageFlags inEnabledStages=defaultFlags())
Combined button and popup list for selecting options.
#define QByteArrayLiteral(str)
static void insertVertexMainArgs(QByteArray &snippet)
static void insertPostProcessorArgs(QByteArray &snippet, bool usesShared)
static void insertPointLightProcessorArgs(QByteArray &snippet, bool usesShared)
static void insertAmbientLightProcessorArgs(QByteArray &snippet, bool usesShared)
static void insertProcessorArgs(QByteArray &snippet, const char *argKey, const char *(*argListFunc)(), bool usesShared=false, bool isSharedInout=false)
static const char * customMainCallWithArguments(bool usesInstancing)
static void insertFragmentMainArgs(QByteArray &snippet, bool usesShared=false)
static void insertIblProbeProcessorArgs(QByteArray &snippet, bool usesShared)
static void insertSpecularLightProcessorArgs(QByteArray &snippet, bool usesShared)
static void insertVertexInstancedMainArgs(QByteArray &snippet)
static void insertVertexMainArgs(QByteArray &snippet)
static void insertSpotLightProcessorArgs(QByteArray &snippet, bool usesShared)
static void insertDirectionalLightProcessorArgs(QByteArray &snippet, bool usesShared)
static const char * vertexMainArgumentList()
static const char * vertexInstancedMainArgumentList()
static const char * postProcessorArgumentList()
static const char * specularLightProcessorArgumentList()
static const char * ambientLightProcessorArgumentList()
static const char * iblProbeProcessorArgumentList()
static const char * spotLightProcessorArgumentList()
static const char * pointLightProcessorArgumentList()
static const char * directionalLightProcessorArgumentList()
static const char * shadedFragmentMainArgumentList()
void beginVertexGeneration(const QSSGShaderDefaultMaterialKey &inKey, const QSSGShaderFeatures &inFeatureSet, QSSGShaderLibraryManager &shaderLibraryManager)
QSSGStageGeneratorBase & vertex()
TStrTableStrMap m_interpolationParameters
QSSGShaderMaterialAdapter * materialAdapter
QSSGMaterialVertexPipeline(QSSGProgramGenerator &inProgram, const QSSGShaderDefaultMaterialKeyProperties &materialProperties, QSSGShaderMaterialAdapter *materialAdapter)
QSSGStageGeneratorBase & fragment()
void doGenerateVarTangent(const QSSGShaderDefaultMaterialKey &inKey)
void beginFragmentGeneration(QSSGShaderLibraryManager &shaderLibraryManager)
const QSSGShaderDefaultMaterialKeyProperties & defaultMaterialShaderKeyProperties
void doGenerateVarBinormal(const QSSGShaderDefaultMaterialKey &inKey)
void addInterpolationParameter(const QByteArray &inParamName, const QByteArray &inParamType)
void doGenerateWorldNormal(const QSSGShaderDefaultMaterialKey &inKey)
bool skipCustomFragmentSnippet
QSSGStageGeneratorBase & activeStage()
void endFragmentGeneration()
bool hasAttributeInKey(QSSGShaderKeyVertexAttribute::VertexAttributeBits inAttr, const QSSGShaderDefaultMaterialKey &inKey)
void assignOutput(const QByteArray &inVarName, const QByteArray &inVarValueExpr)
QSSGProgramGenerator * programGenerator() const
void endVertexGeneration()
QSSGShaderKeyBoolean m_usesInverseProjectionMatrix
QSSGShaderKeyBoolean m_usesProjectionMatrix
QSSGShaderKeyBoolean m_usesInstancing
QSSGShaderKeyBoolean m_blendParticles
QSSGShaderKeyBoolean m_overridesPosition
QSSGShaderKeyBoolean m_usesFloatJointIndices
QSSGShaderKeyUnsigned< 16 > m_boneCount
QSSGShaderKeyVertexAttribute m_vertexAttributes
QSSGShaderKeyUnsigned< 8 > m_targetCount
QSSGShaderKeyBoolean m_usesPointsTopology
constexpr bool isSet(Feature feature) const
bool getValue(QSSGDataView< quint32 > inDataStore) const
quint32 getValue(QSSGDataView< quint32 > inDataStore) const
bool getBitValue(VertexAttributeBits bit, QSSGDataView< quint32 > inKeySet) const
virtual bool isVertexColorsEnabled()=0
virtual bool usesCustomMorphing()=0
virtual bool isUnshaded()
virtual bool usesCustomSkinning()=0
virtual QByteArray customShaderSnippet(QSSGShaderCache::ShaderType type, QSSGShaderLibraryManager &shaderLibraryManager)
virtual bool hasCustomShaderFunction(QSSGShaderCache::ShaderType shaderType, const QByteArray &funcName, QSSGShaderLibraryManager &shaderLibraryManager)
virtual bool hasCustomShaderSnippet(QSSGShaderCache::ShaderType type)
virtual bool usesSharedVariables()
virtual void addUniformArray(const QByteArray &name, const QByteArray &type, quint32 size)
virtual void addUniform(const QByteArray &name, const QByteArray &type)
virtual void append(const QByteArray &data)
virtual void addOutgoing(const QByteArray &name, const QByteArray &type)
virtual void addIncoming(const QByteArray &name, const QByteArray &type)
virtual void addInclude(const QByteArray &name) final