BsSerializedSceneObject.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. //********************************** Banshee Engine (www.banshee3d.com) **************************************************//
  2. //**************** Copyright (c) 2019 Marko Pintera ([email protected]). All rights reserved. **********************//
  3. #include "Scene/BsSerializedSceneObject.h"
  4. #include "Scene/BsSceneObject.h"
  5. #include "Serialization/BsMemorySerializer.h"
  6. #include "Utility/BsUtility.h"
  7. namespace bs
  8. {
  9. SerializedSceneObject::SerializedSceneObject(const HSceneObject& sceneObject, bool hierarchy)
  10. :mSceneObject(sceneObject), mRecordHierarchy(hierarchy)
  11. {
  12. if(mSceneObject.isDestroyed())
  13. return;
  14. UINT32 numChildren = mSceneObject->getNumChildren();
  15. HSceneObject* children = nullptr;
  16. if (!mRecordHierarchy)
  17. {
  18. children = bs_stack_new<HSceneObject>(numChildren);
  19. for (UINT32 i = 0; i < numChildren; i++)
  20. {
  21. HSceneObject child = mSceneObject->getChild(i);
  22. children[i] = child;
  23. child->setParent(HSceneObject());
  24. }
  25. }
  26. bool isInstantiated = !mSceneObject->hasFlag(SOF_DontInstantiate);
  27. mSceneObject->_setFlags(SOF_DontInstantiate);
  28. MemorySerializer serializer;
  29. mSerializedObject = serializer.encode(mSceneObject.get(), mSerializedObjectSize);
  30. if (isInstantiated)
  31. mSceneObject->_unsetFlags(SOF_DontInstantiate);
  32. mSceneObjectProxy = EditorUtility::createProxy(mSceneObject);
  33. HSceneObject parent = sceneObject->getParent();
  34. if (parent != nullptr)
  35. mSerializedObjectParentId = parent->getInstanceId();
  36. if (!mRecordHierarchy)
  37. {
  38. for (UINT32 i = 0; i < numChildren; i++)
  39. children[i]->setParent(sceneObject->getHandle());
  40. bs_stack_delete(children, numChildren);
  41. }
  42. }
  43. SerializedSceneObject::~SerializedSceneObject()
  44. {
  45. if (mSerializedObject != nullptr)
  46. {
  47. bs_free(mSerializedObject);
  48. mSerializedObject = nullptr;
  49. }
  50. }
  51. void SerializedSceneObject::restore()
  52. {
  53. HSceneObject parent;
  54. if (mSerializedObjectParentId != 0)
  55. parent = static_object_cast<SceneObject>(GameObjectManager::instance().getObject(mSerializedObjectParentId));
  56. HSceneObject* children = nullptr;
  57. UINT32 numChildren = 0;
  58. if (!mSceneObject.isDestroyed())
  59. {
  60. numChildren = mSceneObject->getNumChildren();
  61. if (!mRecordHierarchy)
  62. {
  63. children = bs_stack_new<HSceneObject>(numChildren);
  64. for (UINT32 i = 0; i < numChildren; i++)
  65. {
  66. HSceneObject child = mSceneObject->getChild(i);
  67. children[i] = child;
  68. child->setParent(HSceneObject());
  69. }
  70. }
  71. mSceneObject->destroy(true);
  72. }
  73. CoreSerializationContext serzContext;
  74. serzContext.goState = bs_shared_ptr_new<GameObjectDeserializationState>(GODM_RestoreExternal | GODM_UseNewIds);
  75. MemorySerializer serializer;
  76. SPtr<SceneObject> restored = std::static_pointer_cast<SceneObject>(
  77. serializer.decode(mSerializedObject, mSerializedObjectSize, &serzContext));
  78. EditorUtility::restoreIds(restored->getHandle(), mSceneObjectProxy);
  79. restored->setParent(parent);
  80. if (children)
  81. {
  82. for (UINT32 i = 0; i < numChildren; i++)
  83. children[i]->setParent(restored->getHandle());
  84. bs_stack_delete(children, numChildren);
  85. }
  86. restored->_instantiate();
  87. }
  88. }