public void SetDefine <T>(ShaderTypeFlag shaderType, string name, T value) where T : struct { string formatedValue = ShaderMacrosConverter <T> .ConvertToString(value); m_defineParameters.Add(new DefineParams(name, formatedValue, shaderType)); }
private void EditShader(ShaderTypeFlag type, string shaderPath) { if (shaderPath == string.Empty) { return; } StreamReader reader = new StreamReader(shaderPath); List <string> code = new List <string>(); while (!reader.EndOfStream) { code.Add(reader.ReadLine()); } reader.Close(); reader.Dispose(); // code only with macros List <DefineParams> macros = new List <DefineParams>(); code.ForEach((str) => { if (str.StartsWith("#define")) { Int32 indexName = str.IndexOf(' '); Int32 indexValue = str.IndexOf(' ', indexName + 1); var name = str.Substring(indexName + 1, indexValue - indexName - 1); var value = str.Substring(indexValue + 1); macros.Add(new DefineParams(name, value)); } }); // remove all macros from code code.RemoveAll((str) => str.StartsWith("#define")); // get macros only for current shader List <DefineParams> input = new List <DefineParams>(); foreach (var def in m_defineParameters) { if ((def.shaderType & ShaderTypeFlag.VertexShader) == type || (def.shaderType & ShaderTypeFlag.FragmentShader) == type || (def.shaderType & ShaderTypeFlag.GeometryShader) == type) { input.Add(def); } } // update values for existing macros for (Int32 i = 0; i < input.Count; i++) { if (macros.Any(def => def.Name == input[i].Name)) { macros.RemoveAll(def => def.Name == input[i].Name); } macros.Add(input[i]); } string macroResult = String.Empty; foreach (var def in macros) { macroResult += string.Format("#define {0} {1} \n", def.Name, def.Value); } Int32 startIndex = code.FindIndex(new Predicate <string>(s => s.StartsWith("#version"))) + 2; code.Insert(startIndex, macroResult); string codeResult = string.Empty; for (Int32 i = 0; i < code.Count; i++) { string str = code[i]; str = str.TrimEnd(); if (code.Count - 1 > i) { codeResult += str + "\n"; } else { codeResult += str; } } Int32 indexNewLine = codeResult.LastIndexOf("\n"); indexNewLine = codeResult.LastIndexOf("\n") > indexNewLine?codeResult.LastIndexOf("\n") : indexNewLine; codeResult = codeResult.EndsWith("\n") || codeResult.EndsWith("\r") ? codeResult.Remove(indexNewLine) : codeResult; using (StreamWriter writer = new StreamWriter(shaderPath, false)) { writer.WriteLine(codeResult); writer.Close(); } }
public DefineParams(string name, string value) { Name = name; Value = value; this.shaderType = ShaderTypeFlag.VertexShader; }
public DefineParams(string name, string value, ShaderTypeFlag shaderType) { Name = name; Value = value; this.shaderType = shaderType; }