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


Loading…
Cancel
Save