TangentGenerateComponent.h 4.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394959697
  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. #pragma once
  9. #include <SceneAPI/SceneCore/Components/GenerationComponent.h>
  10. #include <SceneAPI/SceneCore/Containers/Scene.h>
  11. #include <SceneAPI/SceneData/Rules/TangentsRule.h>
  12. #include <AzCore/RTTI/RTTI.h>
  13. namespace AZ::SceneAPI::DataTypes { class IMeshData; }
  14. namespace AZ::SceneAPI::DataTypes { class IMeshVertexUVData; }
  15. namespace AZ::SceneAPI::DataTypes { class IMeshVertexTangentData; }
  16. namespace AZ::SceneAPI::DataTypes { class IMeshVertexBitangentData; }
  17. namespace AZ::SceneAPI::DataTypes { enum class TangentSpace; }
  18. namespace AZ::SceneData::GraphData
  19. {
  20. class BlendShapeData;
  21. }
  22. namespace AZ::SceneGenerationComponents
  23. {
  24. struct TangentGenerateContext
  25. : public AZ::SceneAPI::Events::ICallContext
  26. {
  27. AZ_RTTI(TangentGenerateContext, "{E836F8F8-5A66-497C-89CC-2D37D741CCAA}", AZ::SceneAPI::Events::ICallContext)
  28. TangentGenerateContext(AZ::SceneAPI::Containers::Scene& scene)
  29. : m_scene(scene) {}
  30. TangentGenerateContext& operator=(const TangentGenerateContext& other) = delete;
  31. AZ::SceneAPI::Containers::Scene& GetScene() { return m_scene; }
  32. const AZ::SceneAPI::Containers::Scene& GetScene() const { return m_scene; }
  33. private:
  34. AZ::SceneAPI::Containers::Scene& m_scene;
  35. };
  36. class TangentGenerateComponent
  37. : public AZ::SceneAPI::SceneCore::GenerationComponent
  38. {
  39. public:
  40. AZ_COMPONENT(TangentGenerateComponent, "{57743E6F-8718-491C-8A82-24A6763904F5}", AZ::SceneAPI::SceneCore::GenerationComponent);
  41. TangentGenerateComponent();
  42. static void Reflect(AZ::ReflectContext* context);
  43. AZ::SceneAPI::Events::ProcessingResult GenerateTangentData(TangentGenerateContext& context);
  44. private:
  45. void FindBlendShapes(
  46. AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
  47. AZStd::vector<AZ::SceneData::GraphData::BlendShapeData*>& outBlendShapes) const;
  48. bool GenerateTangentsForMesh(
  49. AZ::SceneAPI::Containers::Scene& scene,
  50. const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
  51. AZ::SceneAPI::DataTypes::IMeshData* meshData,
  52. AZ::SceneAPI::DataTypes::TangentGenerationMethod defaultGenerationMethod);
  53. bool UpdateFbxTangentWValues(
  54. AZ::SceneAPI::Containers::SceneGraph& graph,
  55. const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
  56. const AZ::SceneAPI::DataTypes::IMeshData* meshData,
  57. bool deubgBitangentFlip);
  58. const AZ::SceneAPI::SceneData::TangentsRule* GetTangentRule(const AZ::SceneAPI::Containers::Scene& scene) const;
  59. void GetRegistrySettings(
  60. AZ::SceneAPI::DataTypes::TangentGenerationMethod& defaultTangentGenrationMethod, bool& debugBitangentFlip) const;
  61. size_t CalcUvSetCount(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex) const;
  62. AZ::SceneAPI::DataTypes::IMeshVertexUVData* FindUvData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 uvSet) const;
  63. AZ::SceneAPI::DataTypes::IMeshVertexTangentData* FindTangentData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 setIndex) const;
  64. bool CreateTangentLayer(AZ::SceneAPI::Containers::SceneManifest& manifest,
  65. const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
  66. size_t numVerts,
  67. size_t uvSetIndex,
  68. AZ::SceneAPI::DataTypes::TangentGenerationMethod generationMethod,
  69. AZ::SceneAPI::Containers::SceneGraph& graph,
  70. AZ::SceneAPI::DataTypes::IMeshVertexTangentData** outTangentData);
  71. AZ::SceneAPI::DataTypes::IMeshVertexBitangentData* FindBitangentData(AZ::SceneAPI::Containers::SceneGraph& graph, const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex, AZ::u64 setIndex) const;
  72. bool CreateBitangentLayer(AZ::SceneAPI::Containers::SceneManifest& manifest,
  73. const AZ::SceneAPI::Containers::SceneGraph::NodeIndex& nodeIndex,
  74. size_t numVerts,
  75. size_t uvSetIndex,
  76. AZ::SceneAPI::DataTypes::TangentGenerationMethod generationMethod,
  77. AZ::SceneAPI::Containers::SceneGraph& graph,
  78. AZ::SceneAPI::DataTypes::IMeshVertexBitangentData** outBitangentData);
  79. };
  80. } // namespace AZ::SceneGenerationComponents