فهرست منبع

[animgraph] Tweaks, bugfix and ux improvement

Clément Espeute 8 ماه پیش
والد
کامیت
761842d18a

+ 36 - 8
hide/view/animgraph/AnimGraphEditor.hx

@@ -15,6 +15,7 @@ class AnimGraphEditor extends GenericGraphEditor {
     var previewAnimation : AnimGraphInstance = null;
     var previewAnimation : AnimGraphInstance = null;
 
 
     var previewNode : hrt.animgraph.nodes.AnimNode = null;
     var previewNode : hrt.animgraph.nodes.AnimNode = null;
+    var queuedPreview : hrt.animgraph.nodes.AnimNode = null;
 
 
     override function reloadView() {
     override function reloadView() {
         previewNode = null;
         previewNode = null;
@@ -66,12 +67,17 @@ class AnimGraphEditor extends GenericGraphEditor {
     }
     }
 
 
     public function setPreview(newOutput: hrt.animgraph.nodes.AnimNode) {
     public function setPreview(newOutput: hrt.animgraph.nodes.AnimNode) {
+        queuedPreview = newOutput;
+    }
+
+    public function setPreviewInternal(newOutput: hrt.animgraph.nodes.AnimNode) {
         previewNode = newOutput;
         previewNode = newOutput;
 
 
         // refresh animation
         // refresh animation
         {
         {
             if (previewModel == null)
             if (previewModel == null)
                 return;
                 return;
+
             var anim = animGraph.getAnimation(previewNode);
             var anim = animGraph.getAnimation(previewNode);
             previewModel.playAnimation(anim);
             previewModel.playAnimation(anim);
             previewAnimation = cast previewModel.currentAnimation;
             previewAnimation = cast previewModel.currentAnimation;
@@ -79,9 +85,9 @@ class AnimGraphEditor extends GenericGraphEditor {
         }
         }
 
 
         // copy runtime parameters
         // copy runtime parameters
-        for (index => param in animGraph.parameters) {
-            animGraph.parameters[index].runtimeValue = param.runtimeValue;
-        }
+        // for (index => param in animGraph.parameters) {
+        //     previewAnimation.animGraph.parameters[index].runtimeValue = param.runtimeValue;
+        // }
         graphEditor.refreshPreviewButtons();
         graphEditor.refreshPreviewButtons();
     }
     }
 
 
@@ -139,8 +145,7 @@ class AnimGraphEditor extends GenericGraphEditor {
             var props = new Element("<ul>").appendTo(content);
             var props = new Element("<ul>").appendTo(content);
             if (previewAnimation != null) {
             if (previewAnimation != null) {
                 var runtimeParam = previewAnimation.parameterMap.get(param.name);
                 var runtimeParam = previewAnimation.parameterMap.get(param.name);
-                var line = new Element("<li></li>").appendTo(props);
-                var slider = new Element('<li><dd>Preview</dd><input type="range" min="0.0" max="1.0" step="0.01" value="${param.runtimeValue}"></input></li>').appendTo(line).find("input");
+                var slider = new Element('<li><dd>Preview</dd><input type="range" min="0.0" max="1.0" step="0.01" value="${param.runtimeValue}"></input></li>').appendTo(props).find("input");
 
 
                 slider.on("input", (e) -> {
                 slider.on("input", (e) -> {
                     var value = Std.parseFloat(slider.val());
                     var value = Std.parseFloat(slider.val());
@@ -157,8 +162,22 @@ class AnimGraphEditor extends GenericGraphEditor {
                     }
                     }
                 });
                 });
 
 
-                var line = new Element("<li></li>").appendTo(props);
-                var def = new Element('<dd>Default</dd><input type="range" min="0.0" max="1.0" step="0.01" value="${param.runtimeValue}"></input>').appendTo(line).find("input");
+                var def = new Element('<li><dd>Default</dd><input type="range" min="0.0" max="1.0" step="0.01" value="${param.defaultValue}"></input></li>').appendTo(props).find("input");
+                var current = param.defaultValue;
+                def.change((e) -> {
+                    var newValue = Std.parseFloat(def.val());
+                    if (newValue != current) {
+                        var prev = current;
+                        var curr = newValue;
+                        var exec = function(isUndo: Bool) {
+                            var v = !isUndo ? curr : prev;
+                            def.val(v);
+                            param.defaultValue = v;
+                        }
+                        exec(false);
+                        undo.change(Custom(exec));
+                    }
+                });
             }
             }
         }
         }
     }
     }
@@ -180,7 +199,7 @@ class AnimGraphEditor extends GenericGraphEditor {
         previewModel = scenePreview.loadModel("Ogre/Ogre_Kobold.fbx");
         previewModel = scenePreview.loadModel("Ogre/Ogre_Kobold.fbx");
         scenePreview.s3d.addChild(previewModel);
         scenePreview.s3d.addChild(previewModel);
 
 
-        setPreview(previewNode);
+        setPreview(cast animGraph.nodes.find((f) -> Std.downcast(f, hrt.animgraph.nodes.Output) != null));
     }
     }
 
 
     override function getNodes() : Iterator<IGraphNode> {
     override function getNodes() : Iterator<IGraphNode> {
@@ -303,6 +322,15 @@ class AnimGraphEditor extends GenericGraphEditor {
         setPreview(previewNode);
         setPreview(previewNode);
     }
     }
 
 
+    override function onScenePreviewUpdate(dt:Float) {
+        super.onScenePreviewUpdate(dt);
+
+        if (queuedPreview != null) {
+            setPreviewInternal(queuedPreview);
+            queuedPreview = null;
+        }
+    }
+
     function addParameter() {
     function addParameter() {
         var newParam = new hrt.animgraph.AnimGraph.Parameter();
         var newParam = new hrt.animgraph.AnimGraph.Parameter();
         newParam.name = "New Parameter";
         newParam.name = "New Parameter";

+ 5 - 2
hide/view/animgraph/BlendSpace2DEditor.hx

@@ -45,7 +45,10 @@ class BlendSpace2DEditor extends hide.view.FileView {
 	}
 	}
 
 
 	override function onRebuild() {
 	override function onRebuild() {
-		blendSpace2D = cast hide.Ide.inst.loadPrefab(state.path, null,  true);
+		blendSpace2D = Std.downcast(hide.Ide.inst.loadPrefab(state.path, null,  true), hrt.animgraph.BlendSpace2D);
+		if (blendSpace2D == null)
+			throw "Invalid blendSpace2D";
+
 		super.onRebuild();
 		super.onRebuild();
 		element.html("");
 		element.html("");
 
 
@@ -456,5 +459,5 @@ class BlendSpace2DEditor extends hide.view.FileView {
 		}
 		}
 	}
 	}
 
 
-    static var _ = FileTree.registerExtension(BlendSpace2DEditor,["blendspace2d"],{ icon : "arrows-alt", createNew: "Blend Space 2D" });
+    static var _ = FileTree.registerExtension(BlendSpace2DEditor,["bs2d"],{ icon : "arrows-alt", createNew: "Blend Space 2D" });
 }
 }

+ 1 - 0
hrt/animgraph/AnimGraph.hx

@@ -101,6 +101,7 @@ class AnimGraph extends hrt.prefab.Prefab {
 				var copyParameter = new Parameter();
 				var copyParameter = new Parameter();
 				@:privateAccess copyParameter.copyFromDynamic(parameter);
 				@:privateAccess copyParameter.copyFromDynamic(parameter);
 				unserializedParameters.push(copyParameter);
 				unserializedParameters.push(copyParameter);
+				copyParameter.runtimeValue = copyParameter.defaultValue;
 			}
 			}
 		}
 		}
 
 

+ 5 - 5
hrt/animgraph/AnimGraphInstance.hx

@@ -35,10 +35,10 @@ class AnimGraphInstance extends h3d.anim.Animation {
 
 
 		var inst = new AnimGraphInstance(outputNode, animGraph.name, 1000, 1/60.0);
 		var inst = new AnimGraphInstance(outputNode, animGraph.name, 1000, 1/60.0);
 
 
-		for (param in animGraph.parameters) {
-			inst.parameterMap.set(param.name, param);
-			param.runtimeValue = param.defaultValue;
-		}
+		// for (param in animGraph.parameters) {
+		// 	inst.parameterMap.set(param.name, param);
+		// 	param.runtimeValue = param.defaultValue;
+		// }
 
 
 		return inst;
 		return inst;
 	}
 	}
@@ -74,7 +74,7 @@ class AnimGraphInstance extends h3d.anim.Animation {
 			clonedParam.parameter = inst.parameterMap.getOrPut(nodeParam.parameter.name, {
 			clonedParam.parameter = inst.parameterMap.getOrPut(nodeParam.parameter.name, {
 				var newParam = new hrt.animgraph.AnimGraph.Parameter();
 				var newParam = new hrt.animgraph.AnimGraph.Parameter();
 				@:privateAccess newParam.copyFromOther(nodeParam.parameter);
 				@:privateAccess newParam.copyFromOther(nodeParam.parameter);
-				nodeParam.parameter.runtimeValue = nodeParam.parameter.defaultValue;
+				newParam.runtimeValue = nodeParam.parameter.defaultValue;
 				newParam;
 				newParam;
 			});
 			});
 		}
 		}

+ 1 - 1
hrt/animgraph/BlendSpace2D.hx

@@ -31,7 +31,7 @@ class BlendSpace2D extends hrt.prefab.Prefab {
 		}
 		}
 	}
 	}
 
 
-	static var _ = hrt.prefab.Prefab.register("blendspace2d", BlendSpace2D, "blendspace2d");
+	static var _ = hrt.prefab.Prefab.register("blendspace2d", BlendSpace2D, "bs2d");
 }
 }
 
 
 typedef BlendSpaceInstancePoint = {
 typedef BlendSpaceInstancePoint = {

+ 33 - 2
hrt/animgraph/nodes/BlendSpace2D.hx

@@ -18,7 +18,7 @@ class BlendSpace2D extends AnimNode {
 	@:input var bsX(default, set): Float = 0.5;
 	@:input var bsX(default, set): Float = 0.5;
 	@:input var bsY(default, set): Float = 0.5;
 	@:input var bsY(default, set): Float = 0.5;
 
 
-	@:s var path : String = "AnimGraph/blendSpaceOgreLocomotion.blendspace2d";
+	@:s var path : String = "";
 
 
 	var dirtyPos: Bool = true;
 	var dirtyPos: Bool = true;
 
 
@@ -56,6 +56,8 @@ class BlendSpace2D extends AnimNode {
 		var curOurBoneId = 0;
 		var curOurBoneId = 0;
 
 
 		if (blendSpace == null) {
 		if (blendSpace == null) {
+			if (!hxd.res.Loader.currentInstance.exists(path))
+				return boneMap;
 			blendSpace = cast hxd.res.Loader.currentInstance.load(path).toPrefab().load();
 			blendSpace = cast hxd.res.Loader.currentInstance.load(path).toPrefab().load();
 		}
 		}
 
 
@@ -114,7 +116,6 @@ class BlendSpace2D extends AnimNode {
 	override function tick(dt:Float) {
 	override function tick(dt:Float) {
 		super.tick(dt);
 		super.tick(dt);
 
 
-		trace(bsX, bsY);
 		for (animInfo in animInfos) {
 		for (animInfo in animInfos) {
 			animInfo.anim.update(dt);
 			animInfo.anim.update(dt);
 			@:privateAccess animInfo.anim.isSync = false;
 			@:privateAccess animInfo.anim.isSync = false;
@@ -227,4 +228,34 @@ class BlendSpace2D extends AnimNode {
 		outMatrix._21 = workQuat.z;
 		outMatrix._21 = workQuat.z;
 		outMatrix._23 = workQuat.w;
 		outMatrix._23 = workQuat.w;
 	}
 	}
+
+	#if editor
+	override function getPropertiesHTML(width:Float):Array<hide.Element> {
+		var elts = super.getPropertiesHTML(width);
+
+		var wrapper = new hide.Element("<input-wrapper></input-wrapper>");
+		wrapper.height("20px");
+
+		var fileSelect = new hide.comp.FileSelect(["bs2d"], wrapper);
+		fileSelect.path = path;
+		fileSelect.onChange = () -> {
+			var prev = path;
+			var curr = fileSelect.path;
+			function exec(isUndo : Bool) {
+				path = !isUndo ? curr : prev;
+				fileSelect.path = path;
+				getAnimEditor().refreshPreview();
+			}
+			exec(false);
+			getAnimEditor().undo.change(Custom(exec));
+		}
+		elts.push(wrapper);
+		return elts;
+	}
+
+	override function getSize():Int {
+		return Node.SIZE_BIG;
+	}
+
+	#end
 }
 }

+ 14 - 5
hrt/animgraph/nodes/Input.hx

@@ -15,9 +15,7 @@ class Input extends AnimNode {
 
 
 	@:s var path : String = "character/Kobold01/Anim_attack01.FBX";
 	@:s var path : String = "character/Kobold01/Anim_attack01.FBX";
 
 
-	override function getSize():Int {
-		return Node.SIZE_BIG;
-	}
+
 
 
 	override function getBones(ctx: hrt.animgraph.nodes.AnimNode.GetBoneContext):Map<String, Int> {
 	override function getBones(ctx: hrt.animgraph.nodes.AnimNode.GetBoneContext):Map<String, Int> {
 		proxy = new AnimProxy();
 		proxy = new AnimProxy();
@@ -55,12 +53,23 @@ class Input extends AnimNode {
 		var fileSelect = new hide.comp.FileSelect(["fbx"], wrapper);
 		var fileSelect = new hide.comp.FileSelect(["fbx"], wrapper);
 		fileSelect.path = path;
 		fileSelect.path = path;
 		fileSelect.onChange = () -> {
 		fileSelect.onChange = () -> {
-			path = fileSelect.path;
-			getAnimEditor().refreshPreview();
+			var prev = path;
+			var curr = fileSelect.path;
+			function exec(isUndo : Bool) {
+				path = !isUndo ? curr : prev;
+				fileSelect.path = path;
+				getAnimEditor().refreshPreview();
+			}
+			exec(false);
+			getAnimEditor().undo.change(Custom(exec));
 		}
 		}
 		elts.push(wrapper);
 		elts.push(wrapper);
 
 
 		return elts;
 		return elts;
 	}
 	}
+
+	override function getSize():Int {
+		return Node.SIZE_BIG;
+	}
 	#end
 	#end
 }
 }

+ 0 - 15
hrt/animgraph/nodes/Output.hx

@@ -15,21 +15,6 @@ class Output extends AnimNode {
 		return Node.SIZE_SMALL;
 		return Node.SIZE_SMALL;
 	}
 	}
 
 
-	override function getInfo():hide.view.GraphInterface.GraphNodeInfo {
-		var info = super.getInfo();
-
-		var animGraphEditor : hide.view.animgraph.AnimGraphEditor = cast editor.editor;
-		info.playButton = {
-			getActive: () -> {
-				return @:privateAccess animGraphEditor.previewNode == null;
-			},
-			onClick: () -> {
-				animGraphEditor.setPreview(null);
-			}
-		};
-		return info;
-	}
-
 	override function getBones(ctx:hrt.animgraph.nodes.AnimNode.GetBoneContext):Map<String, Int> {
 	override function getBones(ctx:hrt.animgraph.nodes.AnimNode.GetBoneContext):Map<String, Int> {
 		return a.getBones(ctx);
 		return a.getBones(ctx);
 	}
 	}