BsCmdDeleteSO.cpp 2.3 KB

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