rendering: strip redundant builtin material pass hints
This commit is contained in:
@@ -45,6 +45,23 @@ inline bool IsObjectIdPassName(const Containers::String& value) {
|
||||
normalized == Containers::String("editorobjectid");
|
||||
}
|
||||
|
||||
inline bool IsSkyboxPassName(const Containers::String& value) {
|
||||
const Containers::String normalized = NormalizeBuiltinPassMetadataValue(value);
|
||||
return normalized == Containers::String("skybox");
|
||||
}
|
||||
|
||||
inline bool IsPostProcessPassName(const Containers::String& value) {
|
||||
const Containers::String normalized = NormalizeBuiltinPassMetadataValue(value);
|
||||
return normalized == Containers::String("postprocess") ||
|
||||
normalized == Containers::String("colorscale");
|
||||
}
|
||||
|
||||
inline bool IsFinalColorPassName(const Containers::String& value) {
|
||||
const Containers::String normalized = NormalizeBuiltinPassMetadataValue(value);
|
||||
return normalized == Containers::String("finaloutput") ||
|
||||
normalized == Containers::String("finalcolor");
|
||||
}
|
||||
|
||||
inline bool MatchesBuiltinPassName(
|
||||
const Containers::String& value,
|
||||
BuiltinMaterialPass pass) {
|
||||
@@ -59,11 +76,61 @@ inline bool MatchesBuiltinPassName(
|
||||
return IsShadowCasterPassName(value);
|
||||
case BuiltinMaterialPass::ObjectId:
|
||||
return IsObjectIdPassName(value);
|
||||
case BuiltinMaterialPass::Skybox:
|
||||
return IsSkyboxPassName(value);
|
||||
case BuiltinMaterialPass::PostProcess:
|
||||
return IsPostProcessPassName(value);
|
||||
case BuiltinMaterialPass::FinalColor:
|
||||
return IsFinalColorPassName(value);
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
inline bool TryResolveBuiltinMaterialPassHint(
|
||||
const Containers::String& value,
|
||||
BuiltinMaterialPass& outPass) {
|
||||
const Containers::String normalized = NormalizeBuiltinPassMetadataValue(value);
|
||||
if (normalized.Empty()) {
|
||||
return false;
|
||||
}
|
||||
|
||||
if (IsForwardPassName(normalized)) {
|
||||
outPass = BuiltinMaterialPass::ForwardLit;
|
||||
return true;
|
||||
}
|
||||
if (IsUnlitPassName(normalized)) {
|
||||
outPass = BuiltinMaterialPass::Unlit;
|
||||
return true;
|
||||
}
|
||||
if (IsDepthOnlyPassName(normalized)) {
|
||||
outPass = BuiltinMaterialPass::DepthOnly;
|
||||
return true;
|
||||
}
|
||||
if (IsShadowCasterPassName(normalized)) {
|
||||
outPass = BuiltinMaterialPass::ShadowCaster;
|
||||
return true;
|
||||
}
|
||||
if (IsObjectIdPassName(normalized)) {
|
||||
outPass = BuiltinMaterialPass::ObjectId;
|
||||
return true;
|
||||
}
|
||||
if (IsSkyboxPassName(normalized)) {
|
||||
outPass = BuiltinMaterialPass::Skybox;
|
||||
return true;
|
||||
}
|
||||
if (IsPostProcessPassName(normalized)) {
|
||||
outPass = BuiltinMaterialPass::PostProcess;
|
||||
return true;
|
||||
}
|
||||
if (IsFinalColorPassName(normalized)) {
|
||||
outPass = BuiltinMaterialPass::FinalColor;
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
inline bool ShaderPassHasExplicitBuiltinMetadata(const Resources::ShaderPass& shaderPass) {
|
||||
if (!shaderPass.name.Empty() &&
|
||||
shaderPass.name != Containers::String("Default")) {
|
||||
@@ -116,6 +183,27 @@ inline bool ShaderPassMatchesBuiltinPass(
|
||||
return hasMetadata;
|
||||
}
|
||||
|
||||
inline bool IsRedundantLegacyMaterialShaderPassHint(
|
||||
const Resources::Shader* shader,
|
||||
const Containers::String& shaderPass) {
|
||||
if (shader == nullptr) {
|
||||
return false;
|
||||
}
|
||||
|
||||
BuiltinMaterialPass builtinPass = BuiltinMaterialPass::ForwardLit;
|
||||
if (!TryResolveBuiltinMaterialPassHint(shaderPass, builtinPass)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
for (const Resources::ShaderPass& pass : shader->GetPasses()) {
|
||||
if (ShaderPassMatchesBuiltinPass(pass, builtinPass)) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
inline BuiltinPassResourceSemantic ResolveBuiltinPassResourceSemantic(
|
||||
const Resources::ShaderResourceBindingDesc& binding) {
|
||||
Containers::String semantic = NormalizeBuiltinPassMetadataValue(binding.semantic);
|
||||
@@ -143,11 +231,34 @@ inline BuiltinPassResourceSemantic ResolveBuiltinPassResourceSemantic(
|
||||
return BuiltinPassResourceSemantic::ShadowReceiver;
|
||||
}
|
||||
|
||||
if (semantic == Containers::String("environment") ||
|
||||
semantic == Containers::String("environmentconstants")) {
|
||||
return BuiltinPassResourceSemantic::Environment;
|
||||
}
|
||||
|
||||
if (semantic == Containers::String("passconstants") ||
|
||||
semantic == Containers::String("finalcolorconstants") ||
|
||||
semantic == Containers::String("postprocessconstants")) {
|
||||
return BuiltinPassResourceSemantic::PassConstants;
|
||||
}
|
||||
|
||||
if (semantic == Containers::String("basecolortexture") ||
|
||||
semantic == Containers::String("maintex")) {
|
||||
return BuiltinPassResourceSemantic::BaseColorTexture;
|
||||
}
|
||||
|
||||
if (semantic == Containers::String("sourcecolortexture")) {
|
||||
return BuiltinPassResourceSemantic::SourceColorTexture;
|
||||
}
|
||||
|
||||
if (semantic == Containers::String("skyboxpanoramictexture")) {
|
||||
return BuiltinPassResourceSemantic::SkyboxPanoramicTexture;
|
||||
}
|
||||
|
||||
if (semantic == Containers::String("skyboxtexture")) {
|
||||
return BuiltinPassResourceSemantic::SkyboxTexture;
|
||||
}
|
||||
|
||||
if (semantic == Containers::String("shadowmaptexture") ||
|
||||
semantic == Containers::String("shadowmap")) {
|
||||
return BuiltinPassResourceSemantic::ShadowMapTexture;
|
||||
@@ -175,8 +286,18 @@ inline const char* BuiltinPassResourceSemanticToString(BuiltinPassResourceSemant
|
||||
return "Lighting";
|
||||
case BuiltinPassResourceSemantic::ShadowReceiver:
|
||||
return "ShadowReceiver";
|
||||
case BuiltinPassResourceSemantic::Environment:
|
||||
return "Environment";
|
||||
case BuiltinPassResourceSemantic::PassConstants:
|
||||
return "PassConstants";
|
||||
case BuiltinPassResourceSemantic::BaseColorTexture:
|
||||
return "BaseColorTexture";
|
||||
case BuiltinPassResourceSemantic::SourceColorTexture:
|
||||
return "SourceColorTexture";
|
||||
case BuiltinPassResourceSemantic::SkyboxPanoramicTexture:
|
||||
return "SkyboxPanoramicTexture";
|
||||
case BuiltinPassResourceSemantic::SkyboxTexture:
|
||||
return "SkyboxTexture";
|
||||
case BuiltinPassResourceSemantic::ShadowMapTexture:
|
||||
return "ShadowMapTexture";
|
||||
case BuiltinPassResourceSemantic::LinearClampSampler:
|
||||
@@ -238,11 +359,16 @@ inline bool IsBuiltinPassResourceTypeCompatible(
|
||||
case BuiltinPassResourceSemantic::Material:
|
||||
case BuiltinPassResourceSemantic::Lighting:
|
||||
case BuiltinPassResourceSemantic::ShadowReceiver:
|
||||
case BuiltinPassResourceSemantic::Environment:
|
||||
case BuiltinPassResourceSemantic::PassConstants:
|
||||
return type == Resources::ShaderResourceType::ConstantBuffer;
|
||||
case BuiltinPassResourceSemantic::BaseColorTexture:
|
||||
case BuiltinPassResourceSemantic::SourceColorTexture:
|
||||
case BuiltinPassResourceSemantic::SkyboxPanoramicTexture:
|
||||
case BuiltinPassResourceSemantic::ShadowMapTexture:
|
||||
return type == Resources::ShaderResourceType::Texture2D ||
|
||||
type == Resources::ShaderResourceType::TextureCube;
|
||||
return type == Resources::ShaderResourceType::Texture2D;
|
||||
case BuiltinPassResourceSemantic::SkyboxTexture:
|
||||
return type == Resources::ShaderResourceType::TextureCube;
|
||||
case BuiltinPassResourceSemantic::LinearClampSampler:
|
||||
case BuiltinPassResourceSemantic::ShadowMapSampler:
|
||||
return type == Resources::ShaderResourceType::Sampler;
|
||||
|
||||
Reference in New Issue
Block a user