BsCmdCloneSO.cpp 1.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  1. #include "BsCmdCloneSO.h"
  2. #include "BsSceneObject.h"
  3. namespace BansheeEngine
  4. {
  5. CmdCloneSO::CmdCloneSO(const WString& description, const Vector<HSceneObject>& originals)
  6. :EditorCommand(description), mOriginals(originals)
  7. {
  8. }
  9. CmdCloneSO::~CmdCloneSO()
  10. {
  11. }
  12. HSceneObject CmdCloneSO::execute(const HSceneObject& sceneObject, const WString& description)
  13. {
  14. // Register command and commit it
  15. CmdCloneSO* command = new (bs_alloc<CmdCloneSO>()) CmdCloneSO(description, { sceneObject });
  16. UndoRedo::instance().registerCommand(command);
  17. command->commit();
  18. if (command->mClones.size() > 0)
  19. return command->mClones[0];
  20. return HSceneObject();
  21. }
  22. Vector<HSceneObject> CmdCloneSO::execute(const Vector<HSceneObject>& sceneObjects, const WString& description)
  23. {
  24. // Register command and commit it
  25. CmdCloneSO* command = new (bs_alloc<CmdCloneSO>()) CmdCloneSO(description, sceneObjects);
  26. UndoRedo::instance().registerCommand(command);
  27. command->commit();
  28. return command->mClones;
  29. }
  30. void CmdCloneSO::commit()
  31. {
  32. mClones.clear();
  33. for (auto& original : mOriginals)
  34. {
  35. if (!original.isDestroyed())
  36. mClones.push_back(original->clone());
  37. }
  38. }
  39. void CmdCloneSO::revert()
  40. {
  41. for (auto& clone : mClones)
  42. {
  43. if (!clone.isDestroyed())
  44. clone->destroy(true);
  45. }
  46. mClones.clear();
  47. }
  48. }