From 1a1bdf64ce1d50bc59e2d07658ba0420ce8b2b13 Mon Sep 17 00:00:00 2001 From: Josh Holtrop Date: Mon, 16 May 2011 15:55:22 -0400 Subject: [PATCH] import glslUtil; use for creating shaders/program --- .gitmodules | 3 ++ SConstruct | 7 +-- glslUtil | 1 + wfobj | 2 +- wfobj-view.cc | 129 +++++++------------------------------------------- 5 files changed, 27 insertions(+), 115 deletions(-) create mode 160000 glslUtil diff --git a/.gitmodules b/.gitmodules index cd5db7b..8e27145 100644 --- a/.gitmodules +++ b/.gitmodules @@ -4,3 +4,6 @@ [submodule "loadTexture"] path = loadTexture url = ../loadTexture.git +[submodule "glslUtil"] + path = glslUtil + url = ../glslUtil.git diff --git a/SConstruct b/SConstruct index 4a57b36..505f5e8 100644 --- a/SConstruct +++ b/SConstruct @@ -4,11 +4,12 @@ import os import sys env = Environment(LIBS = ['GL', 'GLU', 'SDL_image'], - CFLAGS = ['-Wall'], - CXXFLAGS = ['-Wall']) + CFLAGS = ['-Wall', '-DGL_GLEXT_PROTOTYPES'], + CXXFLAGS = ['-Wall', '-DGL_GLEXT_PROTOTYPES']) env.ParseConfig('sdl-config --cflags --libs') -sources = [Glob('*.cc'), Glob('wfobj/WFObj.cc'), Glob('loadTexture/*.c')] +sources = [Glob('*.cc'), Glob('wfobj/WFObj.cc'), Glob('loadTexture/*.c'), + Glob('glslUtil/*.c')] env.Program('wfobj-view', sources) if len(os.listdir('wfobj')) == 0: diff --git a/glslUtil b/glslUtil new file mode 160000 index 0000000..060f311 --- /dev/null +++ b/glslUtil @@ -0,0 +1 @@ +Subproject commit 060f3115bf0f1f659dd44ef3738c12327ec2ef43 diff --git a/wfobj b/wfobj index 08e5584..1ecc6d7 160000 --- a/wfobj +++ b/wfobj @@ -1 +1 @@ -Subproject commit 08e558482f1b79ff8119c426de2ff6156fd470dc +Subproject commit 1ecc6d749be3bc3f5dc0de230b5e8e3ca079377a diff --git a/wfobj-view.cc b/wfobj-view.cc index 113de7d..88e41a5 100644 --- a/wfobj-view.cc +++ b/wfobj-view.cc @@ -1,6 +1,5 @@ /* Libraries we use */ -#define GL_GLEXT_PROTOTYPES #include #include #include @@ -10,6 +9,7 @@ #include #include "wfobj/WFObj.h" #include "loadTexture/loadTexture.h" +#include "glslUtil/glslUtil.h" using namespace std; /* Some definitions */ @@ -40,7 +40,7 @@ private: int m_startx, m_starty; bool m_dragging; float m_dist; - GLuint m_program, m_vs, m_fs; + GLuint m_program; GLint m_ambient_loc, m_diffuse_loc, m_specular_loc, m_shininess_loc; }; @@ -56,90 +56,6 @@ static GLuint load_texture(const char *fname) return id; } -char * loadFile(const char *fname) -{ - struct stat st; - if (stat(fname, &st) != 0) - return NULL; - if (st.st_size <= 0) - return NULL; - char * buff = new char[st.st_size + 1]; - int fd = open(fname, O_RDONLY); - read(fd, buff, st.st_size); - close(fd); - buff[st.st_size] = '\0'; - return buff; -} - -char *getShaderLog(GLuint id) -{ - GLint log_length; - glGetShaderiv(id, GL_INFO_LOG_LENGTH, &log_length); - if (log_length > 0) - { - char *log = new char[log_length]; - glGetShaderInfoLog(id, log_length, &log_length, log); - return log; - } - return NULL; -} - -char *getProgramLog(GLuint id) -{ - GLint log_length; - glGetProgramiv(id, GL_INFO_LOG_LENGTH, &log_length); - if (log_length > 0) - { - char *log = new char[log_length]; - glGetProgramInfoLog(id, log_length, &log_length, log); - return log; - } - return NULL; -} - -GLuint makeShader(GLenum shaderType, const char *fname) -{ - GLuint id; - const char *source; - GLint status; - - id = glCreateShader(shaderType); - if (id <= 0) - { - cerr << "Error creating shader object" << endl; - goto out; - } - - source = loadFile(fname); - if (source == NULL) - { - fprintf(stderr, "Error reading file '%s'\n", fname); - goto cleanup_shader; - } - - glShaderSource(id, 1, &source, NULL); - delete[] source; - - glCompileShader(id); - - glGetShaderiv(id, GL_COMPILE_STATUS, &status); - if (status != GL_TRUE) - { - cerr << "Error compiling shader" << endl; - char *log = getShaderLog(id); - cerr << "Shader Log:" << endl << log << endl; - delete[] log; - goto cleanup_shader; - } - - return id; - -cleanup_shader: - glDeleteShader(id); -out: - return 0; -} - /* The program's main entry point */ int main(int argc, char * argv[]) { @@ -183,38 +99,29 @@ Viewer::Viewer(const char * filename) exit(1); } - m_vs = makeShader(GL_VERTEX_SHADER, "v_shader.glsl"); - m_fs = makeShader(GL_FRAGMENT_SHADER, "f_shader.glsl"); - - m_program = glCreateProgram(); - glAttachShader(m_program, m_vs); - glAttachShader(m_program, m_fs); - - glBindAttribLocation(m_program, LOC_POSITION, "pos"); - glBindAttribLocation(m_program, LOC_NORMAL, "normal"); - - glLinkProgram(m_program); - - GLint link_status; - glGetProgramiv(m_program, GL_LINK_STATUS, &link_status); - if (link_status != GL_TRUE) + const static guAttribBinding bindings[] = { + {LOC_POSITION, "pos"}, + {LOC_NORMAL, "normal"}, + {0, NULL} + }; + m_program = guMakeProgramFromFiles("v_shader.glsl", "f_shader.glsl", + bindings); + if (m_program == 0) { - char *log = getProgramLog(m_program); - cerr << "Program log:" << endl << log << endl; - delete[] log; - glDeleteShader(m_vs); - glDeleteShader(m_fs); exit(1); } - m_ambient_loc = glGetUniformLocation(m_program, "ambient"); - m_diffuse_loc = glGetUniformLocation(m_program, "diffuse"); - m_specular_loc = glGetUniformLocation(m_program, "specular"); - m_shininess_loc = glGetUniformLocation(m_program, "shininess"); + guUniformLocation uniforms[] = { + {&m_ambient_loc, "ambient"}, + {&m_diffuse_loc, "diffuse"}, + {&m_specular_loc, "specular"}, + {&m_shininess_loc, "shininess"}, + {NULL, NULL} + }; + guGetUniformLocations(m_program, uniforms); if (m_ambient_loc < 0 || m_diffuse_loc < 0 || m_specular_loc < 0 || m_shininess_loc < 0) { - cerr << "glGetUniformLocation() returned < 0" << endl; exit(1); }