Transform2DFunctorSourceData.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  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 "./Transform2DFunctorSourceData.h"
  9. #include <Atom/RHI.Reflect/ShaderResourceGroupLayout.h>
  10. #include <Atom/RPI.Reflect/Material/MaterialNameContext.h>
  11. #include <AzCore/Serialization/SerializeContext.h>
  12. namespace AZ
  13. {
  14. namespace Render
  15. {
  16. void Transform2DFunctorSourceData::Reflect(AZ::ReflectContext* context)
  17. {
  18. if (auto* serializeContext = azrtti_cast<SerializeContext*>(context))
  19. {
  20. serializeContext->Class<Transform2DFunctorSourceData>()
  21. ->Version(3)
  22. ->Field("transformOrder", &Transform2DFunctorSourceData::m_transformOrder)
  23. ->Field("centerProperty", &Transform2DFunctorSourceData::m_center)
  24. ->Field("scaleProperty", &Transform2DFunctorSourceData::m_scale)
  25. ->Field("scaleXProperty", &Transform2DFunctorSourceData::m_scaleX)
  26. ->Field("scaleYProperty", &Transform2DFunctorSourceData::m_scaleY)
  27. ->Field("translateXProperty", &Transform2DFunctorSourceData::m_translateX)
  28. ->Field("translateYProperty", &Transform2DFunctorSourceData::m_translateY)
  29. ->Field("rotateDegreesProperty", &Transform2DFunctorSourceData::m_rotateDegrees)
  30. ->Field("float3x3ShaderInput", &Transform2DFunctorSourceData::m_transformMatrix)
  31. ->Field("float3x3InverseShaderInput", &Transform2DFunctorSourceData::m_transformMatrixInverse)
  32. ;
  33. }
  34. }
  35. RPI::MaterialFunctorSourceData::FunctorResult Transform2DFunctorSourceData::CreateFunctor(const RuntimeContext& context) const
  36. {
  37. using namespace RPI;
  38. RPI::Ptr<Transform2DFunctor> functor = aznew Transform2DFunctor;
  39. functor->m_center = context.FindMaterialPropertyIndex(Name{ m_center });
  40. functor->m_scale = context.FindMaterialPropertyIndex(Name{ m_scale });
  41. functor->m_scaleX = context.FindMaterialPropertyIndex(Name{ m_scaleX });
  42. functor->m_scaleY = context.FindMaterialPropertyIndex(Name{ m_scaleY });
  43. functor->m_translateX = context.FindMaterialPropertyIndex(Name{ m_translateX });
  44. functor->m_translateY = context.FindMaterialPropertyIndex(Name{ m_translateY });
  45. functor->m_rotateDegrees = context.FindMaterialPropertyIndex(Name{ m_rotateDegrees });
  46. if (functor->m_center.IsNull() || functor->m_scale.IsNull() || functor->m_scaleX.IsNull() || functor->m_scaleY.IsNull() ||
  47. functor->m_translateX.IsNull() || functor->m_translateY.IsNull() || functor->m_rotateDegrees.IsNull())
  48. {
  49. return Failure();
  50. }
  51. AddMaterialPropertyDependency(functor, functor->m_center);
  52. AddMaterialPropertyDependency(functor, functor->m_scale);
  53. AddMaterialPropertyDependency(functor, functor->m_scaleX);
  54. AddMaterialPropertyDependency(functor, functor->m_scaleY);
  55. AddMaterialPropertyDependency(functor, functor->m_translateX);
  56. AddMaterialPropertyDependency(functor, functor->m_translateY);
  57. AddMaterialPropertyDependency(functor, functor->m_rotateDegrees);
  58. functor->m_transformMatrix = context.FindShaderInputConstantIndex(Name{m_transformMatrix});
  59. if (functor->m_transformMatrix.IsNull())
  60. {
  61. AZ_Error("MaterialFunctorSourceData", false, "Could not find shader input '%s'", context.GetNameContext()->GetContextualizedProperty(m_transformMatrix).c_str());
  62. return Failure();
  63. }
  64. // There are some cases where the matrix is required but the inverse is not, so the SRG only has the regular matrix.
  65. // In that case, the.materialtype file will not provide the name of an inverse matrix because it doesn't have one.
  66. if (!m_transformMatrixInverse.empty())
  67. {
  68. functor->m_transformMatrixInverse = context.FindShaderInputConstantIndex(Name{m_transformMatrixInverse});
  69. if (functor->m_transformMatrixInverse.IsNull())
  70. {
  71. // There are cases where the same functor definition is used for multiple shaders where some have an inverse matrix and some do not.
  72. // So this is just a warning, not an error, to allow re-use of that functor definition.
  73. AZ_Warning("MaterialFunctorSourceData", false, "Could not find shader input '%s'", context.GetNameContext()->GetContextualizedProperty(m_transformMatrixInverse).c_str());
  74. }
  75. }
  76. functor->m_transformOrder = m_transformOrder;
  77. AZStd::set<TransformType> transformSet{m_transformOrder.begin(), m_transformOrder.end()};
  78. if (m_transformOrder.size() != transformSet.size())
  79. {
  80. AZ_Warning("Transform2DFunctor", false, "transformOrder field contains duplicate entries");
  81. }
  82. if (transformSet.find(TransformType::Invalid) != transformSet.end())
  83. {
  84. AZ_Warning("Transform2DFunctor", false, "transformOrder contains invalid entries");
  85. }
  86. return Success(RPI::Ptr<MaterialFunctor>(functor));
  87. }
  88. }
  89. }