5#ifndef QSSG_VERTEX_PIPELINE_IMPL_H
6#define QSSG_VERTEX_PIPELINE_IMPL_H
19#include <QtQuick3DRuntimeRender/private/qssgrenderdefaultmaterialshadergenerator_p.h>
20#include <QtQuick3DRuntimeRender/private/qssgrendershaderkeys_p.h>
22#include <QtCore/QSharedPointer>
106 Q_ASSERT(inUVSet == 0 || inUVSet == 1);
112 vertex().
append(
" qt_vertUV0 = qt_getTargetTex0(qt_vertUV0);");
113 vertex() <<
" qt_varTexCoord0 = qt_vertUV0;\n";
114 fragment() <<
" vec2 qt_texCoord0 = qt_varTexCoord0;\n";
116 vertex() <<
" vec2 qt_varTexCoord0 = vec2(0.0);\n";
117 fragment() <<
" vec2 qt_texCoord0 = vec2(0.0);\n";
119 }
else if (inUVSet == 1) {
123 vertex().
append(
" qt_vertUV1 = qt_getTargetTex0(qt_vertUV1);");
124 vertex() <<
" qt_varTexCoord1 = qt_vertUV1;\n";
125 fragment() <<
" vec2 qt_texCoord1 = qt_varTexCoord1;\n";
127 vertex() <<
" vec2 qt_varTexCoord1 = vec2(0.0);\n";
128 fragment() <<
" vec2 qt_texCoord1 = vec2(0.0);\n";
137 vertex() <<
" qt_varTexCoordLightmap = qt_vertLightmapUV;\n";
138 fragment() <<
" vec2 qt_texCoordLightmap = qt_varTexCoordLightmap;\n";
140 vertex() <<
" vec2 qt_varTexCoordLightmap = vec2(0.0);\n";
141 fragment() <<
" vec2 qt_texCoordLightmap = vec2(0.0);\n";
156 activeGenerator.addUniform(
"qt_cameraPosition",
"vec3");
157 activeGenerator.append(
" qt_var_object_to_camera = normalize( qt_local_model_world_position - qt_cameraPosition );");
159 activeGenerator.addUniformArray(
"qt_cameraPosition",
"vec3",
m_viewCount);
160 activeGenerator.append(
" qt_var_object_to_camera = normalize( qt_local_model_world_position - qt_cameraPosition[qt_viewIndex] );");
165 "normalize(qt_var_object_to_camera), qt_world_normal.xyz );");
166 fragment().
append(
" environment_map_reflection *= vec3( 0.5, 0.5, 0 );");
167 fragment().
append(
" environment_map_reflection += vec3( 0.5, 0.5, 1.0 );");
179 fragment() <<
" vec3 qt_view_vector = normalize(qt_cameraPosition - qt_varWorldPos);\n";
182 fragment() <<
" vec3 qt_view_vector = normalize(qt_cameraPosition[qt_viewIndex] - qt_varWorldPos);\n";
203 fragment().
append(
" vec3 qt_varNormal = cross(dFdx(qt_varWorldPos), qt_rhi_properties.x * dFdy(qt_varWorldPos));");
205 fragment().
append(
" vec3 qt_world_normal = normalize(qt_varNormal);");
214 vertex().
append(
" qt_varObjectNormal = qt_vertNormal;");
215 fragment().
append(
" vec3 object_normal = normalize(qt_varObjectNormal);");
228 vertex().
append(
" vec3 qt_local_model_world_position = qt_vertPosition.xyz;");
230 vertex().
append(
" vec3 qt_local_model_world_position = (qt_modelMatrix * qt_vertPosition).xyz;");
232 vertex().
append(
" vec3 qt_local_model_world_position = (qt_instancedModelMatrix * qt_vertPosition).xyz;");
235 assignOutput(
"qt_varWorldPos",
"qt_local_model_world_position");
244 vertex().
append(
" qt_varDepth = gl_Position.z / gl_Position.w;");
258 vertex().
append(
" vec4 qt_shadow_world_tmp = qt_vertPosition;");
260 vertex().
append(
" vec4 qt_shadow_world_tmp = qt_modelMatrix * qt_vertPosition;");
262 vertex().
append(
" vec4 qt_shadow_world_tmp = qt_instancedModelMatrix * qt_vertPosition;");
264 vertex().
append(
" qt_varShadowWorldPos = qt_shadow_world_tmp.xyz / qt_shadow_world_tmp.w;");
280 fragment() <<
" vec3 qt_tangent = normalize(qt_varTangent);\n";
285 fragment() <<
" vec3 qt_binormal = normalize(qt_varBinormal);\n";
288 fragment() <<
" vec3 qt_binormal = vec3(0.0);\n";
292 fragment() <<
" vec3 qt_tangent = vec3(0.0);\n"
293 <<
" vec3 qt_binormal = vec3(0.0);\n";
309 const bool vertexColorsEnabled = (vColorEnabled && meshHasColor) ||
usesInstancing || usesBlendParticles || usesVarColor;
310 const bool vertexColorsMaskEnabled = (vColorMaskEnabled && meshHasColor);
312 if (vertexColorsEnabled || vertexColorsMaskEnabled) {
315 vertex().
append(
" qt_vertColor = qt_getTargetColor(qt_vertColor);");
319 if (vertexColorsEnabled)
343 QByteArray includeName =
"func" + functionName +
".glsllib";
friend class const_iterator
void push_back(parameter_type t)
QSSGStageGeneratorBase * getStage(QSSGShaderGeneratorStage inStage)
\macro QT_RESTRICTED_CAST_FROM_ASCII
Combined button and popup list for selecting options.
typedef QByteArray(EGLAPIENTRYP PFNQGSGETDISPLAYSPROC)()
EGLOutputLayerEXT EGLint EGLAttrib value
[5]
GLenum GLuint GLintptr GLsizeiptr size
[1]
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
bool contains(const AT &t) const noexcept
void append(const QByteArray &data)
void addFlatParameter(const QByteArray &inParamName, const QByteArray &inParamType)
QFlags< GenerationFlag > GenerationFlags
bool setCode(GenerationFlag inCode)
void generateShadowWorldPosition(const QSSGShaderDefaultMaterialKey &inKey)
void beginVertexGeneration(const QSSGShaderDefaultMaterialKey &inKey, const QSSGShaderFeatures &inFeatureSet, QSSGShaderLibraryManager &shaderLibraryManager)
void addIncoming(const QByteArray &name, const QByteArray &type)
void addDefinition(const QByteArray &name, const QByteArray &value=QByteArray())
void addUniform(const QByteArray &name, const QByteArray &type)
GenerationFlags m_generationFlags
void addInclude(const QByteArray &name)
bool hasCode(GenerationFlag inCode)
QSSGStageGeneratorBase & vertex()
QSSGShaderMaterialAdapter * materialAdapter
QSSGMaterialVertexPipeline(QSSGProgramGenerator &inProgram, const QSSGShaderDefaultMaterialKeyProperties &materialProperties, QSSGShaderMaterialAdapter *materialAdapter)
void generateEnvMapReflection(const QSSGShaderDefaultMaterialKey &inKey)
void addUniformArray(const QByteArray &name, const QByteArray &type, quint32 size)
QSSGStageGeneratorBase & fragment()
void doGenerateVarTangent(const QSSGShaderDefaultMaterialKey &inKey)
void beginFragmentGeneration(QSSGShaderLibraryManager &shaderLibraryManager)
const QSSGShaderDefaultMaterialKeyProperties & defaultMaterialShaderKeyProperties
void generateVertexColor(const QSSGShaderDefaultMaterialKey &inKey)
void doGenerateVarBinormal(const QSSGShaderDefaultMaterialKey &inKey)
QSSGProgramGenerator * m_programGenerator
bool useFloatJointIndices
QList< QByteArray > m_addedFunctions
void addConstantBuffer(const QByteArray &name, const QByteArray &layout)
void addInterpolationParameter(const QByteArray &inParamName, const QByteArray &inParamType)
void doGenerateWorldNormal(const QSSGShaderDefaultMaterialKey &inKey)
bool skipCustomFragmentSnippet
~QSSGMaterialVertexPipeline()=default
void addConstantBufferParam(const QByteArray &cbName, const QByteArray ¶mName, const QByteArray &type)
QSSGStageGeneratorBase & activeStage()
void endFragmentGeneration()
void generateVarTangentAndBinormal(const QSSGShaderDefaultMaterialKey &inKey, bool &genTangent, bool &genBinormal)
QSSGShaderGeneratorStage stage() const
bool hasAttributeInKey(QSSGShaderKeyVertexAttribute::VertexAttributeBits inAttr, const QSSGShaderDefaultMaterialKey &inKey)
void assignOutput(const QByteArray &inVarName, const QByteArray &inVarValueExpr)
QSSGProgramGenerator * programGenerator() const
void generateObjectNormal()
void generateViewVector(const QSSGShaderDefaultMaterialKey &inKey)
void addOutgoing(const QByteArray &name, const QByteArray &type)
void addFunction(const QByteArray &functionName)
void generateWorldNormal(const QSSGShaderDefaultMaterialKey &inKey)
QHash< QByteArray, QByteArray > TStrTableStrMap
void generateWorldPosition(const QSSGShaderDefaultMaterialKey &inKey)
void endVertexGeneration()
void generateUVCoords(quint32 inUVSet, const QSSGShaderDefaultMaterialKey &inKey)
Generates UV coordinates in shader code.
void generateLightmapUVCoords(const QSSGShaderDefaultMaterialKey &inKey)
TStrTableStrMap::const_iterator TParamIter
QSSGStageGeneratorBase & operator<<(const QByteArray &data)
QSSGShaderKeyBoolean m_vertexColorsMaskEnabled
QSSGShaderKeyBoolean m_usesInstancing
QSSGShaderKeyBoolean m_blendParticles
QSSGShaderKeyBoolean m_usesVarColor
QSSGShaderKeyBoolean m_vertexColorsEnabled
bool getValue(QSSGDataView< quint32 > inDataStore) const
QSSGShaderGeneratorStage stage() const
virtual void addConstantBuffer(const QByteArray &name, const QByteArray &layout)
virtual void addConstantBufferParam(const QByteArray &cbName, const QByteArray ¶mName, const QByteArray &type)
virtual void addUniformArray(const QByteArray &name, const QByteArray &type, quint32 size)
virtual void addUniform(const QByteArray &name, const QByteArray &type)
virtual void addDefinition(const QByteArray &name, const QByteArray &value) final
virtual void append(const QByteArray &data)
virtual void addIncoming(const QByteArray &name, const QByteArray &type)
virtual void addInclude(const QByteArray &name) final