started the renderer abstraction and the cubemap renderer
authorJohn Tsiombikas <nuclear@mutantstargoat.com>
Mon, 9 Jan 2017 15:28:22 +0000 (17:28 +0200)
committerJohn Tsiombikas <nuclear@mutantstargoat.com>
Mon, 9 Jan 2017 15:28:22 +0000 (17:28 +0200)
src/app.cc
src/rend_cubemap.h [new file with mode: 0644]
src/renderer.cc [new file with mode: 0644]
src/renderer.h [new file with mode: 0644]
src/sdrman.cc [new file with mode: 0644]
src/sdrman.h [new file with mode: 0644]

index d2f9476..1cf21bd 100644 (file)
@@ -13,6 +13,7 @@
 #include "ui.h"
 #include "opt.h"
 #include "post.h"
 #include "ui.h"
 #include "opt.h"
 #include "post.h"
+#include "renderer.h"
 #include "blob_exhibit.h"
 
 #define NEAR_CLIP      5.0
 #include "blob_exhibit.h"
 
 #define NEAR_CLIP      5.0
@@ -63,6 +64,8 @@ static long prev_msec;
 static BlobExhibit *blobs;
 static bool show_blobs;
 
 static BlobExhibit *blobs;
 static bool show_blobs;
 
+static Renderer *rend;
+
 
 bool app_init(int argc, char **argv)
 {
 
 bool app_init(int argc, char **argv)
 {
@@ -139,6 +142,9 @@ bool app_init(int argc, char **argv)
                sdr_post_gamma = create_program_load("sdr/post_gamma.v.glsl", "sdr/post_gamma.p.glsl");
        }
 
                sdr_post_gamma = create_program_load("sdr/post_gamma.v.glsl", "sdr/post_gamma.p.glsl");
        }
 
+       rend = new Renderer;
+       rend->set_scene(mscn);
+
        glUseProgram(0);
 
        if(opt.vr || opt.fullscreen) {
        glUseProgram(0);
 
        if(opt.vr || opt.fullscreen) {
@@ -154,6 +160,8 @@ void app_cleanup()
                goatvr_shutdown();
        }
 
                goatvr_shutdown();
        }
 
+       delete rend;
+
        blobs->destroy();
        delete blobs->node;
        delete blobs;
        blobs->destroy();
        delete blobs->node;
        delete blobs;
@@ -354,7 +362,8 @@ static void draw_scene()
        set_light(1, lpos[1], Vec3(0.6, 0.7, 1.0) * 0.6);
        set_light(2, lpos[2], Vec3(0.8, 1.0, 0.8) * 0.3);
 
        set_light(1, lpos[1], Vec3(0.6, 0.7, 1.0) * 0.6);
        set_light(2, lpos[2], Vec3(0.8, 1.0, 0.8) * 0.3);
 
-       mscn->draw();
+       rend->draw();
+
        if(show_blobs) {
                blobs->draw();
        }
        if(show_blobs) {
                blobs->draw();
        }
diff --git a/src/rend_cubemap.h b/src/rend_cubemap.h
new file mode 100644 (file)
index 0000000..00995c7
--- /dev/null
@@ -0,0 +1,20 @@
+#ifndef REND_CUBEMAP_H_
+#define REND_CUBEMAP_H_
+
+#include "renderer.h"
+#include "texture.h"
+
+class RendCubemap : public Renderer {
+private:
+       Vec3 pos;
+       Texture *cubemap;
+       unsigned int fbo, zbuf;
+
+public:
+       void set_position(const Vec3 &pos);
+       void set_cubemap(Texture *cubemap);
+
+       void draw() const;
+};
+
+#endif // REND_CUBEMAP_H_
diff --git a/src/renderer.cc b/src/renderer.cc
new file mode 100644 (file)
index 0000000..0987b0d
--- /dev/null
@@ -0,0 +1,49 @@
+#include "renderer.h"
+
+Renderer::Renderer()
+{
+       mscn = 0;
+}
+
+Renderer::~Renderer()
+{
+}
+
+bool Renderer::init()
+{
+       return true;
+}
+
+void Renderer::destroy()
+{
+}
+
+void Renderer::set_scene(MetaScene *mscn)
+{
+       this->mscn = mscn;
+}
+
+MetaScene *Renderer::get_scene() const
+{
+       return mscn;
+}
+
+void Renderer::draw() const
+{
+       if(!mscn) return;
+
+       int num = (int)mscn->scenes.size();
+       for(int i=0; i<num; i++) {
+               Scene *scn = mscn->scenes[i];
+
+               int nobj = (int)scn->objects.size();
+               for(int j=0; j<nobj; j++) {
+                       draw_object(scn->objects[j]);
+               }
+       }
+}
+
+void Renderer::draw_object(Object *obj) const
+{
+       obj->draw();
+}
diff --git a/src/renderer.h b/src/renderer.h
new file mode 100644 (file)
index 0000000..e5af123
--- /dev/null
@@ -0,0 +1,25 @@
+#ifndef RENDERER_H_
+#define RENDERER_H_
+
+#include "metascene.h"
+
+class Renderer {
+private:
+       MetaScene *mscn;
+
+public:
+
+       Renderer();
+       virtual ~Renderer();
+
+       virtual bool init();
+       virtual void destroy();
+
+       virtual void set_scene(MetaScene *mscn);
+       virtual MetaScene *get_scene() const;
+
+       virtual void draw() const;
+       virtual void draw_object(Object *obj) const;
+};
+
+#endif // RENDERER_H_
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";
+}
diff --git a/src/sdrman.h b/src/sdrman.h
new file mode 100644 (file)
index 0000000..5c5aa96
--- /dev/null
@@ -0,0 +1,13 @@
+#ifndef SDRMAN_H_
+#define SDRMAN_H_
+
+#include "shader.h"
+
+extern ShaderSet *vsdrset, *psdrset;
+
+bool sdrman_init();
+void sdrman_destroy();
+
+ShaderProg *get_sdrprog(const char *vname, const char *pname);
+
+#endif // SDRMAN_H_