[Test] public void CommentHandling() { ShaderSourceBuilder builder = new ShaderSourceBuilder(); string mainShader = new StringBuilder() .AppendLine("uniform vec4 sharedUniformA;") .AppendLine("uniform float sharedUniformB;") .AppendLine("uniform float sharedUniformC;") .AppendLine() .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = sharedFunc(gl_Vertex);") .AppendLine("}") .ToString(); string sharedShader = new StringBuilder() .AppendLine("uniform vec4 sharedUniformA;") .AppendLine("//uniform float sharedUniformB;") .AppendLine("/*") .AppendLine("uniform float sharedUniformC;") .AppendLine("*/") .AppendLine() .AppendLine("vec4 sharedFuncA(vec4 pos)") .AppendLine("{") .AppendLine(" return pos + vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .ToString(); string expectedResultShader = new StringBuilder() .AppendLine("#line 10000") .AppendLine("uniform vec4 sharedUniformA;") .AppendLine("//uniform float sharedUniformB;") .AppendLine("/*") .AppendLine("uniform float sharedUniformC;") .AppendLine("*/") .AppendLine() .AppendLine("vec4 sharedFuncA(vec4 pos)") .AppendLine("{") .AppendLine(" return pos + vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .AppendLine() .AppendLine("#line 1") .AppendLine("// uniform vec4 sharedUniformA;") .AppendLine("uniform float sharedUniformB;") .AppendLine("uniform float sharedUniformC;") .AppendLine() .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = sharedFunc(gl_Vertex);") .AppendLine("}") .ToString(); builder.SetMainChunk(mainShader); builder.AddSharedChunk(sharedShader); string resultShader = builder.Build(); Assert.AreEqual(expectedResultShader, resultShader); }
[Test] public void VersionDirective() { ShaderSourceBuilder builder = new ShaderSourceBuilder(); string mainShader = new StringBuilder() .AppendLine("#version 150") .AppendLine() .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = sharedFunc(gl_Vertex);") .AppendLine("}") .ToString(); string sharedShader = new StringBuilder() .AppendLine("#version 140") .AppendLine() .AppendLine("vec4 sharedFuncA(vec4 pos)") .AppendLine("{") .AppendLine(" return pos + vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .ToString(); string expectedResultShader = new StringBuilder() .AppendLine("#version 150") .AppendLine("#line 10000") .AppendLine("// #version 140") .AppendLine() .AppendLine("vec4 sharedFuncA(vec4 pos)") .AppendLine("{") .AppendLine(" return pos + vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .AppendLine() .AppendLine("#line 1") .AppendLine("// #version 150") .AppendLine() .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = sharedFunc(gl_Vertex);") .AppendLine("}") .ToString(); builder.SetMainChunk(mainShader); builder.AddSharedChunk(sharedShader); string resultShader = builder.Build(); Assert.AreEqual(expectedResultShader, resultShader); }
[Test] public void ConditionalSymbols() { ShaderSourceBuilder builder = new ShaderSourceBuilder(); string mainShader = new StringBuilder() .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = sharedFunc(gl_Vertex);") .AppendLine("}") .ToString(); string sharedShader = new StringBuilder() .AppendLine("vec4 sharedFuncA(vec4 pos)") .AppendLine("{") .AppendLine(" return pos + vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .ToString(); string expectedResultShader = new StringBuilder() .AppendLine("#line 20000") .AppendLine("#define CONDITION_B") .AppendLine("#define CONDITION_C") .AppendLine() .AppendLine("#line 10000") .AppendLine("vec4 sharedFuncA(vec4 pos)") .AppendLine("{") .AppendLine(" return pos + vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .AppendLine() .AppendLine("#line 1") .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = sharedFunc(gl_Vertex);") .AppendLine("}") .ToString(); builder.SetConditional("CONDITION_A", true); builder.SetConditional("CONDITION_B", true); builder.SetConditional("CONDITION_C", true); builder.SetConditional("CONDITION_A", false); builder.SetMainChunk(mainShader); builder.AddSharedChunk(sharedShader); string resultShader = builder.Build(); Assert.AreEqual(expectedResultShader, resultShader); }
[Test] public void FieldParsingComposition() { ShaderSourceBuilder builder = new ShaderSourceBuilder(); string mainShader = new StringBuilder() .AppendLine("#pragma duality editorType ColorRgba") .AppendLine("uniform vec4 mainColor;") .AppendLine() .AppendLine("in vec3 vertexPos;") .AppendLine() .AppendLine("out vec4 programColor;") .AppendLine() .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = vec4(0.0, 0.0, 0.0, 1.0);") .AppendLine(" programColor = vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .ToString(); string sharedShader = new StringBuilder() .AppendLine("// Some comment") .AppendLine("// Another comment") .AppendLine("# version 130") .AppendLine() .AppendLine("uniform mat4 _viewMatrix;") .AppendLine("uniform mat4 _projectionMatrix") .AppendLine("uniform mat4 _viewProjectionMatrix") .ToString(); builder.SetMainChunk(mainShader); builder.AddSharedChunk(sharedShader); string resultShader = builder.Build(); // Make sure all fields are there as expected Assert.AreEqual("_viewMatrix", builder.Fields[0].Name); Assert.AreEqual("_projectionMatrix", builder.Fields[1].Name); Assert.AreEqual("_viewProjectionMatrix", builder.Fields[2].Name); Assert.AreEqual("mainColor", builder.Fields[3].Name); Assert.AreEqual("vertexPos", builder.Fields[4].Name); }
[Test] public void VariableMetadata() { ShaderSourceBuilder builder = new ShaderSourceBuilder(); string mainShader = new StringBuilder() .AppendLine("#pragma duality editorType ColorRgba") .AppendLine("#pragma duality description \"Test mainUniform Desc\"") .AppendLine("uniform vec4 mainUniform;") .AppendLine() .AppendLine("#pragma duality editorType Single") .AppendLine("#pragma duality description \"Test sharedUniform Desc\"") .AppendLine("// Some comment") .AppendLine("uniform float sharedUniform;") .AppendLine() .AppendLine("#pragma duality editorType ColorRgba") .AppendLine() .AppendLine("#pragma duality description \"Test mainAttribute Desc\"") .AppendLine() .AppendLine("in vec4 mainAttribute;") .AppendLine() .AppendLine("#pragma duality editorType Single") .AppendLine("#pragma duality description \"Test sharedAttribute Desc\"") .AppendLine() .AppendLine("in vec4 sharedAttribute;") .AppendLine() .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = vec4(0.0, 0.0, 0.0, 1.0);") .AppendLine("}") .ToString(); string sharedShader = new StringBuilder() .AppendLine("#pragma duality editorType Single") .AppendLine("#pragma duality description \"Test sharedUniform Desc\"") .AppendLine("uniform float sharedUniform;") .AppendLine() .AppendLine("#pragma duality editorType Single") .AppendLine("#pragma duality description \"Test sharedAttribute Desc\"") .AppendLine("in vec4 sharedAttribute;") .AppendLine() .AppendLine("vec4 sharedFuncA(vec4 pos) { return pos; }") .ToString(); string expectedResultShader = new StringBuilder() .AppendLine("#line 10000") .AppendLine("// #pragma duality editorType Single") .AppendLine("// #pragma duality description \"Test sharedUniform Desc\"") .AppendLine("uniform float sharedUniform;") .AppendLine() .AppendLine("// #pragma duality editorType Single") .AppendLine("// #pragma duality description \"Test sharedAttribute Desc\"") .AppendLine("in vec4 sharedAttribute;") .AppendLine() .AppendLine("vec4 sharedFuncA(vec4 pos) { return pos; }") .AppendLine() .AppendLine("#line 1") .AppendLine("// #pragma duality editorType ColorRgba") .AppendLine("// #pragma duality description \"Test mainUniform Desc\"") .AppendLine("uniform vec4 mainUniform;") .AppendLine() .AppendLine("// #pragma duality editorType Single") .AppendLine("// #pragma duality description \"Test sharedUniform Desc\"") .AppendLine("// Some comment") .AppendLine("// uniform float sharedUniform;") .AppendLine() .AppendLine("// #pragma duality editorType ColorRgba") .AppendLine() .AppendLine("// #pragma duality description \"Test mainAttribute Desc\"") .AppendLine() .AppendLine("in vec4 mainAttribute;") .AppendLine() .AppendLine("// #pragma duality editorType Single") .AppendLine("// #pragma duality description \"Test sharedAttribute Desc\"") .AppendLine() .AppendLine("// in vec4 sharedAttribute;") .AppendLine() .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = vec4(0.0, 0.0, 0.0, 1.0);") .AppendLine("}") .ToString(); builder.SetMainChunk(mainShader); builder.AddSharedChunk(sharedShader); string resultShader = builder.Build(); Assert.AreEqual(expectedResultShader, resultShader); }
[Test] public void Composition() { ShaderSourceBuilder builder = new ShaderSourceBuilder(); string mainShader = new StringBuilder() .AppendLine("uniform vec4 mainUniformA;") .AppendLine("uniform float mainUniformB;") .AppendLine("uniform vec4 sharedUniformA;") .AppendLine() .AppendLine("attribute vec4 mainAttributeA;") .AppendLine("attribute vec4 sharedAttributeA;") .AppendLine("in float mainAttributeB;") .AppendLine() .AppendLine("varying vec4 sharedVaryingA;") .AppendLine("varying vec4 mainVaryingA;") .AppendLine("out float mainVaryingB;") .AppendLine() .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = sharedFunc(gl_Vertex);") .AppendLine("}") .ToString(); string sharedShaderA = new StringBuilder() .AppendLine("uniform vec4 sharedUniformA;") .AppendLine("attribute vec4 sharedAttributeA;") .AppendLine("varying vec4 sharedVaryingA;") .AppendLine() .AppendLine("vec4 sharedFuncA(vec4 pos)") .AppendLine("{") .AppendLine(" return pos + vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .ToString(); string sharedShaderB = new StringBuilder() .AppendLine("uniform float sharedUniformB;") .AppendLine("in float sharedAttributeB;") .AppendLine("out float sharedVaryingB;") .AppendLine() .AppendLine("vec4 sharedFuncB(vec4 pos)") .AppendLine("{") .AppendLine(" return pos + vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .ToString(); string expectedResultShader = new StringBuilder() .AppendLine("#line 10000") .AppendLine("uniform vec4 sharedUniformA;") .AppendLine("attribute vec4 sharedAttributeA;") .AppendLine("varying vec4 sharedVaryingA;") .AppendLine() .AppendLine("vec4 sharedFuncA(vec4 pos)") .AppendLine("{") .AppendLine(" return pos + vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .AppendLine() .AppendLine("#line 20000") .AppendLine("uniform float sharedUniformB;") .AppendLine("in float sharedAttributeB;") .AppendLine("out float sharedVaryingB;") .AppendLine() .AppendLine("vec4 sharedFuncB(vec4 pos)") .AppendLine("{") .AppendLine(" return pos + vec4(1.0, 0.0, 0.0, 0.0);") .AppendLine("}") .AppendLine() .AppendLine("#line 1") .AppendLine("uniform vec4 mainUniformA;") .AppendLine("uniform float mainUniformB;") .AppendLine("// uniform vec4 sharedUniformA;") .AppendLine() .AppendLine("attribute vec4 mainAttributeA;") .AppendLine("// attribute vec4 sharedAttributeA;") .AppendLine("in float mainAttributeB;") .AppendLine() .AppendLine("// varying vec4 sharedVaryingA;") .AppendLine("varying vec4 mainVaryingA;") .AppendLine("out float mainVaryingB;") .AppendLine() .AppendLine("void main()") .AppendLine("{") .AppendLine(" gl_Position = sharedFunc(gl_Vertex);") .AppendLine("}") .ToString(); builder.SetMainChunk(mainShader); builder.AddSharedChunk(sharedShaderA); builder.AddSharedChunk(sharedShaderB); string resultShader = builder.Build(); Assert.AreEqual(expectedResultShader, resultShader); }