Browse Source

Shader tests. Disabled for now.

legacy
Sam Hocevar sam 14 years ago
parent
commit
8ac9945afa
1 changed files with 73 additions and 0 deletions
  1. +73
    -0
      src/scene.cpp

+ 73
- 0
src/scene.cpp View File

@@ -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),


Loading…
Cancel
Save