BsScriptSerializedSceneObject.cpp 3.6 KB

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