|
|
@@ -1,25 +1,23 @@
|
|
|
|
|
|
-#include <Atomic/IO/Log.h>
|
|
|
-#include <Atomic/Core/Timer.h>
|
|
|
-#include <Atomic/Scene/Scene.h>
|
|
|
-#include <Atomic/Scene/Component.h>
|
|
|
-#include <Atomic/Scene/SceneEvents.h>
|
|
|
+#include "SceneEditor3D.h"
|
|
|
|
|
|
-#include "../../EditorMode/AEEditorEvents.h"
|
|
|
-
|
|
|
-#include "SceneEditOps.h"
|
|
|
#include "SceneEditor3DEvents.h"
|
|
|
+#include "SceneEditOp.h"
|
|
|
+#include "SceneSelection.h"
|
|
|
#include "SceneEditHistory.h"
|
|
|
|
|
|
namespace AtomicEditor
|
|
|
{
|
|
|
|
|
|
-SceneEditHistory::SceneEditHistory(Context* context, Scene* scene) :
|
|
|
- Object(context),
|
|
|
- scene_(scene)
|
|
|
+SceneEditHistory::SceneEditHistory(Context* context, SceneEditor3D* sceneEditor) : Object(context),
|
|
|
+ sceneEditor_(sceneEditor),
|
|
|
+ curSelEditOp_(0)
|
|
|
{
|
|
|
- SubscribeToEvent(scene_, E_SCENEEDITSERIALIZABLE, HANDLER(SceneEditHistory, HandleSceneEditSerializable));
|
|
|
- SubscribeToEvent(scene_, E_SCENEEDITNODEADDEDREMOVED, HANDLER(SceneEditHistory, HandleSceneEditNodeAddedRemoved));
|
|
|
+ SubscribeToEvent(sceneEditor_->GetScene(), E_SCENENODESELECTED, HANDLER(SceneEditHistory, HandleSceneNodeSelected));
|
|
|
+
|
|
|
+ SubscribeToEvent(sceneEditor_->GetScene(), E_SCENEEDITBEGIN, HANDLER(SceneEditHistory, HandleSceneEditBegin));
|
|
|
+ SubscribeToEvent(sceneEditor_->GetScene(), E_SCENEEDITEND, HANDLER(SceneEditHistory, HandleSceneEditEnd));
|
|
|
+
|
|
|
}
|
|
|
|
|
|
SceneEditHistory::~SceneEditHistory()
|
|
|
@@ -27,84 +25,62 @@ SceneEditHistory::~SceneEditHistory()
|
|
|
|
|
|
}
|
|
|
|
|
|
-void SceneEditHistory::AddUndoOp(SceneEditOp* op)
|
|
|
+void SceneEditHistory::HandleSceneEditBegin(StringHash eventType, VariantMap& eventData)
|
|
|
{
|
|
|
- undoHistory_.Push(op);
|
|
|
+ assert(0);
|
|
|
+ BeginSelectionEdit();
|
|
|
+}
|
|
|
|
|
|
- scene_->SendEvent(E_SCENEEDITSCENEMODIFIED);
|
|
|
+void SceneEditHistory::HandleSceneEditEnd(StringHash eventType, VariantMap& eventData)
|
|
|
+{
|
|
|
+ EndSelectionEdit();
|
|
|
+}
|
|
|
|
|
|
- for (unsigned i = 0; i < redoHistory_.Size(); i++)
|
|
|
- {
|
|
|
- delete redoHistory_[i];
|
|
|
- }
|
|
|
+void SceneEditHistory::BeginSelectionEdit()
|
|
|
+{
|
|
|
+ assert(!curSelEditOp_);
|
|
|
|
|
|
- redoHistory_.Clear();
|
|
|
+ Vector<SharedPtr<Node>>& nodes = sceneEditor_->GetSelection()->GetNodes();
|
|
|
+ if (!nodes.Size())
|
|
|
+ return;
|
|
|
+
|
|
|
+ curSelEditOp_ = new SelectionEditOp(nodes);
|
|
|
}
|
|
|
|
|
|
-void SceneEditHistory::HandleSceneEditSerializableUndoRedo(StringHash eventType, VariantMap& eventData)
|
|
|
+void SceneEditHistory::AddUndoOp(SelectionEditOp* op)
|
|
|
{
|
|
|
- SharedPtr<Serializable> serial(static_cast<Serializable*>(eventData[SceneEditSerializableUndoRedo::P_SERIALIZABLE].GetPtr()));
|
|
|
+ undoHistory_.Push(op);
|
|
|
+
|
|
|
+ sceneEditor_->GetScene()->SendEvent(E_SCENEEDITSCENEMODIFIED);
|
|
|
|
|
|
- if (editStates_.Contains(serial))
|
|
|
+ for (unsigned i = 0; i < redoHistory_.Size(); i++)
|
|
|
{
|
|
|
- scene_->SendEvent(E_SCENEEDITSCENEMODIFIED);
|
|
|
- editStates_[serial] = eventData[SceneEditSerializableUndoRedo::P_STATE].GetVectorBuffer();
|
|
|
+ delete redoHistory_[i];
|
|
|
}
|
|
|
-}
|
|
|
|
|
|
-void SceneEditHistory::HandleSceneEditNodeAddedRemoved(StringHash eventType, VariantMap& eventData)
|
|
|
-{
|
|
|
- bool added = eventData[SceneEditNodeAddedRemoved::P_ADDED].GetBool();
|
|
|
- Node* node = static_cast<Node*>(eventData[SceneEditNodeAddedRemoved::P_NODE].GetPtr());
|
|
|
- NodeAddedRemovedOp* op = new NodeAddedRemovedOp(node, added);
|
|
|
- AddUndoOp(op);
|
|
|
+ redoHistory_.Clear();
|
|
|
}
|
|
|
|
|
|
-void SceneEditHistory::HandleSceneEditSerializable(StringHash eventType, VariantMap& eventData)
|
|
|
+void SceneEditHistory::EndSelectionEdit()
|
|
|
{
|
|
|
+ if (!curSelEditOp_)
|
|
|
+ return;
|
|
|
|
|
|
- int editop = eventData[SceneEditSerializable::P_OPERATION].GetInt();
|
|
|
-
|
|
|
- SharedPtr<Serializable> serial(static_cast<Serializable*>(eventData[SceneEditSerializable::P_SERIALIZABLE].GetPtr()));
|
|
|
+ curSelEditOp_->RegisterEdit();
|
|
|
|
|
|
- if (editop == 0) // begin
|
|
|
+ if (curSelEditOp_->Commit())
|
|
|
{
|
|
|
- if (editStates_.Contains(serial))
|
|
|
- return;
|
|
|
-
|
|
|
- SubscribeToEvent(serial, E_SCENEEDITSERIALIZABLEUNDOREDO, HANDLER(SceneEditHistory, HandleSceneEditSerializableUndoRedo));
|
|
|
- VectorBuffer& vb = editStates_[serial];
|
|
|
- vb.Clear();
|
|
|
- serial->Serializable::Save(vb);
|
|
|
- vb.Seek(0);
|
|
|
+ AddUndoOp(curSelEditOp_);
|
|
|
}
|
|
|
- else if (editop == 1) // change
|
|
|
+ else
|
|
|
{
|
|
|
- if (!editStates_.Contains(serial))
|
|
|
- return;
|
|
|
-
|
|
|
- VectorBuffer& beginState = editStates_[serial];
|
|
|
- VectorBuffer deltaState;
|
|
|
- serial->Serializable::Save(deltaState);
|
|
|
- deltaState.Seek(0);
|
|
|
-
|
|
|
- if (beginState.GetSize() != deltaState.GetSize() ||
|
|
|
- memcmp(beginState.GetData(), deltaState.GetData(), deltaState.GetSize()))
|
|
|
- {
|
|
|
- SerializableEditOp* op = new SerializableEditOp(serial, beginState, deltaState);
|
|
|
- AddUndoOp(op);
|
|
|
- editStates_[serial] = deltaState;
|
|
|
- }
|
|
|
+ delete curSelEditOp_;
|
|
|
}
|
|
|
- else if (editop == 2) // end
|
|
|
- {
|
|
|
- if (!editStates_.Contains(serial))
|
|
|
- return;
|
|
|
|
|
|
- UnsubscribeFromEvent(serial, E_SCENEEDITSERIALIZABLEUNDOREDO);
|
|
|
+ curSelEditOp_ = 0;
|
|
|
+
|
|
|
+ BeginSelectionEdit();
|
|
|
|
|
|
- editStates_.Erase(serial);
|
|
|
- }
|
|
|
}
|
|
|
|
|
|
void SceneEditHistory::Undo()
|
|
|
@@ -112,13 +88,21 @@ void SceneEditHistory::Undo()
|
|
|
if (!undoHistory_.Size())
|
|
|
return;
|
|
|
|
|
|
- SceneEditOp* op = undoHistory_.Back();
|
|
|
+ SelectionEditOp* op = undoHistory_.Back();
|
|
|
undoHistory_.Pop();
|
|
|
|
|
|
op->Undo();
|
|
|
|
|
|
redoHistory_.Push(op);
|
|
|
|
|
|
+ if (curSelEditOp_)
|
|
|
+ {
|
|
|
+ delete curSelEditOp_;
|
|
|
+ curSelEditOp_ = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ BeginSelectionEdit();
|
|
|
+
|
|
|
}
|
|
|
|
|
|
void SceneEditHistory::Redo()
|
|
|
@@ -126,13 +110,35 @@ void SceneEditHistory::Redo()
|
|
|
if (!redoHistory_.Size())
|
|
|
return;
|
|
|
|
|
|
- SceneEditOp* op = redoHistory_.Back();
|
|
|
+ SelectionEditOp* op = redoHistory_.Back();
|
|
|
redoHistory_.Pop();
|
|
|
|
|
|
op->Redo();
|
|
|
|
|
|
undoHistory_.Push(op);
|
|
|
|
|
|
+ if (curSelEditOp_)
|
|
|
+ {
|
|
|
+ delete curSelEditOp_;
|
|
|
+ curSelEditOp_ = 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ BeginSelectionEdit();
|
|
|
+
|
|
|
+
|
|
|
}
|
|
|
|
|
|
+
|
|
|
+void SceneEditHistory::HandleSceneNodeSelected(StringHash eventType, VariantMap& eventData)
|
|
|
+{
|
|
|
+ if (curSelEditOp_)
|
|
|
+ {
|
|
|
+ EndSelectionEdit();
|
|
|
+ }
|
|
|
+ else
|
|
|
+ BeginSelectionEdit();
|
|
|
}
|
|
|
+
|
|
|
+
|
|
|
+}
|
|
|
+
|