| @@ -14,6 +14,7 @@ | |||||
| #include <cmath> | #include <cmath> | ||||
| #include <cstdio> | #include <cstdio> | ||||
| #include <cstring> | |||||
| #include "core.h" | #include "core.h" | ||||
| #include "lolgl.h" | #include "lolgl.h" | ||||
| @@ -28,11 +29,12 @@ namespace lol | |||||
| * DebugQuad implementation class | * DebugQuad implementation class | ||||
| */ | */ | ||||
| static int const NUM_ARRAYS = 2; | |||||
| static int const NUM_BUFFERS = 9; | |||||
| static int const NUM_ATTRS = 6; | |||||
| static int const NUM_SHADERS = 6; | |||||
| static int const NUM_TEXTURES = 1; | |||||
| static int const NUM_ARRAYS = 10; | |||||
| static int const NUM_BUFFERS = 20; | |||||
| static int const NUM_ATTRS = 20; | |||||
| static int const NUM_UNIFORMS = 20; | |||||
| static int const NUM_SHADERS = 20; | |||||
| static int const NUM_TEXTURES = 10; | |||||
| static int const TEX_SIZE = 32; | static int const TEX_SIZE = 32; | ||||
| @@ -51,8 +53,18 @@ private: | |||||
| GLuint buffer[NUM_BUFFERS]; | GLuint buffer[NUM_BUFFERS]; | ||||
| Shader *shader[NUM_SHADERS]; | Shader *shader[NUM_SHADERS]; | ||||
| GLuint attr[NUM_ATTRS]; | GLuint attr[NUM_ATTRS]; | ||||
| GLuint uni[NUM_UNIFORMS]; | |||||
| GLuint texture[NUM_TEXTURES]; | GLuint texture[NUM_TEXTURES]; | ||||
| uint8_t image[1][TEX_SIZE * TEX_SIZE * 4]; | uint8_t image[1][TEX_SIZE * TEX_SIZE * 4]; | ||||
| GLfloat const *GetVertexArray() | |||||
| { | |||||
| GLfloat tmp[18] = { aa.x, bb.y, 0, bb.x, bb.y, 0, bb.x, aa.y, 0, | |||||
| bb.x, aa.y, 0, aa.x, aa.y, 0, aa.x, bb.y, 0 }; | |||||
| memcpy(vertices, tmp, sizeof(tmp)); | |||||
| return vertices; | |||||
| } | |||||
| GLfloat vertices[18]; /* To cache quad coordinates */ | |||||
| }; | }; | ||||
| /* | /* | ||||
| @@ -125,7 +137,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| } | } | ||||
| /* Prepare our quad coordinates */ | /* Prepare our quad coordinates */ | ||||
| vec2i const layout(4, 3); | |||||
| vec2i const layout(5, 4); | |||||
| data->step = vec2(2.0f, -2.0f) / (4 * layout + vec2i(1)); | data->step = vec2(2.0f, -2.0f) / (4 * layout + vec2i(1)); | ||||
| data->orig = vec2(-1.0f, 1.0f) + data->step; | data->orig = vec2(-1.0f, 1.0f) + data->step; | ||||
| data->aa = data->orig; | data->aa = data->orig; | ||||
| @@ -149,15 +161,16 @@ void DebugQuad::TickDraw(float deltams) | |||||
| GLuint *buffer = data->buffer; | GLuint *buffer = data->buffer; | ||||
| Shader **shader = data->shader; | Shader **shader = data->shader; | ||||
| GLuint *attr = data->attr; | GLuint *attr = data->attr; | ||||
| GLuint *uni = data->uni; | |||||
| ResetState(); | ResetState(); | ||||
| #if defined HAVE_GLBEGIN || defined USE_GLEW | |||||
| /* | /* | ||||
| * Test #1: simple glBegin code | * Test #1: simple glBegin code | ||||
| * | * | ||||
| * Renders an orange square. | * Renders an orange square. | ||||
| */ | */ | ||||
| #if defined HAVE_GLBEGIN || defined USE_GLEW | |||||
| glColor3f(0.8f, 0.5f, 0.2f); | glColor3f(0.8f, 0.5f, 0.2f); | ||||
| glBegin(GL_TRIANGLES); | glBegin(GL_TRIANGLES); | ||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| @@ -168,6 +181,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glVertex3f(data->aa.x, data->aa.y, 0.0f); | glVertex3f(data->aa.x, data->aa.y, 0.0f); | ||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| glEnd(); | glEnd(); | ||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| @@ -177,7 +191,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| * | * | ||||
| * Renders a multicoloured square with varying colors. | * Renders a multicoloured square with varying colors. | ||||
| */ | */ | ||||
| #if defined HAVE_GLBEGIN || defined USE_GLEW | |||||
| glBegin(GL_TRIANGLES); | glBegin(GL_TRIANGLES); | ||||
| glColor3f(f1, f2, f3); | glColor3f(f1, f2, f3); | ||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| @@ -192,6 +206,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glColor3f(f1, f2, f3); | glColor3f(f1, f2, f3); | ||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| glEnd(); | glEnd(); | ||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| @@ -202,6 +217,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| * Renders a multicoloured square with varying colors multiplied with an | * Renders a multicoloured square with varying colors multiplied with an | ||||
| * animated distorted checkerboard. | * animated distorted checkerboard. | ||||
| */ | */ | ||||
| #if defined HAVE_GLBEGIN || defined USE_GLEW | |||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | glBindTexture(GL_TEXTURE_2D, data->texture[0]); | ||||
| glColor3f(1.0f, 1.0f, 1.0f); | glColor3f(1.0f, 1.0f, 1.0f); | ||||
| @@ -226,6 +242,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| glEnd(); | glEnd(); | ||||
| glDisable(GL_TEXTURE_2D); | glDisable(GL_TEXTURE_2D); | ||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| @@ -235,6 +252,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| * | * | ||||
| * Renders a static, coloured and tiled pattern. | * Renders a static, coloured and tiled pattern. | ||||
| */ | */ | ||||
| #if defined HAVE_GLBEGIN || defined USE_GLEW | |||||
| if (!shader[0]) | if (!shader[0]) | ||||
| shader[0] = Shader::Create( | shader[0] = Shader::Create( | ||||
| "#version 110\n" | "#version 110\n" | ||||
| @@ -263,7 +281,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glVertex3f(data->aa.x, data->aa.y, 0.0f); | glVertex3f(data->aa.x, data->aa.y, 0.0f); | ||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| glEnd(); | glEnd(); | ||||
| glUseProgram(0); | |||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| @@ -274,6 +292,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| * | * | ||||
| * Renders a multicoloured square with varying colors. | * Renders a multicoloured square with varying colors. | ||||
| */ | */ | ||||
| #if defined HAVE_GLBEGIN || defined USE_GLEW | |||||
| if (!shader[0]) | if (!shader[0]) | ||||
| shader[0] = Shader::Create( | shader[0] = Shader::Create( | ||||
| "#version 110\n" | "#version 110\n" | ||||
| @@ -310,7 +329,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glTexCoord3f(f1, f2, f3); | glTexCoord3f(f1, f2, f3); | ||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| glEnd(); | glEnd(); | ||||
| glUseProgram(0); | |||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| @@ -324,6 +343,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| * Note: there is no need to glEnable(GL_TEXTURE_2D) when the | * Note: there is no need to glEnable(GL_TEXTURE_2D) when the | ||||
| * texture lookup is done in a shader. | * texture lookup is done in a shader. | ||||
| */ | */ | ||||
| #if defined HAVE_GLBEGIN || defined USE_GLEW | |||||
| if (!shader[0]) | if (!shader[0]) | ||||
| shader[0] = Shader::Create( | shader[0] = Shader::Create( | ||||
| "#version 110\n" | "#version 110\n" | ||||
| @@ -358,11 +378,10 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glTexCoord2f(f1, f3); | glTexCoord2f(f1, f3); | ||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| glEnd(); | glEnd(); | ||||
| glUseProgram(0); | |||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| #endif | |||||
| /* | /* | ||||
| * Test #7: simple vertex buffer | * Test #7: simple vertex buffer | ||||
| @@ -370,24 +389,17 @@ void DebugQuad::TickDraw(float deltams) | |||||
| * Renders an orange square. | * Renders an orange square. | ||||
| */ | */ | ||||
| #if !defined ANDROID_NDK | #if !defined ANDROID_NDK | ||||
| GLfloat const vertices1[] = { data->aa.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->bb.y, 0.0f }; | |||||
| glColor4f(0.8f, 0.5f, 0.2f, 1.0f); | glColor4f(0.8f, 0.5f, 0.2f, 1.0f); | ||||
| glEnableClientState(GL_VERTEX_ARRAY); | glEnableClientState(GL_VERTEX_ARRAY); | ||||
| glVertexPointer(3, GL_FLOAT, 0, vertices1); | |||||
| glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray()); | |||||
| glDrawArrays(GL_TRIANGLES, 0, 6); | glDrawArrays(GL_TRIANGLES, 0, 6); | ||||
| glDisableClientState(GL_VERTEX_ARRAY); | glDisableClientState(GL_VERTEX_ARRAY); | ||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| #endif | |||||
| /* | /* | ||||
| * Test #8: vertex buffer + per-vertex coloring | * Test #8: vertex buffer + per-vertex coloring | ||||
| @@ -395,26 +407,19 @@ void DebugQuad::TickDraw(float deltams) | |||||
| * Renders a multicoloured square with varying colors. | * Renders a multicoloured square with varying colors. | ||||
| */ | */ | ||||
| #if !defined ANDROID_NDK | #if !defined ANDROID_NDK | ||||
| GLfloat const vertices2[] = { data->aa.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->bb.y, 0.0f }; | |||||
| glEnableClientState(GL_VERTEX_ARRAY); | glEnableClientState(GL_VERTEX_ARRAY); | ||||
| glEnableClientState(GL_COLOR_ARRAY); | glEnableClientState(GL_COLOR_ARRAY); | ||||
| glVertexPointer(3, GL_FLOAT, 0, vertices2); | |||||
| glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray()); | |||||
| glColorPointer(3, GL_FLOAT, 0, colors); | glColorPointer(3, GL_FLOAT, 0, colors); | ||||
| glDrawArrays(GL_TRIANGLES, 0, 6); | glDrawArrays(GL_TRIANGLES, 0, 6); | ||||
| glDisableClientState(GL_VERTEX_ARRAY); | glDisableClientState(GL_VERTEX_ARRAY); | ||||
| glDisableClientState(GL_COLOR_ARRAY); | glDisableClientState(GL_COLOR_ARRAY); | ||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| #endif | |||||
| /* | /* | ||||
| * Test #9: vertex buffer + per-vertex coloring + texture | * Test #9: vertex buffer + per-vertex coloring + texture | ||||
| @@ -423,20 +428,13 @@ void DebugQuad::TickDraw(float deltams) | |||||
| * animated distorted checkerboard. | * animated distorted checkerboard. | ||||
| */ | */ | ||||
| #if !defined ANDROID_NDK | #if !defined ANDROID_NDK | ||||
| GLfloat const vertices3[] = { data->aa.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->bb.y, 0.0f }; | |||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | glBindTexture(GL_TEXTURE_2D, data->texture[0]); | ||||
| glEnableClientState(GL_VERTEX_ARRAY); | glEnableClientState(GL_VERTEX_ARRAY); | ||||
| glEnableClientState(GL_COLOR_ARRAY); | glEnableClientState(GL_COLOR_ARRAY); | ||||
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); | glEnableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
| glVertexPointer(3, GL_FLOAT, 0, vertices3); | |||||
| glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray()); | |||||
| glColorPointer(3, GL_FLOAT, 0, colors); | glColorPointer(3, GL_FLOAT, 0, colors); | ||||
| glTexCoordPointer(2, GL_FLOAT, 0, texcoords); | glTexCoordPointer(2, GL_FLOAT, 0, texcoords); | ||||
| @@ -446,19 +444,176 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glDisableClientState(GL_COLOR_ARRAY); | glDisableClientState(GL_COLOR_ARRAY); | ||||
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); | glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
| glDisable(GL_TEXTURE_2D); | glDisable(GL_TEXTURE_2D); | ||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| /* | |||||
| * Test #10: vertex buffer + hardcoded color in 1.10 fragment shader | |||||
| * (GLSL) or in Cg fragment shader (PS3) | |||||
| * | |||||
| * Renders an orange square. | |||||
| */ | |||||
| #if !defined ANDROID_NDK | |||||
| if (!shader[0]) | |||||
| #if !defined __CELLOS_LV2__ | |||||
| shader[0] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_FragColor = vec4(0.8, 0.5, 0.2, 1.0);" | |||||
| "}"); | |||||
| #else | |||||
| shader[0] = Shader::Create( | |||||
| "void main(float4 in_Position : POSITION," | |||||
| " out float4 out_Position : POSITION)" | |||||
| "{" | |||||
| " out_Position = in_Position;" | |||||
| "}", | |||||
| "void main(out float4 out_FragColor : COLOR)" | |||||
| "{" | |||||
| " out_FragColor = float4(0.8, 0.5, 0.2, 1.0);" | |||||
| "}"); | |||||
| #endif | |||||
| shader[0]->Bind(); | |||||
| shader++; | |||||
| glEnableClientState(GL_VERTEX_ARRAY); | |||||
| glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray()); | |||||
| glDrawArrays(GL_TRIANGLES, 0, 6); | |||||
| glDisableClientState(GL_VERTEX_ARRAY); | |||||
| #endif | #endif | ||||
| Advance(); | |||||
| ResetState(); | |||||
| /* | /* | ||||
| * Test #10: vertex buffer + texture & color in 1.10 fragment shader | |||||
| * Test #11: vertex buffer + uniform color in 1.10 fragment shader | |||||
| * (GLSL) or in Cg fragment shader (PS3) | |||||
| * | |||||
| * Renders an orange square. | |||||
| */ | |||||
| #if !defined ANDROID_NDK | |||||
| if (!shader[0]) | |||||
| { | |||||
| #if !defined __CELLOS_LV2__ | |||||
| shader[0] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "uniform vec4 in_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_FragColor = in_Color;" | |||||
| "}"); | |||||
| #else | |||||
| shader[0] = Shader::Create( | |||||
| "void main(float4 in_Position : POSITION," | |||||
| " out float4 out_Position : POSITION)" | |||||
| "{" | |||||
| " out_Position = in_Position;" | |||||
| "}", | |||||
| "uniform float4 in_Color;" | |||||
| "void main(out float4 out_FragColor : COLOR)" | |||||
| "{" | |||||
| " out_FragColor = in_Color;" | |||||
| "}"); | |||||
| #endif | |||||
| uni[0] = shader[0]->GetUniformLocation("in_Color"); | |||||
| } | |||||
| shader[0]->Bind(); | |||||
| shader++; | |||||
| #if !defined __CELLOS_LV2__ | |||||
| glUniform4f(uni[0], 0.8f, 0.5f, 0.2f, 1.0f); | |||||
| #else | |||||
| cgGLSetParameter4f((CGparameter)(intptr_t)uni[0], 0.8f, 0.5f, 0.2f, 1.0f); | |||||
| #endif | |||||
| uni++; | |||||
| glEnableClientState(GL_VERTEX_ARRAY); | |||||
| glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray()); | |||||
| glDrawArrays(GL_TRIANGLES, 0, 6); | |||||
| glDisableClientState(GL_VERTEX_ARRAY); | |||||
| #endif | |||||
| Advance(); | |||||
| ResetState(); | |||||
| /* | |||||
| * Test #12: vertex buffer + color in 1.10 fragment shader (GLSL) or | |||||
| * in Cg fragment shader (PS3) | |||||
| * | |||||
| * Renders a static, coloured and tiled pattern. | |||||
| */ | |||||
| #if !defined ANDROID_NDK | |||||
| if (!shader[0]) | |||||
| #if !defined __CELLOS_LV2__ | |||||
| shader[0] = Shader::Create( | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "void main()" | |||||
| "{" | |||||
| " float dx = mod(gl_FragCoord.x * gl_FragCoord.y, 2.0);" | |||||
| " float dy = mod(gl_FragCoord.x * 0.125, 1.0);" | |||||
| " float dz = mod(gl_FragCoord.y * 0.125, 1.0);" | |||||
| " gl_FragColor = vec4(dx, dy, dz, 1.0);" | |||||
| "}"); | |||||
| #else | |||||
| shader[0] = Shader::Create( | |||||
| "void main(float4 in_Position : POSITION," | |||||
| " out float4 out_Position : POSITION)" | |||||
| "{" | |||||
| " out_Position = in_Position;" | |||||
| "}", | |||||
| "void main(float4 in_FragCoord : WPOS," | |||||
| " out float4 out_FragColor : COLOR)" | |||||
| "{" | |||||
| " float dx = frac(in_FragCoord.x * in_FragCoord.y * 0.5) * 2.0;" | |||||
| " float dy = frac(in_FragCoord.x * 0.125);" | |||||
| " float dz = frac(in_FragCoord.y * 0.125);" | |||||
| " out_FragColor = float4(dx, dy, dz, 1.0);" | |||||
| "}"); | |||||
| #endif | |||||
| shader[0]->Bind(); | |||||
| shader++; | |||||
| glEnableClientState(GL_VERTEX_ARRAY); | |||||
| glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray()); | |||||
| glDrawArrays(GL_TRIANGLES, 0, 6); | |||||
| glDisableClientState(GL_VERTEX_ARRAY); | |||||
| #endif | |||||
| Advance(); | |||||
| ResetState(); | |||||
| /* | |||||
| * Test #13: vertex buffer + texture & color in 1.10 fragment shader | |||||
| * | * | ||||
| * Renders a multicoloured square with varying colors xored with an | * Renders a multicoloured square with varying colors xored with an | ||||
| * animated distorted checkerboard. | * animated distorted checkerboard. | ||||
| */ | */ | ||||
| #if !defined __CELLOS_LV2__ && !defined ANDROID_NDK | |||||
| #if !defined ANDROID_NDK | |||||
| if (!shader[0]) | if (!shader[0]) | ||||
| #if !defined __CELLOS_LV2__ | |||||
| shader[0] = Shader::Create( | shader[0] = Shader::Create( | ||||
| "#version 110\n" | "#version 110\n" | ||||
| "varying vec4 pass_Color;" | "varying vec4 pass_Color;" | ||||
| @@ -477,15 +632,32 @@ void DebugQuad::TickDraw(float deltams) | |||||
| " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | ||||
| " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);" | " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);" | ||||
| "}"); | "}"); | ||||
| #else | |||||
| shader[0] = Shader::Create( | |||||
| "void main(float4 in_Position : POSITION," | |||||
| " float2 in_TexCoord : TEXCOORD0," | |||||
| " float4 in_Color : COLOR," | |||||
| " out float4 out_Color : COLOR," | |||||
| " out float4 out_Position : POSITION," | |||||
| " out float2 out_TexCoord : TEXCOORD0)" | |||||
| "{" | |||||
| " out_TexCoord = in_TexCoord;" | |||||
| " out_Color = in_Color;" | |||||
| " out_Position = in_Position;" | |||||
| "}", | |||||
| "void main(float2 in_TexCoord : TEXCOORD0," | |||||
| " float4 in_Color : COLOR," | |||||
| " uniform sampler2D tex," | |||||
| " out float4 out_FragColor : COLOR)" | |||||
| "{" | |||||
| " float4 tmp = tex2D(tex, in_TexCoord * 0.25);" | |||||
| " out_FragColor = float4(abs(tmp.xyz - in_Color.xyz), 1);" | |||||
| "}"); | |||||
| #endif | |||||
| shader[0]->Bind(); | shader[0]->Bind(); | ||||
| shader++; | shader++; | ||||
| GLfloat const vertices4[] = { data->aa.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->bb.y, 0.0f }; | |||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | glBindTexture(GL_TEXTURE_2D, data->texture[0]); | ||||
| @@ -493,7 +665,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glEnableClientState(GL_COLOR_ARRAY); | glEnableClientState(GL_COLOR_ARRAY); | ||||
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); | glEnableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
| glVertexPointer(3, GL_FLOAT, 0, vertices4); | |||||
| glVertexPointer(3, GL_FLOAT, 0, data->GetVertexArray()); | |||||
| glColorPointer(3, GL_FLOAT, 0, colors); | glColorPointer(3, GL_FLOAT, 0, colors); | ||||
| glTexCoordPointer(2, GL_FLOAT, 0, texcoords); | glTexCoordPointer(2, GL_FLOAT, 0, texcoords); | ||||
| glDrawArrays(GL_TRIANGLES, 0, 6); | glDrawArrays(GL_TRIANGLES, 0, 6); | ||||
| @@ -501,14 +673,13 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glDisableClientState(GL_VERTEX_ARRAY); | glDisableClientState(GL_VERTEX_ARRAY); | ||||
| glDisableClientState(GL_COLOR_ARRAY); | glDisableClientState(GL_COLOR_ARRAY); | ||||
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); | glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
| glUseProgram(0); | |||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| #endif | |||||
| /* | /* | ||||
| * Test #11: vertex buffer + texture & color in 1.20 fragment shader | |||||
| * Test #14: vertex buffer + texture & color in 1.20 fragment shader | |||||
| * | * | ||||
| * Renders a multicoloured square with varying colors xored with an | * Renders a multicoloured square with varying colors xored with an | ||||
| * animated distorted checkerboard. | * animated distorted checkerboard. | ||||
| @@ -543,20 +714,14 @@ void DebugQuad::TickDraw(float deltams) | |||||
| } | } | ||||
| shader[0]->Bind(); | shader[0]->Bind(); | ||||
| shader++; | shader++; | ||||
| GLfloat const vertices5[] = { data->aa.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->bb.y, 0.0f }; | |||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | glBindTexture(GL_TEXTURE_2D, data->texture[0]); | ||||
| glBindVertexArray(*array++); | glBindVertexArray(*array++); | ||||
| glBindBuffer(GL_ARRAY_BUFFER, *buffer++); | glBindBuffer(GL_ARRAY_BUFFER, *buffer++); | ||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(vertices5), vertices5, | |||||
| GL_DYNAMIC_DRAW); | |||||
| glBufferData(GL_ARRAY_BUFFER, 3 * 6 * sizeof(GLfloat), | |||||
| data->GetVertexArray(), GL_DYNAMIC_DRAW); | |||||
| glVertexAttribPointer(attr[0], 3, GL_FLOAT, GL_FALSE, 0, 0); | glVertexAttribPointer(attr[0], 3, GL_FLOAT, GL_FALSE, 0, 0); | ||||
| glEnableVertexAttribArray(attr[0]); | glEnableVertexAttribArray(attr[0]); | ||||
| @@ -578,14 +743,13 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glDisableVertexAttribArray(*attr++); | glDisableVertexAttribArray(*attr++); | ||||
| glDisableVertexAttribArray(*attr++); | glDisableVertexAttribArray(*attr++); | ||||
| glDisableVertexAttribArray(*attr++); | glDisableVertexAttribArray(*attr++); | ||||
| glUseProgram(0); | |||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| #endif | |||||
| /* | /* | ||||
| * Test #12: vertex buffer + texture & color in 1.30 fragment shader | |||||
| * Test #15: vertex buffer + texture & color in 1.30 fragment shader | |||||
| * | * | ||||
| * Renders a multicoloured square with varying colors xored with an | * Renders a multicoloured square with varying colors xored with an | ||||
| * animated distorted checkerboard. | * animated distorted checkerboard. | ||||
| @@ -620,20 +784,14 @@ void DebugQuad::TickDraw(float deltams) | |||||
| } | } | ||||
| shader[0]->Bind(); | shader[0]->Bind(); | ||||
| shader++; | shader++; | ||||
| GLfloat const vertices6[] = { data->aa.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->bb.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->bb.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->aa.y, 0.0f, | |||||
| data->aa.x, data->bb.y, 0.0f }; | |||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | glBindTexture(GL_TEXTURE_2D, data->texture[0]); | ||||
| glBindVertexArray(*array++); | glBindVertexArray(*array++); | ||||
| glBindBuffer(GL_ARRAY_BUFFER, *buffer++); | glBindBuffer(GL_ARRAY_BUFFER, *buffer++); | ||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(vertices6), vertices6, | |||||
| GL_DYNAMIC_DRAW); | |||||
| glBufferData(GL_ARRAY_BUFFER, 3 * 6 * sizeof(GLfloat), | |||||
| data->GetVertexArray(), GL_DYNAMIC_DRAW); | |||||
| glVertexAttribPointer(attr[0], 3, GL_FLOAT, GL_FALSE, 0, 0); | glVertexAttribPointer(attr[0], 3, GL_FLOAT, GL_FALSE, 0, 0); | ||||
| glEnableVertexAttribArray(attr[0]); | glEnableVertexAttribArray(attr[0]); | ||||
| @@ -655,11 +813,10 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glDisableVertexAttribArray(*attr++); | glDisableVertexAttribArray(*attr++); | ||||
| glDisableVertexAttribArray(*attr++); | glDisableVertexAttribArray(*attr++); | ||||
| glDisableVertexAttribArray(*attr++); | glDisableVertexAttribArray(*attr++); | ||||
| glUseProgram(0); | |||||
| #endif | |||||
| Advance(); | Advance(); | ||||
| ResetState(); | ResetState(); | ||||
| #endif | |||||
| /* Check that we didn't overflow our list */ | /* Check that we didn't overflow our list */ | ||||
| #if !defined __CELLOS_LV2__ && !defined ANDROID_NDK | #if !defined __CELLOS_LV2__ && !defined ANDROID_NDK | ||||
| @@ -677,6 +834,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| void DebugQuad::ResetState() | void DebugQuad::ResetState() | ||||
| { | { | ||||
| /* Reset GL states to something reasonably safe */ | /* Reset GL states to something reasonably safe */ | ||||
| #if defined HAVE_GLBEGIN || defined USE_GLEW || defined __CELLOS_LV2__ | #if defined HAVE_GLBEGIN || defined USE_GLEW || defined __CELLOS_LV2__ | ||||
| glMatrixMode(GL_PROJECTION); | glMatrixMode(GL_PROJECTION); | ||||
| glLoadIdentity(); | glLoadIdentity(); | ||||
| @@ -684,6 +842,8 @@ void DebugQuad::ResetState() | |||||
| glLoadIdentity(); | glLoadIdentity(); | ||||
| #endif | #endif | ||||
| glColor4f(1.0f, 1.0f, 1.0f, 1.0f); | |||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| glBindTexture(GL_TEXTURE_2D, 0); | glBindTexture(GL_TEXTURE_2D, 0); | ||||
| #if defined HAVE_GLBEGIN || defined USE_GLEW || defined __CELLOS_LV2__ | #if defined HAVE_GLBEGIN || defined USE_GLEW || defined __CELLOS_LV2__ | ||||
| @@ -694,6 +854,9 @@ void DebugQuad::ResetState() | |||||
| glBindBuffer(GL_ARRAY_BUFFER, 0); | glBindBuffer(GL_ARRAY_BUFFER, 0); | ||||
| #if !defined __CELLOS_LV2__ | #if !defined __CELLOS_LV2__ | ||||
| glUseProgram(0); | glUseProgram(0); | ||||
| #else | |||||
| cgGLDisableProfile(cgGLGetLatestProfile(CG_GL_VERTEX)); | |||||
| cgGLDisableProfile(cgGLGetLatestProfile(CG_GL_FRAGMENT)); | |||||
| #endif | #endif | ||||
| } | } | ||||