浏览代码

[shgraph] Open the fx in the preview when clicking 'view' in a shader in a fx

Clément Espeute 11 月之前
父节点
当前提交
46d057e101
共有 4 个文件被更改,包括 91 次插入23 次删除
  1. 5 1
      hide/comp/FileSelect.hx
  2. 1 0
      hide/tools/IdeData.hx
  3. 63 14
      hide/view/shadereditor/ShaderEditor.hx
  4. 22 8
      hrt/prefab/DynamicShader.hx

+ 5 - 1
hide/comp/FileSelect.hx

@@ -26,7 +26,7 @@ class FileSelect extends Component {
 			e.preventDefault();
 			var fpath = getFullPath();
 			new ContextMenu([
-				{ label : "View", enabled : fpath != null, click : function() ide.openFile(fpath) },
+				{ label : "View", enabled : fpath != null, click : function() onView() },
 				{ label : "Clear", enabled : path != null, click : function() { path = null; onChange(); } },
 				{ label : "Copy Path", enabled : path != null, click : function() ide.setClipboard(path) },
 				{ label : "Copy Absolute Path", enabled : fpath != null, click : function() { ide.setClipboard(fpath); } },
@@ -60,6 +60,10 @@ class FileSelect extends Component {
 		});
 	}
 
+	public dynamic function onView() {
+		ide.openFile(getFullPath());
+	}
+
 	public function onDragDrop( items : Array<String>, isDrop : Bool ) : Bool {
 		if( items.length == 0 )
 			return false;

+ 1 - 0
hide/tools/IdeData.hx

@@ -264,6 +264,7 @@ class IdeData {
 			if( checkExists && !sys.FileSystem.exists(path) )
 				return null;
 			var p = hrt.prefab.Prefab.createFromDynamic(parseJSON(sys.io.File.getContent(path)));
+			p.shared.currentPath = file;
 			if( cl == null )
 				return cast p;
 			return p.get(cl);

+ 63 - 14
hide/view/shadereditor/ShaderEditor.hx

@@ -277,6 +277,8 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 	var meshPreviewRenderPropsRoot : h3d.scene.Object;
 
 	var parametersList : JQuery;
+
+	var previewElem : Element;
 	var draggedParamId : Int;
 
 	var defaultLight : hrt.prefab.Light;
@@ -429,6 +431,39 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		initMeshPreview();
 	}
 
+	override function onDragDrop(items : Array<String>, isDrop : Bool) {
+
+		if (previewElem.get(0).matches(":hover")) {
+			for (item in items) {
+				if (StringTools.endsWith(item, ".prefab") || StringTools.endsWith(item, ".fx")) {
+					var renderProp = config.getLocal("scene.renderProps");
+					var renderProps : Array<String> = renderProp is String ? [renderProp] : cast renderProp;
+					if (renderProps.contains(item)) {
+						if (isDrop) {
+							previewSettings.renderPropsPath = item;
+							refreshRenderProps();
+						}
+						return true;
+					}
+					else {
+						if (isDrop) {
+							setMeshPreviewPrefab(item);
+						}
+						return true;
+					}
+				}
+				else if (StringTools.endsWith(item, ".fbx")) {
+					if (isDrop) {
+						setMeshPreviewFBX(item);
+					}
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
 	override function onActivate() {
 		super.onActivate();
 		if (!isLoaded && isDisplayed) {
@@ -971,12 +1006,12 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		if (meshPreviewScene != null) {
 			meshPreviewScene.element.remove();
 		}
-		var container = new Element('<div id="preview"></div>').appendTo(graphEditor.element);
-		meshPreviewScene = new hide.comp.Scene(config, null, container);
+		previewElem = new Element('<div id="preview"></div>').appendTo(graphEditor.element);
+		meshPreviewScene = new hide.comp.Scene(config, null, previewElem);
 		meshPreviewScene.onReady = onMeshPreviewReady;
 		meshPreviewScene.onUpdate = onMeshPreviewUpdate;
 
-		var toolbar = new Element('<div class="hide-toolbar2"></div>').appendTo(container);
+		var toolbar = new Element('<div class="hide-toolbar2"></div>').appendTo(previewElem);
 		var group = new Element('<div class="tb-group"></div>').appendTo(toolbar);
 		var menu = new Element('<div class="button2 transparent" title="More options"><div class="ico ico-navicon"></div></div>');
 		menu.appendTo(group);
@@ -997,11 +1032,27 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 				{label: "Render Settings", menu: [
 					{label: "Background Color", click: openBackgroundColorMenu},
 					{label: "Render Props", click: selectRenderProps},
+					{label: "Clear Render Props", click: clearRenderProps},
+
 				]}
 			]);
 		});
 	}
 
+	public function setPrefabAndRenderDelayed(prefab: String, renderProps: String) {
+		if (previewSettings == null)
+			loadSettings();
+		previewSettings.meshPath = prefab;
+		previewSettings.renderPropsPath = renderProps;
+		saveSettings();
+	}
+
+	public function clearRenderProps() {
+		previewSettings.renderPropsPath = null;
+		refreshRenderProps();
+		saveSettings();
+	}
+
 	public function selectRenderProps() {
 		var basedir = haxe.io.Path.directory(previewSettings.renderPropsPath ?? "");
 		if (basedir == "" || !haxe.io.Path.isAbsolute(basedir)) {
@@ -1068,6 +1119,11 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			}
 		}
 		meshPreviewScene.engine.backgroundColor = previewSettings.bgColor;
+
+		var anims = meshPreviewRoot3d.findAll((f) -> Std.downcast(f, hrt.prefab.fx.FX.FXAnimation));
+		for (anim in anims) {
+			@:privateAccess anim.setTime(meshPreviewScene.s3d.renderer.ctx.time % anim.duration, true);
+		}
 	}
 
 	public function refreshRenderProps() {
@@ -1095,7 +1151,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		ctx.scene = meshPreviewScene;
 		meshPreviewRenderProps.setSharedRec(ctx);
 		meshPreviewRenderProps.make();
-		var renderProps = meshPreviewRenderProps.getOpt(hrt.prefab.RenderProps);
+		var renderProps = meshPreviewRenderProps.getOpt(hrt.prefab.RenderProps, true);
 		if (renderProps != null)
 			renderProps.applyProps(meshPreviewScene.s3d.renderer);
 	}
@@ -1180,11 +1236,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 	}
 
 	public function resetPreviewCamera() {
-		var bounds = new h3d.col.Bounds();
-		for (mesh in meshPreviewMeshes) {
-			var b = mesh.getBounds();
-			bounds.add(b);
-		}
+		var bounds = meshPreviewRoot3d.getBounds();
 		var sp = bounds.toSphere();
 		meshPreviewCameraController.set(sp.r * 3.0, Math.PI / 4, Math.PI * 5 / 13, sp.getCenter());
 	}
@@ -1226,6 +1278,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 
 	public function setMeshPreviewPrefab(str: String) {
 		cleanupPreview();
+		meshPreviewScene.setCurrent();
 
 		try {
 			meshPreviewPrefab = Ide.inst.loadPrefab(str);
@@ -1280,6 +1333,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		var moved = false;
 		meshPreviewCameraController = new PreviewCamController(meshPreviewScene.s3d);
 		meshPreviewRoot3d = new h3d.scene.Object(meshPreviewScene.s3d);
+
 		loadMeshPreviewFromString(previewSettings.meshPath);
 		refreshRenderProps();
 	}
@@ -1345,11 +1399,6 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		@:privateAccess
 		if (meshPreviewScene.s3d != null) {
 			meshPreviewScene.s3d.renderer.ctx.time = graphEditor.previewsScene.s3d.renderer.ctx.time;
-
-			var anims = meshPreviewRoot3d.findAll((f) -> Std.downcast(f, hrt.prefab.fx.FX.FXAnimation));
-			for (anim in anims) {
-				anim.setTime(meshPreviewScene.s3d.renderer.ctx.time % anim.duration, true);
-			}
 		}
 
 		return true;

+ 22 - 8
hrt/prefab/DynamicShader.hx

@@ -135,14 +135,6 @@ class DynamicShader extends Shader {
 			</dl>
 			</div>');
 
-			if (StringTools.endsWith(source, ".shgraph")) {
-				var res = hxd.res.Loader.currentInstance.load(source);
-				var shgraph = Std.downcast(res.toPrefab().load(), hrt.shgraph.ShaderGraph);
-				if (shgraph == null) {
-					element.append(new hide.Element('<p>The given shadergraph is corrupted</p>'));
-				}
-			}
-
 			ectx.properties.add(element, this, function(pname) {
 				ectx.onChange(this, pname);
 				if (pname == "source") {
@@ -151,6 +143,28 @@ class DynamicShader extends Shader {
 						ectx.rebuildPrefab(this);
 				}
 			});
+
+			if (StringTools.endsWith(source, ".shgraph")) {
+				var res = hxd.res.Loader.currentInstance.load(source);
+				var shgraph = Std.downcast(res.toPrefab().load(), hrt.shgraph.ShaderGraph);
+				if (shgraph == null) {
+					element.append(new hide.Element('<p>The given shadergraph is corrupted</p>'));
+				}
+
+				var field : hide.comp.PropsEditor.PropsField = cast (element.find("[field=source]")[0]:Dynamic).propsField;
+				@:privateAccess field.fselect.onView = () -> {
+					var path = field.fselect.getFullPath();
+					hide.Ide.inst.openFile(path, null, (v) -> {
+						var sheditor : hide.view.shadereditor.ShaderEditor = cast v;
+						var renderProps = shared.editor.renderPropsRoot?.source;
+						sheditor.setPrefabAndRenderDelayed(shared.currentPath,renderProps);
+					});
+				}
+			}
+
+
+
+
 		}
 
 		super.edit(ectx);