/* ================================================================ RenderView ---------------- This file defines our RenderView object. ================================================================ */ #include "RenderView.hpp" #include "Log.hpp" /* ======== Constructors and Destructors ======== */ RenderView::RenderView(int width, int height) { fbo = fbo_depth = fbo_tex = 0; w = width; h = height; x = y = 0; flags = 0; mesh = NULL; program = NULL; createView(width, height); } RenderView::~RenderView() { destroyView(); if (mesh != NULL) delete mesh; } /* ======== Getters ======== */ GLuint RenderView::getFBO() { return fbo; } GLuint RenderView::getTex() { return fbo_tex; } Mesh *RenderView::getMesh() { return mesh; } Program* RenderView::getProgram() { return program; } /* ======== Setters ======== */ int RenderView::createView(int width, int height) { // TODO: call destroyView() and create new FBO at width and height // ================ create depth buffer glGenRenderbuffers(1, &fbo_depth); glBindRenderbuffer(GL_RENDERBUFFER, fbo_depth); #if defined(HAVE_OPENGLES) glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height); #else glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); #endif glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth); // unbind the render buffer glBindRenderbuffer(GL_RENDERBUFFER, 0); // ================ create texture glGenTextures(1, &fbo_tex); glBindTexture(GL_TEXTURE_2D, fbo_tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); // add some filters (... move this) glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); // unbind texture glBindTexture(GL_TEXTURE_2D, 0); // ================ create framebuffers glGenFramebuffers(1, &fbo); glBindFramebuffer(GL_FRAMEBUFFER, fbo); // attach texture to framebuffer glFramebufferTexture2D(GL_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, fbo_tex, 0); // attach depth render buffer glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth); GLenum status; if ((status = glCheckFramebufferStatus(GL_FRAMEBUFFER)) != GL_FRAMEBUFFER_COMPLETE) { GLenum error = glGetError(); LOG(LOG_ERROR) << FUNC_NAME << " " << status << " " << error << " " << "Failed to create Framebuffer!"; glBindFramebuffer(GL_FRAMEBUFFER, 0); return 1; } flags |= RENDERVIEW_ACTIVE; // unbind our frame buffer glBindFramebuffer(GL_FRAMEBUFFER, 0); // ================ create quad mesh // Load our default quad mesh Vec3 quad[6] = { Vec3(-1.0f, -1.0f, 0.0f), Vec3(1.0f, -1.0f, 0.0f), Vec3(-1.0f, 1.0f, 0.0f), Vec3(-1.0f, 1.0f, 0.0f), Vec3(1.0f, -1.0f, 0.0f), Vec3(1.0f, 1.0f, 0.0f) }; mesh = new Mesh(quad, 6, NULL, 0, NULL, 0); mesh->buildMesh(); w = width; h = height; return 0; } int RenderView::destroyView() { if ((flags & RENDERVIEW_ACTIVE) == 0) return 1; glDeleteFramebuffers(1, &fbo); glDeleteTextures(1, &fbo_tex); glDeleteRenderbuffers(1, &fbo_depth); delete mesh; flags &= ~RENDERVIEW_ACTIVE; return 0; } int RenderView::setView(int width, int height) { if ((flags & RENDERVIEW_ACTIVE) == 0) return 1; // resize depth buffer glBindRenderbuffer(GL_RENDERBUFFER, fbo_depth); #if defined(HAVE_OPENGLES) glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT16, width, height); #else glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH_COMPONENT, width, height); #endif glFramebufferRenderbuffer(GL_FRAMEBUFFER, GL_DEPTH_ATTACHMENT, GL_RENDERBUFFER, fbo_depth); glBindRenderbuffer(GL_RENDERBUFFER, 0); // resize texture glBindTexture(GL_TEXTURE_2D, fbo_tex); glTexImage2D(GL_TEXTURE_2D, 0, GL_RGB, width, height, 0, GL_RGB, GL_UNSIGNED_BYTE, 0); glBindTexture(GL_TEXTURE_2D, 0); w = width; h = height; return 0; } int RenderView::setProgram(Program *program_) { program = program_; return 0; }