Files
o3de/Gems/Atom/RPI/Code/Source/RPI.Reflect/Material/MaterialNameContext.cpp
T
santorac 2c59f1b8a4 Added support for deeply nested material property groups.
The main addition here is the MaterialNameContext class which represents the concept of a namespace for properties, shader options, and SRG fields. This concept was already somewhat supported in LuaMaterialFunctor through bespoke "prefix" fields, but I have generalized it be available for all material functors. Note that I have not yet updated the other material functor types to ensure they take advantage of this feature, that will be in another commit.

Signed-off-by: santorac <55155825+santorac@users.noreply.github.com>
2022-02-01 16:35:42 -08:00

90 lines
2.8 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#include <Atom/RPI.Reflect/Material/MaterialNameContext.h>
#include <AzCore/RTTI/ReflectContext.h>
#include <AzCore/Serialization/SerializeContext.h>
#include <AzCore/Name/Name.h>
namespace AZ
{
namespace RPI
{
void MaterialNameContext::Reflect(ReflectContext* context)
{
if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
{
serializeContext->Class<MaterialNameContext>()
->Version(1)
->Field("propertyIdContext", &MaterialNameContext::m_propertyIdContext)
->Field("srgInputNameContext", &MaterialNameContext::m_srgInputNameContext)
->Field("shaderOptionNameContext", &MaterialNameContext::m_shaderOptionNameContext)
;
}
}
bool MaterialNameContext::IsDefault() const
{
return m_propertyIdContext.empty() && m_srgInputNameContext.empty() && m_shaderOptionNameContext.empty();
}
void MaterialNameContext::ExtendPropertyIdContext(AZStd::string_view nameContext, bool insertDelimiter)
{
m_propertyIdContext += nameContext;
if (insertDelimiter && !nameContext.empty() && !nameContext.ends_with("."))
{
m_propertyIdContext += ".";
}
}
void MaterialNameContext::ExtendSrgInputContext(AZStd::string_view nameContext)
{
m_srgInputNameContext += nameContext;
}
void MaterialNameContext::ExtendShaderOptionContext(AZStd::string_view nameContext)
{
m_shaderOptionNameContext += nameContext;
}
bool MaterialNameContext::ContextualizeProperty(Name& propertyName) const
{
if (m_propertyIdContext.empty())
{
return false;
}
propertyName = m_propertyIdContext + propertyName.GetCStr();
return true;
}
bool MaterialNameContext::ContextualizeSrgInput(Name& srgInputName) const
{
if (m_srgInputNameContext.empty())
{
return false;
}
srgInputName = m_srgInputNameContext + srgInputName.GetCStr();
return true;
}
bool MaterialNameContext::ContextualizeShaderOption(Name& shaderOptionName) const
{
if (m_shaderOptionNameContext.empty())
{
return false;
}
shaderOptionName = m_shaderOptionNameContext + shaderOptionName.GetCStr();
return true;
}
} // namespace RPI
} // namespace AZ