Prechádzať zdrojové kódy

[shgraph] Mode undo/redo tweaks

Clément Espeute 1 rok pred
rodič
commit
cbb74f2871

+ 13 - 13
hide/view/GraphEditor.hx

@@ -45,7 +45,6 @@ class GraphEditor extends hide.comp.Component {
 	static var BORDER_SIZE = 50;
 	static var SPEED_BORDER_MOVE = 0.05;
 	var timerUpdateView : Timer;
-
 	// used for selection
 	var boxesSelected : Map<Int, Bool> = [];
 	var boxesToMove : Map<Int, Bool> = [];
@@ -382,7 +381,7 @@ class GraphEditor extends hide.comp.Component {
 		var boundsHeight = Std.int(element.height());
 		trace(boundsHeight);
 
-		var posCursor = new IPoint(Std.int(ide.mouseX - heapsScene.offset().left) + x, Std.int(ide.mouseY - heapsScene.offset().top) + y);
+		var posCursor = new Point(Std.int(ide.mouseX - heapsScene.offset().left) + x, Std.int(ide.mouseY - heapsScene.offset().top) + y);
 		if( posCursor.x < 0 )
 			posCursor.x = 0;
 		if( posCursor.y < 0)
@@ -505,7 +504,7 @@ class GraphEditor extends hide.comp.Component {
 
 		function doAdd() {
 			var key = Std.parseInt(this.selectedNode.attr("node"));
-			var posCursor = new Point(lX(ide.mouseX - 25), lY(ide.mouseY - 10));
+			//var posCursor = new Point(lX(ide.mouseX - 25), lY(ide.mouseY - 10));
 
 			var instance = nodes[key].onConstructNode();
 
@@ -790,16 +789,25 @@ class GraphEditor extends hide.comp.Component {
 	}
 
 	public function opBox(node: IGraphNode, doAdd: Bool, undoBuffer: UndoBuffer) : Void {
+		var data = editor.serializeNode(node);
+
 		var exec = function(isUndo : Bool) : Void {
 			if (!doAdd) isUndo = !isUndo;
 			if (!isUndo) {
+				var node = editor.unserializeNode(data);
 				node.getPos(Box.tmpPoint);
 				addBox(Box.tmpPoint, node);
+				editor.addNode(node);
 			}
 			else {
-				var box = boxes.get(node.getId());
+				var id = node.getId();
+				var box = boxes.get(id);
 
-				removeBox(box);
+				box.dispose();
+				var id = box.node.getId();
+				boxes.remove(id);
+				
+				editor.removeNode(id);
 
 				// Sanity check
 				for (i => _ in box.info.inputs) {
@@ -868,7 +876,6 @@ class GraphEditor extends hide.comp.Component {
 	static var tmpPoint = new h2d.col.Point();
 	function addBox(point: h2d.col.Point, node : IGraphNode) : Box {
 		node.editor = this;
-		editor.addNode(node);
 		var box = new Box(this, editorMatrix, node);
 		box.setPosition(point.x, point.y);
 
@@ -953,13 +960,6 @@ class GraphEditor extends hide.comp.Component {
 		return box;
 	}
 
-	function removeBox(box : Box) {
-		box.dispose();
-		var id = box.node.getId();
-		boxes.remove(id);
-		editor.removeNode(id);
-	}
-
 	inline static function packIO(id: Int, ioId: Int) {
 		return ioId << 24 | id;
 	}

+ 7 - 1
hide/view/GraphInterface.hx

@@ -69,7 +69,10 @@ typedef Edge = {
 interface IGraphNode {
     public function getInfo() : GraphNodeInfo;
 
-    /**Returns an unique ID that identifies this node**/
+    /**
+        Returns an unique ID that identifies this node.
+        The ID of a given node MUST NERVER change for the entire lifetime of the GraphEditor
+    **/
     public function getId() : Int;
     public function getPos(p : h2d.col.Point) : Void;
     public function setPos(p : h2d.col.Point) : Void;
@@ -87,6 +90,9 @@ interface IGraphEditor {
     public function addNode(node : IGraphNode) : Void;
     public function removeNode(id:Int) : Void;
 
+    public function serializeNode(node : IGraphNode) : Dynamic;
+    public function unserializeNode(data: Dynamic) : IGraphNode;
+
     /**Returns false if the edge can't be created because the input/output types don't match**/
     public function canAddEdge(edge : Edge) : Bool;
 

+ 71 - 11
hide/view/shadereditor/ShaderEditor.hx

@@ -255,15 +255,28 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 	}
 
 	function createParameter(type : Type) {
-		//beforeChange();
-		var paramShaderID = shaderGraph.addParameter(type);
-		//afterChange();
-		var paramShader = shaderGraph.getParameter(paramShaderID);
-
-		var elt = addParameter(paramShader, null);
-		//updateParam(paramShaderID);
+		@:privateAccess var paramShaderID : Int = shaderGraph.current_param_id++;
+		@:privateAccess
+		function exec(isUndo:Bool) {
+			if (!isUndo) {
+				var name = "Param_" + paramShaderID;
+				shaderGraph.parametersAvailable.set(paramShaderID, {id: paramShaderID, name : name, type : type, defaultValue : null, variable : shaderGraph.generateParameter(name, type), index : shaderGraph.parametersKeys.length});
+				shaderGraph.parametersKeys.push(paramShaderID);
+
+				var paramShader = shaderGraph.getParameter(paramShaderID);
+				var elt = addParameter(paramShader, null);
+				elt.find(".input-title").focus();
+			} else {
+				shaderGraph.parametersAvailable.remove(paramShaderID);
+				shaderGraph.parametersKeys.remove(paramShaderID);
+				parametersUpdate.remove(paramShaderID);
+				shaderGraph.checkParameterIndex();
+				parametersList.find("#param_" + paramShaderID).remove();
+			}
+		}
 
-		elt.find(".input-title").focus();
+		exec(false);
+		undo.change(Custom(exec));
 	}
 
 	function moveParameter(parameter : Parameter, up : Bool) {
@@ -282,6 +295,8 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		}
 	}
 
+	var parametersUpdate : Map<Int, (Dynamic) -> Void> = [];
+
 	function addParameter(parameter : Parameter, ?value : Dynamic) {
 
 		var elt = new Element('<div id="param_${parameter.id}" class="parameter" draggable="true" ></div>').appendTo(parametersList);
@@ -327,6 +342,8 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 				});
 				if (value == null) value = 0;
 				range.value = value;
+
+				parametersUpdate.set(parameter.id, (v:Dynamic) -> range.value = v);
 				shaderGraph.setParameterDefaultValue(parameter.id, value);
 				
 				var saveValue : Null<Float> = null;
@@ -341,8 +358,8 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 						saveValue = null;
 						function exec(isUndo : Bool) {
 							var v = isUndo ? old : curr;
-							range.value = v;
-							shaderGraph.setParameterDefaultValue(parameter.id, v); 
+							shaderGraph.setParameterDefaultValue(parameter.id, v);
+							parametersUpdate[parameter.id](v);
 							updateParam(parameter.id);
 						}
 						exec(false);
@@ -365,6 +382,9 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 				var start : h3d.Vector = h3d.Vector.fromArray(value);
 				shaderGraph.setParameterDefaultValue(parameter.id, value);
 				picker.value = start.toColor();
+
+				parametersUpdate.set(parameter.id, (v:Dynamic) -> picker.value = v.toColor());
+
 				var saveValue : Null<h3d.Vector4> = null;
 				picker.onChange = function(move) {
 					if (saveValue == null) {
@@ -377,7 +397,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 						saveValue = null;
 						function exec(isUndo : Bool) {
 							var v = isUndo ? old : curr;
-							picker.value = v.toColor();
+							parametersUpdate[parameter.id](v);
 							shaderGraph.setParameterDefaultValue(parameter.id, [v.x, v.y, v.z, v.w]);
 							updateParam(parameter.id);
 						}
@@ -397,11 +417,17 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 					value = [for (i in 0...n) 0.0];
 
 				shaderGraph.setParameterDefaultValue(parameter.id, value);
+
 				//var row = new Element('<div class="flex"/>').appendTo(defaultValue);
 
+				var ranges : Array<hide.comp.Range> = [];
+
+				var saveValue : Array<Float> = null;
+
 				for( i in 0...n ) {
 					var parentRange = new Element('<input type="range" min="-1" max="1" />').appendTo(defaultValue);
 					var range = new hide.comp.Range(null, parentRange);
+					ranges.push(range);
 					range.value = value[i];
 
 					var rangeInput = @:privateAccess range.f;
@@ -415,6 +441,25 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 					});
 
 					range.onChange = function(move) {
+						if (saveValue == null) {
+							saveValue = (shaderGraph.getParameter(parameter.id).defaultValue:Array<Float>).copy();
+						}
+	
+						if (move == false) {
+							var old = saveValue;
+							var curr = [for (i in 0...n) ranges[i].value];
+							saveValue = null;
+							function exec(isUndo : Bool) {
+								var v = isUndo ? old : curr;
+								shaderGraph.setParameterDefaultValue(parameter.id, v);
+								parametersUpdate[parameter.id](v);
+								updateParam(parameter.id);
+							}
+							exec(false);
+							undo.change(Custom(exec));
+							return;
+						}
+
 						value[i] = range.value;
 						if (!shaderGraph.setParameterDefaultValue(parameter.id, value))
 							return;
@@ -426,6 +471,12 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 					//e.attr("min", "" + min);
 					//e.attr("max", "" + max);
 				}
+				parametersUpdate.set(parameter.id, (v:Dynamic) -> {
+					for (i in 0...n) {
+						ranges[i].value = v[i];
+					}
+				});
+
 				typeName = "Vec" + n;
 			case TSampler(_):
 				var parentSampler = new Element('<input type="texturepath" field="sampler2d"/>').appendTo(defaultValue);
@@ -507,6 +558,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 				if (!isUndo) {
 					shaderGraph.parametersAvailable.remove(parameter.id);
 					shaderGraph.parametersKeys.remove(parameter.id);
+					parametersUpdate.remove(parameter.id);
 					shaderGraph.checkParameterIndex();
 					elt.remove();
 				} else {
@@ -1029,6 +1081,14 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		return edges.iterator();
 	}
 
+	public function serializeNode(node: IGraphNode) : Dynamic {
+		return (cast node:ShaderNode).serializeToDynamic();
+	}
+
+	public function unserializeNode(data : Dynamic) : IGraphNode {
+		return ShaderNode.createFromDynamic(data, shaderGraph);
+	}
+
 	public function getAddNodesMenu() : Array<AddNodeMenuEntry> {
 		var entries : Array<AddNodeMenuEntry> = [];