00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
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
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
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
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
00091
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
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
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);
00128
00129 m_t = 2.0 * M_PI * getRandomX();
00130 m_dt = (0.5 + getRandomX());
00131
00132 m_oldTime = perf::getNow();
00133 }
00134
00135
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
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
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
00194 TestHost(void) throw() { }
00195
00196
00197
00198 int m_nViewports;
00199 smart_ptr<view::Manager> m_viewMgr;
00200 };
00201
00202
00203
00204
00205
00206
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
00231 smart_ptr<glut::DemoHost> host = TestHost::create(nViewports);
00232 ASSERT_THROW(host, "null");
00233
00234 const char * title = "Viewport Test";
00235
00236
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