rendering: add alpha cutout integration coverage

This commit is contained in:
2026-04-06 23:09:45 +08:00
parent 620717f8b4
commit 83f316a91f
6 changed files with 506580 additions and 10 deletions

View File

@@ -1013,19 +1013,70 @@ std::vector<ShaderKeywordSet> BuildShaderKeywordVariantSets(
Containers::String BuildKeywordVariantSource(
const Containers::String& baseSource,
const ShaderKeywordSet& requiredKeywords) {
Containers::String variantSource;
if (requiredKeywords.enabledKeywords.Empty()) {
return baseSource;
}
std::string defineBlock;
for (const Containers::String& keyword : requiredKeywords.enabledKeywords) {
variantSource += "#define ";
variantSource += keyword;
variantSource += " 1\n";
defineBlock += "#define ";
defineBlock += ToStdString(keyword);
defineBlock += " 1\n";
}
if (!variantSource.Empty() && !baseSource.Empty()) {
variantSource += '\n';
if (baseSource.Empty()) {
return Containers::String(defineBlock.c_str());
}
variantSource += baseSource;
return variantSource;
const std::string sourceText = ToStdString(baseSource);
size_t lineStart = 0;
while (lineStart < sourceText.size()) {
const size_t lineEnd = sourceText.find_first_of("\r\n", lineStart);
const size_t lineLength =
lineEnd == std::string::npos ? sourceText.size() - lineStart : lineEnd - lineStart;
const std::string line = sourceText.substr(lineStart, lineLength);
const std::string trimmedLine = TrimCopy(line);
if (trimmedLine.empty() ||
trimmedLine.rfind("//", 0) == 0u ||
trimmedLine.rfind("/*", 0) == 0u ||
trimmedLine.rfind("*", 0) == 0u) {
if (lineEnd == std::string::npos) {
break;
}
lineStart = lineEnd + 1u;
if (sourceText[lineEnd] == '\r' &&
lineStart < sourceText.size() &&
sourceText[lineStart] == '\n') {
++lineStart;
}
continue;
}
if (trimmedLine.rfind("#version", 0) != 0u) {
break;
}
size_t insertionPos = lineEnd == std::string::npos ? sourceText.size() : lineEnd + 1u;
if (lineEnd != std::string::npos &&
sourceText[lineEnd] == '\r' &&
insertionPos < sourceText.size() &&
sourceText[insertionPos] == '\n') {
++insertionPos;
}
std::string variantSource = sourceText.substr(0, insertionPos);
variantSource += defineBlock;
variantSource += sourceText.substr(insertionPos);
return Containers::String(variantSource.c_str());
}
std::string variantSource = defineBlock;
variantSource += '\n';
variantSource += sourceText;
return Containers::String(variantSource.c_str());
}
bool TryParseShaderKeywordDeclarationPragma(