ImportContexts.h 7.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  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 "ImportContextProvider.h"
  10. #include <AzCore/RTTI/RTTI.h>
  11. #include <AzCore/std/string/string.h>
  12. #include <SceneAPI/SceneCore/Containers/Scene.h>
  13. #include <SceneAPI/SceneCore/Containers/SceneGraph.h>
  14. #include <SceneAPI/SceneCore/Events/CallProcessorBus.h>
  15. namespace AZ
  16. {
  17. namespace SceneAPI
  18. {
  19. namespace Containers
  20. {
  21. class Scene;
  22. }
  23. namespace DataTypes
  24. {
  25. class IGraphObject;
  26. }
  27. namespace Events
  28. {
  29. class ImportEventContext;
  30. }
  31. namespace SceneBuilder
  32. {
  33. struct ImportContextProvider;
  34. class RenamedNodesMap;
  35. //! ImportContext
  36. //! Base structure containing common data needed for all import contexts
  37. struct ImportContext
  38. : public Events::ICallContext
  39. {
  40. AZ_RTTI(ImportContext, "{68E546D5-9B79-4293-AD37-4A4BA688892F}", Events::ICallContext);
  41. ImportContext(Containers::Scene& scene, Containers::SceneGraph::NodeIndex currentGraphPosition,
  42. RenamedNodesMap& nodeNameMap);
  43. ImportContext(Containers::Scene& scene, RenamedNodesMap& nodeNameMap);
  44. Containers::Scene& m_scene;
  45. Containers::SceneGraph::NodeIndex m_currentGraphPosition;
  46. RenamedNodesMap& m_nodeNameMap; // Map of the nodes that have received a new name.
  47. ImportContextProvider* m_contextProvider; // The provider that created this context.
  48. };
  49. //! NodeEncounteredContext
  50. //! Context pushed to indicate that a new Node has been found and any
  51. //! importers that have means to process the contained data should do so
  52. //! Member Variables:
  53. //! m_createdData - out container that importers must add their created data
  54. //! to.
  55. struct NodeEncounteredContext
  56. : public ImportContext
  57. {
  58. AZ_RTTI(NodeEncounteredContext, "{40C31D76-7101-4ACD-8849-0D6D0AF62855}", ImportContext);
  59. NodeEncounteredContext(Containers::Scene& scene,
  60. Containers::SceneGraph::NodeIndex currentGraphPosition,
  61. RenamedNodesMap& nodeNameMap);
  62. NodeEncounteredContext(Events::ImportEventContext& parent,
  63. Containers::SceneGraph::NodeIndex currentGraphPosition,
  64. RenamedNodesMap& nodeNameMap);
  65. AZStd::vector<AZStd::shared_ptr<DataTypes::IGraphObject>> m_createdData;
  66. };
  67. //! SceneDataPopulatedContextBase
  68. //! Context pushed to indicate that a piece of scene data has been fully
  69. //! processed and any importers that wish to place it within the scene graph
  70. //! may now do so.
  71. //! Member Variables:
  72. //! m_graphData - the piece of data that should be inserted in the graph
  73. //! m_dataName - the name that should be used as the basis for the scene node
  74. //! name
  75. struct SceneDataPopulatedContextBase
  76. : public ImportContext
  77. {
  78. AZ_RTTI(SceneDataPopulatedContextBase, "{5F4CE8D2-EEAC-49F7-8065-0B6372162D6F}", ImportContext);
  79. SceneDataPopulatedContextBase(NodeEncounteredContext& parent,
  80. AZStd::shared_ptr<DataTypes::IGraphObject> nodeData,
  81. const AZStd::string& dataName);
  82. SceneDataPopulatedContextBase(Containers::Scene& scene,
  83. Containers::SceneGraph::NodeIndex currentGraphPosition,
  84. RenamedNodesMap& nodeNameMap,
  85. AZStd::shared_ptr<DataTypes::IGraphObject> nodeData, const AZStd::string& dataName);
  86. AZStd::shared_ptr<DataTypes::IGraphObject> m_graphData;
  87. const AZStd::string m_dataName;
  88. };
  89. //! SceneNodeAppendedContextBase
  90. //! Context pushed to indicate that data has been added to the scene graph.
  91. //! Generally created due to the insertion of a node during SceneDataPopulatedContextBase
  92. //! processing.
  93. struct SceneNodeAppendedContextBase
  94. : public ImportContext
  95. {
  96. AZ_RTTI(SceneNodeAppendedContextBase, "{0A69FB6C-2B1B-46E7-AEC3-C4B8ABBFDD69}", ImportContext);
  97. SceneNodeAppendedContextBase(SceneDataPopulatedContextBase& parent, Containers::SceneGraph::NodeIndex newIndex);
  98. SceneNodeAppendedContextBase(Containers::Scene& scene,
  99. Containers::SceneGraph::NodeIndex currentGraphPosition, RenamedNodesMap& nodeNameMap);
  100. };
  101. //! SceneAttributeDataPopulatedContextBase
  102. //! Context pushed to indicate that attribute data has been found and processed
  103. struct SceneAttributeDataPopulatedContextBase
  104. : public ImportContext
  105. {
  106. AZ_RTTI(SceneAttributeDataPopulatedContextBase, "{DA133E14-0770-435B-9A4E-38679367F56C}", ImportContext);
  107. SceneAttributeDataPopulatedContextBase(SceneNodeAppendedContextBase& parent,
  108. AZStd::shared_ptr<DataTypes::IGraphObject> nodeData,
  109. const Containers::SceneGraph::NodeIndex attributeNodeIndex, const AZStd::string& dataName);
  110. AZStd::shared_ptr<DataTypes::IGraphObject> m_graphData;
  111. const AZStd::string m_dataName;
  112. };
  113. //! SceneAttributeNodeAppendedContextBase
  114. //! Context pushed to indicate that an attribute node has been added to the scene graph
  115. struct SceneAttributeNodeAppendedContextBase
  116. : public ImportContext
  117. {
  118. AZ_RTTI(SceneAttributeNodeAppendedContextBase, "{8A382A1E-CFE7-47D2-BA5B-CFDF1FB9F03D}", ImportContext);
  119. SceneAttributeNodeAppendedContextBase(SceneAttributeDataPopulatedContextBase& parent,
  120. Containers::SceneGraph::NodeIndex newIndex);
  121. };
  122. //! SceneNodeAddedAttributesContextBase
  123. //! Context pushed to indicate that all attribute processors have completed their
  124. //! work for a specific data node.
  125. struct SceneNodeAddedAttributesContextBase
  126. : public ImportContext
  127. {
  128. AZ_RTTI(SceneNodeAddedAttributesContextBase, "{65B97E48-16A0-4BBD-B364-CFDA9E3600B6}", ImportContext);
  129. SceneNodeAddedAttributesContextBase(SceneNodeAppendedContextBase& parent);
  130. };
  131. //! SceneNodeFinalizeContextBase
  132. //! Context pushed last after all other contexts for a scene node to allow any
  133. //! post-processing needed for an importer.
  134. struct SceneNodeFinalizeContextBase
  135. : public ImportContext
  136. {
  137. AZ_RTTI(SceneNodeFinalizeContextBase, "{F2C7D1BC-8065-423E-9212-241EB426A2BB}", ImportContext);
  138. SceneNodeFinalizeContextBase(SceneNodeAddedAttributesContextBase& parent);
  139. };
  140. //! FinalizeSceneContextBase
  141. //! Context pushed after the scene has been fully created. This can be used to finalize pending work
  142. //! such as resolving named links.
  143. struct FinalizeSceneContextBase
  144. : public ImportContext
  145. {
  146. AZ_RTTI(FinalizeSceneContextBase, "{91C54F51-9B4D-4C61-956C-9D530725D737}", ImportContext);
  147. FinalizeSceneContextBase(Containers::Scene& scene, RenamedNodesMap& nodeNameMap);
  148. };
  149. } // namespace SceneBuilder
  150. } // namespace SceneAPI
  151. } // namespace AZ