# HG changeset patch # User John Tsiombikas # Date 1337782246 -10800 # Node ID 8d95187cb3ee10bf070859182f122629d07dd223 # Parent 369b51c9e4a8b5bdeecdfe4784ca9b965fff2114 foo diff -r 369b51c9e4a8 -r 8d95187cb3ee Makefile --- a/Makefile Wed May 23 07:25:43 2012 +0300 +++ b/Makefile Wed May 23 17:10:46 2012 +0300 @@ -4,11 +4,12 @@ dep = $(obj:.o=.d) bin = strat -incdir = -Isrc -Ilevel/src -Icommon/src +incdir = -Isrc -Igfx/src -Ilevel/src -Icommon/src +libgfx = gfx/libgfx.a liblevel = level/liblevel.a libcommon = common/libcommon.a -slibs = $(liblevel) $(libcommon) +slibs = $(libgfx) $(liblevel) $(libcommon) CFLAGS = -pedantic -Wall -g $(incdir) CXXFLAGS = -std=c++0x $(CFLAGS) diff -r 369b51c9e4a8 -r 8d95187cb3ee gfx/Makefile --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/Makefile Wed May 23 17:10:46 2012 +0300 @@ -0,0 +1,28 @@ +csrc = $(wildcard src/*.c) +ccsrc = $(wildcard src/*.cc) +obj = $(ccsrc:.cc=.o) $(csrc:.c=.o) +dep = $(obj:.o=.d) +lib_a = libgfx.a + +CFLAGS = -pedantic -Wall -g -I../common/src +CXXFLAGS = -std=c++0x $(CFLAGS) + +ifeq ($(shell uname -s), Darwin) + CC = clang + CXX = clang++ +endif + +$(lib_a): $(obj) + $(AR) rcs $@ $(obj) + +-include $(dep) + +%.d: %.c + @$(CPP) $(CFLAGS) $< -MM -MT $(@:.d=.o) >$@ + +%.d: %.cc + @$(CPP) $(CXXFLAGS) $< -MM -MT $(@:.d=.o) >$@ + +.PHONY: clean +clean: + rm -f $(obj) $(bin) $(dep) diff -r 369b51c9e4a8 -r 8d95187cb3ee gfx/src/opengl.cc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/src/opengl.cc Wed May 23 17:10:46 2012 +0300 @@ -0,0 +1,39 @@ +#include "opengl.h" + +void load_gl_matrix(const Matrix4x4 &mat) +{ +#ifdef SINGLE_PRECISION_MATH + if(glLoadTransposeMatrixfARB) { + glLoadTransposeMatrixfARB((float*)&mat); + } else { + Matrix4x4 tmat = mat.transposed(); + glLoadMatrixf((float*)&tmat); + } +#else + if(glLoadTransposeMatrixdARB) { + glLoadTransposeMatrixdARB((double*)&mat); + } else { + Matrix4x4 tmat = mat.transposed(); + glLoadMatrixd((double*)&tmat); + } +#endif +} + +void mult_gl_matrix(const Matrix4x4 &mat) +{ +#ifdef SINGLE_PRECISION_MATH + if(glMultTransposeMatrixfARB) { + glMultTransposeMatrixfARB((float*)&mat); + } else { + Matrix4x4 tmat = mat.transposed(); + glMultMatrixf((float*)&tmat); + } +#else + if(glMultTransposeMatrixdARB) { + glMultTransposeMatrixdARB((double*)&mat); + } else { + Matrix4x4 tmat = mat.transposed(); + glMultMatrixd((double*)&tmat); + } +#endif +} diff -r 369b51c9e4a8 -r 8d95187cb3ee gfx/src/opengl.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/src/opengl.h Wed May 23 17:10:46 2012 +0300 @@ -0,0 +1,19 @@ +#ifndef OPENGL_H_ +#define OPENGL_H_ + +#include + +#ifndef __APPLE__ +#include +#else +#include +#endif + +#ifdef __cplusplus +#include + +void load_gl_matrix(const Matrix4x4 &mat); +void mult_gl_matrix(const Matrix4x4 &mat); +#endif /* __cplusplus */ + +#endif /* OPENGL_H_ */ diff -r 369b51c9e4a8 -r 8d95187cb3ee gfx/src/sdr.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/src/sdr.c Wed May 23 17:10:46 2012 +0300 @@ -0,0 +1,328 @@ +#include +#include +#include +#include +#include +#include + +#if defined(unix) || defined(__unix__) +#include +#include +#endif /* unix */ + +#include "sdr.h" + +unsigned int create_vertex_shader(const char *src) +{ + return create_shader(src, GL_VERTEX_SHADER); +} + +unsigned int create_pixel_shader(const char *src) +{ + return create_shader(src, GL_FRAGMENT_SHADER); +} + +unsigned int create_shader(const char *src, unsigned int sdr_type) +{ + unsigned int sdr; + int success, info_len; + char *info_str = 0; + GLenum err; + + sdr = glCreateShader(sdr_type); + assert(glGetError() == GL_NO_ERROR); + glShaderSource(sdr, 1, &src, 0); + err = glGetError(); + assert(err == GL_NO_ERROR); + glCompileShader(sdr); + assert(glGetError() == GL_NO_ERROR); + + glGetShaderiv(sdr, GL_COMPILE_STATUS, &success); + assert(glGetError() == GL_NO_ERROR); + glGetShaderiv(sdr, GL_INFO_LOG_LENGTH, &info_len); + assert(glGetError() == GL_NO_ERROR); + + if(info_len) { + if((info_str = malloc(info_len + 1))) { + glGetShaderInfoLog(sdr, info_len, 0, info_str); + assert(glGetError() == GL_NO_ERROR); + } + } + + if(success) { + fprintf(stderr, info_str ? "done: %s\n" : "done\n", info_str); + } else { + fprintf(stderr, info_str ? "failed: %s\n" : "failed\n", info_str); + glDeleteShader(sdr); + sdr = 0; + } + + free(info_str); + return sdr; +} + +void free_shader(unsigned int sdr) +{ + glDeleteShader(sdr); +} + +unsigned int load_vertex_shader(const char *fname) +{ + return load_shader(fname, GL_VERTEX_SHADER); +} + +unsigned int load_pixel_shader(const char *fname) +{ + return load_shader(fname, GL_FRAGMENT_SHADER); +} + +unsigned int load_shader(const char *fname, unsigned int sdr_type) +{ +#if defined(unix) || defined(__unix__) + struct stat st; +#endif + unsigned int sdr; + size_t filesize; + FILE *fp; + char *src; + + if(!(fp = fopen(fname, "r"))) { + fprintf(stderr, "failed to open shader %s: %s\n", fname, strerror(errno)); + return 0; + } + +#if defined(unix) || defined(__unix__) + fstat(fileno(fp), &st); + filesize = st.st_size; +#else + fseek(fp, 0, SEEK_END); + filesize = ftell(fp); + fseek(fp, 0, SEEK_SET); +#endif /* unix */ + + if(!(src = malloc(filesize + 1))) { + fclose(fp); + return 0; + } + fread(src, 1, filesize, fp); + src[filesize] = 0; + fclose(fp); + + fprintf(stderr, "compiling %s shader: %s... ", (sdr_type == GL_VERTEX_SHADER ? "vertex" : "pixel"), fname); + sdr = create_shader(src, sdr_type); + + free(src); + return sdr; +} + + +unsigned int get_vertex_shader(const char *fname) +{ + return get_shader(fname, GL_VERTEX_SHADER); +} + +unsigned int get_pixel_shader(const char *fname) +{ + return get_shader(fname, GL_FRAGMENT_SHADER); +} + +unsigned int get_shader(const char *fname, unsigned int sdr_type) +{ + unsigned int sdr; + if(!(sdr = load_shader(fname, sdr_type))) { + return 0; + } + return sdr; +} + + +/* ---- gpu programs ---- */ + +unsigned int create_program(void) +{ + unsigned int prog = glCreateProgram(); + assert(glGetError() == GL_NO_ERROR); + return prog; +} + +unsigned int create_program_link(unsigned int vs, unsigned int ps) +{ + unsigned int prog; + + if(!(prog = create_program())) { + return 0; + } + + if(vs) { + attach_shader(prog, vs); + assert(glGetError() == GL_NO_ERROR); + } + if(ps) { + attach_shader(prog, ps); + assert(glGetError() == GL_NO_ERROR); + } + + if(link_program(prog) == -1) { + free_program(prog); + return 0; + } + return prog; +} + +unsigned int create_program_load(const char *vfile, const char *pfile) +{ + unsigned int vs = 0, ps = 0; + + if(vfile && !(vs = get_vertex_shader(vfile))) { + return 0; + } + if(pfile && !(ps = get_pixel_shader(pfile))) { + return 0; + } + return create_program_link(vs, ps); +} + +void free_program(unsigned int sdr) +{ + glDeleteProgram(sdr); +} + +void attach_shader(unsigned int prog, unsigned int sdr) +{ + glAttachShader(prog, sdr); + assert(glGetError() == GL_NO_ERROR); +} + +int link_program(unsigned int prog) +{ + int linked, info_len, retval = 0; + char *info_str = 0; + + glLinkProgram(prog); + assert(glGetError() == GL_NO_ERROR); + glGetProgramiv(prog, GL_LINK_STATUS, &linked); + assert(glGetError() == GL_NO_ERROR); + glGetProgramiv(prog, GL_INFO_LOG_LENGTH, &info_len); + assert(glGetError() == GL_NO_ERROR); + + if(info_len) { + if((info_str = malloc(info_len + 1))) { + glGetProgramInfoLog(prog, info_len, 0, info_str); + assert(glGetError() == GL_NO_ERROR); + } + } + + if(linked) { + fprintf(stderr, info_str ? "linking done: %s\n" : "linking done\n", info_str); + } else { + fprintf(stderr, info_str ? "linking failed: %s\n" : "linking failed\n", info_str); + retval = -1; + } + + free(info_str); + return retval; +} + +int bind_program(unsigned int prog) +{ + GLenum err; + + glUseProgram(prog); + if(prog && (err = glGetError()) != GL_NO_ERROR) { + /* maybe the program is not linked, try linking first */ + if(err == GL_INVALID_OPERATION) { + if(link_program(prog) == -1) { + return -1; + } + glUseProgram(prog); + return glGetError() == GL_NO_ERROR ? 0 : -1; + } + return -1; + } + return 0; +} + +/* ugly but I'm not going to write the same bloody code over and over */ +#define BEGIN_UNIFORM_CODE \ + int loc, curr_prog; \ + glGetIntegerv(GL_CURRENT_PROGRAM, &curr_prog); \ + if((unsigned int)curr_prog != prog && bind_program(prog) == -1) { \ + return -1; \ + } \ + if((loc = glGetUniformLocation(prog, name)) != -1) + +#define END_UNIFORM_CODE \ + if((unsigned int)curr_prog != prog) { \ + bind_program(curr_prog); \ + } \ + return loc == -1 ? -1 : 0 + +int set_uniform_int(unsigned int prog, const char *name, int val) +{ + BEGIN_UNIFORM_CODE { + glUniform1i(loc, val); + } + END_UNIFORM_CODE; +} + +int set_uniform_float(unsigned int prog, const char *name, float val) +{ + BEGIN_UNIFORM_CODE { + glUniform1f(loc, val); + } + END_UNIFORM_CODE; +} + +int set_uniform_float3(unsigned int prog, const char *name, float x, float y, float z) +{ + BEGIN_UNIFORM_CODE { + glUniform3f(loc, x, y, z); + } + END_UNIFORM_CODE; +} + +int set_uniform_float4(unsigned int prog, const char *name, float x, float y, float z, float w) +{ + BEGIN_UNIFORM_CODE { + glUniform4f(loc, x, y, z, w); + } + END_UNIFORM_CODE; +} + +int set_uniform_matrix4(unsigned int prog, const char *name, float *mat) +{ + BEGIN_UNIFORM_CODE { + glUniformMatrix4fv(loc, 1, GL_FALSE, mat); + } + END_UNIFORM_CODE; +} + +int set_uniform_matrix4_transposed(unsigned int prog, const char *name, float *mat) +{ + BEGIN_UNIFORM_CODE { + glUniformMatrix4fv(loc, 1, GL_TRUE, mat); + } + END_UNIFORM_CODE; +} + +int get_attrib_loc(unsigned int prog, const char *name) +{ + int loc, curr_prog; + + glGetIntegerv(GL_CURRENT_PROGRAM, &curr_prog); + if((unsigned int)curr_prog != prog && bind_program(prog) == -1) { + return -1; + } + + loc = glGetAttribLocation(prog, (char*)name); + + if((unsigned int)curr_prog != prog) { + bind_program(curr_prog); + } + return loc; +} + +void set_attrib_float3(int attr_loc, float x, float y, float z) +{ + glVertexAttrib3f(attr_loc, x, y, z); +} diff -r 369b51c9e4a8 -r 8d95187cb3ee gfx/src/sdr.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/gfx/src/sdr.h Wed May 23 17:10:46 2012 +0300 @@ -0,0 +1,49 @@ +#ifndef SDR_H_ +#define SDR_H_ + +#ifdef __cplusplus +extern "C" { +#endif /* __cplusplus */ + +/* ---- shaders ---- */ +unsigned int create_vertex_shader(const char *src); +unsigned int create_pixel_shader(const char *src); +unsigned int create_shader(const char *src, unsigned int sdr_type); +void free_shader(unsigned int sdr); + +unsigned int load_vertex_shader(const char *fname); +unsigned int load_pixel_shader(const char *fname); +unsigned int load_shader(const char *src, unsigned int sdr_type); + +unsigned int get_vertex_shader(const char *fname); +unsigned int get_pixel_shader(const char *fname); +unsigned int get_shader(const char *fname, unsigned int sdr_type); + +int add_shader(const char *fname, unsigned int sdr); +int remove_shader(const char *fname); + +/* ---- gpu programs ---- */ +unsigned int create_program(void); +unsigned int create_program_link(unsigned int vs, unsigned int ps); +unsigned int create_program_load(const char *vfile, const char *pfile); +void free_program(unsigned int sdr); + +void attach_shader(unsigned int prog, unsigned int sdr); +int link_program(unsigned int prog); +int bind_program(unsigned int prog); + +int set_uniform_int(unsigned int prog, const char *name, int val); +int set_uniform_float(unsigned int prog, const char *name, float val); +int set_uniform_float3(unsigned int prog, const char *name, float x, float y, float z); +int set_uniform_float4(unsigned int prog, const char *name, float x, float y, float z, float w); +int set_uniform_matrix4(unsigned int prog, const char *name, float *mat); +int set_uniform_matrix4_transposed(unsigned int prog, const char *name, float *mat); + +int get_attrib_loc(unsigned int prog, const char *name); +void set_attrib_float3(int attr_loc, float x, float y, float z); + +#ifdef __cplusplus +} +#endif /* __cplusplus */ + +#endif /* SDR_H_ */ diff -r 369b51c9e4a8 -r 8d95187cb3ee level/Makefile --- a/level/Makefile Wed May 23 07:25:43 2012 +0300 +++ b/level/Makefile Wed May 23 17:10:46 2012 +0300 @@ -3,7 +3,7 @@ dep = $(obj:.o=.d) lib_a = liblevel.a -CXXFLAGS = -std=c++0x -pedantic -Wall -g -I../common/src +CXXFLAGS = -std=c++0x -pedantic -Wall -g -I../gfx/src -I../common/src ifeq ($(shell uname -s), Darwin) CC = clang diff -r 369b51c9e4a8 -r 8d95187cb3ee level/src/level.cc --- a/level/src/level.cc Wed May 23 07:25:43 2012 +0300 +++ b/level/src/level.cc Wed May 23 17:10:46 2012 +0300 @@ -2,6 +2,7 @@ #include #include "level.h" #include "datapath.h" +#include "opengl.h" using namespace tinyxml2; @@ -53,6 +54,32 @@ return true; } +void Level::draw() const +{ + auto iter = levelmaps.find("height"); + if(iter == levelmaps.end()) { + return; + } + + img_pixmap *hmap = (img_pixmap*)iter->second.get_pixmap(); + + glBegin(GL_POINTS); + for(int i=0; iheight; i++) { + for(int j=0; jwidth; j++) { + int height; + img_getpixel1i(hmap, j, i, &height); + + float x = (float)j / (float)hmap->width - 0.5; + float y = height / 255.0; + float z = (float)i / (float)hmap->height - 0.5; + + glColor3f(y, 0.0, 1.0 - y); + glVertex3f(x, y, z); + } + } + glEnd(); +} + LevelMap::LevelMap() { diff -r 369b51c9e4a8 -r 8d95187cb3ee level/src/level.h --- a/level/src/level.h Wed May 23 07:25:43 2012 +0300 +++ b/level/src/level.h Wed May 23 17:10:46 2012 +0300 @@ -18,6 +18,8 @@ ~Level(); bool load(const char *fname); + + void draw() const; }; class LevelMap { diff -r 369b51c9e4a8 -r 8d95187cb3ee src/game_part.cc --- a/src/game_part.cc Wed May 23 07:25:43 2012 +0300 +++ b/src/game_part.cc Wed May 23 17:10:46 2012 +0300 @@ -1,3 +1,4 @@ +#include #include "opengl.h" #include "game_part.h" #include "level.h" @@ -12,32 +13,39 @@ return true; } +void Game::start() +{ + Part::start(); + + glEnable(GL_DEPTH_TEST); +} + void Game::draw() const { - glClear(GL_COLOR_BUFFER_BIT); + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); glMatrixMode(GL_MODELVIEW); glLoadIdentity(); - glRotatef(current_time / 100.0, 0, 0, 1); - glScalef(0.5, 0.5, 1); + glTranslatef(0, 0, -4); + glRotatef(50, 1, 0, 0); + glRotatef(current_time / 100.0, 0, 1, 0); - glBegin(GL_QUADS); - glColor3f(1, 0, 0); - glVertex2f(-1, -1); - glColor3f(0, 1, 0); - glVertex2f(1, -1); - glColor3f(0, 0, 1); - glVertex2f(1, 1); - glColor3f(1, 0, 1); - glVertex2f(-1, 1); - glEnd(); + level.draw(); +} + +void Game::reshape(int x, int y) +{ + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(45.0, (float)x / (float)y, 0.5, 500); } void Game::key(int key, bool pressed) { switch(key) { case 27: - cur_part = menu_part; + exit(0); + //cur_part = menu_part; break; default: diff -r 369b51c9e4a8 -r 8d95187cb3ee src/game_part.h --- a/src/game_part.h Wed May 23 07:25:43 2012 +0300 +++ b/src/game_part.h Wed May 23 17:10:46 2012 +0300 @@ -12,7 +12,10 @@ bool init(); + void start(); + void draw() const; + void reshape(int x, int y); void key(int key, bool pressed); }; diff -r 369b51c9e4a8 -r 8d95187cb3ee src/main.cc --- a/src/main.cc Wed May 23 07:25:43 2012 +0300 +++ b/src/main.cc Wed May 23 17:10:46 2012 +0300 @@ -62,7 +62,8 @@ return false; } - cur_part = menu_part; + //menu_part->start(); + game_part->start(); return true; } diff -r 369b51c9e4a8 -r 8d95187cb3ee src/opengl.h --- a/src/opengl.h Wed May 23 07:25:43 2012 +0300 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,12 +0,0 @@ -#ifndef OPENGL_H_ -#define OPENGL_H_ - -#include - -#ifdef __APPLE__ -#include -#else -#include -#endif - -#endif /* OPENGL_H_ */ diff -r 369b51c9e4a8 -r 8d95187cb3ee src/part.cc --- a/src/part.cc Wed May 23 07:25:43 2012 +0300 +++ b/src/part.cc Wed May 23 17:10:46 2012 +0300 @@ -13,6 +13,16 @@ return true; } +void Part::start() +{ + if(cur_part) { + cur_part->stop(); + } + cur_part = this; +} + +void Part::stop() {} + void Part::update(unsigned long msec) { current_time = msec; diff -r 369b51c9e4a8 -r 8d95187cb3ee src/part.h --- a/src/part.h Wed May 23 07:25:43 2012 +0300 +++ b/src/part.h Wed May 23 17:10:46 2012 +0300 @@ -15,6 +15,9 @@ virtual bool init(); + virtual void start(); + virtual void stop(); + virtual void update(unsigned long msec); virtual void draw() const = 0;