X-Git-Url: http://git.mutantstargoat.com?a=blobdiff_plain;f=src%2Fshader_manager.cc;h=87c0451f0c989f36c2dbb8a115da3fdb2c8b2d40;hb=63d7f3b0e70ab5e3d530c579b1881967c96b0b92;hp=2b683d6def8d723c80dc7bfaf220ee6536ce9ffa;hpb=31bab00bc3b476be9814c1ee06b9a2f0dc77d4e9;p=demo diff --git a/src/shader_manager.cc b/src/shader_manager.cc index 2b683d6..87c0451 100644 --- a/src/shader_manager.cc +++ b/src/shader_manager.cc @@ -15,22 +15,25 @@ void ShaderManager::add_shader(Shader *sdr, const char *name) Shader *ShaderManager::load_shader(const char *name, SType type) { - std::map::const_iterator it; + std::map::const_iterator it; it = shaders.find(name); if(it != shaders.end()) { return it->second; } - Shader* sdr; + Shader *sdr; if(use_vulkan) { - // sdr = new ShaderVK; + // sdr = new ShaderVK; } else { sdr = new ShaderGL; } - if(!sdr->load(name, type)) { + std::string fname = path.empty() ? std::string(name) : path + "/" + std::string(name); + + if(!sdr->load(fname.c_str(), type)) { + fprintf(stderr, "Failed to load shader: %s.\n", fname.c_str()); delete sdr; return 0; } @@ -45,4 +48,49 @@ void ShaderManager::delete_shaders() for(it=shaders.begin(); it != shaders.end(); it++) { delete it->second; } +} + +ShaderProgram *ShaderManager::create_shader_program(const char *vname, const char *fname) +{ + path = use_vulkan ? "vk_shaders" : "gl_shaders"; + + Shader *vsdr = load_shader(vname, SDR_VERTEX); + if(!vsdr) + return 0; + + Shader *fsdr = load_shader(fname, SDR_FRAGMENT); + if(!fsdr) + return 0; + + ShaderProgram *sprog; + + if(use_vulkan) { + // TODO + return 0; + } + else { + sprog = new ShaderProgramGL; + } + + 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); } \ No newline at end of file