AssImpImportContextProvider.cpp 8.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165
  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 "AssImpImportContextProvider.h"
  9. #include <SceneAPI/SceneBuilder/ImportContexts/AssImpImportContexts.h>
  10. #include <AzCore/std/smart_ptr/make_shared.h>
  11. namespace AZ
  12. {
  13. namespace SceneAPI
  14. {
  15. namespace SceneBuilder
  16. {
  17. AssImpImportContextProvider::~AssImpImportContextProvider() = default;
  18. AZStd::shared_ptr<NodeEncounteredContext> AssImpImportContextProvider::CreateNodeEncounteredContext(
  19. Containers::Scene& scene,
  20. Containers::SceneGraph::NodeIndex currentGraphPosition,
  21. const SceneSystem& sourceSceneSystem,
  22. RenamedNodesMap& nodeNameMap,
  23. SDKScene::SceneWrapperBase& sourceScene,
  24. SDKNode::NodeWrapper& sourceNode)
  25. {
  26. // need to cast NodeWrapper
  27. auto assImpNode = azrtti_cast<AZ::AssImpSDKWrapper::AssImpNodeWrapper*>(&sourceNode);
  28. auto assImpScene = azrtti_cast<AZ::AssImpSDKWrapper::AssImpSceneWrapper*>(&sourceScene);
  29. if (!assImpNode)
  30. {
  31. // Handle error: parent is not of the expected type
  32. AZ_Error("SceneBuilder", false, "Incorrect node type. Cannot create NodeEncounteredContext");
  33. return nullptr;
  34. }
  35. if (!assImpScene)
  36. {
  37. AZ_Error("SceneBuilder", false, "Incorrect scene type. Cannot create NodeEncounteredContext");
  38. return nullptr;
  39. }
  40. auto context = AZStd::make_shared<AssImpNodeEncounteredContext>(
  41. scene, currentGraphPosition, *assImpScene, sourceSceneSystem, nodeNameMap, *assImpNode);
  42. context->m_contextProvider = this;
  43. return context;
  44. }
  45. AZStd::shared_ptr<SceneDataPopulatedContextBase> AssImpImportContextProvider::CreateSceneDataPopulatedContext(
  46. NodeEncounteredContext& parent, AZStd::shared_ptr<DataTypes::IGraphObject> graphData, const AZStd::string& dataName)
  47. {
  48. // Downcast the parent to the AssImp-specific type to access AssImpImportContext members
  49. AssImpNodeEncounteredContext* assImpParent = azrtti_cast<AssImpNodeEncounteredContext*>(&parent);
  50. if (!assImpParent)
  51. {
  52. AZ_Error("SceneBuilder", false, "Incorrect type of parent. Cannot create SceneDataPopulatedContext");
  53. return nullptr;
  54. }
  55. auto context = AZStd::make_shared<AssImpSceneDataPopulatedContext>(*assImpParent, AZStd::move(graphData), dataName);
  56. context->m_contextProvider = this;
  57. return context;
  58. }
  59. AZStd::shared_ptr<SceneNodeAppendedContextBase> AssImpImportContextProvider::CreateSceneNodeAppendedContext(
  60. SceneDataPopulatedContextBase& parent, Containers::SceneGraph::NodeIndex newIndex)
  61. {
  62. // Downcast the parent to the AssImp-specific type
  63. AssImpSceneDataPopulatedContext* assImpParent = azrtti_cast<AssImpSceneDataPopulatedContext*>(&parent);
  64. if (!assImpParent)
  65. {
  66. AZ_Error("SceneBuilder", false, "Incorrect type of parent. Cannot create SceneNodeAppendedContext");
  67. return nullptr;
  68. }
  69. auto context = AZStd::make_shared<AssImpSceneNodeAppendedContext>(*assImpParent, newIndex);
  70. context->m_contextProvider = this;
  71. return context;
  72. }
  73. AZStd::shared_ptr<SceneAttributeDataPopulatedContextBase> AssImpImportContextProvider::CreateSceneAttributeDataPopulatedContext(
  74. SceneNodeAppendedContextBase& parent,
  75. AZStd::shared_ptr<DataTypes::IGraphObject> nodeData,
  76. const Containers::SceneGraph::NodeIndex attributeNodeIndex,
  77. const AZStd::string& dataName)
  78. {
  79. // Downcast the parent to the AssImp-specific type
  80. AssImpSceneNodeAppendedContext* assImpParent = azrtti_cast<AssImpSceneNodeAppendedContext*>(&parent);
  81. if (!assImpParent)
  82. {
  83. AZ_Error("SceneBuilder", false, "Incorrect type of parent. Cannot create SceneAttributeDataPopulatedContext");
  84. return nullptr;
  85. }
  86. auto context = AZStd::make_shared<AssImpSceneAttributeDataPopulatedContext>(
  87. *assImpParent, AZStd::move(nodeData), attributeNodeIndex, dataName);
  88. context->m_contextProvider = this;
  89. return context;
  90. }
  91. AZStd::shared_ptr<SceneAttributeNodeAppendedContextBase> AssImpImportContextProvider::CreateSceneAttributeNodeAppendedContext(
  92. SceneAttributeDataPopulatedContextBase& parent, Containers::SceneGraph::NodeIndex newIndex)
  93. {
  94. // Downcast the parent to the AssImp-specific type
  95. AssImpSceneAttributeDataPopulatedContext* assImpParent = azrtti_cast<AssImpSceneAttributeDataPopulatedContext*>(&parent);
  96. if (!assImpParent)
  97. {
  98. AZ_Error("SceneBuilder", false, "Incorrect type of parent. Cannot create SceneAttributeNodeAppendedContext");
  99. return nullptr;
  100. }
  101. auto context = AZStd::make_shared<AssImpSceneAttributeNodeAppendedContext>(*assImpParent, newIndex);
  102. context->m_contextProvider = this;
  103. return context;
  104. }
  105. AZStd::shared_ptr<SceneNodeAddedAttributesContextBase> AssImpImportContextProvider::CreateSceneNodeAddedAttributesContext(
  106. SceneNodeAppendedContextBase& parent)
  107. {
  108. // Downcast the parent to the AssImp-specific type
  109. AssImpSceneNodeAppendedContext* assImpParent = azrtti_cast<AssImpSceneNodeAppendedContext*>(&parent);
  110. if (!assImpParent)
  111. {
  112. AZ_Error("SceneBuilder", false, "Incorrect type of parent. Cannot create SceneNodeAddedAttributesContext");
  113. return nullptr;
  114. }
  115. auto context = AZStd::make_shared<AssImpSceneNodeAddedAttributesContext>(*assImpParent);
  116. context->m_contextProvider = this;
  117. return context;
  118. }
  119. AZStd::shared_ptr<SceneNodeFinalizeContextBase> AssImpImportContextProvider::CreateSceneNodeFinalizeContext(
  120. SceneNodeAddedAttributesContextBase& parent)
  121. {
  122. // Downcast the parent to the AssImp-specific type
  123. AssImpSceneNodeAddedAttributesContext* assImpParent = azrtti_cast<AssImpSceneNodeAddedAttributesContext*>(&parent);
  124. if (!assImpParent)
  125. {
  126. AZ_Error("SceneBuilder", false, "Incorrect type of parent. Cannot create SceneNodeFinalizeContext");
  127. return nullptr;
  128. }
  129. auto context = AZStd::make_shared<AssImpSceneNodeFinalizeContext>(*assImpParent);
  130. context->m_contextProvider = this;
  131. return context;
  132. }
  133. AZStd::shared_ptr<FinalizeSceneContextBase> AssImpImportContextProvider::CreateFinalizeSceneContext(
  134. Containers::Scene& scene,
  135. const SceneSystem& sourceSceneSystem,
  136. SDKScene::SceneWrapperBase& sourceScene,
  137. RenamedNodesMap& nodeNameMap)
  138. {
  139. AssImpSDKWrapper::AssImpSceneWrapper* assImpScene = azrtti_cast<AssImpSDKWrapper::AssImpSceneWrapper*>(&sourceScene);
  140. if (!assImpScene)
  141. {
  142. AZ_Error("SceneBuilder", false, "Incorrect scene type. Cannot create FinalizeSceneContext");
  143. return nullptr;
  144. }
  145. auto context = AZStd::make_shared<AssImpFinalizeSceneContext>(scene, *assImpScene, sourceSceneSystem, nodeNameMap);
  146. context->m_contextProvider = this;
  147. return context;
  148. }
  149. } // namespace SceneBuilder
  150. } // namespace SceneAPI
  151. } // namespace AZ