ConvertEmissiveUnitFunctor.cpp 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687
  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 <Atom/Feature/Material/ConvertEmissiveUnitFunctor.h>
  9. #include <Atom/RPI.Public/Material/Material.h>
  10. #include <Atom/RPI.Public/Shader/ShaderResourceGroup.h>
  11. namespace AZ
  12. {
  13. namespace Render
  14. {
  15. void ConvertEmissiveUnitFunctor::Reflect(AZ::ReflectContext* context)
  16. {
  17. if (auto* serializeContext = azrtti_cast<AZ::SerializeContext*>(context))
  18. {
  19. serializeContext->Class<ConvertEmissiveUnitFunctor, AZ::RPI::MaterialFunctor>()
  20. ->Version(6)
  21. ->Field("intensityPropertyIndex", &ConvertEmissiveUnitFunctor::m_intensityPropertyIndex)
  22. ->Field("lightUnitPropertyIndex", &ConvertEmissiveUnitFunctor::m_lightUnitPropertyIndex)
  23. ->Field("shaderInputIndex", &ConvertEmissiveUnitFunctor::m_shaderInputIndex)
  24. ->Field("ev100Index", &ConvertEmissiveUnitFunctor::m_ev100Index)
  25. ->Field("nitIndex", &ConvertEmissiveUnitFunctor::m_nitIndex)
  26. ->Field("ev100Min", &ConvertEmissiveUnitFunctor::m_ev100Min)
  27. ->Field("ev100Max", &ConvertEmissiveUnitFunctor::m_ev100Max)
  28. ->Field("nitMin", &ConvertEmissiveUnitFunctor::m_nitMin)
  29. ->Field("nitMax", &ConvertEmissiveUnitFunctor::m_nitMax)
  30. ;
  31. }
  32. }
  33. void ConvertEmissiveUnitFunctor::Process(RPI::MaterialFunctorAPI::RuntimeContext& context)
  34. {
  35. // Convert unit on runtime
  36. float sourceValue = context.GetMaterialPropertyValue<float>(m_intensityPropertyIndex);
  37. uint32_t lightUnit = context.GetMaterialPropertyValue<uint32_t>(m_lightUnitPropertyIndex);
  38. float targetValue = GetProcessedValue(sourceValue, lightUnit);
  39. context.GetShaderResourceGroup()->SetConstant(m_shaderInputIndex, targetValue);
  40. }
  41. void ConvertEmissiveUnitFunctor::Process(RPI::MaterialFunctorAPI::EditorContext& context)
  42. {
  43. // Update Editor based on selected light unit
  44. uint32_t lightUnit = context.GetMaterialPropertyValue<uint32_t>(m_lightUnitPropertyIndex);
  45. if (lightUnit == m_ev100Index)
  46. {
  47. context.SetMaterialPropertyMinValue(m_intensityPropertyIndex, m_ev100Min);
  48. context.SetMaterialPropertyMaxValue(m_intensityPropertyIndex, m_ev100Max);
  49. }
  50. else if (lightUnit == m_nitIndex)
  51. {
  52. context.SetMaterialPropertyMinValue(m_intensityPropertyIndex, m_nitMin);
  53. context.SetMaterialPropertyMaxValue(m_intensityPropertyIndex, m_nitMax);
  54. }
  55. else
  56. {
  57. AZ_Assert(false, "ConvertEmissiveUnitFunctor doesn't recognize light unit.")
  58. }
  59. }
  60. float ConvertEmissiveUnitFunctor::GetProcessedValue(float originalEmissiveIntensity, uint32_t lightUnitIndex) const
  61. {
  62. PhotometricUnit sourceType;
  63. if (lightUnitIndex == m_ev100Index)
  64. {
  65. sourceType = PhotometricUnit::Ev100Luminance;
  66. }
  67. else if (lightUnitIndex == m_nitIndex)
  68. {
  69. sourceType = PhotometricUnit::Nit;
  70. }
  71. else
  72. {
  73. sourceType = PhotometricUnit::Unknown;
  74. AZ_Assert(false, "ConvertEmissiveUnitFunctor doesn't recognize light unit.")
  75. }
  76. return PhotometricValue::ConvertIntensityBetweenUnits(sourceType, PhotometricUnit::Nit, originalEmissiveIntensity);
  77. }
  78. }
  79. }