# HG changeset patch # User Eleni Maria Stea # Date 1384084956 -7200 # Node ID f756fc9fdd3e5571241838200ef8ed06552bf709 # Parent ad78eb81988d9d48f49b91abbc1ae2515abbb1b9 quick backup diff -r ad78eb81988d -r f756fc9fdd3e .hgignore --- a/.hgignore Sun Nov 10 00:38:23 2013 +0200 +++ b/.hgignore Sun Nov 10 14:02:36 2013 +0200 @@ -7,3 +7,5 @@ *.d invisible *.swp +*.jpg +*.png diff -r ad78eb81988d -r f756fc9fdd3e src/sdr.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sdr.cc Sun Nov 10 14:02:36 2013 +0200 @@ -0,0 +1,102 @@ +#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 = NULL; + if(!(glsl = (char*) malloc(ctr + 1))) { + perror("Failed to allocate memory"); + return 0; + } + ctr = fread(glsl, 1, ctr, fp); + fclose(fp); + + 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 false; + } else if(loglen) { + fprintf(stderr, "%s\n", infolog); + } + return sprog; +} diff -r ad78eb81988d -r f756fc9fdd3e src/sdr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/sdr.h Sun Nov 10 14:02:36 2013 +0200 @@ -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 ad78eb81988d -r f756fc9fdd3e src/tesquad.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/tesquad.cc Sun Nov 10 14:02:36 2013 +0200 @@ -0,0 +1,46 @@ +#include +#include "tesquad.h" + +void draw_tess_quad(float x, float y, float w, float h, int usub, int vsub, bool ortho) +{ + if(ortho) { + glPushAttrib(GL_ENABLE_BIT); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + } + + float du = 1.0 / usub; + float dv = 1.0 / vsub; + + float dx = du * w; + float dy = dv * h; + + glBegin(GL_QUADS); + for (int i=0; i +#include +#include +#include "texture.h" + +unsigned int load_texture(const char* fname) +{ + IplImage* img = cvLoadImage(fname); + if(!img) { + fprintf(stderr, "Failed to load image: %s\n", fname); + return 0; + } + cv::Mat mat = cv::Mat(img); + + unsigned int tex; + glGenTextures(1, &tex); + glBindTexture(GL_TEXTURE_2D, tex); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, mat.cols, mat.rows, + 0, GL_BGR, GL_UNSIGNED_BYTE, mat.data); + + return tex; +} diff -r ad78eb81988d -r f756fc9fdd3e src/texture.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/texture.h Sun Nov 10 14:02:36 2013 +0200 @@ -0,0 +1,6 @@ +#ifndef TEXTURE_H_ +#define TEXTURE_H_ + +unsigned int load_texture(const char *fname); + +#endif // TEXTURE_H_