| @@ -28,7 +28,7 @@ namespace lol | |||
| * DebugQuad implementation class | |||
| */ | |||
| #define NUM_SHADERS 3 | |||
| #define NUM_SHADERS 4 | |||
| class DebugQuadData | |||
| { | |||
| @@ -71,6 +71,7 @@ void DebugQuad::TickDraw(float deltams) | |||
| if (!data->initialised && !IsDestroying()) | |||
| { | |||
| #if 0 | |||
| glGenBuffers(3, data->buflist); | |||
| static char const *vertexshader = | |||
| @@ -99,7 +100,9 @@ void DebugQuad::TickDraw(float deltams) | |||
| "}\n"; | |||
| data->shader[0] = Shader::Create(vertexshader, fragmentshader); | |||
| glGenTextures(1, data->texlist); | |||
| #endif | |||
| /* Checkerboard texture */ | |||
| glEnable(GL_TEXTURE_2D); | |||
| glBindTexture(GL_TEXTURE_2D, data->texlist[0]); | |||
| for (int j = 0; j < 32; j++) | |||
| @@ -154,33 +157,59 @@ void DebugQuad::TickDraw(float deltams) | |||
| "}"); | |||
| /* Quad #6: apply texture in fragment shader */ | |||
| /* Quad #8: vertex buffer, apply texture in fragment shader */ | |||
| data->shader[2] = Shader::Create( | |||
| "#version 120\n" | |||
| "void main()" | |||
| "{" | |||
| " gl_TexCoord[0] = gl_MultiTexCoord0;" | |||
| " gl_Position = gl_Vertex;" | |||
| "}", | |||
| "#version 120\n" | |||
| "uniform sampler2D tex;" | |||
| "void main()" | |||
| "{" | |||
| " gl_FragColor = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||
| "}"); | |||
| /* Quad #8: vertex buffer, apply texture in fragment shader */ | |||
| data->shader[3] = Shader::Create( | |||
| "#version 120\n" | |||
| "varying vec4 color;" | |||
| "void main()" | |||
| "{" | |||
| " gl_TexCoord[0] = gl_MultiTexCoord0;" | |||
| " color = gl_Color;" | |||
| " gl_Position = gl_Vertex;" | |||
| "}", | |||
| "#version 120\n" | |||
| "varying vec4 color;" | |||
| "uniform sampler2D tex;" | |||
| "void main()" | |||
| "{" | |||
| " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||
| " gl_FragColor = vec4(abs(tmp.xyz - color.xyz), 1.0);" | |||
| "}"); | |||
| data->initialised = 1; | |||
| } | |||
| else if (data->initialised && IsDestroying()) | |||
| { | |||
| #if 0 | |||
| glDeleteBuffers(3, data->buflist); | |||
| #endif | |||
| Shader::Destroy(data->shader[0]); | |||
| Shader::Destroy(data->shader[1]); | |||
| Shader::Destroy(data->shader[2]); | |||
| Shader::Destroy(data->shader[3]); | |||
| glDeleteTextures(1, data->texlist); | |||
| data->initialised = 0; | |||
| } | |||
| #if 0 | |||
| float const st = sinf(0.0005f * data->time); | |||
| float const ct = cosf(0.0005f * data->time); | |||
| @@ -272,6 +301,7 @@ void DebugQuad::TickDraw(float deltams) | |||
| glDisableVertexAttribArray(attr_pos); | |||
| glDisableVertexAttribArray(attr_col); | |||
| glDisableVertexAttribArray(attr_tex); | |||
| #endif | |||
| #endif | |||
| /* Reset GL states */ | |||
| @@ -284,7 +314,7 @@ void DebugQuad::TickDraw(float deltams) | |||
| glUseProgram(0); | |||
| /* Prepare our quad coordinates */ | |||
| vec2i const layout(4, 3); | |||
| vec2i const layout(3, 3); | |||
| data->step = vec2(2.0f, -2.0f) / (3 * layout + vec2i(1)); | |||
| data->orig = vec2(-1.0f, 1.0f) + data->step; | |||
| data->aa = data->orig; | |||
| @@ -296,6 +326,11 @@ void DebugQuad::TickDraw(float deltams) | |||
| float f3 = 0.5f + 0.5f * sinf(0.00072f * data->time + 4.0f); | |||
| float f4 = 0.5f + 0.5f * sinf(0.00091f * data->time + 8.0f); | |||
| GLfloat const colors[] = { f1, f2, f3, f4, f2, f1, f3, f1, f4, | |||
| f3, f1, f4, f4, f3, f2, f1, f2, f3 }; | |||
| GLfloat const texcoords[] = { f1, f3, f3, f2, f2, f4, | |||
| f2, f4, f4, f1, f1, f3 }; | |||
| /* Quad #1: simple glBegin program */ | |||
| glColor3f(0.8f, 0.5f, 0.2f); | |||
| glBegin(GL_TRIANGLES); | |||
| @@ -415,20 +450,18 @@ void DebugQuad::TickDraw(float deltams) | |||
| Advance(); | |||
| /* Quad #7: simple vertex buffer */ | |||
| GLfloat const v1[] = { 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 }; | |||
| GLfloat const c1[] = { f1, f2, f3, f4, f2, f1, f3, f1, f4, | |||
| f3, f1, f4, f4, f3, f2, f1, f2, f3 }; | |||
| 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 }; | |||
| glEnableClientState(GL_COLOR_ARRAY); | |||
| glEnableClientState(GL_VERTEX_ARRAY); | |||
| glColorPointer(3, GL_FLOAT, 0, c1); | |||
| glVertexPointer(3, GL_FLOAT, 0, v1); | |||
| glColorPointer(3, GL_FLOAT, 0, colors); | |||
| glVertexPointer(3, GL_FLOAT, 0, vertices1); | |||
| glDrawArrays(GL_TRIANGLES, 0, 6); | |||
| glDisableClientState(GL_VERTEX_ARRAY); | |||
| @@ -436,28 +469,29 @@ void DebugQuad::TickDraw(float deltams) | |||
| Advance(); | |||
| /* Quad #8: vertex buffer, apply texture in fragment shader */ | |||
| data->shader[2]->Bind(); | |||
| GLfloat const v2[] = { 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 }; | |||
| GLfloat const t2[] = { f1, f3, f3, f2, f2, f4, f2, f4, f4, f1, f1, f3 }; | |||
| /* Quad #8: vertex buffer, apply texture and color in fragment shader */ | |||
| data->shader[3]->Bind(); | |||
| 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_TEXTURE_COORD_ARRAY); | |||
| glEnableClientState(GL_VERTEX_ARRAY); | |||
| glEnableClientState(GL_COLOR_ARRAY); | |||
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); | |||
| glTexCoordPointer(2, GL_FLOAT, 0, t2); | |||
| glVertexPointer(3, GL_FLOAT, 0, v2); | |||
| glVertexPointer(3, GL_FLOAT, 0, vertices2); | |||
| glColorPointer(3, GL_FLOAT, 0, colors); | |||
| glTexCoordPointer(2, GL_FLOAT, 0, texcoords); | |||
| glDrawArrays(GL_TRIANGLES, 0, 6); | |||
| glDisableClientState(GL_VERTEX_ARRAY); | |||
| glDisableClientState(GL_COLOR_ARRAY); | |||
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); | |||
| Advance(); | |||
| } | |||
| void DebugQuad::Advance() | |||