ObjectLoader.h 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107
  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 "Util/GuidUtil.h"
  10. #include "ErrorReport.h"
  11. #include <AzCore/std/containers/set.h>
  12. #include <CryCommon/IXml.h>
  13. class CErrorRecord;
  14. struct IObjectManager;
  15. typedef std::map<GUID, GUID, guid_less_predicate> TGUIDRemap;
  16. AZ_PUSH_DISABLE_DLL_EXPORT_BASECLASS_WARNING
  17. /** CObjectLoader used to load Bas Object and resolve ObjectId references while loading.
  18. */
  19. class SANDBOX_API CObjectArchive
  20. {
  21. public:
  22. AZ_POP_DISABLE_DLL_EXPORT_BASECLASS_WARNING
  23. AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
  24. XmlNodeRef node; //!< Current archive node.
  25. AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
  26. bool bLoading;
  27. bool bUndo;
  28. CObjectArchive(IObjectManager* objMan, XmlNodeRef xmlRoot, bool loading);
  29. ~CObjectArchive();
  30. //! Resolve callback with only one parameter of CBaseObject.
  31. typedef AZStd::function<void(CBaseObject*)> ResolveObjRefFunctor1;
  32. // Return object ID remapped after loading.
  33. GUID ResolveID(REFGUID id);
  34. //! Set object resolve callback, it will be called once object with specified Id is loaded.
  35. void SetResolveCallback(CBaseObject* fromObject, REFGUID objectId, ResolveObjRefFunctor1 func);
  36. //! Resolve all object ids and call callbacks on resolved objects.
  37. void ResolveObjects();
  38. // Save object to archive.
  39. void SaveObject(CBaseObject* pObject);
  40. //! Load one object from archive.
  41. CBaseObject* LoadObject(const XmlNodeRef& objNode, CBaseObject* pPrevObject = nullptr);
  42. //! If true new loaded objects will be assigned new GUIDs.
  43. void MakeNewIds(bool bEnable);
  44. //! Remap object ids.
  45. void RemapID(REFGUID oldId, REFGUID newId);
  46. private:
  47. struct SLoadedObjectInfo
  48. {
  49. int nSortOrder;
  50. _smart_ptr<CBaseObject> pObject;
  51. XmlNodeRef xmlNode;
  52. GUID newGuid;
  53. bool operator <(const SLoadedObjectInfo& oi) const { return nSortOrder < oi.nSortOrder; }
  54. };
  55. IObjectManager* m_objectManager;
  56. struct Callback
  57. {
  58. ResolveObjRefFunctor1 func1;
  59. _smart_ptr<CBaseObject> fromObject;
  60. Callback() { func1 = 0; }
  61. };
  62. typedef std::multimap<GUID, Callback, guid_less_predicate> Callbacks;
  63. AZ_PUSH_DISABLE_DLL_EXPORT_MEMBER_WARNING
  64. Callbacks m_resolveCallbacks;
  65. // Set of all saved objects to this archive.
  66. typedef AZStd::set<_smart_ptr<CBaseObject> > ObjectsSet;
  67. ObjectsSet m_savedObjects;
  68. //typedef std::multimap<int,_smart_ptr<CBaseObject> > OrderedObjects;
  69. //OrderedObjects m_orderedObjects;
  70. std::vector<SLoadedObjectInfo> m_loadedObjects;
  71. // Loaded objects IDs, used for remapping of GUIDs.
  72. TGUIDRemap m_IdRemap;
  73. enum EObjectLoaderFlags
  74. {
  75. eObjectLoader_MakeNewIDs = 0x0001, // If true new loaded objects will be assigned new GUIDs.
  76. };
  77. int m_nFlags;
  78. IErrorReport* m_pCurrentErrorReport;
  79. bool m_bNeedResolveObjects;
  80. AZ_POP_DISABLE_DLL_EXPORT_MEMBER_WARNING
  81. };