BsSerializedSceneObject.cpp 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  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 "Utility/BsUtility.h"
  6. #include "Serialization/BsBinarySerializer.h"
  7. #include "FileSystem/BsDataStream.h"
  8. namespace bs
  9. {
  10. class BinarySerializer;
  11. SerializedSceneObject::SerializedSceneObject(const HSceneObject& sceneObject, bool hierarchy)
  12. :mSceneObject(sceneObject), mRecordHierarchy(hierarchy), mSerializedObject(bs_shared_ptr_new<MemoryDataStream>())
  13. {
  14. if(mSceneObject.isDestroyed())
  15. return;
  16. UINT32 numChildren = mSceneObject->getNumChildren();
  17. HSceneObject* children = nullptr;
  18. if (!mRecordHierarchy)
  19. {
  20. children = bs_stack_new<HSceneObject>(numChildren);
  21. for (UINT32 i = 0; i < numChildren; i++)
  22. {
  23. HSceneObject child = mSceneObject->getChild(i);
  24. children[i] = child;
  25. child->setParent(HSceneObject());
  26. }
  27. }
  28. bool isInstantiated = !mSceneObject->hasFlag(SOF_DontInstantiate);
  29. mSceneObject->_setFlags(SOF_DontInstantiate);
  30. BinarySerializer serializer;
  31. serializer.encode(mSceneObject.get(), mSerializedObject);
  32. if (isInstantiated)
  33. mSceneObject->_unsetFlags(SOF_DontInstantiate);
  34. mSceneObjectProxy = EditorUtility::createProxy(mSceneObject);
  35. HSceneObject parent = sceneObject->getParent();
  36. if (parent != nullptr)
  37. mSerializedObjectParentId = parent->getInstanceId();
  38. if (!mRecordHierarchy)
  39. {
  40. for (UINT32 i = 0; i < numChildren; i++)
  41. children[i]->setParent(sceneObject->getHandle());
  42. bs_stack_delete(children, numChildren);
  43. }
  44. }
  45. void SerializedSceneObject::restore()
  46. {
  47. HSceneObject parent;
  48. if (mSerializedObjectParentId != 0)
  49. parent = static_object_cast<SceneObject>(GameObjectManager::instance().getObject(mSerializedObjectParentId));
  50. HSceneObject* children = nullptr;
  51. UINT32 numChildren = 0;
  52. if (!mSceneObject.isDestroyed())
  53. {
  54. numChildren = mSceneObject->getNumChildren();
  55. if (!mRecordHierarchy)
  56. {
  57. children = bs_stack_new<HSceneObject>(numChildren);
  58. for (UINT32 i = 0; i < numChildren; i++)
  59. {
  60. HSceneObject child = mSceneObject->getChild(i);
  61. children[i] = child;
  62. child->setParent(HSceneObject());
  63. }
  64. }
  65. mSceneObject->destroy(true);
  66. }
  67. CoreSerializationContext serzContext;
  68. serzContext.goState = bs_shared_ptr_new<GameObjectDeserializationState>(GODM_RestoreExternal | GODM_UseNewIds);
  69. BinarySerializer serializer;
  70. mSerializedObject->seek(0);
  71. SPtr<SceneObject> restored = std::static_pointer_cast<SceneObject>(
  72. serializer.decode(mSerializedObject, (UINT32)mSerializedObject->size(),
  73. BinarySerializerFlag::None, &serzContext));
  74. EditorUtility::restoreIds(restored->getHandle(), mSceneObjectProxy);
  75. restored->setParent(parent);
  76. if (children)
  77. {
  78. for (UINT32 i = 0; i < numChildren; i++)
  79. children[i]->setParent(restored->getHandle());
  80. bs_stack_delete(children, numChildren);
  81. }
  82. restored->_instantiate();
  83. }
  84. }