aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authortaw27 <taw27@84d2e878-0bd5-11dd-ad15-13eda11d74c5>2008-08-06 11:57:49 +0000
committertaw27 <taw27@84d2e878-0bd5-11dd-ad15-13eda11d74c5>2008-08-06 11:57:49 +0000
commitacf1eb14767d5d7c5ffa3b2c9402ea459f4ffb42 (patch)
treeee0ed001cd9b9b81b2d883fdceb0094ace6442da
parent266a3f19778dcf92c5387341192c31979604f968 (diff)
Move shader utilities to a separate file
git-svn-id: svn://cook.msm.cam.ac.uk:745/thrust3d/thrust3d@211 84d2e878-0bd5-11dd-ad15-13eda11d74c5
-rw-r--r--Makefile.am2
-rw-r--r--src/Makefile.am2
-rw-r--r--src/render.c167
-rw-r--r--src/shaderutils.c117
-rw-r--r--src/shaderutils.h29
5 files changed, 182 insertions, 135 deletions
diff --git a/Makefile.am b/Makefile.am
index 9a7e58a..970f706 100644
--- a/Makefile.am
+++ b/Makefile.am
@@ -1,5 +1,5 @@
EXTRA_DIST = configure src/game.h src/model.h src/physics.h src/render.h src/texture.h src/types.h src/utils.h \
- src/audio.h src/render-text.h data/*
+ src/audio.h src/render-text.h src/shaderutils.h data/*
SUBDIRS = src data
TESTS = src/glcheck
diff --git a/src/Makefile.am b/src/Makefile.am
index 2d084a8..9ef8d79 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -1,7 +1,7 @@
bin_PROGRAMS = thrust3d
noinst_PROGRAMS = gentexture obj2model
-thrust3d_SOURCES = main.c model.c render.c physics.c game.c texture.c utils.c audio.c render-text.c
+thrust3d_SOURCES = main.c model.c render.c physics.c game.c texture.c utils.c audio.c render-text.c shaderutils.c
#glcheck_SOURCES = glcheck.c
#glcheck_LDADD = -lglut
diff --git a/src/render.c b/src/render.c
index c554e8a..ce25c5e 100644
--- a/src/render.c
+++ b/src/render.c
@@ -25,128 +25,29 @@
#include "texture.h"
#include "utils.h"
#include "render-text.h"
+#include "shaderutils.h"
#define PANEL_ALPHA 0.3
-static void render_setunf(GLuint program, const char *name, GLfloat val) {
- GLint loc;
- loc = glGetUniformLocation(program, name);
- glUniform1f(loc, val);
-}
-
-static void render_setun2f(GLuint program, const char *name, GLfloat val1, GLfloat val2) {
- GLint loc;
- loc = glGetUniformLocation(program, name);
- glUniform2f(loc, val1, val2);
-}
-
-static void render_setuni(GLuint program, const char *name, GLint val) {
- GLint loc;
- loc = glGetUniformLocation(program, name);
- glUniform1i(loc, val);
-}
-
-/* Utility function to load and compile a shader, checking the info log */
-static GLuint render_load_shader(const char *filename, GLenum type) {
-
- GLuint shader;
- char text[4096];
- size_t len;
- FILE *fh;
- int l;
- GLint status;
-
- fh = fopen(filename, "r");
- if ( fh == NULL ) {
- fprintf(stderr, "Couldn't load shader '%s'\n", filename);
- return 0;
- }
- len = fread(text, 1, 4095, fh);
- fclose(fh);
- text[len] = '\0';
- const GLchar *source = text;
- shader = glCreateShader(type);
- glShaderSource(shader, 1, &source, NULL);
- glCompileShader(shader);
- glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
- if ( status == GL_FALSE ) {
- glGetShaderInfoLog(shader, 4095, &l, text);
- if ( l > 0 ) {
- printf("%s\n", text); fflush(stdout);
- } else {
- printf("Shader compilation failed.\n");
- }
- }
-
- return shader;
-
-}
-
-static int render_link_program(GLuint program) {
-
- int l;
- GLint status;
- char text[4096];
-
- glLinkProgram(program);
-
- glGetProgramiv(program, GL_LINK_STATUS, &status);
- if ( status == GL_FALSE ) {
- printf("Program linking errors:\n");
- glGetProgramInfoLog(program, 4095, &l, text);
- if ( l > 0 ) {
- printf("%s\n", text); fflush(stdout);
- } else {
- printf("Program linking failed.\n");
- }
- }
-
- return status;
-
-}
-
-static int render_validate_program(GLuint program) {
-
- GLint status;
- int l;
- char text[4096];
-
- glValidateProgram(program);
- glGetProgramiv(program, GL_VALIDATE_STATUS, &status);
- if ( status == GL_FALSE ) {
- printf("Program validation errors:\n");
- glGetProgramInfoLog(program, 4095, &l, text);
- if ( l > 0 ) {
- printf("%s\n", text); fflush(stdout);
- } else {
- printf("Program did not validate successfully.\n");
- }
- return 0;
- }
-
- return 1;
-
-}
-
static void render_load_shaders(RenderContext *r) {
/* Lighting */
- r->lighting_vert = render_load_shader(DATADIR"/shaders/lighting.vert", GL_VERTEX_SHADER);
- r->lighting_frag = render_load_shader(DATADIR"/shaders/lighting.frag", GL_FRAGMENT_SHADER);
+ r->lighting_vert = shaderutils_load_shader(DATADIR"/shaders/lighting.vert", GL_VERTEX_SHADER);
+ r->lighting_frag = shaderutils_load_shader(DATADIR"/shaders/lighting.frag", GL_FRAGMENT_SHADER);
r->lighting_program = glCreateProgram();
glAttachShader(r->lighting_program, r->lighting_vert);
glAttachShader(r->lighting_program, r->lighting_frag);
- render_link_program(r->lighting_program);
- render_validate_program(r->lighting_program);
+ shaderutils_link_program(r->lighting_program);
+ shaderutils_validate_program(r->lighting_program);
/* Swirlyness */
- r->swirly_vert = render_load_shader(DATADIR"/shaders/swirlytron.vert", GL_VERTEX_SHADER);
- r->swirly_frag = render_load_shader(DATADIR"/shaders/swirlytron.frag", GL_FRAGMENT_SHADER);
+ r->swirly_vert = shaderutils_load_shader(DATADIR"/shaders/swirlytron.vert", GL_VERTEX_SHADER);
+ r->swirly_frag = shaderutils_load_shader(DATADIR"/shaders/swirlytron.frag", GL_FRAGMENT_SHADER);
r->swirly_program = glCreateProgram();
glAttachShader(r->swirly_program, r->swirly_vert);
glAttachShader(r->swirly_program, r->swirly_frag);
- render_link_program(r->swirly_program);
- render_validate_program(r->swirly_program);
+ shaderutils_link_program(r->swirly_program);
+ shaderutils_validate_program(r->swirly_program);
}
@@ -295,7 +196,7 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC
GLfloat black[] = {0.0, 0.0, 0.0, 1.0};
int wibble;
- if ( r->shaders ) render_setunf(r->lighting_program, "alpha", alpha);
+ if ( r->shaders ) shaderutils_setunf(r->lighting_program, "alpha", alpha);
if ( nvert == NULL ) nvert = &wibble;
@@ -347,10 +248,10 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC
glEnable(GL_TEXTURE_2D);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
- render_setuni(r->lighting_program, "texture_emits", 1);
+ shaderutils_setuni(r->lighting_program, "texture_emits", 1);
} else {
if ( r->shaders ) {
- render_setuni(r->lighting_program, "texture_enabled", 0);
+ shaderutils_setuni(r->lighting_program, "texture_enabled", 0);
} /* else don't enable texturing */
}
} else if ( p->texture != NULL ) {
@@ -360,18 +261,18 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC
glBindTexture(GL_TEXTURE_2D, texture->texname);
glEnable(GL_TEXTURE_2D);
glTexEnvf(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
- if ( r->shaders ) render_setuni(r->lighting_program, "texture_enabled", 1);
+ if ( r->shaders ) shaderutils_setuni(r->lighting_program, "texture_enabled", 1);
if ( r->shaders && texture->has_normals ) {
glActiveTexture(GL_TEXTURE1);
glBindTexture(GL_TEXTURE_2D, texture->normalmap);
- render_setuni(r->lighting_program, "has_normals", 1);
+ shaderutils_setuni(r->lighting_program, "has_normals", 1);
glActiveTexture(GL_TEXTURE0);
}
} else {
- if ( r->shaders ) render_setuni(r->lighting_program, "texture_enabled", 0);
+ if ( r->shaders ) shaderutils_setuni(r->lighting_program, "texture_enabled", 0);
}
} else {
- if ( r->shaders ) render_setuni(r->lighting_program, "texture_enabled", 0);
+ if ( r->shaders ) shaderutils_setuni(r->lighting_program, "texture_enabled", 0);
}
if ( r->vbos ) {
glBindBuffer(GL_ARRAY_BUFFER, p->vertices_buffer);
@@ -389,11 +290,11 @@ static int render_model_instance_draw(ModelInstance *instance, Uint32 t, RenderC
glDrawArrays(render_gltype(p->type), 0, p->num_vertices);
*nvert += p->num_vertices;
glDisable(GL_TEXTURE_2D);
- render_setuni(r->lighting_program, "has_normals", 0);
+ shaderutils_setuni(r->lighting_program, "has_normals", 0);
glPopMatrix();
if ( p->attribs & ATTRIB_SWIRLY ) {
- if ( r->shaders ) render_setuni(r->lighting_program, "texture_emits", 0);
+ if ( r->shaders ) shaderutils_setuni(r->lighting_program, "texture_emits", 0);
}
}
@@ -633,21 +534,21 @@ void render_draw(Game *game, Uint32 t) {
GLfloat rrb = 0.0;
glUseProgram(r->swirly_program);
- render_setunf(game->render->swirly_program, "time", t);
- render_setuni(game->render->swirly_program, "landed", game->lander->recharging);
+ shaderutils_setunf(game->render->swirly_program, "time", t);
+ shaderutils_setuni(game->render->swirly_program, "landed", game->lander->recharging);
if ( game->lander->recharging ) {
/* Fade in */
rrb = fminf(((GLfloat)t-game->time_of_landing_event)/1500.0, 1.0);
- render_setuni(game->render->swirly_program, "rechargeripple", 1);
+ shaderutils_setuni(game->render->swirly_program, "rechargeripple", 1);
} else if ( game->time_of_landing_event - t < 750 ) {
/* Fade out */
rrb = fmaxf(1.0 - ((GLfloat)t-game->time_of_landing_event)/750.0, 0.0);
- render_setuni(game->render->swirly_program, "rechargeripple", 1);
+ shaderutils_setuni(game->render->swirly_program, "rechargeripple", 1);
} else {
- render_setuni(game->render->swirly_program, "rechargeripple", 0);
+ shaderutils_setuni(game->render->swirly_program, "rechargeripple", 0);
}
- render_setunf(game->render->swirly_program, "rrb", rrb);
- render_setun2f(game->render->swirly_program, "lander",
+ shaderutils_setunf(game->render->swirly_program, "rrb", rrb);
+ shaderutils_setun2f(game->render->swirly_program, "lander",
game->platform_rel_x, game->platform_rel_y);
} /* else this is all a little pointless... */
@@ -698,12 +599,12 @@ void render_draw(Game *game, Uint32 t) {
if ( r->shaders ) {
glUseProgram(r->lighting_program);
- render_setuni(game->render->lighting_program, "texture", 0); /* GL_TEXTURE0 */
- render_setuni(game->render->lighting_program, "normalmap", 1); /* GL_TEXTURE1 */
- render_setuni(game->render->lighting_program, "texture_only", 0);
- render_setuni(game->render->lighting_program, "texture_enabled", 1);
- render_setuni(game->render->lighting_program, "has_normals", 0);
- render_setuni(game->render->lighting_program, "fill_light_enabled", 0);
+ shaderutils_setuni(game->render->lighting_program, "texture", 0); /* GL_TEXTURE0 */
+ shaderutils_setuni(game->render->lighting_program, "normalmap", 1); /* GL_TEXTURE1 */
+ shaderutils_setuni(game->render->lighting_program, "texture_only", 0);
+ shaderutils_setuni(game->render->lighting_program, "texture_enabled", 1);
+ shaderutils_setuni(game->render->lighting_program, "has_normals", 0);
+ shaderutils_setuni(game->render->lighting_program, "fill_light_enabled", 0);
}
render_setup_lighting(game);
amb[0] = 0.02; amb[1] = 0.02; amb[2] = 0.02;
@@ -718,11 +619,11 @@ void render_draw(Game *game, Uint32 t) {
glEnableClientState(GL_VERTEX_ARRAY);
glEnableClientState(GL_NORMAL_ARRAY);
glEnableClientState(GL_TEXTURE_COORD_ARRAY);
- if ( r->shaders ) render_setuni(game->render->lighting_program, "fill_light_enabled", 1);
+ if ( r->shaders ) shaderutils_setuni(game->render->lighting_program, "fill_light_enabled", 1);
render_model_instance_draw(game->lander, t, r, NULL, 1.0);
- if ( r->shaders ) render_setuni(game->render->lighting_program, "fill_light_enabled", 0);
+ if ( r->shaders ) shaderutils_setuni(game->render->lighting_program, "fill_light_enabled", 0);
glPopClientAttrib();
- if ( r->shaders ) render_setuni(game->render->lighting_program, "texture_enabled", 0);
+ if ( r->shaders ) shaderutils_setuni(game->render->lighting_program, "texture_enabled", 0);
render_draw_line(game->lander->x, game->lander->y, game->lander->z,
game->lander->x, game->lander->y, game->lander->z-200.0);
glDisable(GL_LIGHT2);
diff --git a/src/shaderutils.c b/src/shaderutils.c
new file mode 100644
index 0000000..74e9bff
--- /dev/null
+++ b/src/shaderutils.c
@@ -0,0 +1,117 @@
+/*
+ * shaderuitils.c
+ *
+ * Shader utilities
+ *
+ * (c) 2008 Thomas White <taw27@cam.ac.uk>
+ *
+ * thrust3d - a silly game
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glew.h>
+#include <stdio.h>
+
+void shaderutils_setunf(GLuint program, const char *name, GLfloat val) {
+ GLint loc;
+ loc = glGetUniformLocation(program, name);
+ glUniform1f(loc, val);
+}
+
+void shaderutils_setun2f(GLuint program, const char *name, GLfloat val1, GLfloat val2) {
+ GLint loc;
+ loc = glGetUniformLocation(program, name);
+ glUniform2f(loc, val1, val2);
+}
+
+void shaderutils_setuni(GLuint program, const char *name, GLint val) {
+ GLint loc;
+ loc = glGetUniformLocation(program, name);
+ glUniform1i(loc, val);
+}
+
+GLuint shaderutils_load_shader(const char *filename, GLenum type) {
+
+ GLuint shader;
+ char text[4096];
+ size_t len;
+ FILE *fh;
+ int l;
+ GLint status;
+
+ fh = fopen(filename, "r");
+ if ( fh == NULL ) {
+ fprintf(stderr, "Couldn't load shader '%s'\n", filename);
+ return 0;
+ }
+ len = fread(text, 1, 4095, fh);
+ fclose(fh);
+ text[len] = '\0';
+ const GLchar *source = text;
+ shader = glCreateShader(type);
+ glShaderSource(shader, 1, &source, NULL);
+ glCompileShader(shader);
+ glGetShaderiv(shader, GL_COMPILE_STATUS, &status);
+ if ( status == GL_FALSE ) {
+ glGetShaderInfoLog(shader, 4095, &l, text);
+ if ( l > 0 ) {
+ printf("%s\n", text); fflush(stdout);
+ } else {
+ printf("Shader compilation failed.\n");
+ }
+ }
+
+ return shader;
+
+}
+
+int shaderutils_link_program(GLuint program) {
+
+ int l;
+ GLint status;
+ char text[4096];
+
+ glLinkProgram(program);
+
+ glGetProgramiv(program, GL_LINK_STATUS, &status);
+ if ( status == GL_FALSE ) {
+ printf("Program linking errors:\n");
+ glGetProgramInfoLog(program, 4095, &l, text);
+ if ( l > 0 ) {
+ printf("%s\n", text); fflush(stdout);
+ } else {
+ printf("Program linking failed.\n");
+ }
+ }
+
+ return status;
+
+}
+
+int shaderutils_validate_program(GLuint program) {
+
+ GLint status;
+ int l;
+ char text[4096];
+
+ glValidateProgram(program);
+ glGetProgramiv(program, GL_VALIDATE_STATUS, &status);
+ if ( status == GL_FALSE ) {
+ printf("Program validation errors:\n");
+ glGetProgramInfoLog(program, 4095, &l, text);
+ if ( l > 0 ) {
+ printf("%s\n", text); fflush(stdout);
+ } else {
+ printf("Program did not validate successfully.\n");
+ }
+ return 0;
+ }
+
+ return 1;
+
+}
+
diff --git a/src/shaderutils.h b/src/shaderutils.h
new file mode 100644
index 0000000..df8fb78
--- /dev/null
+++ b/src/shaderutils.h
@@ -0,0 +1,29 @@
+/*
+ * shaderuitils.h
+ *
+ * Shader utilities
+ *
+ * (c) 2008 Thomas White <taw27@cam.ac.uk>
+ *
+ * thrust3d - a silly game
+ *
+ */
+
+#ifdef HAVE_CONFIG_H
+#include <config.h>
+#endif
+
+#include <glew.h>
+
+#ifndef SHADERUTILS_H
+#define SHADERUTILS_H
+
+extern void shaderutils_setunf(GLuint program, const char *name, GLfloat val);
+extern void shaderutils_setun2f(GLuint program, const char *name, GLfloat val1, GLfloat val2);
+extern void shaderutils_setuni(GLuint program, const char *name, GLint val);
+extern GLuint shaderutils_load_shader(const char *filename, GLenum type);
+extern int shaderutils_link_program(GLuint program);
+extern int shaderutils_validate_program(GLuint program);
+
+#endif /* SHADERUTILS_H */
+