AssImpTransformImporter.cpp 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  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 <SceneAPI/SceneBuilder/Importers/AssImpTransformImporter.h>
  9. #include <AzCore/std/smart_ptr/make_shared.h>
  10. #include <AzCore/Serialization/SerializeContext.h>
  11. #include <AzToolsFramework/Debug/TraceContext.h>
  12. #include <SceneAPI/SceneBuilder/SceneSystem.h>
  13. #include <SceneAPI/SceneBuilder/Importers/ImporterUtilities.h>
  14. #include <SceneAPI/SceneBuilder/Importers/Utilities/RenamedNodesMap.h>
  15. #include <SceneAPI/SceneCore/Utilities/Reporting.h>
  16. #include <SceneAPI/SceneData/GraphData/TransformData.h>
  17. #include <SceneAPI/SDKWrapper/AssImpTypeConverter.h>
  18. #include <SceneAPI/SDKWrapper/AssImpNodeWrapper.h>
  19. #include <SceneAPI/SDKWrapper/AssImpSceneWrapper.h>
  20. #include <assimp/scene.h>
  21. #include <SceneAPI/SceneBuilder/Importers/AssImpImporterUtilities.h>
  22. namespace AZ
  23. {
  24. namespace SceneAPI
  25. {
  26. namespace SceneBuilder
  27. {
  28. const char* AssImpTransformImporter::s_transformNodeName = "transform";
  29. AssImpTransformImporter::AssImpTransformImporter()
  30. {
  31. BindToCall(&AssImpTransformImporter::ImportTransform);
  32. }
  33. void AssImpTransformImporter::Reflect(ReflectContext* context)
  34. {
  35. SerializeContext* serializeContext = azrtti_cast<SerializeContext*>(context);
  36. if (serializeContext)
  37. {
  38. serializeContext->Class<AssImpTransformImporter, SceneCore::LoadingComponent>()->Version(2);
  39. }
  40. }
  41. Events::ProcessingResult AssImpTransformImporter::ImportTransform(AssImpSceneNodeAppendedContext& context)
  42. {
  43. AZ_TraceContext("Importer", "transform");
  44. const aiNode* currentNode = context.m_sourceNode.GetAssImpNode();
  45. const aiScene* scene = context.m_sourceScene.GetAssImpScene();
  46. if (currentNode == scene->mRootNode || IsPivotNode(currentNode->mName))
  47. {
  48. return Events::ProcessingResult::Ignored;
  49. }
  50. DataTypes::MatrixType localTransform = GetLocalSpaceBindPoseTransform(scene, currentNode);
  51. context.m_sourceSceneSystem.SwapTransformForUpAxis(localTransform);
  52. context.m_sourceSceneSystem.ConvertUnit(localTransform);
  53. AZStd::shared_ptr<SceneData::GraphData::TransformData> transformData =
  54. AZStd::make_shared<SceneData::GraphData::TransformData>(localTransform);
  55. AZ_Error(SceneAPI::Utilities::ErrorWindow, transformData, "Failed to allocate transform data.");
  56. if (!transformData)
  57. {
  58. return Events::ProcessingResult::Failure;
  59. }
  60. // If it is non-endpoint data populated node, add a transform attribute
  61. if (context.m_scene.GetGraph().HasNodeContent(context.m_currentGraphPosition))
  62. {
  63. if (!context.m_scene.GetGraph().IsNodeEndPoint(context.m_currentGraphPosition))
  64. {
  65. AZStd::string nodeName = s_transformNodeName;
  66. RenamedNodesMap::SanitizeNodeName(nodeName, context.m_scene.GetGraph(), context.m_currentGraphPosition);
  67. AZ_TraceContext("Transform node name", nodeName);
  68. Containers::SceneGraph::NodeIndex newIndex =
  69. context.m_scene.GetGraph().AddChild(context.m_currentGraphPosition, nodeName.c_str());
  70. AZ_Error(SceneAPI::Utilities::ErrorWindow, newIndex.IsValid(), "Failed to create SceneGraph node for attribute.");
  71. if (!newIndex.IsValid())
  72. {
  73. return Events::ProcessingResult::Failure;
  74. }
  75. Events::ProcessingResult transformAttributeResult;
  76. AssImpSceneAttributeDataPopulatedContext dataPopulated(context, transformData, newIndex, nodeName);
  77. transformAttributeResult = Events::Process(dataPopulated);
  78. if (transformAttributeResult != Events::ProcessingResult::Failure)
  79. {
  80. transformAttributeResult = AddAttributeDataNodeWithContexts(dataPopulated);
  81. }
  82. return transformAttributeResult;
  83. }
  84. }
  85. else
  86. {
  87. bool addedData = context.m_scene.GetGraph().SetContent(context.m_currentGraphPosition, transformData);
  88. AZ_Error(SceneAPI::Utilities::ErrorWindow, addedData, "Failed to add node data");
  89. return addedData ? Events::ProcessingResult::Success : Events::ProcessingResult::Failure;
  90. }
  91. return Events::ProcessingResult::Ignored;
  92. }
  93. } // namespace SceneBuilder
  94. } // namespace SceneAPI
  95. } // namespace AZ