7#include <QtQuick3DRuntimeRender/private/qssgshadermaterialadapter_p.h>
8#include <QtQuick3DRuntimeRender/private/qssgrendercontextcore_p.h>
16 switch (materialNode.
type) {
17 case QSSGRenderGraphObject::Type::DefaultMaterial:
18 case QSSGRenderGraphObject::Type::PrincipledMaterial:
19 case QSSGRenderGraphObject::Type::SpecularGlossyMaterial:
22 case QSSGRenderGraphObject::Type::CustomMaterial:
69 : m_material(material)
75 return m_material.
type == QSSGRenderGraphObject::Type::PrincipledMaterial;
80 return m_material.
type == QSSGRenderGraphObject::Type::SpecularGlossyMaterial;
145 return m_material.
color;
155 return m_material.
ior;
259 : m_material(material)
453 return std::numeric_limits<float>::infinity();
458 return { 1.0f, 1.0f, 1.0f };
497 context.customMaterialSystem()->applyRhiShaderPropertyValues(ubufData, m_material, shaderPipeline);
511 {
"MODELVIEWPROJECTION_MATRIX",
"qt_modelViewProjection" },
512 {
"VIEWPROJECTION_MATRIX",
"qt_viewProjectionMatrix" },
513 {
"MODEL_MATRIX",
"qt_modelMatrix" },
514 {
"VIEW_MATRIX",
"qt_viewMatrix" },
515 {
"NORMAL_MATRIX",
"qt_normalMatrix"},
516 {
"BONE_TRANSFORMS",
"qt_getTexMatrix" },
517 {
"BONE_NORMAL_TRANSFORMS",
"qt_getTexMatrix" },
518 {
"PROJECTION_MATRIX",
"qt_projectionMatrix" },
519 {
"INVERSE_PROJECTION_MATRIX",
"qt_inverseProjectionMatrix" },
520 {
"CAMERA_POSITION",
"qt_cameraPosition" },
521 {
"CAMERA_DIRECTION",
"qt_cameraDirection" },
522 {
"CAMERA_PROPERTIES",
"qt_cameraProperties" },
523 {
"FRAMEBUFFER_Y_UP",
"qt_rhi_properties.x" },
524 {
"NDC_Y_UP",
"qt_rhi_properties.y" },
525 {
"NEAR_CLIP_VALUE",
"qt_rhi_properties.z" },
526 {
"IBL_MAXMIPMAP",
"qt_lightProbeProperties.y" },
527 {
"IBL_HORIZON",
"qt_lightProbeProperties.z" },
528 {
"IBL_EXPOSE",
"qt_lightProbeProperties.w" },
531 {
"POSITION",
"gl_Position" },
532 {
"FRAGCOLOR",
"fragOutput" },
533 {
"POINT_SIZE",
"gl_PointSize" },
536 {
"FRAGCOORD",
"gl_FragCoord"},
539 {
"DIRECTIONAL_LIGHT",
"qt_directionalLightProcessor" },
540 {
"POINT_LIGHT",
"qt_pointLightProcessor" },
541 {
"SPOT_LIGHT",
"qt_spotLightProcessor" },
542 {
"AMBIENT_LIGHT",
"qt_ambientLightProcessor" },
543 {
"SPECULAR_LIGHT",
"qt_specularLightProcessor" },
544 {
"MAIN",
"qt_customMain" },
545 {
"POST_PROCESS",
"qt_customPostProcessor" },
546 {
"IBL_PROBE",
"qt_iblProbeProcessor" },
549 {
"SCREEN_TEXTURE",
"qt_screenTexture" },
550 {
"SCREEN_MIP_TEXTURE",
"qt_screenTexture" },
551 {
"DEPTH_TEXTURE",
"qt_depthTexture" },
552 {
"AO_TEXTURE",
"qt_aoTexture" },
553 {
"IBL_TEXTURE",
"qt_lightProbe" },
554 {
"LIGHTMAP",
"qt_lightmap" },
560 {
"VAR_WORLD_NORMAL",
"qt_varNormal" },
561 {
"VAR_WORLD_TANGENT",
"qt_varTangent" },
562 {
"VAR_WORLD_BINORMAL",
"qt_varBinormal" },
563 {
"VAR_WORLD_POSITION",
"qt_varWorldPos" },
565 {
"VAR_COLOR",
"qt_varColor" },
568 {
"INPUT",
"qt_inputTexture" },
569 {
"INPUT_UV",
"qt_inputUV" },
570 {
"TEXTURE_UV",
"qt_textureUV" },
571 {
"INPUT_SIZE",
"qt_inputSize" },
572 {
"OUTPUT_SIZE",
"qt_outputSize" },
573 {
"FRAME",
"qt_frame_num" },
576 {
"INSTANCE_COLOR",
"qt_instanceColor"},
577 {
"INSTANCE_DATA",
"qt_instanceData"},
578 {
"INSTANCE_INDEX",
"gl_InstanceIndex"},
581 {
"MORPH_POSITION",
"qt_getTargetPositionFromTargetId"},
582 {
"MORPH_NORMAL",
"qt_getTargetNormalFromTargetId"},
583 {
"MORPH_TANGENT",
"qt_getTargetTangentFromTargetId"},
584 {
"MORPH_BINORMAL",
"qt_getTargetBinormalFromTargetId"},
585 {
"MORPH_WEIGHTS",
"qt_morphWeights"},
588 {
"SHARED_VARS",
"struct QT_SHARED_VARS"}
626 const char *identifier;
636Tokenizer::Token Tokenizer::next()
646 return Token_Comment;
647 }
else if (*
pos ==
'*') {
652 return Token_Comment;
654 return Token_Unspecified;
661 }
else if (*
pos ==
'\\') {
663 while (*
pos && (*
pos ==
' ' || *
pos ==
'\t'))
665 if (*
pos && (*
pos ==
'\n' || (*
pos ==
'\r' &&
pos[1] ==
'\n')))
671 return Token_Unspecified;
674 case ';':
return Token_SemiColon;
675 case '\0':
return Token_EOF;
676 case '{':
return Token_OpenBrace;
677 case '}':
return Token_CloseBrace;
678 case '(':
return Token_OpenParen;
679 case ')':
return Token_CloseParen;
680 case '[':
return Token_OpenBraket;
681 case ']':
return Token_CloseBraket;
688 if ((
c >=
'a' &&
c <=
'z' ) || (
c >=
'A' &&
c <=
'Z' ) ||
c ==
'_') {
689 identifier =
pos - 1;
690 while (*
pos && ((*
pos >=
'a' && *
pos <=
'z')
691 || (*
pos >=
'A' && *
pos <=
'Z')
693 || (*
pos >=
'0' && *
pos <=
'9'))) {
696 return Token_Identifier;
698 return Token_Unspecified;
719 tok.initialize(shaderCode);
732 result.prepend(
"#line 1\n");
733 const char *lastPos = shaderCode.
constData();
735 int funcFinderState = 0;
736 int useJointTexState = -1;
737 int useJointNormalTexState = -1;
739 Tokenizer::Token
t = tok.next();
740 while (
t != Tokenizer::Token_EOF) {
742 case Tokenizer::Token_Comment:
744 case Tokenizer::Token_Identifier:
752 while (
t != Tokenizer::Token_EOF) {
754 if (
t == Tokenizer::Token_Identifier) {
760 if (
t == Tokenizer::Token_SemiColon)
766 outputs.append(vtype +
" " + vname);
768 inputs.append(vtype +
" " + vname);
772 funcFinderState += 1;
773 }
else if (funcFinderState == 1) {
774 auto begin = qssg_func_injectarg_tab;
775 const auto end = qssg_func_injectarg_tab + (
sizeof(qssg_func_injectarg_tab) /
sizeof(qssg_func_injectarg_tab[0]));
777 if (foundIt !=
end) {
778 currentShadedFunc = trimmedId;
779 funcFinderState += 1;
809 if (trimmedId == subst.builtin) {
810 id.replace(subst.builtin, subst.actualName);
812 useJointTexState = 0;
815 useJointNormalTexState = 0;
830 case Tokenizer::Token_OpenParen:
832 if (funcFinderState == 2) {
834 result += currentShadedFunc;
837 if (currentShadedFunc == subst.builtin) {
838 currentShadedFunc = subst.actualName.toByteArray();
843 currentShadedFunc.
clear();
847 case Tokenizer::Token_OpenBraket:
848 if (useJointTexState == 0) {
852 }
else if (useJointNormalTexState == 0) {
854 ++useJointNormalTexState;
858 if (useJointTexState >= 0)
860 else if (useJointNormalTexState >= 0)
861 ++useJointNormalTexState;
864 case Tokenizer::Token_CloseBraket:
869 if (useJointTexState <= 0 && useJointNormalTexState <= 0) {
873 if (useJointTexState > 1) {
877 }
else if (useJointNormalTexState > 1) {
879 --useJointNormalTexState;
883 useJointTexState = -1;
884 useJointNormalTexState = -1;
898 allUniforms.
append({
"sampler2D",
"qt_screenTexture" });
900 allUniforms.
append({
"sampler2D",
"qt_depthTexture" });
902 allUniforms.
append({
"sampler2D",
"qt_aoTexture" });
904 allUniforms.
append({
"sampler2D",
"qt_lightmap" });
906 static const char *metaStart =
"#ifdef QQ3D_SHADER_META\n/*{\n \"uniforms\": [\n";
907 static const char *metaEnd =
" ]\n}*/\n#endif\n";
908 dst.append(metaStart);
910 const auto &typeAndName(allUniforms[
i]);
911 dst.append(
" { \"type\": \"" + typeAndName.first +
"\", \"name\": \"" + typeAndName.second +
"\" }");
920 for (
const QByteArray &inputTypeAndName : inputs) {
922 if (typeAndName.size() == 2)
923 allInputs.
append({ typeAndName[0].trimmed(), typeAndName[1].trimmed() });
925 if (!allInputs.isEmpty()) {
926 static const char *metaStart =
"#ifdef QQ3D_SHADER_META\n/*{\n \"inputs\": [\n";
927 static const char *metaEnd =
" ]\n}*/\n#endif\n";
928 dst.append(metaStart);
930 dst.append(
" { \"type\": \"" + allInputs[
i].
first
931 +
"\", \"name\": \"" + allInputs[
i].second
932 +
"\", \"stage\": \"" + stageStr +
"\" }");
940 StringPairList allOutputs = baseOutputs;
941 for (
const QByteArray &outputTypeAndName : outputs) {
943 if (typeAndName.size() == 2)
944 allOutputs.append({ typeAndName[0].trimmed(), typeAndName[1].
trimmed() });
946 if (!allOutputs.isEmpty()) {
947 static const char *metaStart =
"#ifdef QQ3D_SHADER_META\n/*{\n \"outputs\": [\n";
948 static const char *metaEnd =
" ]\n}*/\n#endif\n";
949 dst.append(metaStart);
951 dst.append(
" { \"type\": \"" + allOutputs[
i].
first
952 +
"\", \"name\": \"" + allOutputs[
i].second
953 +
"\", \"stage\": \"" + stageStr +
"\" }");
967 k.
reserve(std::size(qssg_var_subst_tab));
968 for (
const auto &
v : qssg_var_subst_tab)
QByteArray trimmed() const &
const char * constData() const noexcept
Returns a pointer to the const data stored in the byte array.
bool isEmpty() const noexcept
Returns true if the byte array has size 0; otherwise returns false.
void clear()
Clears the contents of the byte array and makes it null.
static QByteArray fromRawData(const char *data, qsizetype size)
Constructs a QByteArray that uses the first size bytes of the data array.
void push_back(parameter_type t)
void reserve(qsizetype size)
static bool shaderDebuggingEnabled()
QSSGCustomShaderMetaData getShaderMetaData(const QByteArray &inShaderPathKey, QSSGShaderCache::ShaderType type)
QByteArray getShaderSource(const QByteArray &inShaderPathKey, QSSGShaderCache::ShaderType type)
bool contains(const T &value) const
iterator insert(const T &value)
constexpr size_type size() const noexcept
The QVector3D class represents a vector or vertex in 3D space.
The QVector4D class represents a vector or vertex in 4D space.
Combined button and popup list for selecting options.
Q_CORE_EXPORT Q_DECL_PURE_FUNCTION QByteArrayView trimmed(QByteArrayView s) noexcept
Q_QUICK3DRUNTIMERENDER_EXPORT QList< QByteArrayView > preprocessorVars()
#define QByteArrayLiteral(str)
GLsizei const GLfloat * v
[13]
GLenum GLenum GLsizei count
GLint GLsizei GLsizei GLenum GLenum GLsizei void * data
GLenum GLenum GLenum input
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
CustomShaderPresence m_customShaderPresence
RenderFlags m_renderFlags
ShadingMode m_shadingMode
QSSGRenderImage * m_iblProbe
QByteArray m_shaderPathKey
bool m_usesSharedVariables
bool isClearcoatEnabled() const
bool isMetalnessEnabled() const
QSSGRenderDefaultMaterial::MaterialSpecularModel specularModel
bool isVertexColorsEnabled() const
QSSGRenderImage * iblProbe
bool isSpecularEnabled() const
float clearcoatRoughnessAmount
bool isTransmissionEnabled() const
float attenuationDistance
QVector3D attenuationColor
QSSGRenderDefaultMaterial::MaterialAlphaMode alphaMode
bool isSpecularGlossy() override
float translucentFallOff() override
float alphaCutOff() override
bool isUnshaded() override
bool usesCustomMorphing() override
bool hasCustomShaderSnippet(QSSGShaderCache::ShaderType type) override
float pointSize() override
QVector3D attenuationColor() override
bool isSpecularEnabled() override
float fresnelPower() override
bool usesCustomSkinning() override
bool isMetalnessEnabled() override
float transmissionFactor() override
float lineWidth() override
float diffuseLightWrap() override
bool hasCustomShaderFunction(QSSGShaderCache::ShaderType shaderType, const QByteArray &funcName, QSSGShaderLibraryManager &shaderLibraryManager) override
bool hasLighting() override
void setCustomPropertyUniforms(char *ubufData, QSSGRhiShaderPipeline &shaderPipeline, const QSSGRenderContextInterface &context) override
float occlusionAmount() override
QVector4D color() override
float thicknessFactor() override
float bumpAmount() override
bool isClearcoatEnabled() override
bool isTransmissionEnabled() override
float specularAmount() override
float clearcoatAmount() override
float specularRoughness() override
bool isPrincipled() override
float clearcoatRoughnessAmount() override
static ShaderCodeAndMetaData prepareCustomShader(QByteArray &dst, const QByteArray &shaderCode, QSSGShaderCache::ShaderType type, const StringPairList &baseUniforms, const StringPairList &baseInputs=StringPairList(), const StringPairList &baseOutputs=StringPairList())
QSSGRenderImage * iblProbe() override
QVector3D emissiveColor() override
bool isVertexColorsEnabled() override
float maxHeightSamples() override
QSSGShaderCustomMaterialAdapter(const QSSGRenderCustomMaterial &material)
bool usesSharedVariables() override
QPair< QByteArray, QSSGCustomShaderMetaData > ShaderCodeAndMetaData
QByteArray customShaderSnippet(QSSGShaderCache::ShaderType type, QSSGShaderLibraryManager &shaderLibraryManager) override
float metalnessAmount() override
float minHeightSamples() override
float heightAmount() override
float attenuationDistance() override
QSSGRenderDefaultMaterial::MaterialSpecularModel specularModel() override
QSSGRenderDefaultMaterial::MaterialAlphaMode alphaMode() override
QVector3D specularTint() override
QVector3D attenuationColor() override
float heightAmount() override
bool usesCustomMorphing() override
bool isSpecularGlossy() override
bool isSpecularEnabled() override
float maxHeightSamples() override
QVector3D emissiveColor() override
bool isMetalnessEnabled() override
QVector3D specularTint() override
float specularRoughness() override
float fresnelPower() override
float attenuationDistance() override
float clearcoatAmount() override
bool hasLighting() override
bool isVertexColorsEnabled() override
QSSGShaderDefaultMaterialAdapter(const QSSGRenderDefaultMaterial &material)
QSSGRenderDefaultMaterial::MaterialSpecularModel specularModel() override
float minHeightSamples() override
float metalnessAmount() override
bool usesCustomSkinning() override
float bumpAmount() override
float translucentFallOff() override
float occlusionAmount() override
float clearcoatRoughnessAmount() override
float transmissionFactor() override
bool isPrincipled() override
float alphaCutOff() override
QSSGRenderDefaultMaterial::MaterialAlphaMode alphaMode() override
float pointSize() override
float specularAmount() override
float diffuseLightWrap() override
QSSGRenderImage * iblProbe() override
QVector4D color() override
bool isTransmissionEnabled() override
float lineWidth() override
float thicknessFactor() override
bool isClearcoatEnabled() override
virtual ~QSSGShaderMaterialAdapter()
virtual bool isUnshaded()
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)
static QSSGShaderMaterialAdapter * create(const QSSGRenderGraphObject &materialNode)
virtual bool usesSharedVariables()
virtual void setCustomPropertyUniforms(char *ubufData, QSSGRhiShaderPipeline &shaderPipeline, const QSSGRenderContextInterface &context)