浏览代码

[animgraph] Refactored genericGraphEditor to use a ScenePreview

Clément Espeute 8 月之前
父节点
当前提交
675051f016
共有 3 个文件被更改,包括 12 次插入107 次删除
  1. 2 12
      hide/view/GenericGraphEditor.hx
  2. 9 94
      hide/view/animgraph/AnimGraphEditor.hx
  3. 1 1
      hrt/animgraph/nodes/BlendPerBone.hx

+ 2 - 12
hide/view/GenericGraphEditor.hx

@@ -7,8 +7,7 @@ class GenericGraphEditor extends hide.view.FileView implements IGraphEditor {
     var graphEditor : hide.view.GraphEditor;
 
     var previewContainer : Element;
-    var scenePreview : hide.comp.Scene;
-    var previewCamController : hide.comp.Scene.PreviewCamController;
+    var scenePreview : hide.comp.ScenePreview;
 
     var editorRoot : Element;
     var graphContainer: Element;
@@ -52,7 +51,7 @@ class GenericGraphEditor extends hide.view.FileView implements IGraphEditor {
         var height = getDisplayState("preview.width") ?? 300;
 
         // Scene init
-        scenePreview = new hide.comp.Scene(config, previewContainer, null);
+        scenePreview = new hide.comp.ScenePreview(config, previewContainer, null, saveDisplayKey + "/scenePreview");
         scenePreview.element.addClass("scene-preview");
 
         scenePreview.onReady = onScenePreviewReady;
@@ -127,20 +126,11 @@ class GenericGraphEditor extends hide.view.FileView implements IGraphEditor {
         }
     }
 
-    public function previewFocusObject(obj: h3d.scene.Object) {
-        if (previewCamController == null)
-            return;
-		var bounds = obj.getBounds();
-		var sp = bounds.toSphere();
-		previewCamController.set(sp.r * 3.0, Math.PI / 4, Math.PI * 5 / 13, sp.getCenter());
-	}
-
     function getPreviewOptionsMenu() : Array<hide.comp.ContextMenu.MenuItem> {
         return [];
     }
 
     function onScenePreviewReady() {
-        previewCamController = new hide.comp.Scene.PreviewCamController(scenePreview.s3d);
     }
 
     function onScenePreviewUpdate(dt: Float) {

+ 9 - 94
hide/view/animgraph/AnimGraphEditor.hx

@@ -3,19 +3,12 @@ using Lambda;
 import hide.view.GraphInterface;
 import hrt.animgraph.*;
 
-class PreviewSettings {
-    public var modelPath: String = null;
-
-    public function new() {};
-}
-
 @:access(hrt.animgraph.AnimGraph)
 @:access(hrt.animgraph.AnimGraphInstance)
 @:access(hrt.animgraph.Node)
 class AnimGraphEditor extends GenericGraphEditor {
 
     var animGraph : hrt.animgraph.AnimGraph;
-    public var previewModel : h3d.scene.Object;
     public var previewPrefab : hrt.prefab.Prefab;
 
     var parametersList : hide.Element;
@@ -24,8 +17,6 @@ class AnimGraphEditor extends GenericGraphEditor {
     var previewNode : hrt.animgraph.nodes.AnimNode = null;
     var queuedPreview : hrt.animgraph.nodes.AnimNode = null;
 
-    var previewSettings : PreviewSettings = new PreviewSettings();
-
     override function reloadView() {
         previewNode = null;
         animGraph = cast hide.Ide.inst.loadPrefab(state.path, null,  true);
@@ -51,9 +42,6 @@ class AnimGraphEditor extends GenericGraphEditor {
         }
 
         super.reloadView();
-        loadPreviewSettings();
-
-
 
         var parameters = new Element("<graph-parameters></graph-parameters>").appendTo(propertiesContainer);
         new Element("<h1>Parameters</h1>").appendTo(parameters);
@@ -88,10 +76,6 @@ class AnimGraphEditor extends GenericGraphEditor {
 			graphEditor.opBox(inst, true, graphEditor.currentUndoBuffer);
 			graphEditor.commitUndo();
         });
-
-        if (previewSettings.modelPath == null) {
-            previewSettings.modelPath = gatherAllPreviewModels(animGraph.animFolder)[0];
-        }
     }
 
     static public function gatherAllPreviewModels(basePath : String) : Array<String> {
@@ -128,9 +112,7 @@ class AnimGraphEditor extends GenericGraphEditor {
         for (path in paths) {
             var basePath = StringTools.replace(path, animGraph.animFolder + "/", "");
             models.push({label: basePath, click: () -> {
-                previewSettings.modelPath = path;
-                savePreviewSettings();
-                reloadPreviewModel();
+                scenePreview.setObjectPath(path);
             }});
         }
 
@@ -138,11 +120,6 @@ class AnimGraphEditor extends GenericGraphEditor {
         return options;
     }
 
-    public function setPreviewMesh(path: String) {
-
-        savePreviewSettings();
-    }
-
     public function refreshPreview() {
         if (previewNode != null)
             setPreview(previewNode);
@@ -157,6 +134,7 @@ class AnimGraphEditor extends GenericGraphEditor {
 
         // refresh animation
         {
+            var previewModel = scenePreview.prefab?.find(hrt.prefab.Model, (f) -> StringTools.startsWith(f.source, animGraph.animFolder))?.local3d;
             if (previewModel == null)
                 return;
 
@@ -304,6 +282,10 @@ class AnimGraphEditor extends GenericGraphEditor {
                 ]);
             });
         }
+
+        scenePreview.onObjectLoaded = () -> {
+            setPreview(cast animGraph.nodes.find((f) -> Std.downcast(f, hrt.animgraph.nodes.Output) != null));
+        }
     }
 
     function execRemoveParam(index: Int) {
@@ -359,58 +341,10 @@ class AnimGraphEditor extends GenericGraphEditor {
     override function onScenePreviewReady() {
         super.onScenePreviewReady();
 
-        reloadPreviewModel();
-        resetPreviewCamera();
-    }
-
-    function reloadPreviewModel() {
-        if (previewModel != null) {
-            previewModel.remove();
-            previewModel = null;
-        }
-
-        if (previewPrefab != null) {
-            previewPrefab.dispose();
-            previewPrefab.shared.root3d?.remove();
-            previewPrefab.shared.root2d?.remove();
-            previewPrefab = null;
+        if (scenePreview.getObjectPath() == null) {
+            scenePreview.setObjectPath(gatherAllPreviewModels(animGraph.animFolder)[0]);
         }
-
-        if (previewSettings.modelPath == null)
-            return;
-
-        try {
-            if (StringTools.endsWith(previewSettings.modelPath, ".prefab")) {
-                try {
-                    previewPrefab = Ide.inst.loadPrefab(previewSettings.modelPath);
-                } catch (e) {
-                    throw 'Could not load mesh ${previewSettings.modelPath}, error : $e';
-                }
-                var ctx = new hide.prefab.ContextShared(null, new h3d.scene.Object(scenePreview.s3d));
-                ctx.scene = scenePreview;
-                previewPrefab.setSharedRec(ctx);
-                previewPrefab = previewPrefab.make();
-
-                previewModel = previewPrefab.find(hrt.prefab.Model, (m) -> StringTools.startsWith(m.source, animGraph.animFolder))?.local3d;
-                if (previewModel == null) {
-                    throw "Linked prefab doesn't contain any suitable model";
-                }
-            } else if (StringTools.endsWith(previewSettings.modelPath, ".fbx")) {
-                previewModel =  scenePreview.loadModel(previewSettings.modelPath);
-                scenePreview.s3d.addChild(previewModel);
-            }
-            else {
-                throw "Unsupported model format";
-            }
-        } catch (e) {
-            previewSettings.modelPath = null;
-            ide.quickError("Couldn't load preview : " + e);
-            savePreviewSettings();
-            reloadPreviewModel(); // cleanup
-            return;
-        }
-
-        setPreview(cast animGraph.nodes.find((f) -> Std.downcast(f, hrt.animgraph.nodes.Output) != null));
+        scenePreview.resetCamera();
     }
 
     override function getNodes() : Iterator<IGraphNode> {
@@ -542,25 +476,6 @@ class AnimGraphEditor extends GenericGraphEditor {
         }
     }
 
-    function resetPreviewCamera() {
-        previewFocusObject(previewModel);
-    }
-
-    public function loadPreviewSettings() {
-		var save = haxe.Json.parse(getDisplayState("previewSettings") ?? "{}");
-		previewSettings = new PreviewSettings();
-		for (f in Reflect.fields(previewSettings)) {
-			var v = Reflect.field(save, f);
-			if (v != null) {
-				Reflect.setField(previewSettings, f, v);
-			}
-		}
-	}
-
-	public function savePreviewSettings() {
-		saveDisplayState("previewSettings", haxe.Json.stringify(previewSettings));
-	}
-
     function addParameter() {
         var newParam = new hrt.animgraph.AnimGraph.Parameter();
         newParam.name = "New Parameter";

+ 1 - 1
hrt/animgraph/nodes/BlendPerBone.hx

@@ -59,7 +59,7 @@ class BlendPerBone extends AnimNode {
 		button.label = targetBone;
 
 		button.onClick = () -> {
-			var model = getAnimEditor().previewModel;
+			var model = @:privateAccess getAnimEditor().scenePreview.prefab.findFirstLocal3d();
 			if (model == null)
 				return;