Пример #1
0
        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));
        }
Пример #2
0
        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();
            }
        }
Пример #3
0
 public DefineParams(string name, string value)
 {
     Name            = name;
     Value           = value;
     this.shaderType = ShaderTypeFlag.VertexShader;
 }
Пример #4
0
 public DefineParams(string name, string value, ShaderTypeFlag shaderType)
 {
     Name            = name;
     Value           = value;
     this.shaderType = shaderType;
 }