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) { } }
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) { } }
//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) { } }