TangentsRule.cpp 4.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  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 <AzCore/RTTI/ReflectContext.h>
  9. #include <AzCore/Memory/SystemAllocator.h>
  10. #include <AzCore/Serialization/SerializeContext.h>
  11. #include <AzCore/Serialization/EditContext.h>
  12. #include <SceneAPI/SceneData/Rules/TangentsRule.h>
  13. #include <SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexUVData.h>
  14. #include <SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexTangentData.h>
  15. #include <SceneAPI/SceneCore/DataTypes/GraphData/IMeshVertexBitangentData.h>
  16. #include <SceneAPI/SceneCore/Containers/SceneGraph.h>
  17. #include <SceneAPI/SceneCore/Containers/Views/SceneGraphChildIterator.h>
  18. #include <SceneAPI/SceneCore/Containers/Views/PairIterator.h>
  19. namespace AZ
  20. {
  21. namespace SceneAPI
  22. {
  23. namespace SceneData
  24. {
  25. TangentsRule::TangentsRule()
  26. : DataTypes::IRule()
  27. {
  28. }
  29. AZ::SceneAPI::DataTypes::TangentGenerationMethod TangentsRule::GetGenerationMethod() const
  30. {
  31. return m_generationMethod;
  32. }
  33. AZ::SceneAPI::DataTypes::MikkTSpaceMethod TangentsRule::GetMikkTSpaceMethod() const
  34. {
  35. return m_tSpaceMethod;
  36. }
  37. AZ::Crc32 TangentsRule::GetSpaceMethodVisibility() const
  38. {
  39. return (m_generationMethod == AZ::SceneAPI::DataTypes::TangentGenerationMethod::MikkT) ? AZ::Edit::PropertyVisibility::Show : AZ::Edit::PropertyVisibility::Hide;
  40. }
  41. void TangentsRule::Reflect(AZ::ReflectContext* context)
  42. {
  43. AZ::SerializeContext* serializeContext = azrtti_cast<AZ::SerializeContext*>(context);
  44. if (!serializeContext)
  45. {
  46. return;
  47. }
  48. serializeContext->Class<TangentsRule, DataTypes::IRule>()->Version(4)
  49. ->Field("tangentSpace", &TangentsRule::m_generationMethod)
  50. ->Field("tSpaceMethod", &TangentsRule::m_tSpaceMethod);
  51. AZ::EditContext* editContext = serializeContext->GetEditContext();
  52. if (editContext)
  53. {
  54. editContext->Class<TangentsRule>("Tangents", "Specify how tangents are imported or generated.")
  55. ->ClassElement(Edit::ClassElements::EditorData, "")
  56. ->Attribute("AutoExpand", true)
  57. ->Attribute(AZ::Edit::Attributes::NameLabelOverride, "")
  58. ->DataElement(AZ::Edit::UIHandlers::ComboBox, &AZ::SceneAPI::SceneData::TangentsRule::m_generationMethod, "Generation Method", "Specify the tangent generation method. Choose 'From Source Scene' to extract the tangents and bitangents directly from the source scene file. When there is no tangents rule or the source scene has no tangents stored inside it, the 'MikkT' option will be used.")
  59. ->EnumAttribute(AZ::SceneAPI::DataTypes::TangentGenerationMethod::FromSourceScene, "From Source Scene")
  60. ->EnumAttribute(AZ::SceneAPI::DataTypes::TangentGenerationMethod::MikkT, "MikkT")
  61. ->Attribute(AZ::Edit::Attributes::ChangeNotify, AZ::Edit::PropertyRefreshLevels::EntireTree)
  62. ->DataElement(AZ::Edit::UIHandlers::ComboBox, &AZ::SceneAPI::SceneData::TangentsRule::m_tSpaceMethod, "TSpace Method",
  63. "TSpace generates the tangents and bitangents with their true magnitudes which can be used for relief mapping effects. "
  64. " It calculates the 'real' bitangent which may not be perpendicular to the tangent. "
  65. "However, both, the tangent and bitangent are perpendicular to the vertex normal. "
  66. "TSpaceBasic calculates unit vector tangents and bitangents at pixel/vertex level which are sufficient for basic normal mapping.")
  67. ->EnumAttribute(AZ::SceneAPI::DataTypes::MikkTSpaceMethod::TSpace, "TSpace")
  68. ->EnumAttribute(AZ::SceneAPI::DataTypes::MikkTSpaceMethod::TSpaceBasic, "TSpaceBasic")
  69. ->Attribute(AZ::Edit::Attributes::Visibility, &TangentsRule::GetSpaceMethodVisibility);
  70. ;
  71. }
  72. }
  73. } // SceneData
  74. } // SceneAPI
  75. } // AZ