summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEric Anholt <eric@anholt.net>2009-07-28 10:49:50 -0700
committerEric Anholt <eric@anholt.net>2009-07-28 10:49:50 -0700
commita9c85b079846cb92929c1acbc8577551953aa1e4 (patch)
tree3e65d936c28a9c0bd9d5d239f84fcc58554a4c44
parent57ee2c3ababab71911e5669932a33fb981c1bf42 (diff)
Fix up load_program so it can be used for other programs too.
-rw-r--r--glass.c58
1 files changed, 41 insertions, 17 deletions
diff --git a/glass.c b/glass.c
index e86d28f..3e9cdd2 100644
--- a/glass.c
+++ b/glass.c
@@ -80,6 +80,7 @@ struct uniform_desc {
[UNIFORM_F0] = { "F0" },
};
+static GLuint glass_prog = 0;
struct revolved_object ring;
GLuint normalmap_tex, heightmap_tex;
@@ -232,10 +233,23 @@ install_transform(int instance)
}
static void
-draw(void)
+draw_rings(void)
{
int instance;
+ if (glass_prog != 0) {
+ glUseProgram(glass_prog);
+ glBindVertexArray(ring.array_obj);
+ for (instance = 0; instance < 27; instance++) {
+ install_transform(instance);
+ do_ring_drawelements();
+ }
+ }
+}
+
+static void
+draw(void)
+{
glClearColor(0.0, 0.0, 0.8, 0.0);
glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
@@ -244,14 +258,9 @@ draw(void)
update_light_position();
- glBindVertexArray(ring.array_obj);
-
glViewport(0, 0, win_width, win_height);
- for (instance = 0; instance < 27; instance++) {
- install_transform(instance);
- do_ring_drawelements();
- }
+ draw_rings();
SDL_GL_SwapBuffers();
frames++;
@@ -635,14 +644,17 @@ generate_rounded_rect_verts(float w, float h, float top_flat, float side_flat,
*out_num_verts = num_verts;
}
-static void
-load_program(void)
+static GLuint
+load_program(char *base_filename)
{
GLint prog, fs, vs, ok;
- int i;
+ char vert_filename[100];
+ char frag_filename[100];
- vs = compile_program(GL_VERTEX_SHADER, "glass.vert");
- fs = compile_program(GL_FRAGMENT_SHADER, "glass.frag");
+ sprintf(vert_filename, "%s.vert", base_filename);
+ sprintf(frag_filename, "%s.frag", base_filename);
+ vs = compile_program(GL_VERTEX_SHADER, vert_filename);
+ fs = compile_program(GL_FRAGMENT_SHADER, frag_filename);
prog = glCreateProgram();
glAttachShader(prog, fs);
glAttachShader(prog, vs);
@@ -658,13 +670,25 @@ load_program(void)
glGetProgramInfoLog(prog, size, NULL, info);
fprintf(stderr, "Failed to link: %s\n", info);
}
- glUseProgram(prog);
+ return prog;
+}
+static void
+load_programs(void)
+{
+ int i;
+
+ if (glass_prog != 0) {
+ glDeleteProgram(glass_prog);
+ }
+
+ glass_prog = load_program("glass");
+
+ glUseProgram(glass_prog);
for (i = 0; i < ARRAY_SIZE(uniforms); i++) {
- uniforms[i].location = glGetUniformLocation(prog,
+ uniforms[i].location = glGetUniformLocation(glass_prog,
uniforms[i].name);
}
-
glUniform1i(uniforms[UNIFORM_NORMAL_SAMPLER].location, 0);
glUniform1i(uniforms[UNIFORM_HEIGHTMAP_SAMPLER].location, 1);
@@ -739,7 +763,7 @@ init(void)
free(verts);
- load_program();
+ load_programs();
glActiveTexture(GL_TEXTURE0);
normalmap_tex = load_texture_rgb("normalmap.png");
@@ -787,7 +811,7 @@ key(SDLKey sym)
{
switch (sym) {
case 'c':
- load_program();
+ load_programs();
break;
case 'f':
SDL_WM_ToggleFullScreen(sdl_surf);