home *** CD-ROM | disk | FTP | other *** search
/ 3D Games (Spidla) / 3dhry2.iso / Cube Drop 2001 1.0 / Canvas.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  2003-03-17  |  6.5 KB  |  311 lines

  1. /*
  2. Authors: David Nishimoto and Thomas Lee Young
  3. Website: http://www.listensoftware.com
  4. Program: Cube Drop
  5. */
  6.  
  7. #include "canvas.h"
  8. #include "matrix.h" //needed for matrix size definitions
  9.  
  10. Canvas::Canvas(GLint x, GLint y, GLint width, GLint height, char *windowTitle)
  11. {
  12.     char * argv[1];
  13.     char dummyString[8];
  14.     argv[0]=dummyString;
  15.     int argc=1;
  16.     int i;
  17.  
  18.     //game area size attributes
  19.     cubeSize = 5;
  20.     gameWidth = cubeSize * MAT_WIDTH;
  21.     gameDepth = cubeSize * MAT_WIDTH;
  22.     gameHeight = cubeSize * MAT_HEIGHT;
  23.  
  24.     miWidth=width;
  25.     miHeight=height;
  26.     m_CurrDegree=0;
  27.  
  28.     for(i=0;i<DISPLAY_LIST_SIZE; i++)
  29.     {
  30.         display_list[i].available=YES;
  31.         display_list[i].id=-1;
  32.     }
  33. }
  34.  
  35. Canvas::~Canvas()
  36. {
  37.  
  38. }
  39.  
  40. void Canvas::setWindow(GLfloat fLeft, GLfloat fRight, GLfloat fBottom, GLfloat fTop)
  41. {
  42.     GLfloat zNear=1.0f;
  43.     GLfloat zFar=2000.0f;
  44.  
  45.     glMatrixMode(GL_PROJECTION);
  46.     glLoadIdentity();
  47.     //gluOrtho2D(fLeft,fRight,fBottom,fTop);
  48.     glOrtho(fLeft,fRight,fBottom,fTop, zNear, zFar);
  49.  
  50. }
  51.  
  52. void Canvas::setPerspectiveWindow(GLdouble fovy, GLdouble aspect,GLdouble zNear,GLdouble zFar)
  53. {
  54.   glMatrixMode(GL_PROJECTION);
  55.   glLoadIdentity();
  56.   gluPerspective(fovy, aspect,zNear,  zFar);
  57. }
  58.  
  59. void Canvas::setViewport(GLint iX, GLint iY, GLsizei iWidth, GLsizei iHeight)
  60. {
  61.     glViewport(iX,iY,iWidth,iHeight);
  62. }
  63.  
  64. void Canvas::setBackgroundColor(GLfloat red, GLfloat green, GLfloat blue)
  65. {
  66.     glClearColor(red,green,blue,1);
  67. }
  68.  
  69. void Canvas::setLighting()
  70. {
  71.   GLfloat light0pos[4]=     {0.7071, 3.0, 5.0, 0.0};
  72.   GLfloat light0ambient[4]= {0.3, 0.3, 0.3, 1.0};
  73.   GLfloat light0diffuse[4]= {0.6, 0.6, 0.6, 1.0};
  74.   GLfloat light0specular[4]={0.8, 0.8, 0.8, 1.0};
  75.   GLfloat lmodel_ambient[]= {0.8f,0.8f,0.8f,1.0f};
  76.  
  77.   glLightModelfv(GL_LIGHT_MODEL_AMBIENT,lmodel_ambient);
  78.  
  79.   //glDisable(GL_DITHER);
  80.   glShadeModel(GL_SMOOTH);
  81.   
  82.   glLightfv(GL_LIGHT0, GL_POSITION, light0pos);
  83.   glLightfv(GL_LIGHT0, GL_AMBIENT, light0ambient);
  84.   glLightfv(GL_LIGHT0, GL_DIFFUSE, light0diffuse);
  85.   glLightfv(GL_LIGHT0, GL_SPECULAR, light0specular);
  86.   
  87.   glEnable(GL_LIGHTING);
  88.   glEnable(GL_LIGHT0);
  89.   //glEnable(GL_LIGHT1);
  90.   //glEnable(GL_LIGHT2);
  91. }
  92.  
  93. void Canvas::setBlending()
  94. {
  95.     glEnable(GL_BLEND);
  96.     /*GL_SRC_ALPHA = Source color multiplied by source alpha
  97.       GL_ONE_MINUS_SRC_ALPHA =  Destination color is multiplied by 1,1,1,1 - source color)
  98.     */
  99.     glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA);
  100.  
  101. }
  102.  
  103. void Canvas::setDepthBuffer()
  104. {
  105.   glEnable(GL_DEPTH_TEST);
  106.   glDepthFunc(GL_LESS);
  107.   glEnable(GL_CULL_FACE);
  108.   glCullFace(GL_BACK);
  109.   glFrontFace(GL_CCW);
  110. }
  111.  
  112. void Canvas::setDiffuseMaterialColor(GLfloat red, GLfloat green, GLfloat blue,GLfloat alpha)
  113. {
  114.     GLfloat diff[4];
  115.     diff[0]=red;
  116.     diff[1]=green;
  117.     diff[2]=blue;
  118.     diff[3]=alpha;
  119.     glMaterialfv(GL_FRONT, GL_DIFFUSE,diff); 
  120.  
  121. }
  122.  
  123. void Canvas::setAmbientMaterialColor(GLfloat red, GLfloat green, GLfloat blue,GLfloat alpha)
  124. {
  125.     GLfloat amb[4];
  126.     amb[0]=red;
  127.     amb[1]=green;
  128.     amb[2]=blue;
  129.     amb[3]=alpha;
  130.     glMaterialfv(GL_FRONT, GL_AMBIENT,amb);
  131. }
  132.  
  133. void Canvas::setSpecularMaterialColor(GLfloat red, GLfloat green, GLfloat blue,GLfloat alpha)
  134. {
  135.     GLfloat spec[4];
  136.     spec[0]=red;
  137.     spec[1]=green;
  138.     spec[2]=blue;
  139.     spec[3]=alpha;
  140.     glMaterialfv(GL_FRONT, GL_SPECULAR,spec); 
  141.  
  142. }
  143.  
  144. void Canvas::setMaterialShininess(GLint shininess)
  145. {
  146.     glMateriali(GL_FRONT, GL_SHININESS, shininess);
  147. }
  148.  
  149. void Canvas::Box(int w, int h, int d)
  150. {    
  151.     glBegin(GL_POLYGON);
  152.         glBegin(GL_POLYGON);
  153.         glNormal3f(0,0,1);
  154.         glVertex3f(0.5f*w,    0.5f*h,    0.5f*d);
  155.         glVertex3f(-0.5f*w,    0.5f*h,    0.5f*d);
  156.         glVertex3f(-0.5f*w,    -0.5f*h,    0.5f*d);
  157.         glVertex3f(0.5f*w,    -0.5f*h,    0.5f*d);
  158.     glEnd();
  159.  
  160.     glBegin(GL_POLYGON);
  161.         glNormal3f(0,0,-1);
  162.         glVertex3f(0.5f*w,    0.5f*h,    -0.5f*d);
  163.         glVertex3f(0.5f*w,    -0.5f*h,    -0.5f*d);
  164.         glVertex3f(-0.5f*w,    -0.5f*h,    -0.5f*d);
  165.         glVertex3f(-0.5f*w,    0.5f*h,    -0.5f*d);
  166.     glEnd();
  167.  
  168.     glBegin(GL_POLYGON);
  169.         glNormal3f(-1,0,0);
  170.         glVertex3f(-0.5f*w,    0.5f*h,    0.5f*d);
  171.         glVertex3f(-0.5f*w,    0.5f*h,    -0.5f*d);
  172.         glVertex3f(-0.5f*w,    -0.5f*h,    -0.5f*d);
  173.         glVertex3f(-0.5f*w,    -0.5f*h,    0.5f*d);
  174.     glEnd();
  175.  
  176.     glBegin(GL_POLYGON);
  177.         glNormal3f(1,0,0);
  178.         glVertex3f(0.5f*w,    0.5f*h,    0.5f*d);
  179.         glVertex3f(0.5f*w,    -0.5f*h,    0.5f*d);
  180.         glVertex3f(0.5f*w,    -0.5f*h,    -0.5f*d);
  181.         glVertex3f(0.5f*w,    0.5f*h,    -0.5f*d);
  182.     glEnd();
  183.  
  184.     glBegin(GL_POLYGON);
  185.         glNormal3f(0,1,0);
  186.         glVertex3f(-0.5f*w,    0.5f*h,    -0.5f*d);
  187.         glVertex3f(-0.5f*w,    0.5f*h,    0.5f*d);
  188.         glVertex3f(0.5f*w,    0.5f*h,    0.5f*d);
  189.         glVertex3f(0.5f*w,    0.5f*h,    -0.5f*d);
  190.     glEnd();
  191.  
  192.     glBegin(GL_POLYGON);
  193.         glNormal3f(0,-1,0);
  194.         glVertex3f(-0.5f*w,    -0.5f*h,    -0.5f*d);
  195.         glVertex3f(0.5f*w,    -0.5f*h,    -0.5f*d);
  196.         glVertex3f(0.5f*w,    -0.5f*h,    0.5f*d);
  197.         glVertex3f(-0.5f*w,    -0.5f*h,    0.5f*d);
  198.     glEnd();
  199.  
  200. }
  201.  
  202. GLint Canvas::ReserveDisplayListId(char *name)
  203. {
  204.     int i;
  205.     
  206.     for(i=0;i<DISPLAY_LIST_SIZE; i++)
  207.     {
  208.         if(display_list[i].available==YES)
  209.         {
  210.             display_list[i].available=NO;
  211.             strcpy(display_list[i].name,name);
  212.             display_list[i].id=glGenLists(1);
  213.             return(display_list[i].id);
  214.         }
  215.     }
  216.     return(-1);
  217. }
  218.  
  219. GLint Canvas::FindDisplayListId(char *name)
  220. {
  221.     int i;
  222.     
  223.     for(i=0;i<DISPLAY_LIST_SIZE; i++)
  224.     {
  225.         if(strcmp(display_list[i].name,name)==0)
  226.         {
  227.             return(display_list[i].id);
  228.         }
  229.     }
  230.     return(-1);
  231. }
  232.  
  233.  
  234. void Canvas::buildGrid(char *Name)
  235. {
  236.     int r,c,d = 0;
  237.     int nStep = 5;
  238.     int width = gameWidth;
  239.     int depth = gameDepth;
  240.     int height = gameHeight;
  241.     GLint iGrid_Id;
  242.  
  243.  
  244.     glPushAttrib(GL_LIGHTING_BIT);
  245.     glDisable(GL_LIGHTING);
  246.  
  247.     glPushMatrix();
  248.  
  249.     iGrid_Id=ReserveDisplayListId(Name);
  250.  
  251.     glNewList(iGrid_Id,GL_COMPILE_AND_EXECUTE);
  252.     
  253.     glBegin(GL_LINES);
  254.  
  255.     //draw transverse grid lines
  256.     for(r = 0; r  <= width; r += nStep)
  257.     {
  258.         glVertex3d(r, height, 0);
  259.         glVertex3d(r, 0, 0);
  260.  
  261. //        for(d = 0; d <= height; d += nStep)
  262.         {
  263.             glVertex3d(r, d, 0);
  264.             glVertex3d(r, d, -depth);
  265.         }
  266.  
  267.         glVertex3d(r, 0, -depth);
  268.         glVertex3d(r, height, -depth);
  269.     }
  270.  
  271.     //draw lateral grid lines
  272.     for(c = 0; c <= depth; c += nStep)
  273.     {
  274.         glVertex3d(0, height, -c);
  275.         glVertex3d(0, 0, -c);
  276.  
  277. //        for(d = 0; d <= height; d += nStep)
  278.         {
  279.             glVertex3d(0, d, -c);
  280.             glVertex3d(width, d, -c);
  281.         }
  282.  
  283.         glVertex3d(width, 0, -c);
  284.         glVertex3d(width, height, -c);
  285.     }
  286.  
  287.     //draw grid lines up the y axis
  288.     for(d=0; d<=height; d+=nStep)
  289.     {
  290.         glVertex3d(0,d,0);
  291.         glVertex3d(width,d,0);
  292.  
  293.         glVertex3d(width,d,0);
  294.         glVertex3d(width,d,-depth);
  295.  
  296.         glVertex3d(width,d,-depth);
  297.         glVertex3d(0,d,-depth);
  298.  
  299.         glVertex3d(0,d,-depth);
  300.         glVertex3d(0,d,0);
  301.     }
  302.  
  303.     glEnd();
  304.  
  305.     glEndList();
  306.  
  307.   glPopMatrix();
  308.   glPopAttrib();
  309.   glEnable(GL_LIGHTING);
  310. }
  311.