浏览代码

[shgraph] Refactored shader compilation to be 'render context' safe

Clément Espeute 1 年之前
父节点
当前提交
62a2df4b12
共有 1 个文件被更改,包括 39 次插入28 次删除
  1. 39 28
      hide/view/shadereditor/ShaderEditor.hx

+ 39 - 28
hide/view/shadereditor/ShaderEditor.hx

@@ -133,7 +133,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 meshPreviewRoot3d : h3d.scene.Object;
 	var meshPreviewRoot3d : h3d.scene.Object;
-	var meshShader : hxsl.DynamicShader;
+	var meshPreviewShader : hxsl.DynamicShader;
 	var meshPreviewCameraController : h3d.scene.CameraController;
 	var meshPreviewCameraController : h3d.scene.CameraController;
 	var previewSettings : PreviewSettings;
 	var previewSettings : PreviewSettings;
 	var meshPreviewPrefab : hrt.prefab.Prefab;
 	var meshPreviewPrefab : hrt.prefab.Prefab;
@@ -168,6 +168,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			inst.id = id;
 			inst.id = id;
 			inst.parameterId = draggedParamId;
 			inst.parameterId = draggedParamId;
 			inst.shaderGraph = shaderGraph;
 			inst.shaderGraph = shaderGraph;
+			inst.setPos(posCursor);
 
 
 			graphEditor.opBox(inst, true, graphEditor.currentUndoBuffer);
 			graphEditor.opBox(inst, true, graphEditor.currentUndoBuffer);
 			graphEditor.commitUndo();
 			graphEditor.commitUndo();
@@ -280,9 +281,17 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 	}
 	}
 
 
 	function updateParam(id : Int) {
 	function updateParam(id : Int) {
+		meshPreviewScene.setCurrent(); // needed for texture changes
+
 		var param = shaderGraph.getParameter(id);
 		var param = shaderGraph.getParameter(id);
-		var v = compiledShader.inits.find((i) -> i.variable.name == param.name).variable;
-		setParamValue(meshShader, v, param.defaultValue);
+		var init = compiledShader.inits.find((i) -> i.variable.name == param.name);
+		if (init != null) {
+			setParamValue(meshPreviewShader, init.variable, param.defaultValue);
+		} else {
+			// The init can be missing if the variable has been optimised away,
+			// so try a recompilation 
+			requestRecompile();
+		}
 	}
 	}
 
 
 	function addParameter(parameter : Parameter, ?value : Dynamic) {
 	function addParameter(parameter : Parameter, ?value : Dynamic) {
@@ -399,7 +408,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 						return;
 						return;
 					//afterChange();
 					//afterChange();
 					//setBoxesParam(parameter.id);
 					//setBoxesParam(parameter.id);
-					//updateParam(parameter.id);
+					updateParam(parameter.id);
 				}
 				}
 				typeName = "Texture";
 				typeName = "Texture";
 
 
@@ -613,9 +622,9 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 				{label: "Prefab/FX ...", click: chooseMeshPreviewPrefab},
 				{label: "Prefab/FX ...", click: chooseMeshPreviewPrefab},
 				{label: "", isSeparator: true},
 				{label: "", isSeparator: true},
 				{label: "Render Settings", menu: [
 				{label: "Render Settings", menu: [
-					{label: "Alpha Blend", click: () -> {previewSettings.alphaBlend = !previewSettings.alphaBlend; applyShaderMesh(); saveSettings();}, stayOpen: true, checked: previewSettings.alphaBlend},
-					{label: "Backface Cull", click: () -> {previewSettings.backfaceCulling = !previewSettings.backfaceCulling; applyShaderMesh(); saveSettings();}, stayOpen: true, checked: previewSettings.backfaceCulling},
-					{label: "Unlit", click: () -> {previewSettings.unlit = !previewSettings.unlit; applyShaderMesh(); saveSettings();}, stayOpen: true, checked: previewSettings.unlit},
+					{label: "Alpha Blend", click: () -> {previewSettings.alphaBlend = !previewSettings.alphaBlend; meshPreviewShader = null; saveSettings();}, stayOpen: true, checked: previewSettings.alphaBlend},
+					{label: "Backface Cull", click: () -> {previewSettings.backfaceCulling = !previewSettings.backfaceCulling; meshPreviewShader = null; saveSettings();}, stayOpen: true, checked: previewSettings.backfaceCulling},
+					{label: "Unlit", click: () -> {previewSettings.unlit = !previewSettings.unlit; meshPreviewShader = null; saveSettings();}, stayOpen: true, checked: previewSettings.unlit},
 				], enabled: meshPreviewPrefab == null}
 				], enabled: meshPreviewPrefab == null}
 			]);
 			]);
 		});
 		});
@@ -626,6 +635,21 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			queueReloadMesh = false;
 			queueReloadMesh = false;
 			loadMeshPreviewFromString(previewSettings.meshPath);
 			loadMeshPreviewFromString(previewSettings.meshPath);
 		}
 		}
+		if (meshPreviewShader == null) {
+			checkCompileShader();
+			@:privateAccess meshPreviewScene.checkCurrent();
+			meshPreviewShader = new hxsl.DynamicShader(compiledShader.shader);
+	
+			for (init in compiledShader.inits) {
+				if (init.variable == previewVar)
+					setParamValue(meshPreviewShader, previewVar, 0);
+				else
+					setParamValue(meshPreviewShader, init.variable, init.value);
+			}
+			for (m in meshPreviewMeshes) {
+				replaceMeshShader(m, meshPreviewShader);
+			}
+		}
 	}
 	}
 
 
 	public function cleanupPreview() {
 	public function cleanupPreview() {
@@ -650,7 +674,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		meshPreviewMeshes.resize(0);
 		meshPreviewMeshes.resize(0);
 		meshPreviewMeshes.push(mesh);
 		meshPreviewMeshes.push(mesh);
 
 
-		applyShaderMesh();
+		meshPreviewShader = null;
 		resetPreviewCamera();
 		resetPreviewCamera();
 	}
 	}
 
 
@@ -788,7 +812,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 
 
 		meshPreviewprefabWatch = Ide.inst.fileWatcher.register(str, () -> queueReloadMesh = true, false);
 		meshPreviewprefabWatch = Ide.inst.fileWatcher.register(str, () -> queueReloadMesh = true, false);
 
 
-		applyShaderMesh();
+		meshPreviewShader = null;
 		resetPreviewCamera();
 		resetPreviewCamera();
 		previewSettings.meshPath = str;
 		previewSettings.meshPath = str;
 		saveSettings();
 		saveSettings();
@@ -851,17 +875,9 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		}
 		}
 	}
 	}
 
 
-	public function applyShaderMesh() {
-		for (m in meshPreviewMeshes) {
-			replaceMeshShader(m, meshShader);
-		}
-	}
-
 
 
 	public function onPreviewUpdate() {
 	public function onPreviewUpdate() {
-		if (needRecompile) {
-			compileShader();
-		}
+		checkCompileShader();
 
 
 		@:privateAccess
 		@:privateAccess
 		{
 		{
@@ -894,6 +910,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			bitmap.addShader(shader);
 			bitmap.addShader(shader);
 		}
 		}
 		for (init in compiledShader.inits) {
 		for (init in compiledShader.inits) {
+			@:privateAccess graphEditor.previewsScene.checkCurrent();
 			if (init.variable == previewVar)
 			if (init.variable == previewVar)
 				setParamValue(shader, previewVar, node.getId() + 1);
 				setParamValue(shader, previewVar, node.getId() + 1);
 			else {
 			else {
@@ -1026,7 +1043,9 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 		needRecompile = true;
 		needRecompile = true;
 	}
 	}
 
 
-	public function compileShader() {
+	public function checkCompileShader() {
+		if (!needRecompile)
+			return;
 		needRecompile = false;
 		needRecompile = false;
 		try {
 		try {
 			var start = Timer.stamp();
 			var start = Timer.stamp();
@@ -1036,15 +1055,7 @@ class ShaderEditor extends hide.view.FileView implements GraphInterface.IGraphEd
 			var end = Timer.stamp();
 			var end = Timer.stamp();
 			Ide.inst.quickMessage('shader recompiled in ${(end - start) * 1000.0} ms', 2.0);
 			Ide.inst.quickMessage('shader recompiled in ${(end - start) * 1000.0} ms', 2.0);
 
 
-			meshShader = new hxsl.DynamicShader(compiledShader.shader);
-			for (init in compiledShader.inits) {
-				if (init.variable == previewVar)
-					setParamValue(meshShader, previewVar, 0);
-				else
-					setParamValue(meshShader, init.variable, init.value);
-			}
-
-			applyShaderMesh();
+			meshPreviewShader = null;
 		} catch (err) {
 		} catch (err) {
 			Ide.inst.quickError(err);
 			Ide.inst.quickError(err);
 		}
 		}