# HG changeset patch # User Eleni Maria Stea # Date 1398361668 -10800 # Node ID 4e120dcd55ec124a11566326d76681c5df54502f # Parent c22866ecb7ae2ce113a17dc124b643a7c2b99321 added shaders that just draw diff -r c22866ecb7ae -r 4e120dcd55ec src/main.cc --- a/src/main.cc Tue Mar 25 00:17:39 2014 +0200 +++ b/src/main.cc Thu Apr 24 20:47:48 2014 +0300 @@ -9,6 +9,7 @@ #include #include "mesh.h" +#include "sdr.h" #include "volume.h" static bool init(void); @@ -34,17 +35,21 @@ static std::vector key_state(256); static const char *vol_fname = "data/test1.vol"; +static const char *vsdr_path = "data/shaders/transfer.v.glsl"; +static const char *fsdr_path = "data/shaders/transfer.f.glsl"; static Volume *vol; static Mesh *mesh; static float cur_z, thres = 0.5, thres2 = 1.0; -static float zeta; +static float slice_z; static int use_orig_vol_res = 1; static int vol_res[3]; // volume sampling resolution x/y/z static GLUI *ui; +static unsigned int sprog; + int main(int argc, char **argv) { glutInit(&argc, argv); @@ -80,10 +85,24 @@ glEnable(GL_DEPTH_TEST); glEnable(GL_NORMALIZE); - glEnable(GL_LIGHTING); //TODO: shaders + glEnable(GL_LIGHTING); glEnable(GL_LIGHT0); glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, 1); + //FIXME shaders setup + if(!(sprog = sdr_getprog(vsdr_path, fsdr_path))) + { + fprintf(stderr, "Failed to create shader program!\n"); + return false; + } + glUseProgram(sprog); + float t1 = glGetUniformLocation(sprog, "thres1"); + if(t1 != -1) + glUniform1f(t1, 0); + float t2 = glGetUniformLocation(sprog, "thres2"); + glUniform1f(t2, 1); + glUseProgram(0); + vol = new Volume; if(!vol->load(vol_fname)) { fprintf(stderr, "Failed to load %s", vol_fname); @@ -171,7 +190,7 @@ GLUI_Panel *preview_panel = ui->add_panel("volume preview"); - GLUI_Spinner *preview_spin = ui->add_spinner_to_panel(preview_panel, "slice z", GLUI_SPINNER_FLOAT, &zeta, 0); + GLUI_Spinner *preview_spin = ui->add_spinner_to_panel(preview_panel, "slice z", GLUI_SPINNER_FLOAT, &slice_z, 0); preview_spin->set_float_limits(0, 1); return ui; @@ -184,6 +203,8 @@ glDisable(GL_LIGHTING); glDisable(GL_DEPTH_TEST); + glUseProgram(sprog); + glMatrixMode(GL_MODELVIEW); glPushMatrix(); glLoadIdentity(); @@ -197,10 +218,10 @@ glEnable(GL_TEXTURE_3D); glBegin(GL_QUADS); glColor3f(1.0, 1.0, 1.0); - glTexCoord3f(0, 0, zeta); glVertex3f(-1.0, 1.0, 0.0); - glTexCoord3f(0, 1, zeta); glVertex3f(-1.0, 0.5, 0.0); - glTexCoord3f(1, 1, zeta); glVertex3f(-0.5, 0.5, 0.0); - glTexCoord3f(1, 0, zeta); glVertex3f(-0.5, 1.0, 0.0); + glTexCoord3f(0, 0, slice_z); glVertex3f(-1.0, 1.0, 0.0); + glTexCoord3f(0, 1, slice_z); glVertex3f(-1.0, 0.5, 0.0); + glTexCoord3f(1, 1, slice_z); glVertex3f(-0.5, 0.5, 0.0); + glTexCoord3f(1, 0, slice_z); glVertex3f(-0.5, 1.0, 0.0); glEnd(); glDisable(GL_TEXTURE_3D); @@ -219,6 +240,8 @@ glMatrixMode(GL_MODELVIEW); glPopMatrix(); + glUseProgram(0); + glEnable(GL_DEPTH_TEST); glEnable(GL_LIGHTING); } diff -r c22866ecb7ae -r 4e120dcd55ec src/sdr.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sdr.cc Thu Apr 24 20:47:48 2014 +0300 @@ -0,0 +1,104 @@ +#include +#include + +#include +#include +#include +#include + +#include "sdr.h" + +char* sdr_load(const char* fname) +{ + if(!fname) { + return 0; + } + + FILE *fp; + int ctr = 0; + + if(!(fp = fopen(fname, "rb"))) { + fprintf(stderr, "Failed to open file %s: %s\n", fname, strerror(errno)); + return 0; + } + fseek(fp, 0, SEEK_END); + ctr = ftell(fp); + rewind(fp); + + char *glsl; + if(!(glsl = (char*) malloc(ctr + 1))) { + perror("Failed to allocate memory"); + return 0; + } + fread(glsl, 1, ctr, fp); + fclose(fp); + + glsl[ctr] = 0; + + return glsl; +} + +bool sdr_compile(unsigned int sdr) +{ + int status, loglen; + char infolog[512]; + + glCompileShader(sdr); + glGetShaderiv(sdr, GL_COMPILE_STATUS, &status); + glGetShaderInfoLog(sdr, sizeof infolog, &loglen, infolog); + if(status == GL_FALSE) { + fprintf(stderr, "Failed to compile shader: %s\n", infolog); + return false; + } else if(loglen) { + fprintf(stderr, "%s\n", infolog); + } + return true; +} + +unsigned int sdr_getprog(const char* vfname, const char* ffname) +{ + char *vsdr_glsl = NULL; + char *fsdr_glsl = NULL; + + GLuint vsdr; GLuint fsdr; + vsdr = glCreateShader(GL_VERTEX_SHADER); + fsdr = glCreateShader(GL_FRAGMENT_SHADER); + + if(!(vsdr_glsl = sdr_load(vfname))) + return 0; + if(!(fsdr_glsl = sdr_load(ffname))) + return 0; + + glShaderSource(vsdr, 1, (const GLchar**)&vsdr_glsl, NULL); + glShaderSource(fsdr, 1, (const GLchar**)&fsdr_glsl, NULL); + + free(vsdr_glsl); + free(fsdr_glsl); + + if(!sdr_compile(vsdr)) { + fprintf(stderr, "Shader %s failed to compile.\n", vfname); + return 0; + } + if(!sdr_compile(fsdr)) { + fprintf(stderr, "Shader %s failed to compile.\n", ffname); + return 0; + } + + unsigned int sprog; + int status, loglen; + char infolog[512]; + + sprog = glCreateProgram(); + glAttachShader(sprog, vsdr); + glAttachShader(sprog, fsdr); + glLinkProgram(sprog); + glGetProgramiv(sprog, GL_LINK_STATUS, &status); + glGetProgramInfoLog(sprog, sizeof infolog, &loglen, infolog); + if(status == GL_FALSE) { + fprintf(stderr, "Error while linking shader program:\n%s\n", infolog); + return 0; + } else if(loglen) { + fprintf(stderr, "%s\n", infolog); + } + return sprog; +} diff -r c22866ecb7ae -r 4e120dcd55ec src/sdr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sdr.h Thu Apr 24 20:47:48 2014 +0300 @@ -0,0 +1,8 @@ +#ifndef SDR_H_ +#define SDR_H_ + +char *sdr_load(const char *fname); +bool sdr_compile(unsigned int sdr); +unsigned int sdr_getprog(const char *vfname, const char *ffname); + +#endif // SDR_H_ diff -r c22866ecb7ae -r 4e120dcd55ec src/volume.cc --- a/src/volume.cc Tue Mar 25 00:17:39 2014 +0200 +++ b/src/volume.cc Thu Apr 24 20:47:48 2014 +0300 @@ -241,6 +241,7 @@ void Volume::draw() const { + } static char *strip_whitespaces(char *buf)