BsCmdDeleteSO.cpp 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. #include "BsCmdDeleteSO.h"
  2. #include "BsSceneObject.h"
  3. #include "BsComponent.h"
  4. #include "BsMemorySerializer.h"
  5. namespace BansheeEngine
  6. {
  7. CmdDeleteSO::CmdDeleteSO(const HSceneObject& sceneObject)
  8. :mSceneObject(sceneObject), mSerializedObject(nullptr), mSerializedObjectParentId(0), mSerializedObjectSize(0)
  9. {
  10. }
  11. CmdDeleteSO::~CmdDeleteSO()
  12. {
  13. mSceneObject = nullptr;
  14. clear();
  15. }
  16. void CmdDeleteSO::clear()
  17. {
  18. mSerializedObjectSize = 0;
  19. mSerializedObjectParentId = 0;
  20. if (mSerializedObject != nullptr)
  21. {
  22. bs_free(mSerializedObject);
  23. mSerializedObject = nullptr;
  24. }
  25. }
  26. void CmdDeleteSO::execute(const HSceneObject& sceneObject)
  27. {
  28. // Register command and commit it
  29. CmdDeleteSO* command = new (bs_alloc<CmdDeleteSO>()) CmdDeleteSO(sceneObject);
  30. UndoRedo::instance().registerCommand(command);
  31. command->commit();
  32. }
  33. void CmdDeleteSO::commit()
  34. {
  35. clear();
  36. if (mSceneObject == nullptr || mSceneObject.isDestroyed())
  37. return;
  38. recordSO(mSceneObject);
  39. mSceneObject->destroy();
  40. }
  41. void CmdDeleteSO::revert()
  42. {
  43. if (mSceneObject == nullptr)
  44. return;
  45. HSceneObject parent;
  46. if (mSerializedObjectParentId != 0)
  47. parent = GameObjectManager::instance().getObject(mSerializedObjectParentId);
  48. GameObjectManager::instance().setDeserializationMode(GODM_RestoreExternal | GODM_UseNewIds);
  49. // Object might still only be queued for destruction, but we need to fully destroy it since we're about to replace
  50. // the potentially only reference to the old object
  51. if (!mSceneObject.isDestroyed())
  52. mSceneObject->destroy(true);
  53. MemorySerializer serializer;
  54. std::shared_ptr<SceneObject> restored = std::static_pointer_cast<SceneObject>(serializer.decode(mSerializedObject, mSerializedObjectSize));
  55. CmdUtility::restoreIds(restored->getHandle(), mSceneObjectProxy);
  56. restored->setParent(parent);
  57. }
  58. void CmdDeleteSO::recordSO(const HSceneObject& sceneObject)
  59. {
  60. MemorySerializer serializer;
  61. mSerializedObject = serializer.encode(mSceneObject.get(), mSerializedObjectSize, &bs_alloc);
  62. HSceneObject parent = mSceneObject->getParent();
  63. if (parent != nullptr)
  64. mSerializedObjectParentId = parent->getInstanceId();
  65. mSceneObjectProxy = CmdUtility::createProxy(mSceneObject);
  66. }
  67. }