BsScriptSerializedSceneObject.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  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. namespace bs
  10. {
  11. ScriptSerializedSceneObject::ScriptSerializedSceneObject(MonoObject* instance, const HSceneObject& so, bool recordHierarchy)
  12. : ScriptObject(instance), mSO(so), mRecordHierarchy(recordHierarchy), mSerializedObject(nullptr), mSerializedObjectSize(0)
  13. {
  14. if (mSO.isDestroyed())
  15. return;
  16. UINT32 numChildren = mSO->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 = mSO->getChild(i);
  24. children[i] = child;
  25. child->setParent(HSceneObject());
  26. }
  27. }
  28. bool isInstantiated = !mSO->hasFlag(SOF_DontInstantiate);
  29. mSO->_setFlags(SOF_DontInstantiate);
  30. MemorySerializer serializer;
  31. mSerializedObject = serializer.encode(mSO.get(), mSerializedObjectSize);
  32. if (isInstantiated)
  33. mSO->_unsetFlags(SOF_DontInstantiate);
  34. mSceneObjectProxy = EditorUtility::createProxy(mSO);
  35. if (!mRecordHierarchy)
  36. {
  37. for (UINT32 i = 0; i < numChildren; i++)
  38. children[i]->setParent(mSO->getHandle());
  39. bs_stack_delete(children, numChildren);
  40. }
  41. }
  42. ScriptSerializedSceneObject::~ScriptSerializedSceneObject()
  43. {
  44. if (mSerializedObject != nullptr)
  45. bs_free(mSerializedObject);
  46. }
  47. void ScriptSerializedSceneObject::initRuntimeData()
  48. {
  49. metaData.scriptClass->addInternalCall("Internal_CreateInstance", (void*)&ScriptSerializedSceneObject::internal_CreateInstance);
  50. metaData.scriptClass->addInternalCall("Internal_Restore", (void*)&ScriptSerializedSceneObject::internal_Restore);
  51. }
  52. void ScriptSerializedSceneObject::internal_CreateInstance(MonoObject* instance, ScriptSceneObject* so, bool hierarchy)
  53. {
  54. HSceneObject sceneObj;
  55. if (so != nullptr)
  56. sceneObj = so->getNativeSceneObject();
  57. new (bs_alloc<ScriptSerializedSceneObject>()) ScriptSerializedSceneObject(instance, sceneObj, hierarchy);
  58. }
  59. void ScriptSerializedSceneObject::internal_Restore(ScriptSerializedSceneObject* thisPtr)
  60. {
  61. HSceneObject sceneObj = thisPtr->mSO;
  62. if (sceneObj.isDestroyed())
  63. return;
  64. HSceneObject parent = sceneObj->getParent();
  65. UINT32 numChildren = sceneObj->getNumChildren();
  66. HSceneObject* children = nullptr;
  67. if (!thisPtr->mRecordHierarchy)
  68. {
  69. children = bs_stack_new<HSceneObject>(numChildren);
  70. for (UINT32 i = 0; i < numChildren; i++)
  71. {
  72. HSceneObject child = sceneObj->getChild(i);
  73. children[i] = child;
  74. child->setParent(HSceneObject());
  75. }
  76. }
  77. sceneObj->destroy(true);
  78. GameObjectManager::instance().setDeserializationMode(GODM_RestoreExternal | GODM_UseNewIds);
  79. MemorySerializer serializer;
  80. SPtr<SceneObject> restored = std::static_pointer_cast<SceneObject>(
  81. serializer.decode(thisPtr->mSerializedObject, thisPtr->mSerializedObjectSize));
  82. EditorUtility::restoreIds(restored->getHandle(), thisPtr->mSceneObjectProxy);
  83. restored->setParent(parent);
  84. if (!thisPtr->mRecordHierarchy)
  85. {
  86. for (UINT32 i = 0; i < numChildren; i++)
  87. children[i]->setParent(restored->getHandle());
  88. bs_stack_delete(children, numChildren);
  89. }
  90. restored->_instantiate();
  91. }
  92. }