public void Reload() { this.parent = VariableMaterial.GetParentShader(this.material); if (!this.parent.IsNull()) { this.hash = this.parent.GetModifiedDate("MdyyHmmff") + "-" + this.material.shaderKeywords.Join(" ").ToMD5(); } VariableMaterial.dirty = false; this.shader = this.material.shader; this.editor.Repaint(); }
public static void Unflatten(params UnityObject[] targets) { string shaderName = ""; foreach (var target in targets) { var material = (Material)target; FileData shaderFile = VariableMaterial.GetParentShader(target); if (shaderFile.IsNull()) { continue; } shaderName = shaderFile.fullName; material.shader = shaderFile.GetAsset <Shader>(); } VariableMaterial.dirty = true; if (VariableMaterial.debug) { Log.Show("[VariableMaterial] " + shaderName + " -- " + targets.Length + " Unflattened."); } ProxyEditor.RebuildInspectors(); }
public static void Flatten(params UnityObject[] targets) { string originalName = ""; foreach (var target in targets) { Material material = (Material)target; FileData shaderFile = VariableMaterial.GetParentShader(target); if (shaderFile.IsNull()) { continue; } string timestamp = shaderFile.GetModifiedDate("MdyyHmmff"); string projectPath = Application.dataPath + "/" + "Shaders"; string hash = timestamp + "-" + material.shaderKeywords.Join(" ").ToMD5(); string folderPath = projectPath + "/" + shaderFile.name + "/"; string outputPath = folderPath + shaderFile.name + "#" + hash + ".shader"; Action update = () => { ProxyEditor.RecordObject(material, "Variable Material - Shader Set"); material.EnableKeyword("VARIABLE_MATERIAL_" + shaderFile.name.ToUpper()); material.shader = File.GetAsset <Shader>(outputPath); ProxyEditor.SetAssetDirty(material); if (VariableMaterial.debug) { Log.Show("[VariableMaterial] Shader set " + outputPath); } }; if (!VariableMaterial.force && File.Exists(outputPath)) { VariableMaterial.updates += update; continue; } originalName = shaderFile.fullName; string text = shaderFile.ReadText(); string shaderName = text.Parse("Shader ", "{").Trim(' ', '"'); if (shaderName.Contains("#")) { continue; } string output = "Shader " + '"' + "Hidden/" + shaderName + "#" + hash + '"' + "{\r\n"; var allowed = new Stack <bool?>(); int tabs = -1; text = text.Replace("\\\r\n", ""); int lineNumber = 0; foreach (string current in text.Split("\r\n").Skip(1)) { lineNumber += 1; if (current.IsEmpty()) { continue; } string line = current; bool hideBlock = allowed.Count > 0 && allowed.Peek() != true; bool allowedBranch = line.ContainsAny("#else", "#elif") && allowed.Peek() != null; bool ignoredBranch = line.Contains("@#"); //if(line.ContainsAny("[KeywordEnum","[Toggle")){continue;} if (!ignoredBranch && line.Contains("#endif")) { allowed.Pop(); if (allowed.Count == 0) { tabs = -1; } continue; } if (hideBlock && !allowedBranch) { if (!ignoredBranch && line.ContainsAny("#if")) { allowed.Push(null); } continue; } if (ignoredBranch) { bool end = line.Contains("#end"); bool include = line.Contains("#include"); if (tabs < 0) { tabs = line.Length - line.TrimStart().Length; } if (end) { tabs -= 1; } line = new String('\t', tabs) + line.TrimStart(); output += line.Replace("@#", "#") + "\r\n"; if (!end && !include) { tabs += 1; } continue; } if (line.Contains("#include")) { line = line.Replace("#include \"", "#include \"../"); } if (line.Contains("#pragma shader_feature")) { continue; } if (line.Contains("#pragma multi_compile ")) { continue; } if (line.ContainsAny("#if", "#elif", "#else")) { bool useBlock = false; if (line.ContainsAny("#else", "#elif")) { bool lastAllowed = allowed.Pop() == true; if (lastAllowed) { allowed.Push(null); continue; } useBlock = line.Contains("#else"); } if (line.ContainsAny("#ifdef", "#ifndef")) { bool hasTerm = material.shaderKeywords.Contains(line.Trim().Split(" ").Last()); useBlock = line.Contains("#ifndef") ? !hasTerm : hasTerm; } else if (line.Contains("defined")) { string[] orBlocks = line.Trim().Trim("#if ").Trim("#elif ").Split("||"); foreach (string orBlock in orBlocks) { string[] andBlocks = orBlock.Split("&&"); foreach (string andBlock in andBlocks) { string term = andBlock.Parse("defined(", ")"); bool hasTerm = material.shaderKeywords.Contains(term); useBlock = andBlock.Contains("!") ? !hasTerm : hasTerm; if (!useBlock) { break; } } if (useBlock) { break; } } } allowed.Push(useBlock); if (useBlock && allowed.Count == 1 && tabs <= 0) { tabs = line.Length - line.TrimStart().Length; } continue; } if (tabs >= 1) { if (line.Contains("}") && !line.Contains("{")) { tabs -= 1; } line = new String('\t', tabs) + line.TrimStart(); if (line.Contains("{") && !line.Contains("}")) { tabs += 1; } } output += line + "\r\n"; } output = output.Replace("{\r\n\t\t\t}", "{}"); string pattern = output.Cut("{\r\n\t\t\t\treturn ", ";\r\n\t\t\t"); while (!pattern.IsEmpty()) { string replace = pattern.Replace("\r\n", "").Replace("\t", ""); output = output.ReplaceFirst(pattern, replace); pattern = output.Cut("{\r\n\t\t\t\treturn ", ";\r\n\t\t\t"); } if (output != text) { Action write = () => { File.Create(outputPath).Write(output); }; VariableMaterial.writes += write; VariableMaterial.updates += update; } } if (VariableMaterial.debug) { Log.Show("[VariableMaterial] " + originalName + " -- " + targets.Length + " flattened."); } if (VariableMaterial.delay) { Call.Delay(VariableMaterial.RefreshEditor, 0.5f); return; } VariableMaterial.RefreshEditor(); VariableMaterial.force = false; }