2
0
Эх сурвалжийг харах

[animgraph] Save custom anim set in editor

Clément Espeute 7 сар өмнө
parent
commit
bd0c7776fb

+ 27 - 4
hide/view/animgraph/AnimGraphEditor.hx

@@ -3,6 +3,12 @@ using Lambda;
 import hide.view.GraphInterface;
 import hrt.animgraph.*;
 
+@:structInit
+@:build(hrt.prefab.Macros.buildSerializable())
+class AnimGraphEditorPreviewState {
+    @:s public var providerIndex: Int = 0;
+}
+
 @:access(hrt.animgraph.AnimGraph)
 @:access(hrt.animgraph.AnimGraphInstance)
 @:access(hrt.animgraph.Node)
@@ -17,9 +23,11 @@ class AnimGraphEditor extends GenericGraphEditor {
     var previewNode : hrt.animgraph.nodes.AnimNode = null;
     var queuedPreview : hrt.animgraph.nodes.AnimNode = null;
 
-    var customProviderIndex : Int = 0;
+    var previewState: AnimGraphEditorPreviewState;
 
     override function reloadView() {
+        loadPreviewState();
+
         previewNode = null;
         animGraph = cast hide.Ide.inst.loadPrefab(state.path, null,  true);
 
@@ -47,8 +55,9 @@ class AnimGraphEditor extends GenericGraphEditor {
         refreshPamamList();
 
         var dl = new Element("<dl></dl>").appendTo(propertiesContainer);
-        addAnimSetSelector(dl, undo, () -> customProviderIndex, (i: Int) -> {
-			customProviderIndex = i;
+        addAnimSetSelector(dl, undo, () -> previewState.providerIndex, (i: Int) -> {
+			previewState.providerIndex = i;
+            savePreviewState();
 			refreshPreview();
 		});
 
@@ -177,6 +186,16 @@ class AnimGraphEditor extends GenericGraphEditor {
         return menu;
     }
 
+    public function loadPreviewState() : Void {
+        var settingsSer = haxe.Json.parse(getDisplayState("previewState") ?? "{}");
+        previewState = {};
+        @:privateAccess previewState.copyFromDynamic(settingsSer);
+    }
+
+    public function savePreviewState() : Void {
+        saveDisplayState("previewState", haxe.Json.stringify(@:privateAccess previewState.copyToDynamic({})));
+    }
+
     static public function gatherAllPreviewModels(basePath : String) : Array<String> {
         var paths = [];
 
@@ -279,7 +298,11 @@ class AnimGraphEditor extends GenericGraphEditor {
             var resolver = null;
             if (AnimGraph.customEditorResolverProvider != null) {
                 var providers = AnimGraph.customEditorResolverProvider(_);
-                resolver = providers != null ? providers[customProviderIndex].resolver : null;
+                if (providers != null && previewState.providerIndex > providers.length) {
+                    previewState.providerIndex = 0;
+                    savePreviewState();
+                }
+                resolver = providers != null ? providers[previewState.providerIndex]?.resolver : null;
             }
             var anim = animGraph.getAnimation(previewNode, resolver);
             previewModel.playAnimation(anim);

+ 28 - 12
hide/view/animgraph/BlendSpace2DEditor.hx

@@ -1,9 +1,9 @@
 package hide.view.animgraph;
 
-class BlendSpacePreviewSettings {
-	public var modelPath: String = null;
-
-	public function new() {};
+@:structInit
+@:build(hrt.prefab.Macros.buildSerializable())
+class BlendSpacePreviewState {
+    @:s public var providerIndex: Int = 0;
 }
 
 @:access(hrt.animgraph.BlendSpace2D)
@@ -29,17 +29,15 @@ class BlendSpace2DEditor extends hide.view.FileView {
 
 	var previewAxis : h2d.col.Point = new h2d.col.Point();
 
-	var startMovePos : h2d.col.Point = null;
+    var previewState: BlendSpacePreviewState;
 
-	var previewSettings : BlendSpacePreviewSettings;
+	var startMovePos : h2d.col.Point = null;
 
 	static final pointRadius = 8;
 	var subdivs = 5;
 
 	var animPreview : hrt.animgraph.AnimGraphInstance;
 
-	var customProviderIndex = 0;
-
 	inline function getPointPos(clientX : Float, clientY : Float, snap: Bool) : h2d.col.Point {
 		var x = hxd.Math.clamp(graphXToLocal(clientX), blendSpace2D.minX, blendSpace2D.maxX);
 		var y = hxd.Math.clamp(graphYToLocal(clientY), blendSpace2D.minY, blendSpace2D.maxY);
@@ -58,7 +56,20 @@ class BlendSpace2DEditor extends hide.view.FileView {
 		return inline new h2d.col.Point(x, y);
 	}
 
+    public function loadPreviewState() : Void {
+        var settingsSer = haxe.Json.parse(getDisplayState("previewState") ?? "{}");
+        previewState = {};
+        @:privateAccess previewState.copyFromDynamic(settingsSer);
+    }
+
+    public function savePreviewState() : Void {
+        saveDisplayState("previewState", haxe.Json.stringify(@:privateAccess previewState.copyToDynamic({})));
+    }
+
 	override function onDisplay() {
+
+		loadPreviewState();
+
 		previewModel = null;
 		animPreview = null;
 		blendSpace2D = Std.downcast(hide.Ide.inst.loadPrefab(state.path, null,  true), hrt.animgraph.BlendSpace2D);
@@ -352,7 +363,11 @@ class BlendSpace2DEditor extends hide.view.FileView {
 				if (hrt.animgraph.AnimGraph.customEditorResolverProvider != null) {
 					var resolvers = hrt.animgraph.AnimGraph.customEditorResolverProvider(_);
 					if (resolvers != null) {
-						resolver = resolvers[customProviderIndex]?.resolver;
+						if (previewState.providerIndex > resolvers.length) {
+							previewState.providerIndex = 0;
+							savePreviewState();
+						}
+						resolver = resolvers[previewState.providerIndex]?.resolver;
 					}
 				}
 				animPreview = new hrt.animgraph.AnimGraphInstance(blendSpaceNode, resolver, "", 1000, 1.0/60.0);
@@ -367,7 +382,7 @@ class BlendSpace2DEditor extends hide.view.FileView {
 				if (hrt.animgraph.AnimGraph.customEditorResolverProvider != null) {
 					var resolvers = hrt.animgraph.AnimGraph.customEditorResolverProvider(_);
 					if (resolvers != null) {
-						resolver = resolvers[customProviderIndex]?.resolver;
+						resolver = resolvers[previewState.providerIndex]?.resolver;
 					}
 				}
 				animPreview.resolver = resolver;
@@ -451,8 +466,9 @@ class BlendSpace2DEditor extends hide.view.FileView {
 			updatePreviewAxis();
 		});
 
-		AnimGraphEditor.addAnimSetSelector(preview.find("dl"), undo, () -> customProviderIndex, (i: Int) -> {
-			customProviderIndex = i;
+		AnimGraphEditor.addAnimSetSelector(preview.find("dl"), undo, () -> previewState.providerIndex, (i: Int) -> {
+			previewState.providerIndex = i;
+			savePreviewState();
 			refreshPreviewAnimation();
 		});
 	}