test/framebuffer.cpp

Go to the documentation of this file.
00001 /*
00002  * framebuffer.cpp
00003  *
00004  * Copyright (C) 2010  Thomas A. Vaughan
00005  * All rights reserved.
00006  *
00007  * Test for the glut::Framebuffer object
00008  */
00009 
00010 // includes --------------------------------------------------------------------
00011 #include "glut-demo/glut-demo.h"
00012 #include "opengl-effects/framebuffer.h"
00013 
00014 
00015 ////////////////////////////////////////////////////////////////////////////////
00016 //
00017 //      static helper methods
00018 //
00019 ////////////////////////////////////////////////////////////////////////////////
00020 
00021 
00022 class TestHost : public glut::DemoHost {
00023 public:
00024         ~TestHost(void) throw() { }
00025 
00026         // glut::DemoHost class interface methods ------------------------------
00027         void onInit(void) {
00028                         // framebuffer dimensions
00029                         m_width = 240;
00030                         m_height = m_width;
00031 
00032                         // create texture as a render target
00033                         glGenTextures(1, (GLuint *) &m_texId);
00034                         DPRINTF("Created texture id=%d", m_texId);
00035                         glBindTexture(GL_TEXTURE_2D, m_texId);
00036                         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_REPEAT);
00037                         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_REPEAT);
00038                         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST);
00039                         glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST);
00040 
00041                         glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA8, m_width, m_height,
00042                             0, GL_RGBA, GL_UNSIGNED_BYTE, NULL);
00043 
00044                         // create framebuffer
00045                         m_framebuffer =
00046                             glut::Framebuffer::create(m_width, m_height);
00047                         ASSERT(m_framebuffer, "failed to create framebuffer");
00048                 }
00049 
00050         void display3D(IN const glut::render_context_t& rc,
00051                                 IN glut::RenderQueue * rq) {
00052 
00053                         static float s_rotate = 0.0;
00054                         s_rotate += 0.67;
00055 
00056                         // render offscreen
00057                         glMatrixMode(GL_MODELVIEW);
00058                         glPushMatrix();
00059                         {
00060                                 glut::FramebufferContext fc(m_framebuffer, m_texId, rc);
00061 
00062                                 glut::Viewer view2;
00063                                 view2.setPosition(point3d_t(0, 0, -5));
00064                                 glut::setOpenGLViewer(view2);
00065                                 glRotatef(s_rotate, 0, 1, 0);
00066                                 
00067                                 // render to framebuffer
00068                                 glEnable(GL_BLEND);
00069                                 glBlendFunc(GL_SRC_ALPHA, GL_ONE);
00070                                 glClearColor(0.0, 0.0, 0.0, 0.0);
00071                                 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
00072                                 glColor4f(1.0, 0.0, 1.0, 0.8);
00073                                 glEnable(GL_COLOR_MATERIAL);
00074                                 glutSolidSphere(1.5, 12, 12);
00075                                 glDisable(GL_COLOR_MATERIAL);
00076                                 glDisable(GL_BLEND);
00077                         }
00078                         glMatrixMode(GL_MODELVIEW);
00079                         glPopMatrix();
00080 
00081                         // add to render queue
00082                         glut::poly_request_t * pr = rq->grabRequestSlot();
00083                         if (!pr) {
00084                                 DPRINTF("No available slots?");
00085                                 return;
00086                         }
00087 
00088                         // get transform
00089                         matrix4_t T;
00090                         glut::getModelViewMatrix(T);
00091 
00092                         pr->nVertices = 4;
00093                         pr->textureId = m_texId;
00094                         pr->normal.set(0, 0, -1);
00095 
00096                         pr->u[0] = 0;
00097                         pr->v[0] = 0;
00098                         pr->vertex[0] = T * point3d_t(-1, -1, -1);
00099 
00100                         pr->u[1] = 0;
00101                         pr->v[1] = 1;
00102                         pr->vertex[1] = T * point3d_t(-1,  1, -1);
00103 
00104                         pr->u[2] = 1;
00105                         pr->v[2] = 1;
00106                         pr->vertex[2] = T * point3d_t( 1,  1, -1);
00107 
00108                         pr->u[3] = 1;
00109                         pr->v[3] = 0;
00110                         pr->vertex[3] = T * point3d_t( 1, -1, -1);
00111                 }
00112 
00113 private:
00114         // private member data -------------------------------------------------
00115         smart_ptr<glut::Framebuffer>    m_framebuffer;
00116         int                             m_texId;
00117         int                             m_width;
00118         int                             m_height;
00119 };
00120 
00121 
00122 
00123 ////////////////////////////////////////////////////////////////////////////////
00124 //
00125 //      entry point
00126 //
00127 ////////////////////////////////////////////////////////////////////////////////
00128 
00129 int
00130 main
00131 (
00132 IN int argc,
00133 IN const char * argv[]
00134 )
00135 {
00136         try {
00137                 smart_ptr<glut::DemoHost> host = new TestHost;
00138                 ASSERT(host, "out of memory");
00139                 glut::startDemo(argc, argv, "Framebuffer Demo", host);
00140 
00141         } catch (std::exception& e) {
00142                 DPRINTF("Exception: %s", e.what());
00143                 return 1;
00144         }
00145 
00146         // don't ever get here
00147         return 0;
00148 }
00149