|
|
@@ -28,7 +28,11 @@ namespace lol |
|
|
|
* 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 |
|
|
|
{ |
|
|
@@ -39,9 +43,11 @@ private: |
|
|
|
|
|
|
|
int initialised; |
|
|
|
float time; |
|
|
|
GLuint buflist[3]; |
|
|
|
GLuint array[NUM_ARRAYS]; |
|
|
|
GLuint buffer[NUM_BUFFERS]; |
|
|
|
Shader *shader[NUM_SHADERS]; |
|
|
|
GLuint texlist[1]; |
|
|
|
GLuint attr[NUM_ATTRS]; |
|
|
|
GLuint texture[NUM_TEXTURES]; |
|
|
|
uint8_t image[1][32 * 32 * 4]; |
|
|
|
}; |
|
|
|
|
|
|
@@ -71,8 +77,9 @@ void DebugQuad::TickDraw(float deltams) |
|
|
|
|
|
|
|
if (!data->initialised && !IsDestroying()) |
|
|
|
{ |
|
|
|
glGenVertexArrays(NUM_ARRAYS, data->array); |
|
|
|
glGenBuffers(NUM_BUFFERS, data->buffer); |
|
|
|
#if 0 |
|
|
|
glGenBuffers(3, data->buflist); |
|
|
|
|
|
|
|
static char const *vertexshader = |
|
|
|
"//#version 130\n" |
|
|
@@ -99,12 +106,12 @@ void DebugQuad::TickDraw(float deltams) |
|
|
|
" gl_FragColor = vec4(1.0, 1.0, 1.0, 0.0);\n" |
|
|
|
"}\n"; |
|
|
|
data->shader[0] = Shader::Create(vertexshader, fragmentshader); |
|
|
|
glGenTextures(1, data->texlist); |
|
|
|
glGenTextures(1, data->texture); |
|
|
|
#endif |
|
|
|
|
|
|
|
/* Checkerboard texture */ |
|
|
|
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 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_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( |
|
|
|
"#version 130\n" |
|
|
|
"in vec2 in_Vertex;" |
|
|
|
"#version 110\n" |
|
|
|
"void main()" |
|
|
|
"{" |
|
|
|
" gl_Position = vec4(in_Vertex, 0.0, 1.0);" |
|
|
|
" gl_Position = gl_Vertex;" |
|
|
|
"}", |
|
|
|
|
|
|
|
"#version 130\n" |
|
|
|
"#version 110\n" |
|
|
|
"void main()" |
|
|
|
"{" |
|
|
|
" 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);" |
|
|
|
"}"); |
|
|
|
|
|
|
|
/* 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( |
|
|
|
"#version 130\n" |
|
|
|
"in vec2 in_Vertex;" |
|
|
|
"in vec2 in_MultiTexCoord0;" |
|
|
|
"#version 110\n" |
|
|
|
"varying vec4 pass_Color;" |
|
|
|
"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);" |
|
|
|
" gl_Position = vec4(in_Vertex, 0.0, 1.0);" |
|
|
|
" gl_Position = gl_Vertex;" |
|
|
|
"}", |
|
|
|
|
|
|
|
"#version 130\n" |
|
|
|
"#version 110\n" |
|
|
|
"varying vec4 pass_Color;" |
|
|
|
"void main()" |
|
|
|
"{" |
|
|
|
" 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( |
|
|
|
"#version 130\n" |
|
|
|
"in vec2 in_Vertex;" |
|
|
|
"in vec2 in_MultiTexCoord0;" |
|
|
|
"#version 110\n" |
|
|
|
"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;" |
|
|
|
"void main()" |
|
|
|
"{" |
|
|
|
" 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( |
|
|
|
"#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;" |
|
|
|
"void main()" |
|
|
|
"{" |
|
|
|
" 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;" |
|
|
|
"uniform sampler2D tex;" |
|
|
|
"void main()" |
|
|
@@ -199,20 +221,47 @@ void DebugQuad::TickDraw(float deltams) |
|
|
|
" vec4 tmp = texture2D(tex, gl_TexCoord[0].xy * 0.25);" |
|
|
|
" 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; |
|
|
|
} |
|
|
|
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[1]); |
|
|
|
Shader::Destroy(data->shader[2]); |
|
|
|
Shader::Destroy(data->shader[3]); |
|
|
|
glDeleteTextures(1, data->texlist); |
|
|
|
glDeleteTextures(NUM_TEXTURES, data->texture); |
|
|
|
|
|
|
|
data->initialised = 0; |
|
|
|
} |
|
|
@@ -256,7 +305,7 @@ void DebugQuad::TickDraw(float deltams) |
|
|
|
glEnableClientState(GL_TEXTURE_COORD_ARRAY); |
|
|
|
|
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
glBindTexture(GL_TEXTURE_2D, data->texlist[0]); |
|
|
|
glBindTexture(GL_TEXTURE_2D, data->texture[0]); |
|
|
|
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, data->buflist[0]); |
|
|
|
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), verts, GL_STATIC_DRAW); |
|
|
@@ -288,7 +337,7 @@ void DebugQuad::TickDraw(float deltams) |
|
|
|
|
|
|
|
/* Bind texture */ |
|
|
|
glActiveTexture(GL_TEXTURE0); |
|
|
|
glBindTexture(GL_TEXTURE_2D, data->texlist[0]); |
|
|
|
glBindTexture(GL_TEXTURE_2D, data->texture[0]); |
|
|
|
|
|
|
|
glBindBuffer(GL_ARRAY_BUFFER, data->buflist[0]); |
|
|
|
glBufferData(GL_ARRAY_BUFFER, 12 * sizeof(GLfloat), verts, GL_STATIC_DRAW); |
|
|
@@ -322,7 +371,7 @@ void DebugQuad::TickDraw(float deltams) |
|
|
|
glUseProgram(0); |
|
|
|
|
|
|
|
/* 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->orig = vec2(-1.0f, 1.0f) + data->step; |
|
|
|
data->aa = data->orig; |
|
|
@@ -373,7 +422,7 @@ void DebugQuad::TickDraw(float deltams) |
|
|
|
|
|
|
|
/* Quad #3: textured quad */ |
|
|
|
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); |
|
|
|
glBegin(GL_TRIANGLES); |
|
|
|
glTexCoord2f(f1, f3); |
|
|
@@ -436,7 +485,7 @@ void DebugQuad::TickDraw(float deltams) |
|
|
|
data->shader[2]->Bind(); |
|
|
|
glColor3f(0.0f, 1.0f, 1.0f); |
|
|
|
glEnable(GL_TEXTURE_2D); |
|
|
|
glBindTexture(GL_TEXTURE_2D, data->texlist[0]); |
|
|
|
glBindTexture(GL_TEXTURE_2D, data->texture[0]); |
|
|
|
glBegin(GL_TRIANGLES); |
|
|
|
glTexCoord2f(f1, f3); |
|
|
|
glVertex3f(data->aa.x, data->bb.y, 0.0f); |
|
|
@@ -474,6 +523,7 @@ void DebugQuad::TickDraw(float deltams) |
|
|
|
|
|
|
|
glDisableClientState(GL_VERTEX_ARRAY); |
|
|
|
glDisableClientState(GL_COLOR_ARRAY); |
|
|
|
glUseProgram(0); |
|
|
|
|
|
|
|
Advance(); |
|
|
|
|
|
|
@@ -498,6 +548,85 @@ void DebugQuad::TickDraw(float deltams) |
|
|
|
glDisableClientState(GL_VERTEX_ARRAY); |
|
|
|
glDisableClientState(GL_COLOR_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(); |
|
|
|
} |
|
|
|