rendering: add alpha cutout integration coverage
This commit is contained in:
@@ -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(
|
||||
|
||||
Reference in New Issue
Block a user