Browse Source

Make an in-memory snapshot of the scene when starting update. Optionally revert to it (new button in editor toolbar) when stopping update.

Lasse Öörni 11 years ago
parent
commit
b166579662

+ 2 - 0
Bin/Data/Scripts/Editor.as

@@ -152,6 +152,7 @@ void LoadConfig()
         if (objectElem.HasAttribute("importoptions")) importOptions = objectElem.GetAttribute("importoptions");
         if (objectElem.HasAttribute("pickmode")) pickMode = objectElem.GetInt("pickmode");
         if (objectElem.HasAttribute("axismode")) axisMode = AxisMode(objectElem.GetInt("axismode"));
+        if (objectElem.HasAttribute("revertonpause")) revertOnPause = objectElem.GetBool("revertonpause");
     }
 
     if (!resourcesElem.isNull)
@@ -258,6 +259,7 @@ void SaveConfig()
     objectElem.SetAttribute("importoptions", importOptions);
     objectElem.SetInt("pickmode", pickMode);
     objectElem.SetInt("axismode", axisMode);
+    objectElem.SetBool("revertonpause", revertOnPause);
 
     resourcesElem.SetBool("rememberresourcepath", rememberResourcePath);
     resourcesElem.SetAttribute("resourcepath", sceneResourcePath);

+ 28 - 0
Bin/Data/Scripts/Editor/EditorScene.as

@@ -34,6 +34,9 @@ bool skipMruScene = false;
 Array<EditActionGroup> undoStack;
 uint undoStackPos = 0;
 
+bool revertOnPause = false;
+XMLFile@ revertData;
+
 void ClearSceneSelection()
 {
     selectedNodes.Clear();
@@ -90,6 +93,7 @@ bool ResetScene()
     cache.ReleaseAllResources(false);
 
     sceneModified = false;
+    revertData = null;
     StopSceneUpdate();
 
     UpdateWindowTitle();
@@ -183,6 +187,7 @@ bool LoadScene(const String&in fileName)
 
     suppressSceneChanges = true;
     sceneModified = false;
+    revertData = null;
     StopSceneUpdate();
 
     String extension = GetExtension(fileName);
@@ -382,6 +387,19 @@ void StopSceneUpdate()
     runUpdate = false;
     audio.Stop();
     toolBarDirty = true;
+    
+    // If scene should revert on update stop, load saved data now
+    if (revertOnPause && revertData !is null)
+    {
+        suppressSceneChanges = true;
+        editorScene.Clear();
+        editorScene.LoadXML(revertData.GetRoot());
+        UpdateHierarchyItem(editorScene, true);
+        ClearEditActions();
+        suppressSceneChanges = false;
+    }
+    
+    revertData = null;
 }
 
 void StartSceneUpdate()
@@ -391,6 +409,16 @@ void StartSceneUpdate()
     // paused (similar to physics)
     audio.Play();
     toolBarDirty = true;
+    
+    // Save scene data for reverting if enabled
+    if (revertOnPause)
+    {
+        revertData = XMLFile();
+        XMLElement root = revertData.CreateRoot("scene");
+        editorScene.SaveXML(root);
+    }
+    else
+        revertData = null;
 }
 
 bool ToggleSceneUpdate()

+ 13 - 0
Bin/Data/Scripts/Editor/EditorToolBar.as

@@ -20,6 +20,7 @@ void CreateToolBar()
     UIElement@ runUpdateGroup = CreateGroup("RunUpdateGroup", LM_HORIZONTAL);
     runUpdateGroup.AddChild(CreateToolBarToggle("RunUpdatePlay"));
     runUpdateGroup.AddChild(CreateToolBarToggle("RunUpdatePause"));
+    runUpdateGroup.AddChild(CreateToolBarToggle("RevertOnPause"));
     FinalizeGroupHorizontal(runUpdateGroup, "ToolBarToggle");
     toolBar.AddChild(runUpdateGroup);
 
@@ -188,6 +189,13 @@ void ToolBarRunUpdatePause(StringHash eventType, VariantMap& eventData)
     toolBarDirty = true;
 }
 
+void ToolBarRevertOnPause(StringHash eventType, VariantMap& eventData)
+{
+    CheckBox@ edit = eventData["Element"].GetPtr();
+    revertOnPause = edit.checked;
+    toolBarDirty = true;
+}
+
 void ToolBarEditModeMove(StringHash eventType, VariantMap& eventData)
 {
     CheckBox@ edit = eventData["Element"].GetPtr();
@@ -384,6 +392,10 @@ void UpdateDirtyToolBar()
     if (runUpdatePauseToggle.checked != (runUpdate == false))
         runUpdatePauseToggle.checked = runUpdate == false;
 
+    CheckBox@ revertOnPauseToggle = toolBar.GetChild("RevertOnPause", true);
+    if (revertOnPauseToggle.checked != revertOnPause)
+        revertOnPauseToggle.checked = revertOnPause;
+
     CheckBox@ editMoveToggle = toolBar.GetChild("EditMove", true);
     if (editMoveToggle.checked != (editMode == EDIT_MOVE))
         editMoveToggle.checked = editMode == EDIT_MOVE;
@@ -464,6 +476,7 @@ void UpdateDirtyToolBar()
     {
         SubscribeToEvent(runUpdatePlayToggle, "Toggled", "ToolBarRunUpdatePlay");
         SubscribeToEvent(runUpdatePauseToggle, "Toggled", "ToolBarRunUpdatePause");
+        SubscribeToEvent(revertOnPauseToggle, "Toggled", "ToolBarRevertOnPause");
         SubscribeToEvent(editMoveToggle, "Toggled", "ToolBarEditModeMove");
         SubscribeToEvent(editRotateToggle, "Toggled", "ToolBarEditModeRotate");
         SubscribeToEvent(editScaleToggle, "Toggled", "ToolBarEditModeScale");

BIN
Bin/Data/Textures/EditorIcons.png


+ 4 - 0
Bin/Data/UI/EditorIcons.xml

@@ -255,6 +255,10 @@
         <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
         <attribute name="Image Rect" value="64 128 94 158" />
     </element>
+    <element type="RevertOnPause">
+        <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
+        <attribute name="Image Rect" value="160 160 190 190" />
+    </element>
     <element type="PickGeometries">
         <attribute name="Texture" value="Texture2D;Textures/EditorIcons.png" />
         <attribute name="Image Rect" value="96 128 126 158" />