| @@ -28,7 +28,11 @@ namespace lol | |||||
| * DebugQuad implementation class | * DebugQuad implementation class | ||||
| */ | */ | ||||
| #define NUM_SHADERS 4 | |||||
| #define NUM_ARRAYS 2 | |||||
| #define NUM_BUFFERS 6 | |||||
| #define NUM_ATTRS 6 | |||||
| #define NUM_SHADERS 6 | |||||
| #define NUM_TEXTURES 1 | |||||
| class DebugQuadData | class DebugQuadData | ||||
| { | { | ||||
| @@ -39,9 +43,11 @@ private: | |||||
| int initialised; | int initialised; | ||||
| float time; | float time; | ||||
| GLuint buflist[3]; | |||||
| GLuint array[NUM_ARRAYS]; | |||||
| GLuint buffer[NUM_BUFFERS]; | |||||
| Shader *shader[NUM_SHADERS]; | Shader *shader[NUM_SHADERS]; | ||||
| GLuint texlist[1]; | |||||
| GLuint attr[NUM_ATTRS]; | |||||
| GLuint texture[NUM_TEXTURES]; | |||||
| uint8_t image[1][32 * 32 * 4]; | uint8_t image[1][32 * 32 * 4]; | ||||
| }; | }; | ||||
| @@ -71,8 +77,9 @@ void DebugQuad::TickDraw(float deltams) | |||||
| if (!data->initialised && !IsDestroying()) | if (!data->initialised && !IsDestroying()) | ||||
| { | { | ||||
| glGenVertexArrays(NUM_ARRAYS, data->array); | |||||
| glGenBuffers(NUM_BUFFERS, data->buffer); | |||||
| #if 0 | #if 0 | ||||
| glGenBuffers(3, data->buflist); | |||||
| static char const *vertexshader = | static char const *vertexshader = | ||||
| "//#version 130\n" | "//#version 130\n" | ||||
| @@ -99,12 +106,12 @@ void DebugQuad::TickDraw(float deltams) | |||||
| " gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);\n" | " gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);\n" | ||||
| "}\n"; | "}\n"; | ||||
| data->shader[0] = Shader::Create(vertexshader, fragmentshader); | data->shader[0] = Shader::Create(vertexshader, fragmentshader); | ||||
| glGenTextures(1, data->texlist); | |||||
| glGenTextures(1, data->texture); | |||||
| #endif | #endif | ||||
| /* Checkerboard texture */ | /* Checkerboard texture */ | ||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| glBindTexture(GL_TEXTURE_2D, data->texlist[0]); | |||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | |||||
| for (int j = 0; j < 32; j++) | for (int j = 0; j < 32; j++) | ||||
| for (int i = 0; i < 32; i++) | for (int i = 0; i < 32; i++) | ||||
| { | { | ||||
| @@ -120,16 +127,15 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); | ||||
| glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); | ||||
| /* Quad #4: create texture in fragment shader */ | |||||
| /* Quad #4: create texture in 1.10 fragment shader */ | |||||
| data->shader[0] = Shader::Create( | data->shader[0] = Shader::Create( | ||||
| "#version 130\n" | |||||
| "in vec2 in_Vertex;" | |||||
| "#version 110\n" | |||||
| "void main()" | "void main()" | ||||
| "{" | "{" | ||||
| " gl_Position = vec4(in_Vertex, 0.0, 1.0);" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | "}", | ||||
| "#version 130\n" | |||||
| "#version 110\n" | |||||
| "void main()" | "void main()" | ||||
| "{" | "{" | ||||
| " float dx = mod(gl_FragCoord.x * gl_FragCoord.y, 2.0);" | " float dx = mod(gl_FragCoord.x * gl_FragCoord.y, 2.0);" | ||||
| @@ -138,60 +144,76 @@ void DebugQuad::TickDraw(float deltams) | |||||
| " gl_FragColor = vec4(dx, dy, dz, 1.0);" | " gl_FragColor = vec4(dx, dy, dz, 1.0);" | ||||
| "}"); | "}"); | ||||
| /* Quad #5: pass color from vertex shader to fragment shader */ | |||||
| /* Quad #5: pass color from 1.10 vertex shader to fragment shader */ | |||||
| data->shader[1] = Shader::Create( | data->shader[1] = Shader::Create( | ||||
| "#version 130\n" | |||||
| "in vec2 in_Vertex;" | |||||
| "in vec2 in_MultiTexCoord0;" | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | "varying vec4 pass_Color;" | ||||
| "void main()" | "void main()" | ||||
| "{" | "{" | ||||
| " float r = in_MultiTexCoord0.x;" | |||||
| " float g = in_MultiTexCoord0.y;" | |||||
| " float r = gl_MultiTexCoord0.x;" | |||||
| " float g = gl_MultiTexCoord0.y;" | |||||
| " pass_Color = vec4(1.0 - r, 1.0 - g, r, 1.0);" | " pass_Color = vec4(1.0 - r, 1.0 - g, r, 1.0);" | ||||
| " gl_Position = vec4(in_Vertex, 0.0, 1.0);" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | "}", | ||||
| "#version 130\n" | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | "varying vec4 pass_Color;" | ||||
| "void main()" | "void main()" | ||||
| "{" | "{" | ||||
| " gl_FragColor = pass_Color;" | " gl_FragColor = pass_Color;" | ||||
| "}"); | "}"); | ||||
| /* Quad #6: apply texture in fragment shader */ | |||||
| /* Quad #6: apply texture in 1.10 fragment shader */ | |||||
| data->shader[2] = Shader::Create( | data->shader[2] = Shader::Create( | ||||
| "#version 130\n" | |||||
| "in vec2 in_Vertex;" | |||||
| "in vec2 in_MultiTexCoord0;" | |||||
| "#version 110\n" | |||||
| "void main()" | "void main()" | ||||
| "{" | "{" | ||||
| " gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);" | |||||
| " gl_Position = vec4(in_Vertex, 0.0, 1.0);" | |||||
| " gl_TexCoord[0] = gl_MultiTexCoord0;" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | "}", | ||||
| "#version 130\n" | |||||
| "#version 110\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 */ | |||||
| /* Quad #8: vertex buffer, apply texture in 1.10 fragment shader */ | |||||
| data->shader[3] = Shader::Create( | data->shader[3] = Shader::Create( | ||||
| "#version 130\n" | |||||
| "in vec2 in_Vertex;" | |||||
| "in vec2 in_MultiTexCoord0;" | |||||
| "in vec4 in_Color;" | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_TexCoord[0] = gl_MultiTexCoord0;" | |||||
| " pass_Color = gl_Color;" | |||||
| " gl_Position = gl_Vertex;" | |||||
| "}", | |||||
| "#version 110\n" | |||||
| "varying vec4 pass_Color;" | |||||
| "uniform sampler2D tex;" | |||||
| "void main()" | |||||
| "{" | |||||
| " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||||
| " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);" | |||||
| "}"); | |||||
| /* Quad #9: vertex buffer, apply texture and color in 1.20 shader */ | |||||
| data->shader[4] = Shader::Create( | |||||
| "#version 120\n" | |||||
| "attribute vec3 in_Vertex;" | |||||
| "attribute vec3 in_Color;" | |||||
| "attribute vec2 in_MultiTexCoord0;" | |||||
| "varying vec4 pass_Color;" | "varying vec4 pass_Color;" | ||||
| "void main()" | "void main()" | ||||
| "{" | "{" | ||||
| " gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);" | " gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);" | ||||
| " pass_Color = in_Color;" | |||||
| " gl_Position = vec4(in_Vertex, 0.0, 1.0);" | |||||
| " pass_Color = vec4(in_Color, 1.0);" | |||||
| " gl_Position = vec4(in_Vertex, 1.0);" | |||||
| "}", | "}", | ||||
| "#version 130\n" | |||||
| "#version 120\n" | |||||
| "varying vec4 pass_Color;" | "varying vec4 pass_Color;" | ||||
| "uniform sampler2D tex;" | "uniform sampler2D tex;" | ||||
| "void main()" | "void main()" | ||||
| @@ -199,20 +221,47 @@ 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);" | ||||
| "}"); | "}"); | ||||
| data->attr[0] = data->shader[4]->GetAttribLocation("in_Vertex"); | |||||
| data->attr[1] = data->shader[4]->GetAttribLocation("in_Color"); | |||||
| data->attr[2] = data->shader[4]->GetAttribLocation("in_MultiTexCoord0"); | |||||
| /* Quad #10: vertex buffer, apply texture and color in 1.30 shader */ | |||||
| data->shader[5] = Shader::Create( | |||||
| "#version 130\n" | |||||
| "in vec3 in_Vertex;" | |||||
| "in vec3 in_Color;" | |||||
| "in vec2 in_MultiTexCoord0;" | |||||
| "out vec4 pass_Color;" | |||||
| "void main()" | |||||
| "{" | |||||
| " gl_TexCoord[0] = vec4(in_MultiTexCoord0, 0.0, 0.0);" | |||||
| " pass_Color = vec4(in_Color, 1.0);" | |||||
| " gl_Position = vec4(in_Vertex, 1.0);" | |||||
| "}", | |||||
| "#version 130\n" | |||||
| "in vec4 pass_Color;" | |||||
| "uniform sampler2D tex;" | |||||
| "void main()" | |||||
| "{" | |||||
| " vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" | |||||
| " gl_FragColor = vec4(abs(tmp.xyz - pass_Color.xyz), 1.0);" | |||||
| "}"); | |||||
| data->attr[3] = data->shader[4]->GetAttribLocation("in_Vertex"); | |||||
| data->attr[4] = data->shader[4]->GetAttribLocation("in_Color"); | |||||
| data->attr[5] = data->shader[4]->GetAttribLocation("in_MultiTexCoord0"); | |||||
| data->initialised = 1; | data->initialised = 1; | ||||
| } | } | ||||
| else if (data->initialised && IsDestroying()) | else if (data->initialised && IsDestroying()) | ||||
| { | { | ||||
| #if 0 | |||||
| glDeleteBuffers(3, data->buflist); | |||||
| #endif | |||||
| glDeleteVertexArrays(NUM_ARRAYS, data->array); | |||||
| glDeleteBuffers(NUM_BUFFERS, data->buffer); | |||||
| 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]); | Shader::Destroy(data->shader[3]); | ||||
| glDeleteTextures(1, data->texlist); | |||||
| glDeleteTextures(NUM_TEXTURES, data->texture); | |||||
| data->initialised = 0; | data->initialised = 0; | ||||
| } | } | ||||
| @@ -256,7 +305,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); | glEnableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
| glActiveTexture(GL_TEXTURE0); | glActiveTexture(GL_TEXTURE0); | ||||
| glBindTexture(GL_TEXTURE_2D, data->texlist[0]); | |||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buflist[0]); | glBindBuffer(GL_ARRAY_BUFFER, data->buflist[0]); | ||||
| glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), verts, GL_STATIC_DRAW); | glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), verts, GL_STATIC_DRAW); | ||||
| @@ -288,7 +337,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| /* Bind texture */ | /* Bind texture */ | ||||
| glActiveTexture(GL_TEXTURE0); | glActiveTexture(GL_TEXTURE0); | ||||
| glBindTexture(GL_TEXTURE_2D, data->texlist[0]); | |||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buflist[0]); | glBindBuffer(GL_ARRAY_BUFFER, data->buflist[0]); | ||||
| glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), verts, GL_STATIC_DRAW); | glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), verts, GL_STATIC_DRAW); | ||||
| @@ -322,7 +371,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glUseProgram(0); | glUseProgram(0); | ||||
| /* Prepare our quad coordinates */ | /* Prepare our quad coordinates */ | ||||
| vec2i const layout(3, 3); | |||||
| vec2i const layout(4, 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; | ||||
| @@ -373,7 +422,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| /* Quad #3: textured quad */ | /* Quad #3: textured quad */ | ||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| glBindTexture(GL_TEXTURE_2D, data->texlist[0]); | |||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | |||||
| glColor3f(1.0f, 1.0f, 1.0f); | glColor3f(1.0f, 1.0f, 1.0f); | ||||
| glBegin(GL_TRIANGLES); | glBegin(GL_TRIANGLES); | ||||
| glTexCoord2f(f1, f3); | glTexCoord2f(f1, f3); | ||||
| @@ -436,7 +485,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| data->shader[2]->Bind(); | data->shader[2]->Bind(); | ||||
| glColor3f(0.0f, 1.0f, 1.0f); | glColor3f(0.0f, 1.0f, 1.0f); | ||||
| glEnable(GL_TEXTURE_2D); | glEnable(GL_TEXTURE_2D); | ||||
| glBindTexture(GL_TEXTURE_2D, data->texlist[0]); | |||||
| glBindTexture(GL_TEXTURE_2D, data->texture[0]); | |||||
| glBegin(GL_TRIANGLES); | glBegin(GL_TRIANGLES); | ||||
| glTexCoord2f(f1, f3); | glTexCoord2f(f1, f3); | ||||
| glVertex3f(data->aa.x, data->bb.y, 0.0f); | glVertex3f(data->aa.x, data->bb.y, 0.0f); | ||||
| @@ -474,6 +523,7 @@ void DebugQuad::TickDraw(float deltams) | |||||
| glDisableClientState(GL_VERTEX_ARRAY); | glDisableClientState(GL_VERTEX_ARRAY); | ||||
| glDisableClientState(GL_COLOR_ARRAY); | glDisableClientState(GL_COLOR_ARRAY); | ||||
| glUseProgram(0); | |||||
| Advance(); | Advance(); | ||||
| @@ -498,6 +548,85 @@ 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); | |||||
| Advance(); | |||||
| /* Quad #9: vertex buffer, apply texture and color in 1.20 shader */ | |||||
| data->shader[4]->Bind(); | |||||
| 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 }; | |||||
| glBindVertexArray(data->array[0]); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buffer[0]); | |||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(vertices3), vertices3, | |||||
| GL_DYNAMIC_DRAW); | |||||
| glVertexAttribPointer(data->attr[0], 3, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glEnableVertexAttribArray(data->attr[0]); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buffer[1]); | |||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, | |||||
| GL_DYNAMIC_DRAW); | |||||
| glVertexAttribPointer(data->attr[1], 3, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glEnableVertexAttribArray(data->attr[1]); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buffer[2]); | |||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords, | |||||
| GL_DYNAMIC_DRAW); | |||||
| glVertexAttribPointer(data->attr[2], 2, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glEnableVertexAttribArray(data->attr[2]); | |||||
| glDrawArrays(GL_TRIANGLES, 0, 6); | |||||
| glBindVertexArray(0); | |||||
| glDisableVertexAttribArray(data->attr[0]); | |||||
| glDisableVertexAttribArray(data->attr[1]); | |||||
| glDisableVertexAttribArray(data->attr[2]); | |||||
| glUseProgram(0); | |||||
| Advance(); | |||||
| /* Quad #10: vertex buffer, apply texture and color in 1.30 shader */ | |||||
| data->shader[5]->Bind(); | |||||
| 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 }; | |||||
| glBindVertexArray(data->array[1]); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buffer[3]); | |||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(vertices4), vertices4, | |||||
| GL_DYNAMIC_DRAW); | |||||
| glVertexAttribPointer(data->attr[3], 3, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glEnableVertexAttribArray(data->attr[3]); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buffer[4]); | |||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(colors), colors, | |||||
| GL_DYNAMIC_DRAW); | |||||
| glVertexAttribPointer(data->attr[4], 3, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glEnableVertexAttribArray(data->attr[4]); | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->buffer[5]); | |||||
| glBufferData(GL_ARRAY_BUFFER, sizeof(texcoords), texcoords, | |||||
| GL_DYNAMIC_DRAW); | |||||
| glVertexAttribPointer(data->attr[5], 2, GL_FLOAT, GL_FALSE, 0, 0); | |||||
| glEnableVertexAttribArray(data->attr[5]); | |||||
| glDrawArrays(GL_TRIANGLES, 0, 6); | |||||
| glBindVertexArray(0); | |||||
| glDisableVertexAttribArray(data->attr[3]); | |||||
| glDisableVertexAttribArray(data->attr[4]); | |||||
| glDisableVertexAttribArray(data->attr[5]); | |||||
| glUseProgram(0); | |||||
| Advance(); | Advance(); | ||||
| } | } | ||||