topical media & game development

talk show tell print

basic-visual-03-openglviewport.c

? / basic-visual-03-openglviewport.c


  // ------------------------------------------------------------------------
  // This program is complementary material for the book:
  //
  // Frank Nielsen
  //
  // Visual Computing: Geometry, Graphics, and Vision
  //
  // ISBN: 1-58450-427-7
  //
  // Charles River Media, Inc.
  //
  //
  // All programs are available at www.charlesriver.com/visualcomputing/
  //
  // You may use this program for ACADEMIC and PERSONAL purposes ONLY. 
  //
  //
  // The use of this program in a commercial product requires EXPLICITLY
  // written permission from the author. The author is NOT responsible or 
  // liable for damage or loss that may be caused by the use of this program. 
  //
  // Copyright (c) 2005. Frank Nielsen. All rights reserved.
  // ------------------------------------------------------------------------
   
  // ------------------------------------------------------------------------
  // File: openglviewport.cpp
  // 
  // Description: Show how to use the viewport to render on a same device several views
  // --------------
  include <stdafx.h>
  include <glut.h>
  
  using namespace std;
  
  int width, height;
  
  void init()
  {
  
   glClearColor(1.0f, 1.0f, 1.0f, 1.0f);
   glColor3f(0, 0, 0);
   glClearDepth(1);
  
   glMatrixMode(GL_PROJECTION);
   glLoadIdentity();
  
   glOrtho(-2, 2, -2, 2, -2, 2);
  
   glMatrixMode(GL_MODELVIEW);
   glLoadIdentity();
  }
  
  void reshape (int w, int h)
  {
          width = w;
          height = h;
  }
  
  void drawScene()
  {
   glColor3f(.95, .95, .95);
  
   glPushMatrix();
   glTranslatef(0, -1, 0);
  
   glBegin(GL_QUADS);
          glVertex3f(2, 0, 2);
          glVertex3f(2, 0, -2);
          glVertex3f(-2, 0, -2);
          glVertex3f(-2, 0, 2);
   glEnd();
  
   glPopMatrix();
  
   glColor3f(0.3,0.3,0.3);
  
   glRotatef(10,1.0,0.0, 0.0);
   glPushMatrix();
   glutWireTeapot(1);
   glPopMatrix();
  }
  
  void display()
  {
   glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT );
  
   //bottom left: perspective
   glViewport(0, 0, width/2, height/2);
  
   glMatrixMode(GL_PROJECTION);
   glPushMatrix();
   glLoadIdentity();
   gluPerspective(45, 1, 1, 10000);
   glMatrixMode(GL_MODELVIEW);
   glPushMatrix();
   gluLookAt(5, 5, 5, 0, 0, 0, 0, 1, 0);
   drawScene();
   glPopMatrix();
   glMatrixMode(GL_PROJECTION);
   glPopMatrix();
  
   
  
   //bottom right: orthographic
   glViewport(width/2, 0, width/2, height/2);        
   glPushMatrix();
   gluLookAt(0, 0, 1,   0, 0, 0,   0, 1, 0); // z-axis down
   drawScene();
   glPopMatrix();
  
   //top left
   glViewport(0, height/2,width/2, height/2); 
   glPushMatrix();
   gluLookAt(0, 1, 0,   0, 0, 0,   0, 0, 1);  //y-axis down
   drawScene();
   glPopMatrix();
  
    //top right
   glViewport(width/2, height/2, width/2, height/2);
   glPushMatrix();
   gluLookAt(1, 0, 0,   0, 0, 0,  0, 1, 0); // x-axis down        
   drawScene();
   glPopMatrix();
  
   
   glFlush();
   glutSwapBuffers();
  }
  
  int _tmain(int argc, _TCHAR* argv[])
  {
  width = 750;height = width;
  
  cout<<"Visual Computing: Geometry, Graphics, and Vision (ISBN:1-58450-427-7)"<<endl;
  cout<<"Demo program\n\n"<<endl;
  
   glutInitDisplayMode(GLUT_SINGLE |         GLUT_RGBA | GLUT_DEPTH);
   glutInitWindowSize(width, height);
   glutCreateWindow ("Several viewports mapped on a single screen");
   init();
   glutDisplayFunc(display);
   glutReshapeFunc(reshape);
   glutMainLoop();
   return 0;
  
  }
  
  


(C) Æliens 20/2/2008

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.