You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
o3de/Code/Tools/SceneAPI/SceneBuilder/ImportContexts/ImportContexts.h

181 lines
7.7 KiB
C++

/*
* Copyright (c) Contributors to the Open 3D Engine Project.
* For complete copyright and license terms please see the LICENSE at the root of this distribution.
*
* SPDX-License-Identifier: Apache-2.0 OR MIT
*
*/
#pragma once
#include <AzCore/RTTI/RTTI.h>
#include <AzCore/std/string/string.h>
#include <SceneAPI/SceneCore/Events/CallProcessorBus.h>
#include <SceneAPI/SceneCore/Containers/SceneGraph.h>
#include <SceneAPI/SceneCore/Containers/Scene.h>
namespace AZ
{
namespace SceneAPI
{
namespace Containers
{
class Scene;
}
namespace DataTypes
{
class IGraphObject;
}
namespace Events
{
class ImportEventContext;
}
namespace SceneBuilder
{
class RenamedNodesMap;
// ImportContext
// Base structure containing common data needed for all import contexts
struct ImportContext
: public Events::ICallContext
{
AZ_RTTI(ImportContext, "{68E546D5-9B79-4293-AD37-4A4BA688892F}", Events::ICallContext);
ImportContext(Containers::Scene& scene, Containers::SceneGraph::NodeIndex currentGraphPosition,
RenamedNodesMap& nodeNameMap);
ImportContext(Containers::Scene& scene, RenamedNodesMap& nodeNameMap);
Containers::Scene& m_scene;
Containers::SceneGraph::NodeIndex m_currentGraphPosition;
RenamedNodesMap& m_nodeNameMap; // Map of the nodes that have received a new name.
};
// NodeEncounteredContext
// Context pushed to indicate that a new Node has been found and any
// importers that have means to process the contained data should do so
// Member Variables:
// m_createdData - out container that importers must add their created data
// to.
struct NodeEncounteredContext
: public ImportContext
{
AZ_RTTI(NodeEncounteredContext, "{40C31D76-7101-4ACD-8849-0D6D0AF62855}", ImportContext);
NodeEncounteredContext(Containers::Scene& scene,
Containers::SceneGraph::NodeIndex currentGraphPosition,
RenamedNodesMap& nodeNameMap);
NodeEncounteredContext(Events::ImportEventContext& parent,
Containers::SceneGraph::NodeIndex currentGraphPosition,
RenamedNodesMap& nodeNameMap);
AZStd::vector<AZStd::shared_ptr<DataTypes::IGraphObject>> m_createdData;
};
// SceneDataPopulatedContextBase
// Context pushed to indicate that a piece of scene data has been fully
// processed and any importers that wish to place it within the scene graph
// may now do so.
// Member Variables:
// m_graphData - the piece of data that should be inserted in the graph
// m_dataName - the name that should be used as the basis for the scene node
// name
struct SceneDataPopulatedContextBase
: public ImportContext
{
AZ_RTTI(SceneDataPopulatedContextBase, "{5F4CE8D2-EEAC-49F7-8065-0B6372162D6F}", ImportContext);
SceneDataPopulatedContextBase(NodeEncounteredContext& parent,
const AZStd::shared_ptr<DataTypes::IGraphObject>& nodeData,
const AZStd::string& dataName);
SceneDataPopulatedContextBase(Containers::Scene& scene,
Containers::SceneGraph::NodeIndex currentGraphPosition,
RenamedNodesMap& nodeNameMap,
const AZStd::shared_ptr<DataTypes::IGraphObject>& nodeData, const AZStd::string& dataName);
const AZStd::shared_ptr<DataTypes::IGraphObject>& m_graphData;
const AZStd::string m_dataName;
};
// SceneNodeAppendedContextBase
// Context pushed to indicate that data has been added to the scene graph.
// Generally created due to the insertion of a node during SceneDataPopulatedContextBase
// processing.
struct SceneNodeAppendedContextBase
: public ImportContext
{
AZ_RTTI(SceneNodeAppendedContextBase, "{0A69FB6C-2B1B-46E7-AEC3-C4B8ABBFDD69}", ImportContext);
SceneNodeAppendedContextBase(SceneDataPopulatedContextBase& parent, Containers::SceneGraph::NodeIndex newIndex);
SceneNodeAppendedContextBase(Containers::Scene& scene,
Containers::SceneGraph::NodeIndex currentGraphPosition, RenamedNodesMap& nodeNameMap);
};
// SceneAttributeDataPopulatedContextBase
// Context pushed to indicate that attribute data has been found and processed
struct SceneAttributeDataPopulatedContextBase
: public ImportContext
{
AZ_RTTI(SceneAttributeDataPopulatedContextBase, "{DA133E14-0770-435B-9A4E-38679367F56C}", ImportContext);
SceneAttributeDataPopulatedContextBase(SceneNodeAppendedContextBase& parent,
const AZStd::shared_ptr<DataTypes::IGraphObject>& nodeData,
const Containers::SceneGraph::NodeIndex attributeNodeIndex, const AZStd::string& dataName);
const AZStd::shared_ptr<DataTypes::IGraphObject>& m_graphData;
const AZStd::string m_dataName;
};
// SceneAttributeNodeAppendedContextBase
// Context pushed to indicate that an attribute node has been added to the scene graph
struct SceneAttributeNodeAppendedContextBase
: public ImportContext
{
AZ_RTTI(SceneAttributeNodeAppendedContextBase, "{8A382A1E-CFE7-47D2-BA5B-CFDF1FB9F03D}", ImportContext);
SceneAttributeNodeAppendedContextBase(SceneAttributeDataPopulatedContextBase& parent,
Containers::SceneGraph::NodeIndex newIndex);
};
// SceneNodeAddedAttributesContextBase
// Context pushed to indicate that all attribute processors have completed their
// work for a specific data node.
struct SceneNodeAddedAttributesContextBase
: public ImportContext
{
AZ_RTTI(SceneNodeAddedAttributesContextBase, "{65B97E48-16A0-4BBD-B364-CFDA9E3600B6}", ImportContext);
SceneNodeAddedAttributesContextBase(SceneNodeAppendedContextBase& parent);
};
// SceneNodeFinalizeContextBase
// Context pushed last after all other contexts for a scene node to allow any
// post-processing needed for an importer.
struct SceneNodeFinalizeContextBase
: public ImportContext
{
AZ_RTTI(SceneNodeFinalizeContextBase, "{F2C7D1BC-8065-423E-9212-241EB426A2BB}", ImportContext);
SceneNodeFinalizeContextBase(SceneNodeAddedAttributesContextBase& parent);
};
// FinalizeSceneContextBase
// Context pushed after the scene has been fully created. This can be used to finalize pending work
// such as resolving named links.
struct FinalizeSceneContextBase
: public ImportContext
{
AZ_RTTI(FinalizeSceneContextBase, "{91C54F51-9B4D-4C61-956C-9D530725D737}", ImportContext);
FinalizeSceneContextBase(Containers::Scene& scene, RenamedNodesMap& nodeNameMap);
};
} // namespace SceneBuilder
} // namespace SceneAPI
} // namespace AZ