diff options
author | Eric Anholt <eric@anholt.net> | 2009-07-28 10:49:50 -0700 |
---|---|---|
committer | Eric Anholt <eric@anholt.net> | 2009-07-28 10:49:50 -0700 |
commit | a9c85b079846cb92929c1acbc8577551953aa1e4 (patch) | |
tree | 3e65d936c28a9c0bd9d5d239f84fcc58554a4c44 | |
parent | 57ee2c3ababab71911e5669932a33fb981c1bf42 (diff) |
Fix up load_program so it can be used for other programs too.
-rw-r--r-- | glass.c | 58 |
1 files changed, 41 insertions, 17 deletions
@@ -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); |