wave-glut/lib/viewport/test/test.cpp

Go to the documentation of this file.
00001 /*
00002  * test.cpp
00003  *
00004  * Copyright (C) 2010  Thomas A. Vaughan
00005  * All rights reserved.
00006  *
00007  * Quick test of the viewport library
00008  */
00009 
00010 // includes --------------------------------------------------------------------
00011 #include <iostream>
00012 
00013 #include "glut-demo/glut-demo.h"
00014 #include "glut-font/glut-font.h"
00015 #include "viewport/viewport.h"
00016 
00017 
00018 ////////////////////////////////////////////////////////////////////////////////
00019 //
00020 //      static helper methods
00021 //
00022 ////////////////////////////////////////////////////////////////////////////////
00023 
00024 static float
00025 getRandomX
00026 (
00027 void
00028 )
00029 throw()
00030 {
00031         const float invRand = 1.0 / RAND_MAX;
00032 
00033         return rand() * invRand;
00034 }
00035 
00036 
00037 
00038 class Viewer : public view::Host {
00039 public:
00040         ~Viewer(void) throw() { }
00041 
00042         // view::Host class interface methods ----------------------------------
00043         void render3D(IN int id, IN const view::render_info_t& ri) {
00044                         glColor3f(m_color.red, m_color.green, m_color.blue);
00045 
00046                         perf::time_t newTime = perf::getNow();
00047 
00048                         perf::time_t delta = newTime;
00049                         delta.decrement(m_oldTime);
00050 
00051                         float deltaT = delta.getSeconds();
00052                         m_oldTime = newTime;
00053 
00054                         glut::camera_t camera;
00055                         camera.setAspect(ri.width, ri.height);
00056                         glMatrixMode(GL_PROJECTION);
00057                         glPushMatrix();
00058                         setOpenGLProjection(camera);
00059 
00060                         glMatrixMode(GL_MODELVIEW);
00061                         glPushMatrix();
00062 
00063                         glLoadIdentity();
00064                         m_t += m_dt * deltaT;
00065                         float z = m_z + 5.0 * sin(m_t);
00066                         glTranslatef(0, 0, -z);
00067 
00068                         m_phi += m_dPhi * deltaT;
00069                         glRotatef(m_phi, 0, 1.0, 0);
00070 
00071                         // draw something resembling anything
00072                         int nIndex = id % 5;
00073                         switch (nIndex) {
00074                         case 0:         glutSolidCube(1.4);             break;
00075                         case 1:         glutSolidIcosahedron();         break;
00076                         case 2:         glutSolidSphere(1.0, 8, 8);     break;
00077                         case 3:         glutWireTeapot(1.0);            break;
00078                         case 4:         glutSolidTorus(0.4, 0.8, 16, 16); break;
00079                         default:
00080                                 ASSERT(false, "unknown index: %d", nIndex);
00081                         }
00082 
00083                         glMatrixMode(GL_MODELVIEW);
00084                         glPopMatrix();
00085                         glMatrixMode(GL_PROJECTION);
00086                         glPopMatrix();
00087                 }
00088 
00089         void render2D(IN int id, IN const view::render_info_t& ri) {
00090                 //      DPRINTF("I am drawing in a window that is %d x %d",
00091                 //          ri.width, ri.height);
00092 
00093                         glDisable(GL_LIGHTING);
00094                         glDisable(GL_BLEND);
00095                         glDisable(GL_TEXTURE_2D);
00096                         glDisable(GL_DEPTH_TEST);
00097                         glColor3f(1, 1, 1);
00098                         glut::Font * font = glut::getDefaultFont();
00099                         const int bufsize = 256;
00100                         char buffer[bufsize];
00101                         snprintf(buffer, bufsize, "Top of viewport %d", id);
00102                         font->display(1, 12, 0, buffer);
00103                         snprintf(buffer, bufsize, "Bottom of viewport %d", id);
00104                         font->display(1, ri.height - 4, 0, buffer);
00105                 }
00106 
00107         // static factory methods ----------------------------------------------
00108         static smart_ptr<view::Host> create(void) {
00109                         smart_ptr<Viewer> local = new Viewer;
00110                         ASSERT(local, "out of memory");
00111 
00112                         local->initialize();
00113 
00114                         return local;
00115                 }
00116 private:
00117         // private helper methods ----------------------------------------------
00118         void initialize(void) {
00119                         m_color.red = 0.5 + 0.5 * getRandomX();
00120                         m_color.green = 0.5 + 0.5 * getRandomX();
00121                         m_color.blue = 0.5 + 0.5 * getRandomX();
00122                         m_color.alpha = 1.0;
00123 
00124                         m_z = 5.0 + 5.0 * getRandomX();
00125 
00126                         m_phi = 0.0;
00127                         m_dPhi = 180.0 * (getRandomX() - 0.5); // degrees/sec
00128 
00129                         m_t = 2.0 * M_PI * getRandomX();
00130                         m_dt = (0.5 + getRandomX());    // radians/sec
00131 
00132                         m_oldTime = perf::getNow();
00133                 }
00134 
00135         // private member data -------------------------------------------------
00136         glut_color_t            m_color;
00137         float                   m_dPhi;
00138         float                   m_phi;
00139         float                   m_z;
00140         float                   m_t;
00141         float                   m_dt;
00142         perf::time_t            m_oldTime;
00143 };
00144 
00145 
00146 
00147 class TestHost : public glut::DemoHost {
00148 public:
00149         ~TestHost(void) throw() { }
00150 
00151         // glut::DemoHost class interface methods ------------------------------
00152         void onInit(void) {
00153                         ASSERT_THROW(m_nViewports > 0, "Bad viewport count: " <<
00154                             m_nViewports);
00155 
00156                         int iStart = 1 + (rand() % 12);
00157                         m_viewMgr = view::Manager::create();
00158                         ASSERT_THROW(m_viewMgr, "null");
00159                         for (int i = 0; i < m_nViewports; ++i) {
00160                                 smart_ptr<view::Host> viewer = Viewer::create();
00161                                 ASSERT_THROW(viewer, "null");
00162                                 m_viewMgr->createViewport(iStart + i, viewer);
00163                         }
00164 
00165                         DPRINTF("Created %d viewports",
00166                             m_viewMgr->getViewportCount());
00167                 }
00168 
00169         bool displayAxes(void) { return false; }
00170 
00171         void display3D(IN const glut::render_context_t& rc,
00172                                 IN glut::RenderQueue * rq) {
00173                         ASSERT(m_viewMgr, "null");
00174 
00175                         int width = rc.viewport.right - rc.viewport.left;
00176                         int height = rc.viewport.bottom - rc.viewport.top;
00177                         m_viewMgr->render(width, height);
00178                 }
00179 
00180         // static factory methods ----------------------------------------------
00181         static smart_ptr<glut::DemoHost> create(IN int nViewports) {
00182                         ASSERT_THROW(nViewports > 0, "Bad viewport count: " 
00183                             << nViewports);
00184 
00185                         smart_ptr<TestHost> local = new TestHost;
00186                         ASSERT(local, "out of memory");
00187 
00188                         local->m_nViewports = nViewports;
00189 
00190                         return local;
00191                 }
00192 private:
00193         // constructor ---------------------------------------------------------
00194         TestHost(void) throw() { }
00195 
00196         // private helper methods ----------------------------------------------
00197         // private member data -------------------------------------------------
00198         int                             m_nViewports;
00199         smart_ptr<view::Manager>        m_viewMgr;
00200 };
00201 
00202 
00203 
00204 ////////////////////////////////////////////////////////////////////////////////
00205 //
00206 //      entry point
00207 //
00208 ////////////////////////////////////////////////////////////////////////////////
00209 
00210 int
00211 main
00212 (
00213 IN int argc,
00214 IN const char * argv[]
00215 )
00216 {
00217         ASSERT(2 == argc,
00218             "Usage: viewport-test <viewport-count>");
00219         int nViewports = atoi(argv[1]);
00220         DPRINTF("Using %d viewports", nViewports);
00221         ASSERT(nViewports > 0, "Bad viewport count: %d", nViewports);
00222 
00223         int retval = 0;
00224 
00225         srand(time(NULL));
00226 
00227         try {
00228                 perf::Timer timer("overall timer");
00229 
00230                 // create demo host
00231                 smart_ptr<glut::DemoHost> host = TestHost::create(nViewports);
00232                 ASSERT_THROW(host, "null");
00233 
00234                 const char * title = "Viewport Test";
00235 
00236                 // start demo
00237                 glut::startDemo(argc, argv, title, host);
00238                 
00239         } catch (std::exception& e) {
00240                 DPRINTF("EXCEPTION: %s", e.what());
00241                 retval = 1;
00242         }
00243 
00244         perf::dumpTimingSummary(std::cerr);
00245 
00246         return retval;
00247 }
00248