Browse Source

[shgraph] Undo redo edit parameter somewhat working

Clément Espeute 1 năm trước cách đây
mục cha
commit
1276b8e611

+ 1 - 1
bin/style.css

@@ -2026,7 +2026,7 @@ input[type=checkbox]:checked:after {
   top: -10px;
 }
 .shader-editor #rightPanel .hide-block #parametersList .parameter:after {
-  border-bottom: 5px solid red;
+  border-bottom: 5px solid purple;
   bottom: -10px;
 }
 .shader-editor #rightPanel .hide-block #parametersList .parameter .header {

+ 1 - 1
bin/style.less

@@ -2230,7 +2230,7 @@ input[type=checkbox] {
 					}
 
 					&:after {
-						border-bottom: 5px solid red;
+						border-bottom: 5px solid purple;
 						bottom: -10px;
 					}
 

+ 2 - 2
hide/view/shadereditor/Box.hx

@@ -71,7 +71,7 @@ class Box {
 			this.element.addClass("comment");
 		}
 
-		if (info.noHeader) {
+		if (info.noHeader ?? false) {
 			HEADER_HEIGHT = 0;
 			hasHeader = false;
 		}
@@ -336,7 +336,7 @@ class Box {
 		var nodeCircle = editor.editorDisplay.circle(node, width, nodeHeight, NODE_RADIUS, style).addClass("node output-node");
 
 		if (name.length > 0 && name != "output")
-			editor.editorDisplay.text(node, width - NODE_TITLE_PADDING - (name.length * 6.75), nodeHeight + 4, name).addClass("title-node");
+			editor.editorDisplay.text(node, width - NODE_TITLE_PADDING, nodeHeight + 4, name).addClass("title-node").attr("text-anchor", "end");
 
 		outputs.push(nodeCircle);
 

+ 117 - 37
hide/view/shadereditor/ShaderEditor.hx

@@ -141,7 +141,6 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 
 	var parametersList : JQuery;
 	var draggedParamId : Int;
-	
 
 	var defaultLight : hrt.prefab.Light;
 
@@ -270,14 +269,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 	function moveParameter(parameter : Parameter, up : Bool) {
 		var parameterElt = parametersList.find("#param_" + parameter.id);
 		var parameterPrev = shaderGraph.parametersAvailable.get(shaderGraph.parametersKeys[shaderGraph.parametersKeys.indexOf(parameter.id) + (up? -1 : 1)]);
-		var parameterPrevElt = parametersList.find("#param_" + parameterPrev.id);
-		if (up)
-			parameterElt.insertBefore(parameterPrevElt);
-		else
-			parameterElt.insertAfter(parameterPrevElt);
-		shaderGraph.parametersKeys.remove(parameter.id);
-		shaderGraph.parametersKeys.insert(shaderGraph.parametersKeys.indexOf(parameterPrev.id) + (up? 0 : 1), parameter.id);
-		shaderGraph.checkParameterIndex();
+		execMoveParameterTo(parameter, parameterPrev, !up);
 	}
 
 	function updateParam(id : Int) {
@@ -287,10 +279,6 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		var init = compiledShader.inits.find((i) -> i.variable.name == param.name);
 		if (init != null) {
 			setParamValue(meshPreviewShader, init.variable, param.defaultValue);
-		} else {
-			// The init can be missing if the variable has been optimised away,
-			// so try a recompilation 
-			requestRecompile();
 		}
 	}
 
@@ -327,6 +315,8 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 				var parentRange = new Element('<input type="range" min="-1" max="1" />').appendTo(defaultValue);
 				var range = new hide.comp.Range(null, parentRange);
 				var rangeInput = @:privateAccess range.f;
+
+				var save : Null<Float> = null;
 				rangeInput.on("mousedown", function(e) {
 					elt.attr("draggable", "false");
 					//beforeChange();
@@ -338,10 +328,30 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 				if (value == null) value = 0;
 				range.value = value;
 				shaderGraph.setParameterDefaultValue(parameter.id, value);
+				
+				var saveValue : Null<Float> = null;
 				range.onChange = function(moving) {
+					if (saveValue == null) {
+						saveValue = shaderGraph.getParameter(parameter.id).defaultValue;
+					}
+
+					if (moving == false) {
+						var old = saveValue;
+						var curr = range.value;
+						saveValue = null;
+						function exec(isUndo : Bool) {
+							var v = isUndo ? old : curr;
+							range.value = v;
+							shaderGraph.setParameterDefaultValue(parameter.id, v); 
+							updateParam(parameter.id);
+						}
+						exec(false);
+						undo.change(Custom(exec));
+						return;
+					}
+
 					if (!shaderGraph.setParameterDefaultValue(parameter.id, range.value))
 						return;
-					//setBoxesParam(parameter.id);
 					updateParam(parameter.id);
 				};
 				typeName = "Number";
@@ -355,13 +365,33 @@ 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();
+				var saveValue : Null<h3d.Vector4> = null;
 				picker.onChange = function(move) {
+					if (saveValue == null) {
+						saveValue = new h3d.Vector4();
+						saveValue.load(h3d.Vector4.fromArray(shaderGraph.getParameter(parameter.id).defaultValue));
+					}
+					if (!move) {
+						var curr = h3d.Vector4.fromColor(picker.value);
+						var old = saveValue;
+						saveValue = null;
+						function exec(isUndo : Bool) {
+							var v = isUndo ? old : curr;
+							picker.value = v.toColor();
+							shaderGraph.setParameterDefaultValue(parameter.id, [v.x, v.y, v.z, v.w]);
+							updateParam(parameter.id);
+						}
+						exec(false);
+						undo.change(Custom(exec));
+						return;
+					}
 					var vecColor = h3d.Vector4.fromColor(picker.value);
 					if (!shaderGraph.setParameterDefaultValue(parameter.id, [vecColor.x, vecColor.y, vecColor.z, vecColor.w]))
 						return;
 					//setBoxesParam(parameter.id);
 					updateParam(parameter.id);
 				};
+				typeName = "Color";
 			case TVec(n, VFloat):
 				if (value == null)
 					value = [for (i in 0...n) 0.0];
@@ -461,19 +491,41 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		content.appendTo(elt);
 		var actionBtns = new Element('<div class="action-btns" ></div>').appendTo(content);
 		var deleteBtn = new Element('<input type="button" value="Delete" />');
-		/*deleteBtn.on("click", function() {
-			for (b in listOfBoxes) {
-				var shaderParam = Std.downcast(b.getInstance(), ShaderParam);
-				if (shaderParam != null && shaderParam.parameterId == parameter.id) {
-					error("This parameter is used in the graph.");
-					return;
+		deleteBtn.on("click", function() {
+			@:privateAccess
+			for (graph in shaderGraph.graphs) {
+				for (node in graph.getNodes()) {
+					var shaderParam = Std.downcast(node, ShaderParam);
+					if (shaderParam != null && shaderParam.parameterId == parameter.id) {
+						Ide.inst.quickError("This parameter is used in the graph.");
+						return;
+					}
 				}
 			}
-			beforeChange();
-			shaderGraph.removeParameter(parameter.id);
-			afterChange();
-			elt.remove();
-		});*/
+
+			function exec(isUndo : Bool) {
+				if (!isUndo) {
+					shaderGraph.parametersAvailable.remove(parameter.id);
+					shaderGraph.parametersKeys.remove(parameter.id);
+					shaderGraph.checkParameterIndex();
+					elt.remove();
+				} else {
+					shaderGraph.parametersAvailable.set(parameter.id, parameter);
+					shaderGraph.parametersKeys.insert(parameter.index, parameter.id);
+					shaderGraph.checkParameterIndex();
+					
+					updateParam(parameter.id);
+					addParameter(parameter, parameter.defaultValue);
+
+					for (id in shaderGraph.parametersKeys) {
+						var newElt = parametersList.find("#param_" + id);
+						parametersList.append(newElt);
+					}
+				}
+			}
+			exec(false);
+			undo.change(Custom(exec));
+		});
 		deleteBtn.appendTo(actionBtns);
 
 
@@ -533,7 +585,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			elt.toggleClass("hoverbot", false);
 			var other = shaderGraph.getParameter(draggedParamId);
 			var after = isAfter(e);
-			moveParameterTo(other, parameter, after);
+			execMoveParameterTo(other, parameter, after);
 		});
 
 		return elt;
@@ -565,22 +617,50 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		}
 	}
 
-	function moveParameterTo(paramA: Parameter, paramB: Parameter, after: Bool) {
-		if (paramA == paramB)
+	function execMoveParameterTo(paramA: Parameter, paramB: Parameter, after: Bool) {
+		var oldIndex = paramA.index;
+		var newIndex = paramB.index;
+		var delta = newIndex - oldIndex;
+		if (delta == 0)
 			return;
-		var aElt = parametersList.find("#param_" + paramA.id);
-		var bElt = parametersList.find("#param_" + paramB.id);
 
-		if (!after) {
-			aElt.insertBefore(bElt);
-		} else {
-			aElt.insertAfter(bElt);
+		if (after && delta < 0)
+			delta += 1;
+		if (!after && delta > 0)
+			delta -= 1;
+
+		function exec(isUndo: Bool) {
+			moveParameterOffset(paramA, isUndo ? -delta : delta);
+		}
+		exec(false);
+		undo.change(Custom(exec));
+	}
+
+	function moveParameterOffset(paramA: Parameter, offset: Int) {
+		trace("---");
+		trace(shaderGraph.parametersKeys);
+
+		var current = paramA.index;
+		var end = current + offset;
+		var dir = offset > 0 ? 1 : -1;
+		while(current != end) {
+			var next = current + dir;
+			var tmp = shaderGraph.parametersKeys[current];
+			shaderGraph.parametersKeys[current] = shaderGraph.parametersKeys[next];
+			shaderGraph.parametersKeys[next] = tmp;
+			current = next;
 		}
 
-		shaderGraph.parametersKeys.remove(paramA.id);
-		shaderGraph.parametersKeys.insert(shaderGraph.parametersKeys.indexOf(paramB.id)+ (after ? 1 : 0) , paramA.id);
 
+		trace('move ${paramA.name} by $offset');
+		trace(shaderGraph.parametersKeys);
+		
 		shaderGraph.checkParameterIndex();
+
+		for (id in shaderGraph.parametersKeys) {
+			var elt = parametersList.find("#param_" + id);
+			parametersList.append(elt);
+		}
 	}
 
 
@@ -1051,7 +1131,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			var start = Timer.stamp();
 			compiledShader = shaderGraph.compile(Fragment);
 			bitmapToShader.clear();
-			previewVar = compiledShader.inits.find((e) -> e.variable.name == hrt.shgraph.Variables.previewSelectName).variable;
+			previewVar = compiledShader.inits.find((e) -> e.variable.name == hrt.shgraph.Variables.previewSelectName)?.variable;
 			var end = Timer.stamp();
 			Ide.inst.quickMessage('shader recompiled in ${(end - start) * 1000.0} ms', 2.0);
 

+ 1 - 0
hrt/shgraph/ShaderNode.hx

@@ -94,6 +94,7 @@ implements hide.view.GraphInterface.IGraphNode
 				fullSize: false,
 			},
 			width: metas.width != null ? metas.width[0] : null,
+			noHeader: Reflect.hasField(metas, "noheader"),
 		};
 	}
 

+ 2 - 55
hrt/shgraph/ShaderParam.hx

@@ -2,7 +2,7 @@ package hrt.shgraph;
 
 using hxsl.Ast;
 
-@noheader()
+@name("Parameter")
 @width(120)
 @color("#d6d6d6")
 class ShaderParam extends ShaderNode {
@@ -27,7 +27,7 @@ class ShaderParam extends ShaderNode {
 			default:
 				throw "Unhandled var type " + variable.type;
 		}
-		return [{name: "output", type: t}];
+		return [{name: variable.name, type: t}];
 	}
 
 	override function generate(ctx: NodeGenContext) {
@@ -63,57 +63,4 @@ class ShaderParam extends ShaderNode {
 		return parameters;
 	}
 
-	#if editor
-	private var parameterName : String;
-	private var eltName : hide.Element;
-
-	private var parameterDisplay : String;
-	private var displayDiv : hide.Element;
-	public function setName(s : String) {
-		parameterName = s;
-		if (eltName != null)
-			eltName.html(s);
-	}
-	public function setDisplayValue(value : String) {
-		parameterDisplay = value;
-		switch (this.getVariable().type) {
-			case TFloat:
-				if (displayDiv != null)
-					displayDiv.html(value);
-			case TSampler(_):
-				if (displayDiv != null)
-					displayDiv.css("background-image", 'url(${value})');
-			case TVec(4, VFloat):
-				if (displayDiv != null)
-					displayDiv.css("background-color", value);
-			default:
-		}
-	}
-	override public function getPropertiesHTML(width : Float) : Array<hide.Element> {
-		var elements = super.getPropertiesHTML(width);
-		var height = 25;
-		switch (getVariable().type) {
-			case TFloat:
-				displayDiv = new hide.Element('<div class="float-preview" ></div>');
-				height += 20;
-			case TSampler(_):
-				displayDiv = null;
-			case TVec(4, VFloat):
-				displayDiv = null;
-			default:
-				displayDiv = null;
-		}
-		var element = new hide.Element('<div style="width: 110px; height: ${height}px"></div>');
-		if (displayDiv != null) {
-			setDisplayValue(parameterDisplay);
-			displayDiv.appendTo(element);
-		}
-		eltName = new hide.Element('<div class="paramVisible" >${parameterName}</div>').appendTo(element);
-
-		elements.push(element);
-
-		return elements;
-	}
-	#end
-
 }