diff --git a/src/Engine.cc b/src/Engine.cc index d64de56..202de3a 100644 --- a/src/Engine.cc +++ b/src/Engine.cc @@ -20,6 +20,8 @@ #include "AV.h" #include "PhyObj/PhyObj.h" #include "sdl_keymap.h" +#include "cfs.h" +#include "glslUtil/glslUtil.h" using namespace std; @@ -160,6 +162,44 @@ Engine::Engine(const string & path, AV & av) m_luaState = lua_open(); registerLibraries(); + + const char *obj_v_src = (const char *) getFile("shaders/obj.vp", NULL); + const char *obj_f_src = (const char *) getFile("shaders/obj/fp", NULL); + const static guAttribBinding obj_bindings[] = { + {ATTRIBUTE_OBJ_POS, "pos"}, + {ATTRIBUTE_OBJ_NORMAL, "normal"}, + {0, NULL} + }; + if (obj_v_src != NULL && obj_f_src != NULL) + { + m_programs[PROG_OBJ] = guMakeProgramFromSource(obj_v_src, obj_f_src, + obj_bindings); + } + else + { + m_programs[PROG_OBJ] = 0; + cerr << "Error: Could not obtain 'obj' shader sources" << endl; + } + const char *obj_tex_v_src = + (const char *) getFile("shaders/obj_tex.vp", NULL); + const char *obj_tex_f_src = + (const char *) getFile("shaders/obj_tex.fp", NULL); + const static guAttribBinding obj_tex_bindings[] = { + {ATTRIBUTE_OBJ_TEX_POS, "pos"}, + {ATTRIBUTE_OBJ_TEX_NORMAL, "normal"}, + {ATTRIBUTE_OBJ_TEX_TEX_COORD, "tex_coord"}, + {0, NULL} + }; + if (obj_tex_v_src != NULL && obj_tex_f_src != NULL) + { + m_programs[PROG_OBJ_TEX] = guMakeProgramFromSource(obj_tex_v_src, + obj_tex_f_src, obj_tex_bindings); + } + else + { + m_programs[PROG_OBJ_TEX] = 0; + cerr << "Error: Could not obtain 'obj_tex' shader sources" << endl; + } } Engine::~Engine() diff --git a/src/Engine.h b/src/Engine.h index 060c8d4..65d5a4a 100644 --- a/src/Engine.h +++ b/src/Engine.h @@ -365,6 +365,39 @@ class Engine bool m_event_mousebutton_down_present; bool m_event_mousebutton_up_present; bool m_event_mouse_motion_present; + + enum { PROG_OBJ, PROG_OBJ_TEX, PROG_COUNT }; + GLuint m_programs[PROG_COUNT]; + enum { + UNIFORM_OBJ_PROJECTION, + UNIFORM_OBJ_MODELVIEW, + UNIFORM_OBJ_AMBIENT, + UNIFORM_OBJ_DIFFUSE, + UNIFORM_OBJ_SPECULAR, + UNIFORM_OBJ_SHININESS, + UNIFORM_OBJ_COUNT + }; + enum { + ATTRIBUTE_OBJ_POS, + ATTRIBUTE_OBJ_NORMAL, + ATTRIBUTE_OBJ_COUNT + }; + GLint m_uniforms_obj[UNIFORM_OBJ_COUNT]; + enum { + UNIFORM_OBJ_TEX_PROJECTION, + UNIFORM_OBJ_TEX_MODELVIEW, + UNIFORM_OBJ_TEX_AMBIENT, + UNIFORM_OBJ_TEX_SPECULAR, + UNIFORM_OBJ_TEX_SHININESS, + UNIFORM_OBJ_TEX_COUNT + }; + enum { + ATTRIBUTE_OBJ_TEX_POS, + ATTRIBUTE_OBJ_TEX_NORMAL, + ATTRIBUTE_OBJ_TEX_TEX_COORD, + ATTRIBUTE_OBJ_TEX_COUNT + }; + GLint m_uniforms_obj_tex[UNIFORM_OBJ_TEX_COUNT]; }; extern Engine * g_engine;