Beispiel #1
0
        public void GenerateCSSL()
        {
            string directory    = (new FileInfo(this.Fullname)).DirectoryName;
            var    csslFullname = Path.Combine(directory, this.ShaderName + ".cssl.cs");

            Debug.WriteLine("#if DEBUG");// todo: 没有对应#if 的对象?
            CodeNamespace csslNamespace = new CodeNamespace(string.Format("CSharpShadingLanguage.{0}", this.ShaderName));

            csslNamespace.Imports.Add(new CodeNamespaceImport(typeof(CSharpShadingLanguage.CSShaderCode).Namespace));
            csslNamespace.Comments.Add(new CodeCommentStatement("此文件由CSharpGL.CSSLGenerator.exe生成。"));
            csslNamespace.Comments.Add(new CodeCommentStatement("用法:使用CSSL2GLSL.exe编译此文件,即可获得对应的vertex shader, geometry shader, fragment shader。"));
            csslNamespace.Comments.Add(new CodeCommentStatement("此文件中的类型不应被直接调用,发布release时可以去掉。"));
            csslNamespace.Comments.Add(new CodeCommentStatement("不可将此文件中的代码复制到其他文件内(如果包含了其他的using ...;,那么CSSL2GLSL.exe就无法正常编译这些代码了。)"));
            csslNamespace.Types.AddRange(GenerateStructures());
            csslNamespace.Types.Add(GenerateVertexShader());
            if (this.ProgramType == ShaderProgramType.VertexGeometryFragment)
            {
                Debug.WriteLine("");
                csslNamespace.Types.Add(GenerateGeometryShader());
            }
            csslNamespace.Types.Add(GenerateFragmentShader());
            Debug.WriteLine("#endif");// todo: 没有对应#if 的对象?

            using (var sw = new StreamWriter(csslFullname, false))
            {
                CSharpCodeProvider   codeProvider = new CSharpCodeProvider();
                CodeGeneratorOptions geneOptions  = new CodeGeneratorOptions();//代码生成选项
                geneOptions.BlankLinesBetweenMembers = true;
                geneOptions.BracingStyle             = "C";
                geneOptions.ElseOnClosing            = false;
                geneOptions.IndentString             = "    ";
                geneOptions.VerbatimOrder            = true;

                codeProvider.GenerateCodeFromNamespace(csslNamespace, sw, geneOptions);
            }

            try
            {
                //Process.Start("explorer", "/select," + csslFullname + "," + rendererFullname);
                OpenFolderHelper.OpenFolderAndSelectFiles(directory, csslFullname, csslFullname);
            }
            catch (Exception)
            {
            }
        }
Beispiel #2
0
        private void btnSaveAndGenerate_Click(object sender, EventArgs e)
        {
            Map2Template(this.currentFile);

            保存SToolStripMenuItem_Click(sender, e);

            string directory = (new FileInfo(this.currentFile.Fullname)).DirectoryName;

            List <string> files = new List <string>();

            if (this.chkCSSL.Checked)
            {
                var csslFullname = Path.Combine(directory, this.currentFile.ShaderName + ".cssl.cs");
                files.Add(csslFullname);
                this.currentFile.GenerateCSSL(csslFullname);
            }
            if (this.chkMain.Checked)
            {
                var csslMainFullname = Path.Combine(directory, this.currentFile.ShaderName + ".main.cs");
                files.Add(csslMainFullname);
                this.currentFile.GenerateCSSLMain(csslMainFullname);
            }
            if (this.chkPropertyNameMap.Checked)
            {
                var propertyNameMapFullname = Path.Combine(directory, this.currentFile.ShaderName + ".PropertyNameMap.xml");
                files.Add(propertyNameMapFullname);
                this.currentFile.GenerateProperyNameMap(propertyNameMapFullname);
            }
            if (this.chkUniformNameMap.Checked)
            {
                var uniformNameMapFullname = Path.Combine(directory, this.currentFile.ShaderName + ".UniformNameMap.xml");
                files.Add(uniformNameMapFullname);
                this.currentFile.GenerateUinformNameMap(uniformNameMapFullname);
            }

            try
            {
                //Process.Start("explorer", "/select," + csslFullname + "," + rendererFullname);
                OpenFolderHelper.OpenFolderAndSelectFiles(directory, files.ToArray());
            }
            catch (Exception)
            {
            }
        }
Beispiel #3
0
        //TODO:生成Renderer的过程也用CodeDom重写一下吧。
        //可参考 http://www.cnblogs.com/nokiaguy/archive/2008/05/12/1193471.html
        /// <summary>
        ///
        /// </summary>
        public void GenerateRenderer()
        {
            string directory        = (new FileInfo(this.Fullname)).DirectoryName;
            var    rendererFullname = Path.Combine(directory, this.ShaderName + "Renderer.cs");

            var fileStream = new FileStream(rendererFullname, FileMode.Create);
            var listener   = new TextWriterTraceListener(fileStream);

            Debug.Listeners.Add(listener);
            //
            #region generate renderer
            Debug.WriteLine(string.Format("namespace Renderers.{0}", this.ShaderName));
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("using CSharpGL;");
            Debug.WriteLine("using CSharpGL.Objects;");
            Debug.WriteLine("using CSharpGL.Objects.Models;");
            Debug.WriteLine("using CSharpGL.Objects.Shaders;");
            Debug.WriteLine("using CSharpGL.Objects.Textures;");
            Debug.WriteLine("using CSharpGL.Objects.VertexBuffers;");
            Debug.WriteLine("using GLM;");
            Debug.WriteLine("using System;");
            Debug.WriteLine("using System.Collections.Generic;");
            Debug.WriteLine("using System.Linq;");
            Debug.WriteLine("using System.Threading.Tasks;");
            Debug.WriteLine("");
            Debug.WriteLine("/// <summary>");
            Debug.WriteLine(string.Format("/// 一个<see cref=\"\"/>对应一个(vertex shader+fragment shader+..shader)组成的shader program。", this.ShaderName + "Renderer"));
            Debug.WriteLine("/// </summary>");
            Debug.WriteLine(string.Format("public class {0} : RendererBase", this.ShaderName + "Renderer"));
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("ShaderProgram shaderProgram;");
            Debug.WriteLine("");
            Debug.WriteLine("#region VAO/VBO renderers");
            Debug.WriteLine("");
            Debug.WriteLine("VertexArrayObject vertexArrayObject;");
            Debug.WriteLine("");
            foreach (var item in this.VertexShaderFieldList)
            {
                if (item.Qualider == FieldQualifier.In)
                {
                    Debug.WriteLine(string.Format("const string str{0} = \"{0}\";", item.FieldName, item.FieldName));
                    Debug.WriteLine(string.Format("BufferRenderer {0}BufferRenderer;", item.FieldName));
                }
            }
            Debug.WriteLine("");
            Debug.WriteLine("BufferRenderer indexBufferRenderer;");
            Debug.WriteLine("");
            Debug.WriteLine("#endregion");
            Debug.WriteLine("");

            GenerateDeclaringUniforms();

            Debug.WriteLine("");
            Debug.WriteLine("public PolygonModes polygonMode = PolygonModes.Filled;");
            Debug.WriteLine("");
            Debug.WriteLine("private int elementCount;");
            Debug.WriteLine("");
            Debug.WriteLine("private IModel model;");
            Debug.WriteLine("");
            Debug.WriteLine(string.Format("public {0}(IModel model)", this.ShaderName + "Renderer"));
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("this.model = model;");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("");
            Debug.WriteLine("protected void InitializeShader(out ShaderProgram shaderProgram)");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine(string.Format("var vertexShaderSource = ManifestResourceLoader.LoadTextFile(\"{0}.vert\");", this.ShaderName));
            Debug.WriteLine(string.Format("var fragmentShaderSource = ManifestResourceLoader.LoadTextFile(\"{0}.frag\");", this.ShaderName));
            if (this.ProgramType == ShaderProgramType.VertexGeometryFragment)
            {
                Debug.WriteLine(string.Format("var geometryShaderSource = ManifestResourceLoader.LoadTextFile(\"{0}.geom\");", this.ShaderName));
            }
            Debug.WriteLine("");
            Debug.WriteLine("shaderProgram = new ShaderProgram();");
            if (this.ProgramType == ShaderProgramType.VertexGeometryFragment)
            {
                Debug.WriteLine("shaderProgram.Create(vertexShaderSource, fragmentShaderSource, geometryShaderSource);");
            }
            else
            {
                Debug.WriteLine("shaderProgram.Create(vertexShaderSource, fragmentShaderSource, null);");
            }
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("");
            Debug.WriteLine("protected void InitializeVAO()");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("IModel model = this.model;");
            GenerateSetRenderer();
            Debug.WriteLine("this.indexBufferRenderer = model.GetIndexes();");
            Debug.WriteLine("");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("IndexBufferRenderer renderer = this.indexBufferRenderer as IndexBufferRenderer;");
            Debug.WriteLine("if (renderer != null)");
            Debug.WriteLine("{ this.elementCount = renderer.ElementCount; }");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("ZeroIndexBufferRenderer renderer = this.indexBufferRenderer as ZeroIndexBufferRenderer;");
            Debug.WriteLine("if (renderer != null)");
            Debug.WriteLine("{ this.elementCount = renderer.VertexCount; } ");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("");
            Debug.WriteLine("protected override void DoInitialize()");
            Debug.WriteLine("{");
            Debug.WriteLine("    InitializeShader(out shaderProgram);");
            Debug.WriteLine("");
            Debug.WriteLine("    InitializeVAO();");
            Debug.WriteLine("}");
            Debug.WriteLine("");
            Debug.WriteLine("protected override void DoRender(RenderEventArgs e)");
            Debug.WriteLine("{");
            Debug.Indent();
            GenerateSetUniforms();
            Debug.WriteLine("");
            Debug.WriteLine("int[] originalPolygonMode = new int[1];");
            Debug.WriteLine("GL.GetInteger(GetTarget.PolygonMode, originalPolygonMode);");
            Debug.WriteLine("GL.PolygonMode(PolygonModeFaces.FrontAndBack, this.polygonMode);");
            Debug.WriteLine("");
            Debug.WriteLine("GL.Enable(GL.GL_PRIMITIVE_RESTART);");
            Debug.WriteLine("GL.PrimitiveRestartIndex(uint.MaxValue);");
            Debug.WriteLine("");
            Debug.WriteLine("if (this.vertexArrayObject == null)");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("var vertexArrayObject = new VertexArrayObject(");
            foreach (var item in this.VertexShaderFieldList)
            {
                if (item.Qualider == FieldQualifier.In)
                {
                    Debug.WriteLine(string.Format("this.{0}BufferRenderer,", item.FieldName));
                }
            }
            Debug.WriteLine("this.indexBufferRenderer);");
            Debug.WriteLine("vertexArrayObject.Create(e, this.shaderProgram);");
            Debug.WriteLine("");
            Debug.WriteLine("this.vertexArrayObject = vertexArrayObject;");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("else");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("this.vertexArrayObject.Render(e, this.shaderProgram);");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("");
            Debug.WriteLine("GL.Disable(GL.GL_PRIMITIVE_RESTART);");
            Debug.WriteLine("");
            Debug.WriteLine("GL.PolygonMode(PolygonModeFaces.FrontAndBack, (PolygonModes)(originalPolygonMode[0]));");
            Debug.WriteLine("");
            Debug.WriteLine("// 解绑shader");
            Debug.WriteLine("program.Unbind();");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("");
            Debug.WriteLine("protected override void DisposeUnmanagedResources()");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("if (this.vertexArrayObject != null)");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("this.vertexArrayObject.Dispose();");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("");
            Debug.WriteLine("public void DecreaseVertexCount()");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("IndexBufferRenderer renderer = this.indexBufferRenderer as IndexBufferRenderer;");
            Debug.WriteLine("if (renderer != null)");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("if (renderer.ElementCount > 0) { renderer.ElementCount--; }");
            Debug.WriteLine("return;");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("ZeroIndexBufferRenderer renderer = this.indexBufferRenderer as ZeroIndexBufferRenderer;");
            Debug.WriteLine("if (renderer != null)");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("if (renderer.VertexCount > 0) { renderer.VertexCount--; }");
            Debug.WriteLine("return;");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("");
            Debug.WriteLine("public void IncreaseVertexCount()");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("IndexBufferRenderer renderer = this.indexBufferRenderer as IndexBufferRenderer;");
            Debug.WriteLine("if (renderer != null)");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("if (renderer.ElementCount < this.elementCount) { renderer.ElementCount++; }");
            Debug.WriteLine("return;");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("ZeroIndexBufferRenderer renderer = this.indexBufferRenderer as ZeroIndexBufferRenderer;");
            Debug.WriteLine("if (renderer != null)");
            Debug.WriteLine("{");
            Debug.Indent();
            Debug.WriteLine("if (renderer.VertexCount < this.elementCount) { renderer.VertexCount++; }");
            Debug.WriteLine("return;");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.Unindent();
            Debug.WriteLine("}");
            Debug.Unindent();
            Debug.WriteLine("}");
            #endregion  generate renderer
            //
            Debug.Close();
            Debug.Listeners.Remove(listener);

            try
            {
                //Process.Start("explorer", "/select," + csslFullname + "," + rendererFullname);
                OpenFolderHelper.OpenFolderAndSelectFiles(directory, rendererFullname);
            }
            catch (Exception)
            {
            }
        }