| @@ -28,7 +28,7 @@ namespace lol | |||||
| * DebugQuad implementation class | * DebugQuad implementation class | ||||
| */ | */ | ||||
| #define NUM_SHADERS 3 | |||||
| #define NUM_SHADERS 4 | |||||
| class DebugQuadData | class DebugQuadData | ||||
| { | { | ||||
| @@ -71,6 +71,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| if (!data->initialised && !IsDestroying()) | if (!data->initialised && !IsDestroying()) | ||||
| { | { | ||||
| #if 0 | |||||
| glGenBuffers(3, data->buflist); | glGenBuffers(3, data->buflist); | ||||
| static char const *vertexshader = | static char const *vertexshader = | ||||
| @@ -99,7 +100,9 @@ void DebugQuad::TickDraw(float deltams) | |||||
| "}\n"; | "}\n"; | ||||
| data->shader[0] = Shader::Create(vertexshader, fragmentshader); | data->shader[0] = Shader::Create(vertexshader, fragmentshader); | ||||
| glGenTextures(1, data->texlist); | glGenTextures(1, data->texlist); | ||||
| #endif | |||||
| /* Checkerboard texture */ | |||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| glBindTexture(GL_TEXTURE_2D, data->texlist[0]); | glBindTexture(GL_TEXTURE_2D, data->texlist[0]); | ||||
| for (int j = 0; j < 32; j++) | for (int j = 0; j < 32; j++) | ||||
| @@ -154,33 +157,59 @@ void DebugQuad::TickDraw(float deltams) | |||||
| "}"); | "}"); | ||||
| /* Quad #6: apply texture in fragment shader */ | /* Quad #6: apply texture in fragment shader */ | ||||
| /* Quad #8: vertex buffer, apply texture in fragment shader */ | |||||
| data->shader[2] = Shader::Create( | data->shader[2] = Shader::Create( | ||||
| "#version 120\n" | |||||
| "void main()" | "void main()" | ||||
| "{" | "{" | ||||
| " gl_TexCoord[0] = gl_MultiTexCoord0;" | " gl_TexCoord[0] = gl_MultiTexCoord0;" | ||||
| " gl_Position = gl_Vertex;" | " gl_Position = gl_Vertex;" | ||||
| "}", | "}", | ||||
| "#version 120\n" | |||||
| "uniform sampler2D tex;" | "uniform sampler2D tex;" | ||||
| "void main()" | "void main()" | ||||
| "{" | "{" | ||||
| " gl_FragColor = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | " 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; | data->initialised = 1; | ||||
| } | } | ||||
| else if (data->initialised && IsDestroying()) | else if (data->initialised && IsDestroying()) | ||||
| { | { | ||||
| #if 0 | |||||
| glDeleteBuffers(3, data->buflist); | glDeleteBuffers(3, data->buflist); | ||||
| #endif | |||||
| Shader::Destroy(data->shader[0]); | Shader::Destroy(data->shader[0]); | ||||
| Shader::Destroy(data->shader[1]); | Shader::Destroy(data->shader[1]); | ||||
| Shader::Destroy(data->shader[2]); | Shader::Destroy(data->shader[2]); | ||||
| Shader::Destroy(data->shader[3]); | |||||
| glDeleteTextures(1, data->texlist); | glDeleteTextures(1, data->texlist); | ||||
| data->initialised = 0; | data->initialised = 0; | ||||
| } | } | ||||
| #if 0 | |||||
| float const st = sinf(0.0005f * data->time); | float const st = sinf(0.0005f * data->time); | ||||
| float const ct = cosf(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_pos); | ||||
| glDisableVertexAttribArray(attr_col); | glDisableVertexAttribArray(attr_col); | ||||
| glDisableVertexAttribArray(attr_tex); | glDisableVertexAttribArray(attr_tex); | ||||
| #endif | |||||
| #endif | #endif | ||||
| /* Reset GL states */ | /* Reset GL states */ | ||||
| @@ -284,7 +314,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glUseProgram(0); | glUseProgram(0); | ||||
| /* Prepare our quad coordinates */ | /* 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->step = vec2(2.0f, -2.0f) / (3 * 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; | ||||
| @@ -296,6 +326,11 @@ void DebugQuad::TickDraw(float deltams) | |||||
| float f3 = 0.5f + 0.5f * sinf(0.00072f * data->time + 4.0f); | 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); | 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 */ | /* Quad #1: simple glBegin program */ | ||||
| glColor3f(0.8f, 0.5f, 0.2f); | glColor3f(0.8f, 0.5f, 0.2f); | ||||
| glBegin(GL_TRIANGLES); | glBegin(GL_TRIANGLES); | ||||
| @@ -415,20 +450,18 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | Advance(); | ||||
| /* Quad #7: simple vertex buffer */ | /* 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_COLOR_ARRAY); | ||||
| glEnableClientState(GL_VERTEX_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); | glDrawArrays(GL_TRIANGLES, 0, 6); | ||||
| glDisableClientState(GL_VERTEX_ARRAY); | glDisableClientState(GL_VERTEX_ARRAY); | ||||
| @@ -436,28 +469,29 @@ void DebugQuad::TickDraw(float deltams) | |||||
| Advance(); | 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_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); | glDrawArrays(GL_TRIANGLES, 0, 6); | ||||
| glDisableClientState(GL_VERTEX_ARRAY); | glDisableClientState(GL_VERTEX_ARRAY); | ||||
| glDisableClientState(GL_COLOR_ARRAY); | |||||
| glDisableClientState(GL_TEXTURE_COORD_ARRAY); | glDisableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
| Advance(); | Advance(); | ||||
| } | } | ||||
| void DebugQuad::Advance() | void DebugQuad::Advance() | ||||