quick backup
[demo] / src / shader_manager.cc
index 2b683d6..87c0451 100644 (file)
@@ -15,22 +15,25 @@ void ShaderManager::add_shader(Shader *sdr, const char *name)
 
 Shader *ShaderManager::load_shader(const char *name, SType type)
 {
-       std::map<std::string, Shader*>::const_iterator it;
+       std::map<std::string, Shader *>::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