rendering: add keyword-aware shader variant selection
This commit is contained in:
@@ -95,21 +95,6 @@ bool IsTextureMaterialPropertyType(MaterialPropertyType type) {
|
||||
return type == MaterialPropertyType::Texture || type == MaterialPropertyType::Cubemap;
|
||||
}
|
||||
|
||||
Containers::String NormalizeShaderKeyword(const Containers::String& keyword) {
|
||||
const Containers::String normalized = keyword.Trim();
|
||||
if (normalized.Empty() ||
|
||||
normalized == Containers::String("_") ||
|
||||
normalized == Containers::String("__")) {
|
||||
return Containers::String();
|
||||
}
|
||||
|
||||
return normalized;
|
||||
}
|
||||
|
||||
bool CompareShaderKeywords(const Containers::String& left, const Containers::String& right) {
|
||||
return std::strcmp(left.CStr(), right.CStr()) < 0;
|
||||
}
|
||||
|
||||
MaterialPropertyType GetMaterialPropertyTypeForShaderProperty(ShaderPropertyType type) {
|
||||
switch (type) {
|
||||
case ShaderPropertyType::Float:
|
||||
@@ -439,7 +424,7 @@ Containers::String Material::GetTagValue(Core::uint32 index) const {
|
||||
}
|
||||
|
||||
void Material::EnableKeyword(const Containers::String& keyword) {
|
||||
const Containers::String normalizedKeyword = NormalizeShaderKeyword(keyword);
|
||||
const Containers::String normalizedKeyword = NormalizeShaderKeywordToken(keyword);
|
||||
if (normalizedKeyword.Empty()) {
|
||||
return;
|
||||
}
|
||||
@@ -458,12 +443,12 @@ void Material::EnableKeyword(const Containers::String& keyword) {
|
||||
std::sort(
|
||||
m_keywordSet.enabledKeywords.begin(),
|
||||
m_keywordSet.enabledKeywords.end(),
|
||||
CompareShaderKeywords);
|
||||
CompareShaderKeywordTokens);
|
||||
MarkChanged(false);
|
||||
}
|
||||
|
||||
void Material::DisableKeyword(const Containers::String& keyword) {
|
||||
const Containers::String normalizedKeyword = NormalizeShaderKeyword(keyword);
|
||||
const Containers::String normalizedKeyword = NormalizeShaderKeywordToken(keyword);
|
||||
if (normalizedKeyword.Empty()) {
|
||||
return;
|
||||
}
|
||||
@@ -477,7 +462,7 @@ void Material::DisableKeyword(const Containers::String& keyword) {
|
||||
std::sort(
|
||||
m_keywordSet.enabledKeywords.begin(),
|
||||
m_keywordSet.enabledKeywords.end(),
|
||||
CompareShaderKeywords);
|
||||
CompareShaderKeywordTokens);
|
||||
MarkChanged(false);
|
||||
return;
|
||||
}
|
||||
@@ -493,7 +478,7 @@ void Material::SetKeywordEnabled(const Containers::String& keyword, bool enabled
|
||||
}
|
||||
|
||||
bool Material::IsKeywordEnabled(const Containers::String& keyword) const {
|
||||
const Containers::String normalizedKeyword = NormalizeShaderKeyword(keyword);
|
||||
const Containers::String normalizedKeyword = NormalizeShaderKeywordToken(keyword);
|
||||
if (normalizedKeyword.Empty()) {
|
||||
return false;
|
||||
}
|
||||
@@ -1098,7 +1083,7 @@ void Material::SyncShaderSchemaKeywords(bool removeUnknownKeywords) {
|
||||
std::sort(
|
||||
m_keywordSet.enabledKeywords.begin(),
|
||||
m_keywordSet.enabledKeywords.end(),
|
||||
CompareShaderKeywords);
|
||||
CompareShaderKeywordTokens);
|
||||
}
|
||||
|
||||
void Material::MarkChanged(bool updateConstantBuffer) {
|
||||
|
||||
Reference in New Issue
Block a user