00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011 #include "glut-demo/glut-demo.h"
00012 #include "opengl-effects/framebuffer.h"
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 class TestHost : public glut::DemoHost {
00023 public:
00024 ~TestHost(void) throw() { }
00025
00026
00027 void onInit(void) {
00028
00029 m_width = 240;
00030 m_height = m_width;
00031
00032
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
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
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
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
00082 glut::poly_request_t * pr = rq->grabRequestSlot();
00083 if (!pr) {
00084 DPRINTF("No available slots?");
00085 return;
00086 }
00087
00088
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
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
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
00147 return 0;
00148 }
00149