Browse Source

ShaderGraph: UI + vertex shader

Tom SPIRA 6 years ago
parent
commit
2e8f521f47

+ 4 - 0
bin/style.css

@@ -1030,6 +1030,9 @@ input[type=checkbox]:checked:after {
   visibility: visible;
 }
 /* Shader Editor */
+.graph-view {
+  outline: none !important;
+}
 .graph-view .tabs {
   z-index: 1;
   background: #222222;
@@ -1117,6 +1120,7 @@ input[type=checkbox]:checked:after {
   box-shadow: 0px 0px 25px -4px black;
   background-color: #222222;
   border: 1px solid #444;
+  z-index: 2;
 }
 .graph-view #add-menu .search-container {
   display: flex;

+ 2 - 0
bin/style.less

@@ -1146,6 +1146,7 @@ input[type=checkbox] {
 
 /* Shader Editor */
 .graph-view {
+	outline: none !important;
 	.tabs {
 		z-index: 1;
     	background: #222222;
@@ -1247,6 +1248,7 @@ input[type=checkbox] {
 
 		background-color: rgb(34, 34, 34);
 		border: 1px solid #444;
+		z-index: 2;
 
 		.search-container {
 			display: flex;

+ 4 - 4
hide/view/Graph.hx

@@ -59,11 +59,11 @@ class Graph extends FileView {
 
 	override function onDisplay() {
 		element.html('
-			<div class="flex vertical">
-				<div class="flex-elt graph-view">
-					<div class="heaps-scene" tabindex="0" >
+			<div class="flex vertical" >
+				<div class="flex-elt graph-view" tabindex="0" >
+					<div class="heaps-scene" tabindex="1" >
 					</div>
-					<div id="rightPanel" class="tabs">
+					<div id="rightPanel" class="tabs" >
 					</div>
 				</div>
 			</div>');

+ 29 - 12
hide/view/shadereditor/ShaderEditor.hx

@@ -105,11 +105,6 @@ class ShaderEditor extends hide.view.Graph {
 		sceneEditor.onRefresh = onRefresh;
 		sceneEditor.onUpdate = function(dt : Float) {};
 		sceneEditor.view.keys = new hide.ui.Keys(null); // Remove SceneEditor Shortcuts
-		sceneEditor.view.keys.register("save", function() {
-			save();
-			skipNextChange = true;
-			modified = false;
-		});
 
 		editorMatrix = editor.group(editor.element);
 
@@ -138,12 +133,15 @@ class ShaderEditor extends hide.view.Graph {
 			}
 		});
 
-		parent.on("keydown", function(e) {
+		element.on("keydown", function(e) {
 			if (e.shiftKey && e.keyCode != 16) {
 				if (addMenu == null || !addMenu.is(":visible"))
 					openAddMenu();
 
 				return;
+			} else if (e.ctrlKey && e.keyCode == 83) {
+				save();
+				return;
 			}
 		});
 
@@ -208,6 +206,7 @@ class ShaderEditor extends hide.view.Graph {
 		element.find("#changeModel").on("click", function() {
 			ide.chooseFile(["fbx"], function(path) {
 				if( path == null ) return; // cancel
+				sceneEditor.scene.setCurrent();
 				sceneEditor.scene.s3d.removeChild(obj);
 				obj = sceneEditor.scene.loadModel(path, true);
 				saveDisplayState("customModel", path);
@@ -489,6 +488,9 @@ class ShaderEditor extends hide.view.Graph {
 		inputTitle.on("click", function(e) {
 			e.stopPropagation();
 		});
+		inputTitle.on("keydown", function(e) {
+			e.stopPropagation();
+		});
 		inputTitle.on("change", function(e) {
 			var newName = inputTitle.val();
 			if (shaderGraph.setParameterTitle(id, newName)) {
@@ -586,8 +588,8 @@ class ShaderEditor extends hide.view.Graph {
 		}
 		timerCompileShader = new Timer(COMPILE_SHADER_DEBOUNCE);
 		timerCompileShader.run = function() {
-			compileShader();
 			timerCompileShader.stop();
+			compileShader();
 		};
 	}
 
@@ -619,12 +621,25 @@ class ShaderEditor extends hide.view.Graph {
 				var str : String = e;
 				if (str.split(":")[0] == "An error occurred compiling the shaders") {
 					var strSplitted = str.split("(output_");
-					var idBox = strSplitted[1].split("_")[0];
-					var idBoxParsed = Std.parseInt(idBox);
-					if (Std.string(idBoxParsed) == idBox) {
-						error("Compilation of shader failed > Invalid inputs", idBoxParsed);
+					if (strSplitted.length >= 2) {
+						var idBox = strSplitted[1].split("_")[0];
+						var idBoxParsed = Std.parseInt(idBox);
+						if (Std.string(idBoxParsed) == idBox) {
+							error("Compilation of shader failed > Invalid inputs", idBoxParsed);
+						} else {
+							error("Compilation of shader failed > " + str);
+						}
 					} else {
-						error("Compilation of shader failed > " + str);
+						var nameOutput = str.split("(")[1].split(" =")[0];
+						for (b in listOfBoxes) {
+							var shaderOutput = Std.instance(b.getInstance(), hrt.shgraph.ShaderOutput);
+							if (shaderOutput != null) {
+								if (shaderOutput.variable.name == nameOutput) {
+									error("Compilation of shader failed > Invalid inputs", shaderOutput.id);
+									break;
+								}
+							}
+						}
 					}
 					if (newShader != null)
 						for (m in obj.getMaterials())
@@ -649,6 +664,7 @@ class ShaderEditor extends hide.view.Graph {
 					m.mainPass.addShader(currentShader);
 				}
 			}
+			throw e;
 		}
 	}
 
@@ -1029,6 +1045,7 @@ class ShaderEditor extends hide.view.Graph {
 		afterChange();
 		box.dispose();
 		listOfBoxes.remove(box);
+		launchCompileShader();
 	}
 
 	override function removeEdge(edge : Graph.Edge) {

+ 38 - 8
hrt/shgraph/ShaderGraph.hx

@@ -212,12 +212,15 @@ class ShaderGraph {
 		return false;
 	}
 
+	var variableNameAvailableOnlyInVertex = [];
+
 	public function compile(?specificOutput : ShaderNode) : hrt.prefab.ContextShared.ShaderDef {
 
 		allVariables = [];
 		allParameters = [];
 		allParamDefaultValue = [];
-		var content = [];
+		var contentVertex = [];
+		var contentFragment = [];
 
 		for (n in nodes) {
 			n.instance.outputCompiled = [];
@@ -256,13 +259,42 @@ class ShaderGraph {
 					allVariables.push(variable);
 				}
 				var nodeVar = new NodeVar(shaderNode, "input");
-				content = content.concat(buildNodeVar(nodeVar));
+				var isVertex = (variableNameAvailableOnlyInVertex.indexOf(variable.name) != -1);
+				if (isVertex) {
+					contentVertex = contentVertex.concat(buildNodeVar(nodeVar));
+				} else {
+					contentFragment = contentFragment.concat(buildNodeVar(nodeVar));
+				}
 				if (specificOutput != null) break;
 			}
 		}
 
 		var shaderData = {
-			funs : [{
+			funs : [],
+			name: "SHADER_GRAPH",
+			vars: allVariables
+		};
+
+		if (contentVertex.length > 0) {
+			shaderData.funs.push({
+					ret : TVoid, kind : Vertex,
+					ref : {
+						name : "vertex",
+						id : 0,
+						kind : Function,
+						type : TFun([{ ret : TVoid, args : [] }])
+					},
+					expr : {
+						p : null,
+						t : TVoid,
+						e : TBlock(contentVertex)
+					},
+					args : []
+				});
+		}
+
+		if (contentFragment.length > 0) {
+			shaderData.funs.push({
 					ret : TVoid, kind : Fragment,
 					ref : {
 						name : "fragment",
@@ -273,13 +305,11 @@ class ShaderGraph {
 					expr : {
 						p : null,
 						t : TVoid,
-						e : TBlock(content)
+						e : TBlock(contentFragment)
 					},
 					args : []
-				}],
-			name: "MON_FRAGMENT",
-			vars: allVariables
-		};
+				});
+		}
 
 		var s = new SharedShader("");
 		s.data = shaderData;

+ 1 - 1
hrt/shgraph/ShaderInput.hx

@@ -55,7 +55,7 @@ class ShaderInput extends ShaderNode {
 
 	override public function saveProperties() : Dynamic {
 		var parameters = {
-			variable: variable.name
+			variable: (variable == null) ? null : variable.name
 		};
 
 		return parameters;

+ 8 - 3
hrt/shgraph/ShaderOutput.hx

@@ -16,7 +16,7 @@ class ShaderOutput extends ShaderNode {
 	var components = [X, Y, Z, W];
 
 	override public function checkValidityInput(key : String, type : ShaderType.SType) : Bool {
-		return ShaderType.checkCompatibilities(type, ShaderType.getType(variable.type));
+		return ShaderType.checkConversion(type, ShaderType.getType(variable.type));
 	}
 
 	override public function build(key : String) : TExpr {
@@ -32,6 +32,7 @@ class ShaderOutput extends ShaderNode {
 			};
 
 	}
+
 	static var availableOutputs = [];
 
 	override public function loadProperties(props : Dynamic) {
@@ -53,7 +54,7 @@ class ShaderOutput extends ShaderNode {
 
 	override public function saveProperties() : Dynamic {
 		var parameters = {
-			variable: [variable.name, variable.type.getName()]
+			variable: (variable == null) ? [null] : [variable.name, variable.type.getName()]
 		};
 
 		return parameters;
@@ -87,7 +88,11 @@ class ShaderOutput extends ShaderNode {
 		}
 		input.on("change", function(e) {
 			var value = input.val();
-			this.variable = ShaderNode.availableVariables[value];
+			if (value < ShaderNode.availableVariables.length) {
+				this.variable = ShaderNode.availableVariables[value];
+			} else {
+				this.variable = ShaderOutput.availableOutputs[value-ShaderNode.availableVariables.length];
+			}
 		});
 
 		elements.push(element);