BsCmdDeleteSO.cpp 2.6 KB

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