You cannot select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
105 lines
6.4 KiB
C++
105 lines
6.4 KiB
C++
/*
|
|
* All or portions of this file Copyright (c) Amazon.com, Inc. or its affiliates or
|
|
* its licensors.
|
|
*
|
|
* For complete copyright and license terms please see the LICENSE at the root of this
|
|
* distribution (the "License"). All use of this software is governed by the License,
|
|
* or, if provided, by the license below or the license accompanying this file. Do not
|
|
* remove or modify any license notices. This file is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
*
|
|
*/
|
|
|
|
#include "./SubsurfaceTransmissionParameterFunctorSourceData.h"
|
|
#include <Atom/RHI.Reflect/ShaderResourceGroupLayout.h>
|
|
#include <AzCore/Serialization/SerializeContext.h>
|
|
|
|
namespace AZ
|
|
{
|
|
namespace Render
|
|
{
|
|
void SubsurfaceTransmissionParameterFunctorSourceData::Reflect(AZ::ReflectContext* context)
|
|
{
|
|
if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
|
|
{
|
|
serializeContext->Class<SubsurfaceTransmissionParameterFunctorSourceData, RPI::MaterialFunctorSourceData>()
|
|
->Version(1)
|
|
->Field("mode", &SubsurfaceTransmissionParameterFunctorSourceData::m_mode)
|
|
->Field("scale", &SubsurfaceTransmissionParameterFunctorSourceData::m_scale)
|
|
->Field("power", &SubsurfaceTransmissionParameterFunctorSourceData::m_power)
|
|
->Field("distortion", &SubsurfaceTransmissionParameterFunctorSourceData::m_distortion)
|
|
->Field("attenuation", &SubsurfaceTransmissionParameterFunctorSourceData::m_attenuation)
|
|
->Field("tintColor", &SubsurfaceTransmissionParameterFunctorSourceData::m_tintColor)
|
|
->Field("thickness", &SubsurfaceTransmissionParameterFunctorSourceData::m_thickness)
|
|
->Field("enabled", &SubsurfaceTransmissionParameterFunctorSourceData::m_enabled)
|
|
->Field("scatterDistanceColor", &SubsurfaceTransmissionParameterFunctorSourceData::m_scatterDistanceColor)
|
|
->Field("scatterDistanceIntensity", &SubsurfaceTransmissionParameterFunctorSourceData::m_scatterDistanceIntensity)
|
|
->Field("scatterDistanceShaderInput", &SubsurfaceTransmissionParameterFunctorSourceData::m_scatterDistance)
|
|
->Field("parametersShaderInput", &SubsurfaceTransmissionParameterFunctorSourceData::m_transmissionParams)
|
|
->Field("tintThickenssShaderInput", &SubsurfaceTransmissionParameterFunctorSourceData::m_transmissionTintThickness);
|
|
;
|
|
}
|
|
}
|
|
|
|
RPI::MaterialFunctorSourceData::FunctorResult SubsurfaceTransmissionParameterFunctorSourceData::CreateFunctor(const RuntimeContext& context) const
|
|
{
|
|
using namespace RPI;
|
|
|
|
RPI::Ptr<SubsurfaceTransmissionParameterFunctor> functor = aznew SubsurfaceTransmissionParameterFunctor;
|
|
|
|
functor->m_mode = context.FindMaterialPropertyIndex(Name{ m_mode });
|
|
functor->m_scale = context.FindMaterialPropertyIndex(Name{ m_scale });
|
|
functor->m_power = context.FindMaterialPropertyIndex(Name{ m_power });
|
|
functor->m_distortion = context.FindMaterialPropertyIndex(Name{ m_distortion });
|
|
functor->m_attenuation = context.FindMaterialPropertyIndex(Name{ m_attenuation });
|
|
functor->m_tintColor = context.FindMaterialPropertyIndex(Name{ m_tintColor });
|
|
functor->m_thickness = context.FindMaterialPropertyIndex(Name{ m_thickness });
|
|
functor->m_enabled = context.FindMaterialPropertyIndex(Name{ m_enabled });
|
|
functor->m_scatterDistanceColor = context.FindMaterialPropertyIndex(Name{ m_scatterDistanceColor });
|
|
functor->m_scatterDistanceIntensity = context.FindMaterialPropertyIndex(Name{ m_scatterDistanceIntensity });
|
|
|
|
if (functor->m_mode.IsNull() || functor->m_scale.IsNull() || functor->m_power.IsNull() || functor->m_distortion.IsNull() ||
|
|
functor->m_tintColor.IsNull() || functor->m_thickness.IsNull() || functor->m_enabled.IsNull() || functor->m_attenuation.IsNull() || functor->m_scatterDistanceColor.IsNull() ||
|
|
functor->m_scatterDistanceIntensity.IsNull())
|
|
{
|
|
return Failure();
|
|
}
|
|
|
|
AddMaterialPropertyDependency(functor, functor->m_mode);
|
|
AddMaterialPropertyDependency(functor, functor->m_scale);
|
|
AddMaterialPropertyDependency(functor, functor->m_power);
|
|
AddMaterialPropertyDependency(functor, functor->m_distortion);
|
|
AddMaterialPropertyDependency(functor, functor->m_attenuation);
|
|
AddMaterialPropertyDependency(functor, functor->m_tintColor);
|
|
AddMaterialPropertyDependency(functor, functor->m_thickness);
|
|
AddMaterialPropertyDependency(functor, functor->m_enabled);
|
|
AddMaterialPropertyDependency(functor, functor->m_scatterDistanceColor);
|
|
AddMaterialPropertyDependency(functor, functor->m_scatterDistanceIntensity);
|
|
|
|
functor->m_scatterDistance = context.GetShaderResourceGroupLayout()->FindShaderInputConstantIndex(Name{ m_scatterDistance });
|
|
functor->m_transmissionParams = context.GetShaderResourceGroupLayout()->FindShaderInputConstantIndex(Name{ m_transmissionParams });
|
|
functor->m_transmissionTintThickness = context.GetShaderResourceGroupLayout()->FindShaderInputConstantIndex(Name{ m_transmissionTintThickness });
|
|
|
|
if (functor->m_scatterDistance.IsNull())
|
|
{
|
|
AZ_Error("ShaderCollectionFunctorSourceData", false, "Could not find shader input '%s'", m_scatterDistance.c_str());
|
|
return Failure();
|
|
}
|
|
|
|
if (functor->m_transmissionParams.IsNull())
|
|
{
|
|
AZ_Error("ShaderCollectionFunctorSourceData", false, "Could not find shader input '%s'", m_transmissionParams.c_str());
|
|
return Failure();
|
|
}
|
|
|
|
if (functor->m_transmissionTintThickness.IsNull())
|
|
{
|
|
AZ_Error("ShaderCollectionFunctorSourceData", false, "Could not find shader input '%s'", m_transmissionTintThickness.c_str());
|
|
return Failure();
|
|
}
|
|
|
|
return Success(RPI::Ptr<MaterialFunctor>(functor));
|
|
}
|
|
}
|
|
}
|