#include "ui.h"
#include "opt.h"
#include "post.h"
+#include "renderer.h"
#include "blob_exhibit.h"
#define NEAR_CLIP 5.0
static BlobExhibit *blobs;
static bool show_blobs;
+static Renderer *rend;
+
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) {
goatvr_shutdown();
}
+ delete rend;
+
blobs->destroy();
delete blobs->node;
delete blobs;
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();
}
--- /dev/null
+#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_
--- /dev/null
+#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();
+}
--- /dev/null
+#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_
--- /dev/null
+#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";
+}
--- /dev/null
+#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_