fprintf(stderr, "Unknown shader type.\n");
return false;
}
+ name = std::string(fname);
sdr = glCreateShader(stype);
/* compile */
destroy();
}
-void ShaderProgramGL::delete_shaders()
-{
- for(unsigned int i=0; i<(sizeof shaders) / (sizeof *shaders); ++i) {
- delete shaders[i];
- }
-}
-
bool ShaderProgramGL::create()
{
prog = glCreateProgram();
glDeleteProgram(prog);
prog = 0;
is_linked = false;
-
- delete_shaders();
}
void ShaderProgramGL::attach_shader(Shader *shader)
virtual ~ShaderProgramGL();
virtual void cache_uniforms() override;
- virtual void delete_shaders() override;
virtual bool link() override;
virtual bool use() override;
}
}
-void ShaderProgram::add_shader(Shader *sdr)
-{
- assert(sdr->type < sizeof shaders / sizeof *shaders);
- shaders[sdr->type] = sdr;
-}
+// void ShaderProgram::add_shader(Shader *sdr)
+// {
+// assert(sdr->type < sizeof shaders / sizeof *shaders);
+// shaders[sdr->type] = sdr;
+// }
ShaderProgram *get_current_program()
{
class Shader {
protected:
+ SType type;
+ std::string name;
+
virtual bool create(char *buf, unsigned int bsz, const char *fname) = 0;
public:
- SType type;
Shader();
virtual ~Shader() = 0;
virtual void cache_uniforms() = 0;
- virtual void add_shader(Shader *sdr);
- virtual void delete_shaders() = 0;
-
virtual bool create() = 0;
virtual bool link() = 0;
virtual bool use() = 0;
--- /dev/null
+#include <map>
+
+#include "shader_manager.h"
+#include "opengl/shader-gl.h"
+
+extern bool use_vulkan;
+
+ShaderManager::ShaderManager() {}
+ShaderManager::~ShaderManager() {}
+
+void ShaderManager::add_shader(Shader *sdr, const char *name)
+{
+ shaders[name] = sdr;
+}
+
+Shader *ShaderManager::load_shader(const char *name, SType type)
+{
+ std::map<std::string, Shader*>::const_iterator it;
+ it = shaders.find(name);
+
+ if(it != shaders.end()) {
+ return it->second;
+ }
+
+ Shader* sdr;
+ if(use_vulkan) {
+ // sdr = new ShaderVK;
+ }
+ else {
+ sdr = new ShaderGL;
+ }
+
+ if(!sdr->load(name, type)) {
+ delete sdr;
+ return 0;
+ }
+
+ add_shader(sdr, name);
+ return sdr;
+}
+
+void ShaderManager::delete_shaders()
+{
+ std::map<std::string, Shader *>::iterator it;
+ for(it=shaders.begin(); it != shaders.end(); it++) {
+ delete it->second;
+ }
+}
\ No newline at end of file
--- /dev/null
+#ifndef SHADER_MANAGER_H_
+#define SHADER_MANAGER_H_
+
+#include <string>
+
+#include "shader.h"
+
+class ShaderManager {
+private:
+ std::map<std::string, Shader *> shaders;
+public:
+ ShaderManager();
+ ~ShaderManager();
+
+ void add_shader(Shader *sdr, const char *name);
+ Shader *load_shader(const char *name, SType type);
+ void delete_shaders();
+};
+
+#endif // SHADER_MANAGER_H_
\ No newline at end of file