Переглянути джерело

[shgraph] Allow ScreenFX preview in shader editor

Clément Espeute 10 місяців тому
батько
коміт
ab9fae1a0c
1 змінених файлів з 38 додано та 1 видалено
  1. 38 1
      hide/view/shadereditor/ShaderEditor.hx

+ 38 - 1
hide/view/shadereditor/ShaderEditor.hx

@@ -146,6 +146,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 
 
 	var meshPreviewScene : hide.comp.Scene;
 	var meshPreviewScene : hide.comp.Scene;
 	var meshPreviewMeshes : Array<h3d.scene.Mesh> = [];
 	var meshPreviewMeshes : Array<h3d.scene.Mesh> = [];
+	var meshPreviewScreenFX : Array<hrt.prefab.rfx.ScreenShaderGraph> = [];
 	var meshPreviewRoot3d : h3d.scene.Object;
 	var meshPreviewRoot3d : h3d.scene.Object;
 	var meshPreviewShader : hxsl.DynamicShader;
 	var meshPreviewShader : hxsl.DynamicShader;
 	var meshPreviewCameraController : hide.comp.Scene.PreviewCamController;
 	var meshPreviewCameraController : hide.comp.Scene.PreviewCamController;
@@ -936,6 +937,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 				{label: "", isSeparator: true},
 				{label: "", isSeparator: true},
 				{label: "Sphere", click: setMeshPreviewSphere},
 				{label: "Sphere", click: setMeshPreviewSphere},
 				{label: "Plane", click: setMeshPreviewPlane},
 				{label: "Plane", click: setMeshPreviewPlane},
+				{label: "Screen FX", click: setMeshPreviewScreenFX},
 				{label: "Mesh ...", click: chooseMeshPreviewFBX},
 				{label: "Mesh ...", click: chooseMeshPreviewFBX},
 				{label: "Prefab/FX ...", click: chooseMeshPreviewPrefab},
 				{label: "Prefab/FX ...", click: chooseMeshPreviewPrefab},
 				{label: "", isSeparator: true},
 				{label: "", isSeparator: true},
@@ -1027,11 +1029,24 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			meshPreviewShader = new hxsl.DynamicShader(compiledShader.shader);
 			meshPreviewShader = new hxsl.DynamicShader(compiledShader.shader);
 
 
 			for (init in compiledShader.inits) {
 			for (init in compiledShader.inits) {
-					setParamValue(meshPreviewShader, init.variable, init.value);
+				setParamValue(meshPreviewShader, init.variable, init.value);
 			}
 			}
 			for (m in meshPreviewMeshes) {
 			for (m in meshPreviewMeshes) {
 				replaceMeshShader(m, meshPreviewShader);
 				replaceMeshShader(m, meshPreviewShader);
 			}
 			}
+
+			for (fx in meshPreviewScreenFX) {
+				@:privateAccess fx.shaderPass.removeShader(fx.shader);
+
+				@:privateAccess fx.shaderDef = compiledShader;
+				@:privateAccess fx.shader = meshPreviewShader;
+
+				for (v in compiledShader.inits) {
+					Reflect.setField(fx.props, v.variable.name, v.value);
+				}
+
+				@:privateAccess fx.shaderPass.addShader(fx.shader);
+			}
 		}
 		}
 		meshPreviewScene.engine.backgroundColor = previewSettings.bgColor;
 		meshPreviewScene.engine.backgroundColor = previewSettings.bgColor;
 
 
@@ -1090,6 +1105,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			mesh.remove();
 			mesh.remove();
 
 
 		meshPreviewRoot3d.removeChildren();
 		meshPreviewRoot3d.removeChildren();
+		meshPreviewScreenFX.resize(0);
 	}
 	}
 
 
 	public function setMeshPreviewMesh(mesh: h3d.scene.Mesh) {
 	public function setMeshPreviewMesh(mesh: h3d.scene.Mesh) {
@@ -1126,6 +1142,21 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		setMeshPreviewMesh(m);
 		setMeshPreviewMesh(m);
 	}
 	}
 
 
+	public function setMeshPreviewScreenFX() {
+		cleanupPreview();
+		previewSettings.meshPath = "ScreenFX";
+		saveSettings();
+
+		var shared = new hide.prefab.ContextShared(null, meshPreviewRoot3d);
+		var root = new hrt.prefab.fx.FX(null, shared);
+		var screenFX = new hrt.prefab.rfx.ScreenShaderGraph(root, shared);
+		@:privateAccess screenFX.shaderGraph = this.shaderGraph;
+		root.make();
+
+		meshPreviewScreenFX.push(screenFX);
+		meshPreviewShader = null;
+	}
+
 	public function chooseMeshPreviewFBX() {
 	public function chooseMeshPreviewFBX() {
 		var basedir = haxe.io.Path.directory(previewSettings.meshPath ?? "");
 		var basedir = haxe.io.Path.directory(previewSettings.meshPath ?? "");
 		if (basedir == "" || !haxe.io.Path.isAbsolute(basedir)) {
 		if (basedir == "" || !haxe.io.Path.isAbsolute(basedir)) {
@@ -1162,6 +1193,8 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 				setMeshPreviewSphere();
 				setMeshPreviewSphere();
 			case "Plane":
 			case "Plane":
 				setMeshPreviewPlane();
 				setMeshPreviewPlane();
+			case "ScreenFX":
+				setMeshPreviewScreenFX();
 			default: {
 			default: {
 				if (StringTools.endsWith(str, ".fbx")) {
 				if (StringTools.endsWith(str, ".fbx")) {
 					setMeshPreviewFBX(str);
 					setMeshPreviewFBX(str);
@@ -1351,6 +1384,10 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 
 
 	function setParamValue(shader : DynamicShader, variable : hxsl.Ast.TVar, value : Dynamic) {
 	function setParamValue(shader : DynamicShader, variable : hxsl.Ast.TVar, value : Dynamic) {
 		@:privateAccess ShaderGraph.setParamValue(shader, variable, value);
 		@:privateAccess ShaderGraph.setParamValue(shader, variable, value);
+
+		for (fx in meshPreviewScreenFX) {
+			Reflect.setField(fx.props, variable.name, value);
+		}
 	}
 	}
 
 
 	/** IGraphEditor interface **/
 	/** IGraphEditor interface **/