| @@ -13,6 +13,7 @@ | |||||
| #endif | #endif | ||||
| #include <cstdlib> | #include <cstdlib> | ||||
| #include <cstdio> | |||||
| #include <cmath> | #include <cmath> | ||||
| #ifdef WIN32 | #ifdef WIN32 | ||||
| @@ -28,6 +29,9 @@ | |||||
| #include "core.h" | #include "core.h" | ||||
| #define ATTRIB_POSITION 42 /* arbitrary id */ | |||||
| #define SHADER_CRAP 0 | |||||
| struct Tile | struct Tile | ||||
| { | { | ||||
| uint32_t prio, code; | uint32_t prio, code; | ||||
| @@ -55,6 +59,10 @@ private: | |||||
| int ntiles; | int ntiles; | ||||
| float angle; | float angle; | ||||
| #if SHADER_CRAP | |||||
| GLuint prog, sh1, sh2; | |||||
| GLint uni_mvp, uni_color; | |||||
| #endif | |||||
| GLuint *bufs; | GLuint *bufs; | ||||
| int nbufs; | int nbufs; | ||||
| @@ -63,6 +71,25 @@ private: | |||||
| Scene *SceneData::scene = NULL; | Scene *SceneData::scene = NULL; | ||||
| #if SHADER_CRAP | |||||
| static char const *vertexshader = | |||||
| "attribute vec4 position;\n" | |||||
| "uniform mat4 mvp;\n" | |||||
| "\n" | |||||
| "void main()\n" | |||||
| "{\n" | |||||
| " gl_Position = mvp * position;\n" | |||||
| "}\n"; | |||||
| static char const *fragmentshader = | |||||
| "uniform lowp vec4 color;\n" | |||||
| "\n" | |||||
| "void main()\n" | |||||
| "{\n" | |||||
| " gl_FragColor = color;\n" | |||||
| "}\n"; | |||||
| #endif | |||||
| /* | /* | ||||
| * Public Scene class | * Public Scene class | ||||
| */ | */ | ||||
| @@ -76,12 +103,47 @@ Scene::Scene(float angle) | |||||
| data->bufs = 0; | data->bufs = 0; | ||||
| data->nbufs = 0; | data->nbufs = 0; | ||||
| #if SHADER_CRAP | |||||
| data->sh1 = glCreateShader(GL_VERTEX_SHADER); | |||||
| glShaderSource(data->sh1, 1, &vertexshader, NULL); | |||||
| glCompileShader(data->sh1); | |||||
| char buf[4096]; | |||||
| GLsizei dummy; | |||||
| glGetShaderInfoLog(data->sh1, 4096, &dummy, buf); | |||||
| fprintf(stderr, "sh1 %i: %s", data->sh1, buf); | |||||
| data->sh2 = glCreateShader(GL_FRAGMENT_SHADER); | |||||
| glShaderSource(data->sh2, 1, &fragmentshader, NULL); | |||||
| glCompileShader(data->sh2); | |||||
| glGetShaderInfoLog(data->sh2, 4096, &dummy, buf); | |||||
| fprintf(stderr, "sh2 %i: %s", data->sh2, buf); | |||||
| data->prog = glCreateProgram(); | |||||
| glAttachShader(data->prog, data->sh1); | |||||
| glAttachShader(data->prog, data->sh2); | |||||
| glBindAttribLocation(data->prog, ATTRIB_POSITION, "position"); | |||||
| glLinkProgram(data->prog); | |||||
| data->uni_mvp = glGetUniformLocation(data->prog, "mvp"); | |||||
| data->uni_color = glGetUniformLocation(data->prog, "color"); | |||||
| #endif | |||||
| } | } | ||||
| Scene::~Scene() | Scene::~Scene() | ||||
| { | { | ||||
| /* FIXME: this must be done while the GL context is still active. | /* FIXME: this must be done while the GL context is still active. | ||||
| * Change the architecture to make sure of that. */ | * Change the architecture to make sure of that. */ | ||||
| #if SHADER_CRAP | |||||
| glDetachShader(data->prog, data->sh1); | |||||
| glDetachShader(data->prog, data->sh2); | |||||
| glDeleteShader(data->sh1); | |||||
| glDeleteShader(data->sh2); | |||||
| glDeleteProgram(data->prog); | |||||
| #endif | |||||
| glDeleteBuffers(data->nbufs, data->bufs); | glDeleteBuffers(data->nbufs, data->bufs); | ||||
| delete data; | delete data; | ||||
| } | } | ||||
| @@ -170,11 +232,22 @@ void Scene::Render() // XXX: rename to Blit() | |||||
| glEnableClientState(GL_VERTEX_ARRAY); | glEnableClientState(GL_VERTEX_ARRAY); | ||||
| glEnableClientState(GL_TEXTURE_COORD_ARRAY); | glEnableClientState(GL_TEXTURE_COORD_ARRAY); | ||||
| #if SHADER_CRAP | |||||
| glUseProgram(data->prog); | |||||
| float4x4 mvp = float4x4::identity(); | |||||
| mvp = mvp - mvp; | |||||
| glUniformMatrix4fv(data->uni_mvp, 1, GL_FALSE, (GLfloat *)&mvp[0][0]); | |||||
| glUniform4f(data->uni_color, 1.0f, 0.0f, 1.0f, 1.0f); | |||||
| #endif | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf]); | glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf]); | ||||
| glBufferData(GL_ARRAY_BUFFER, 6 * 3 * (n - i) * sizeof(float), | glBufferData(GL_ARRAY_BUFFER, 6 * 3 * (n - i) * sizeof(float), | ||||
| vertex, GL_DYNAMIC_DRAW); | vertex, GL_DYNAMIC_DRAW); | ||||
| glVertexPointer(3, GL_FLOAT, 0, NULL); | glVertexPointer(3, GL_FLOAT, 0, NULL); | ||||
| #if SHADER_CRAP | |||||
| glVertexAttribPointer(ATTRIB_POSITION, (n - i) * 6, GL_FLOAT, false, 0, vertex); | |||||
| glEnableVertexAttribArray(ATTRIB_POSITION); | |||||
| #endif | |||||
| glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf + 1]); | glBindBuffer(GL_ARRAY_BUFFER, data->bufs[buf + 1]); | ||||
| glBufferData(GL_ARRAY_BUFFER, 6 * 2 * (n - i) * sizeof(float), | glBufferData(GL_ARRAY_BUFFER, 6 * 2 * (n - i) * sizeof(float), | ||||