|
|
@@ -13,6 +13,7 @@ |
|
|
|
#endif |
|
|
|
|
|
|
|
#include <cstdlib> |
|
|
|
#include <cstdio> |
|
|
|
#include <cmath> |
|
|
|
|
|
|
|
#ifdef WIN32 |
|
|
@@ -28,6 +29,9 @@ |
|
|
|
|
|
|
|
#include "core.h" |
|
|
|
|
|
|
|
#define ATTRIB_POSITION 42 /* arbitrary id */ |
|
|
|
#define SHADER_CRAP 0 |
|
|
|
|
|
|
|
struct Tile |
|
|
|
{ |
|
|
|
uint32_t prio, code; |
|
|
@@ -55,6 +59,10 @@ private: |
|
|
|
int ntiles; |
|
|
|
float angle; |
|
|
|
|
|
|
|
#if SHADER_CRAP |
|
|
|
GLuint prog, sh1, sh2; |
|
|
|
GLint uni_mvp, uni_color; |
|
|
|
#endif |
|
|
|
GLuint *bufs; |
|
|
|
int nbufs; |
|
|
|
|
|
|
@@ -63,6 +71,25 @@ private: |
|
|
|
|
|
|
|
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 |
|
|
|
*/ |
|
|
@@ -76,12 +103,47 @@ Scene::Scene(float angle) |
|
|
|
|
|
|
|
data->bufs = 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() |
|
|
|
{ |
|
|
|
/* FIXME: this must be done while the GL context is still active. |
|
|
|
* 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); |
|
|
|
delete data; |
|
|
|
} |
|
|
@@ -170,11 +232,22 @@ void Scene::Render() // XXX: rename to Blit() |
|
|
|
|
|
|
|
glEnableClientState(GL_VERTEX_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]); |
|
|
|
glBufferData(GL_ARRAY_BUFFER, 6 * 3 * (n - i) * sizeof(float), |
|
|
|
vertex, GL_DYNAMIC_DRAW); |
|
|
|
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]); |
|
|
|
glBufferData(GL_ARRAY_BUFFER, 6 * 2 * (n - i) * sizeof(float), |
|
|
|