BsCmdRecordSO.cpp 2.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. #include "BsCmdRecordSO.h"
  2. #include "BsSceneObject.h"
  3. #include "BsComponent.h"
  4. #include "BsMemorySerializer.h"
  5. namespace BansheeEngine
  6. {
  7. CmdRecordSO::CmdRecordSO(const WString& description, const HSceneObject& sceneObject)
  8. :EditorCommand(description), mSceneObject(sceneObject), mSerializedObject(nullptr), mSerializedObjectSize(0)
  9. {
  10. }
  11. CmdRecordSO::~CmdRecordSO()
  12. {
  13. mSceneObject = nullptr;
  14. clear();
  15. }
  16. void CmdRecordSO::clear()
  17. {
  18. mSerializedObjectSize = 0;
  19. if (mSerializedObject != nullptr)
  20. {
  21. bs_free(mSerializedObject);
  22. mSerializedObject = nullptr;
  23. }
  24. }
  25. void CmdRecordSO::execute(const HSceneObject& sceneObject, const WString& description)
  26. {
  27. // Register command and commit it
  28. CmdRecordSO* command = new (bs_alloc<CmdRecordSO>()) CmdRecordSO(description, sceneObject);
  29. UndoRedo::instance().registerCommand(command);
  30. command->commit();
  31. }
  32. void CmdRecordSO::commit()
  33. {
  34. clear();
  35. if (mSceneObject == nullptr || mSceneObject.isDestroyed())
  36. return;
  37. recordSO(mSceneObject);
  38. }
  39. void CmdRecordSO::revert()
  40. {
  41. if (mSceneObject == nullptr || mSceneObject.isDestroyed())
  42. return;
  43. HSceneObject parent = mSceneObject->getParent();
  44. UINT32 numChildren = mSceneObject->getNumChildren();
  45. Vector<HSceneObject> children(numChildren);
  46. for (UINT32 i = 0; i < numChildren; i++)
  47. {
  48. HSceneObject child = mSceneObject->getChild(i);
  49. children[i] = child;
  50. child->setParent(HSceneObject());
  51. }
  52. mSceneObject->destroy(true);
  53. GameObjectManager::instance().setDeserializationMode(GODM_RestoreExternal | GODM_UseNewIds);
  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. for (auto& child : children)
  59. child->setParent(restored->getHandle());
  60. }
  61. void CmdRecordSO::recordSO(const HSceneObject& sceneObject)
  62. {
  63. UINT32 numChildren = mSceneObject->getNumChildren();
  64. Vector<HSceneObject> children(numChildren);
  65. for (UINT32 i = 0; i < numChildren; i++)
  66. {
  67. HSceneObject child = mSceneObject->getChild(i);
  68. children[i] = child;
  69. child->setParent(HSceneObject());
  70. }
  71. MemorySerializer serializer;
  72. mSerializedObject = serializer.encode(mSceneObject.get(), mSerializedObjectSize);
  73. mSceneObjectProxy = CmdUtility::createProxy(mSceneObject);
  74. for (auto& child : children)
  75. child->setParent(sceneObject->getHandle());
  76. }
  77. }