61 QString modifiedCode = QString::fromUtf8(shaderCode);
62 for (
auto it = AugmentMacros.constBegin(); it != AugmentMacros.constEnd(); ++it) {
63 QString pattern = QStringLiteral(
"\\b%1\\b").arg(QRegularExpression::escape(QString::fromUtf8(it.key())));
64 QRegularExpression regex(pattern);
65 modifiedCode.replace(regex, QString::fromUtf8(it.value()));
67 return modifiedCode.toUtf8();
70void QSSGRenderUserPass::finalizeShaders(
const QSSGRenderContextInterface &ctx)
74 if (materialMode != AugmentMaterial)
77 if (!isDirty(DirtyFlag::ShaderDirty))
80 clearDirty(DirtyFlag::ShaderDirty);
82 const bool hasShaderCode = (shaderAugmentation.hasUserAugmentation());
85 qCDebug(lcRenderUserPass) <<
"Finalizing shaders for user pass with augment shader code.";
88 shaderAugmentation.preamble = replaceAugmentMacros(shaderAugmentation.preamble);
89 shaderAugmentation.body = replaceAugmentMacros(shaderAugmentation.body);
93 const QByteArray fullAugmentation = shaderAugmentation.preamble + shaderAugmentation.body;
94 shaderAugmentation.hash = QCryptographicHash::hash(QByteArrayView(fullAugmentation),
95 QCryptographicHash::Algorithm::Sha1).toHex();
98 shaderAugmentation.needsBaseColor = shaderAugmentation.body.contains(AugmentMacros[
"BASE_COLOR"]);
99 shaderAugmentation.needsRoughness = shaderAugmentation.body.contains(AugmentMacros[
"ROUGHNESS"]);
100 shaderAugmentation.needsMetalness = shaderAugmentation.body.contains(AugmentMacros[
"METALNESS"]);
101 shaderAugmentation.needsDiffuseLight = shaderAugmentation.body.contains(AugmentMacros[
"DIFFUSE_LIGHT"]);
102 shaderAugmentation.needsSpecularLight = shaderAugmentation.body.contains(AugmentMacros[
"SPECULAR_LIGHT"]);
103 shaderAugmentation.needsEmissiveLight = shaderAugmentation.body.contains(AugmentMacros[
"EMISSIVE_LIGHT"]);
104 shaderAugmentation.needsWorldNormal = shaderAugmentation.body.contains(AugmentMacros[
"WORLD_NORMAL"]);
105 shaderAugmentation.needsWorldTangent = shaderAugmentation.body.contains(AugmentMacros[
"WORLD_TANGENT"]);
106 shaderAugmentation.needsWorldBinormal = shaderAugmentation.body.contains(AugmentMacros[
"WORLD_BINORMAL"]);
107 shaderAugmentation.needsF0 = shaderAugmentation.body.contains(AugmentMacros[
"F0"]);
108 shaderAugmentation.needsF90 = shaderAugmentation.body.contains(AugmentMacros[
"F90"]);
110 m_state = State::Ready;
113 m_state = State::Error;
115 qWarning() <<
"No augment shader code provided for user pass.";
119 qCDebug(lcRenderUserPass) <<
"Finalizing shaders for user pass commands";