started the renderer abstraction and the cubemap renderer
[laserbrain_demo] / src / sdrman.cc
diff --git a/src/sdrman.cc b/src/sdrman.cc
new file mode 100644 (file)
index 0000000..9fb5404
--- /dev/null
@@ -0,0 +1,79 @@
+#include <assert.h>
+#include "sdrman.h"
+#include "logger.h"
+
+ShaderSet *vsdrset, *psdrset;
+
+bool sdrman_init()
+{
+       if(vsdrset) {
+               assert(psdrset);
+               return true;    // already initialized
+       }
+       try {
+               vsdrset = new ShaderSet(GL_VERTEX_SHADER);
+               psdrset = new ShaderSet(GL_FRAGMENT_SHADER);
+       }
+       catch(...) {
+               delete vsdrset;
+               return false;
+       }
+       return true;
+}
+
+void sdrman_destroy()
+{
+       delete vsdrset;
+       delete psdrset;
+       vsdrset = psdrset = 0;
+}
+
+ShaderProg *get_sdrprog(const char *vname, const char *pname)
+{
+       if(!vsdrset) {
+               sdrman_init();
+       }
+
+       Shader *vsdr = vname ? vsdrset->get(vname) : 0;
+       Shader *psdr = pname ? psdrset->get(pname) : 0;
+
+       if(vname && !vsdr) {
+               return 0;
+       }
+       if(pname && !psdr) {
+               return 0;
+       }
+       if(!vsdr && !psdr) {
+               return 0;
+       }
+
+       ShaderProg *prog = new ShaderProg;
+       if(!prog->create(vsdr, psdr)) {
+               delete prog;
+               return 0;
+       }
+       return prog;
+}
+
+static const char *typestr(unsigned int type)
+{
+       switch(type) {
+       case GL_VERTEX_SHADER:
+               return "vertex";
+       case GL_FRAGMENT_SHADER:
+               return "pixel";
+#ifdef HAVE_GEOMETRY_SHADER
+       case GL_GEOMETRY_SHADER:
+               return "geometry";
+#endif
+#ifdef HAVE_TESSELATION_SHADER
+       case GL_TESS_CONTROL_SHADER:
+               return "tesselation control";
+       case GL_TESS_EVALUATION_SHADER:
+               return "tesselation evaluation";
+#endif
+       default:
+               break;
+       }
+       return "unknown";
+}