From 51fde62020614e8d942f28572efe1ba4fefd6a50 Mon Sep 17 00:00:00 2001 From: John Tsiombikas Date: Mon, 9 Jan 2017 17:28:22 +0200 Subject: [PATCH] started the renderer abstraction and the cubemap renderer --- src/app.cc | 11 +++++++- src/rend_cubemap.h | 20 +++++++++++++ src/renderer.cc | 49 ++++++++++++++++++++++++++++++++ src/renderer.h | 25 +++++++++++++++++ src/sdrman.cc | 79 ++++++++++++++++++++++++++++++++++++++++++++++++++++ src/sdrman.h | 13 +++++++++ 6 files changed, 196 insertions(+), 1 deletion(-) create mode 100644 src/rend_cubemap.h create mode 100644 src/renderer.cc create mode 100644 src/renderer.h create mode 100644 src/sdrman.cc create mode 100644 src/sdrman.h diff --git a/src/app.cc b/src/app.cc index d2f9476..1cf21bd 100644 --- a/src/app.cc +++ b/src/app.cc @@ -13,6 +13,7 @@ #include "ui.h" #include "opt.h" #include "post.h" +#include "renderer.h" #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 Renderer *rend; + 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"); } + rend = new Renderer; + rend->set_scene(mscn); + glUseProgram(0); if(opt.vr || opt.fullscreen) { @@ -154,6 +160,8 @@ void app_cleanup() goatvr_shutdown(); } + delete rend; + 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); - mscn->draw(); + rend->draw(); + if(show_blobs) { blobs->draw(); } diff --git a/src/rend_cubemap.h b/src/rend_cubemap.h new file mode 100644 index 0000000..00995c7 --- /dev/null +++ b/src/rend_cubemap.h @@ -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 index 0000000..0987b0d --- /dev/null +++ b/src/renderer.cc @@ -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; iscenes[i]; + + int nobj = (int)scn->objects.size(); + for(int j=0; jobjects[j]); + } + } +} + +void Renderer::draw_object(Object *obj) const +{ + obj->draw(); +} diff --git a/src/renderer.h b/src/renderer.h new file mode 100644 index 0000000..e5af123 --- /dev/null +++ b/src/renderer.h @@ -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 index 0000000..9fb5404 --- /dev/null +++ b/src/sdrman.cc @@ -0,0 +1,79 @@ +#include +#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 index 0000000..5c5aa96 --- /dev/null +++ b/src/sdrman.h @@ -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_ -- 1.7.10.4