X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fshader_manager.cc;h=b49f68657564daea64ac5ff35ed1400ea77c9082;hb=86c912d603be75ac8b2fdb2229f1696e9c0c01d9;hp=3927969d6719a61157b1a501c36b7da4c7c09de9;hpb=c0078cdf2aa206287888afa767bf75fa0e81ad15;p=demo diff --git a/src/shader_manager.cc b/src/shader_manager.cc index 3927969..b49f686 100644 --- a/src/shader_manager.cc +++ b/src/shader_manager.cc @@ -1,10 +1,10 @@ #include +#include "gfxapi.h" + #include "shader_manager.h" #include "opengl/shader-gl.h" -extern bool use_vulkan; - ShaderManager::ShaderManager() {} ShaderManager::~ShaderManager() {} @@ -13,7 +13,7 @@ void ShaderManager::add_shader(Shader *sdr, const char *name) shaders[name] = sdr; } -Shader *ShaderManager::load_shader(const char *name, SType type) +Shader *ShaderManager::load_shader(const char *name, ShaderType type) { std::map::const_iterator it; it = shaders.find(name); @@ -22,15 +22,11 @@ Shader *ShaderManager::load_shader(const char *name, SType type) return it->second; } - Shader *sdr; - if(use_vulkan) { - // sdr = new ShaderVK; - } - else { - sdr = new ShaderGL; - } + Shader *sdr = gfx_create_shader(); - if(!sdr->load(name, type)) { + std::string fname = path.empty() ? std::string(name) : path + "/" + std::string(name); + + if(!sdr->load(fname.c_str(), type)) { delete sdr; return 0; } @@ -45,4 +41,44 @@ void ShaderManager::delete_shaders() for(it=shaders.begin(); it != shaders.end(); it++) { delete it->second; } -} \ No newline at end of file +} + +ShaderProgram *ShaderManager::create_shader_program(const char *vname, const char *fname) +{ + path = std::string(gfx_get_shader_path()); + + if(!vname || !fname) + return 0; + + Shader *vsdr = load_shader(vname, SDR_VERTEX); + if(!vsdr) + return 0; + + Shader *fsdr = load_shader(fname, SDR_FRAGMENT); + if(!fsdr) + return 0; + + ShaderProgram *sprog = gfx_create_shader_program(); + + if(!sprog->create()) { + return 0; + } + + sprog->attach_shader(vsdr); + sprog->attach_shader(fsdr); + + if(!sprog->link()) { + delete sprog; + return 0; + } + + return sprog; +} + +void ShaderManager::set_path(const char *path) +{ + if(!path) + this->path.clear(); + else + this->path = std::string(path); +}