Просмотр исходного кода

[animgraph] ScenePreview mesh picker

Clément Espeute 8 месяцев назад
Родитель
Сommit
18820ee7d4

+ 55 - 0
hide/comp/ScenePreview.hx

@@ -20,6 +20,49 @@ class ScenePreview extends Scene {
 	public function new(config, parent, el, save: String) {
 		this.saveDisplayKey = save;
 		super(config, parent, el);
+
+		var toolbar = new Element('
+		<div class="hide-toolbar2">
+			<div class="tb-group">
+				<div class="button2 transparent" title="More options">
+					<div class="ico ico-navicon"></div>
+				</div>
+			</div>
+		</div>').appendTo(element);
+		var menu = toolbar.find(".button2");
+
+		menu.get(0).onclick = (e: js.html.MouseEvent) -> {
+			var items : Array<hide.comp.ContextMenu.MenuItem> = [];
+
+			var renderProps = listRenderProps();
+			var renderPropsMenu : Array<hide.comp.ContextMenu.MenuItem> = [];
+			for (prop in renderProps) {
+				renderPropsMenu.push({label: prop.name, click: () -> {
+					previewSettings.renderPropsPath = prop.value;
+					loadSavedRenderProps();
+				}, radio: () -> prop.value == previewSettings.renderPropsPath, stayOpen: true});
+			}
+			items.push({label: "Render Props", menu: renderPropsMenu});
+
+			var loadableMeshes = listLoadableMeshes();
+			if (loadableMeshes.length > 0) {
+				var loadableMeshesMenu : Array<hide.comp.ContextMenu.MenuItem> = [];
+				for (mesh in loadableMeshes) {
+					loadableMeshesMenu.push(
+						{
+							label: mesh.label,
+							click: setObjectPath.bind(mesh.path),
+							radio: ()-> mesh.path == previewSettings.modelPath,
+							stayOpen: true,
+						}
+					);
+				}
+				items.push({label: "Preview Mesh", menu: loadableMeshesMenu});
+
+			}
+
+			hide.comp.ContextMenu.createDropdown(menu.get(0), items);
+		}
 	}
 
 	/**
@@ -29,6 +72,10 @@ class ScenePreview extends Scene {
 
 	}
 
+	public dynamic function listLoadableMeshes() : Array<{label: String, path: String}> {
+		return [];
+	}
+
 	override function preOnReady() {
 		super.preOnReady();
 
@@ -38,6 +85,14 @@ class ScenePreview extends Scene {
 		cameraController = new hide.comp.Scene.PreviewCamController(s3d);
 
 		reloadObject();
+
+		if (prefab == null) {
+			var loadableMeshes = listLoadableMeshes();
+			if (loadableMeshes.length > 0) {
+				previewSettings.modelPath = loadableMeshes[0].path;
+				reloadObject();
+			}
+		}
 	}
 
 	function saveSettings() {

+ 0 - 1
hide/comp/cdb/Formulas.hx

@@ -70,7 +70,6 @@ class Formulas {
 	}
 
 	function reloadFile() {
-		throw "Non";
 		load();
 		evaluateAll();
 		editor.save();

+ 0 - 15
hide/view/GenericGraphEditor.hx

@@ -111,21 +111,6 @@ class GenericGraphEditor extends hide.view.FileView implements IGraphEditor {
 
         previewContainer.width(width);
         previewContainer.height(height);
-
-        // Toolbar init
-        var toolbar = new Element('
-        <div class="hide-toolbar2">
-            <div class="tb-group">
-                <div class="button2 transparent" title="More options">
-                    <div class="ico ico-navicon"></div>
-                </div>
-            </div>
-        </div>').appendTo(previewContainer);
-		var menu = toolbar.find(".button2");
-
-        menu.get(0).onclick = (e: js.html.MouseEvent) -> {
-            hide.comp.ContextMenu.createDropdown(menu.get(0), getPreviewOptionsMenu());
-        }
     }
 
     function getPreviewOptionsMenu() : Array<hide.comp.ContextMenu.MenuItem> {

+ 5 - 0
hide/view/animgraph/AnimGraphEditor.hx

@@ -104,6 +104,11 @@ class AnimGraphEditor extends GenericGraphEditor {
                 }
             }
         });
+
+        scenePreview.listLoadableMeshes = () -> {
+            return [ for (p in gatherAllPreviewModels(animGraph.animFolder)) {label: StringTools.replace(p, animGraph.animFolder + "/", ""), path: p} ];
+        }
+
     }
 
     public static function createChooseFolderPrompt(onSet: (path: String) -> Void) : Element {

+ 15 - 15
hide/view/animgraph/BlendSpace2DEditor.hx

@@ -250,6 +250,14 @@ class BlendSpace2DEditor extends hide.view.FileView {
 			panel.onResize = refreshGraph;
 
 			scenePreview = new hide.comp.ScenePreview(config, previewContainer, null, saveDisplayKey + "/preview");
+			scenePreview.listLoadableMeshes = () -> {
+				var ret : Array<{label: String, path: String}> = [];
+				var list = AnimGraphEditor.gatherAllPreviewModels(blendSpace2D.animFolder);
+				for (path in list) {
+					ret.push({label: StringTools.replace(path, blendSpace2D.animFolder + "/", ""), path: path});
+				}
+				return ret;
+			}
 			scenePreviewReady = false;
 			scenePreview.element.addClass("scene-preview");
 
@@ -259,20 +267,6 @@ class BlendSpace2DEditor extends hide.view.FileView {
 				previewModel = scenePreview.prefab?.find(hrt.prefab.Model, (f) -> StringTools.startsWith(f.source, blendSpace2D.animFolder))?.local3d;
 				refreshPreviewAnimation();
 			}
-
-			var toolbar = new Element('
-			<div class="hide-toolbar2">
-				<div class="tb-group">
-					<div class="button2 transparent" title="More options">
-						<div class="ico ico-navicon"></div>
-					</div>
-				</div>
-			</div>').appendTo(previewContainer);
-			var menu = toolbar.find(".button2");
-
-			menu.get(0).onclick = (e: js.html.MouseEvent) -> {
-				hide.comp.ContextMenu.createDropdown(menu.get(0), []);
-			}
 		}
 
 		propertiesContainer = new hide.Element("<properties-container></properties-container>").appendTo(root);
@@ -318,7 +312,13 @@ class BlendSpace2DEditor extends hide.view.FileView {
 			else @:privateAccess {
 				var root : hrt.animgraph.nodes.BlendSpace2D.BlendSpace2D = cast @:privateAccess animPreview.rootNode;
 				var old = root.points[0]?.animInfo?.anim.frame;
-				animPreview.bind(previewModel);
+
+				// if the anim or the mesh changed between the last refreshPreviewAnimation
+				if (previewModel.currentAnimation == animPreview) {
+					animPreview.bind(previewModel);
+				} else {
+					previewModel.playAnimation(animPreview);
+				}
 				if (old != null) {
 					for (point in root.points) {
 						if (point.animInfo != null) {