SubsurfaceTransmissionParameterFunctorSourceData.cpp 6.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include "./SubsurfaceTransmissionParameterFunctorSourceData.h"
  9. #include <Atom/RHI.Reflect/ShaderResourceGroupLayout.h>
  10. #include <AzCore/Serialization/SerializeContext.h>
  11. namespace AZ
  12. {
  13. namespace Render
  14. {
  15. void SubsurfaceTransmissionParameterFunctorSourceData::Reflect(AZ::ReflectContext* context)
  16. {
  17. if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
  18. {
  19. serializeContext->Class<SubsurfaceTransmissionParameterFunctorSourceData, RPI::MaterialFunctorSourceData>()
  20. ->Version(2) // added shrinkFactor, transmissionNdLBias and distanceAttenuation
  21. ->Field("mode", &SubsurfaceTransmissionParameterFunctorSourceData::m_mode)
  22. ->Field("scale", &SubsurfaceTransmissionParameterFunctorSourceData::m_scale)
  23. ->Field("power", &SubsurfaceTransmissionParameterFunctorSourceData::m_power)
  24. ->Field("distortion", &SubsurfaceTransmissionParameterFunctorSourceData::m_distortion)
  25. ->Field("attenuation", &SubsurfaceTransmissionParameterFunctorSourceData::m_attenuation)
  26. ->Field("shrinkFactor", &SubsurfaceTransmissionParameterFunctorSourceData::m_shrinkFactor)
  27. ->Field("transmissionNdLBias", &SubsurfaceTransmissionParameterFunctorSourceData::m_transmissionNdLBias)
  28. ->Field("distanceAttenuation", &SubsurfaceTransmissionParameterFunctorSourceData::m_distanceAttenuation)
  29. ->Field("tintColor", &SubsurfaceTransmissionParameterFunctorSourceData::m_tintColor)
  30. ->Field("thickness", &SubsurfaceTransmissionParameterFunctorSourceData::m_thickness)
  31. ->Field("enabled", &SubsurfaceTransmissionParameterFunctorSourceData::m_enabled)
  32. ->Field("scatterDistanceColor", &SubsurfaceTransmissionParameterFunctorSourceData::m_scatterDistanceColor)
  33. ->Field("scatterDistanceIntensity", &SubsurfaceTransmissionParameterFunctorSourceData::m_scatterDistanceIntensity)
  34. ->Field("scatterDistanceShaderInput", &SubsurfaceTransmissionParameterFunctorSourceData::m_scatterDistance)
  35. ->Field("parametersShaderInput", &SubsurfaceTransmissionParameterFunctorSourceData::m_transmissionParams)
  36. ->Field("tintThickenssShaderInput", &SubsurfaceTransmissionParameterFunctorSourceData::m_transmissionTintThickness);
  37. ;
  38. }
  39. }
  40. RPI::MaterialFunctorSourceData::FunctorResult SubsurfaceTransmissionParameterFunctorSourceData::CreateFunctor(const RuntimeContext& context) const
  41. {
  42. using namespace RPI;
  43. RPI::Ptr<SubsurfaceTransmissionParameterFunctor> functor = aznew SubsurfaceTransmissionParameterFunctor;
  44. functor->m_mode = context.FindMaterialPropertyIndex(Name{ m_mode });
  45. functor->m_scale = context.FindMaterialPropertyIndex(Name{ m_scale });
  46. functor->m_power = context.FindMaterialPropertyIndex(Name{ m_power });
  47. functor->m_distortion = context.FindMaterialPropertyIndex(Name{ m_distortion });
  48. functor->m_attenuation = context.FindMaterialPropertyIndex(Name{ m_attenuation });
  49. functor->m_shrinkFactor = context.FindMaterialPropertyIndex(Name{ m_shrinkFactor });
  50. functor->m_transmissionNdLBias = context.FindMaterialPropertyIndex(Name{ m_transmissionNdLBias });
  51. functor->m_distanceAttenuation = context.FindMaterialPropertyIndex(Name{ m_distanceAttenuation });
  52. functor->m_tintColor = context.FindMaterialPropertyIndex(Name{ m_tintColor });
  53. functor->m_thickness = context.FindMaterialPropertyIndex(Name{ m_thickness });
  54. functor->m_enabled = context.FindMaterialPropertyIndex(Name{ m_enabled });
  55. functor->m_scatterDistanceColor = context.FindMaterialPropertyIndex(Name{ m_scatterDistanceColor });
  56. functor->m_scatterDistanceIntensity = context.FindMaterialPropertyIndex(Name{ m_scatterDistanceIntensity });
  57. if (functor->m_mode.IsNull() || functor->m_scale.IsNull() || functor->m_power.IsNull() || functor->m_distortion.IsNull() ||
  58. functor->m_tintColor.IsNull() || functor->m_thickness.IsNull() || functor->m_enabled.IsNull() || functor->m_attenuation.IsNull() || functor->m_scatterDistanceColor.IsNull() ||
  59. functor->m_scatterDistanceIntensity.IsNull() || functor->m_shrinkFactor.IsNull() || functor->m_transmissionNdLBias.IsNull() ||
  60. functor->m_distanceAttenuation.IsNull())
  61. {
  62. return Failure();
  63. }
  64. AddMaterialPropertyDependency(functor, functor->m_mode);
  65. AddMaterialPropertyDependency(functor, functor->m_scale);
  66. AddMaterialPropertyDependency(functor, functor->m_power);
  67. AddMaterialPropertyDependency(functor, functor->m_distortion);
  68. AddMaterialPropertyDependency(functor, functor->m_attenuation);
  69. AddMaterialPropertyDependency(functor, functor->m_shrinkFactor);
  70. AddMaterialPropertyDependency(functor, functor->m_transmissionNdLBias);
  71. AddMaterialPropertyDependency(functor, functor->m_distanceAttenuation);
  72. AddMaterialPropertyDependency(functor, functor->m_tintColor);
  73. AddMaterialPropertyDependency(functor, functor->m_thickness);
  74. AddMaterialPropertyDependency(functor, functor->m_enabled);
  75. AddMaterialPropertyDependency(functor, functor->m_scatterDistanceColor);
  76. AddMaterialPropertyDependency(functor, functor->m_scatterDistanceIntensity);
  77. functor->m_scatterDistance = RPI::MaterialShaderParameterNameIndex{ m_scatterDistance, context.GetNameContext() };
  78. functor->m_transmissionParams = RPI::MaterialShaderParameterNameIndex{ m_transmissionParams, context.GetNameContext() };
  79. functor->m_transmissionTintThickness =
  80. RPI::MaterialShaderParameterNameIndex{ m_transmissionTintThickness, context.GetNameContext() };
  81. SetFunctorShaderParameter(functor, GetMaterialShaderParameters(context.GetNameContext()));
  82. return Success(RPI::Ptr<MaterialFunctor>(functor));
  83. }
  84. }
  85. }