www.pudn.com > airhockey1.rar > table.cpp


#include "table.h" 
 
// Draw() 
// desc: draws the ball at its current location 
void CTable::Draw() 
{ 
     // draw hockey table 
     glPushMatrix(); 
          glTranslatef(position.x, position.y, position.z); 
 
          // draw table floor 
          glColor3f(1.0, 1.0, 1.0); 
          glBindTexture(GL_TEXTURE_2D, iceTex.texID); 
          glBegin(GL_TRIANGLE_STRIP); 
               glTexCoord2f(1.0, 1.0); 
               glVertex3fv(&tableCorners[3][0]); 
               glTexCoord2f(0.0, 1.0); 
               glVertex3fv(&tableCorners[2][0]); 
               glTexCoord2f(1.0, 0.0); 
               glVertex3fv(&tableCorners[0][0]); 
               glTexCoord2f(0.0, 0.0); 
               glVertex3fv(&tableCorners[1][0]); 
          glEnd(); 
           
          // enable blending for walls 
          glEnable(GL_BLEND); 
          glDepthMask(GL_FALSE); 
          glBlendFunc(GL_SRC_ALPHA, GL_ONE); 
 
          glColor4f(0.0, 0.1, 0.3, 1.0); 
          // left side 
          glBegin(GL_TRIANGLE_STRIP); 
               glVertex3fv(&tableCorners[1][0]); 
               glVertex3f(tableCorners[1][0], 10.0, 
                              tableCorners[1][2]); 
               glVertex3fv(&tableCorners[0][0]); 
               glVertex3f(tableCorners[0][0], 10.0, 
                              tableCorners[0][2]); 
          glEnd(); 
 
          // right side 
          glBegin(GL_TRIANGLE_STRIP); 
               glVertex3fv(&tableCorners[3][0]); 
               glVertex3f(tableCorners[3][0], 
                           10.0, tableCorners[3][2]); 
               glVertex3fv(&tableCorners[2][0]); 
               glVertex3f(tableCorners[2][0], 10.0, 
                         tableCorners[2][2]); 
          glEnd(); 
 
          // opposite side 
          glBegin(GL_TRIANGLE_STRIP); 
               glVertex3fv(&tableCorners[2][0]); 
               glVertex3f(tableCorners[2][0], 
                         10.0, 
                    tableCorners[2][2]); 
               glVertex3fv(&tableCorners[1][0]); 
               glVertex3f(tableCorners[1][0], 
                         10.0, 
                         tableCorners[1][2]); 
          glEnd(); 
 
          // player side (transparent) 
          glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); 
          glColor4f(0.0, 0.1, 0.3, 0.6); 
          glBegin(GL_TRIANGLE_STRIP); 
               glVertex3fv(&tableCorners[3][0]); 
               glVertex3f(tableCorners[3][0], 
                         10.0, 
                         tableCorners[3][2]); 
               glVertex3fv(&tableCorners[0][0]); 
               glVertex3f(tableCorners[0][0], 
                         10.0, 
                         tableCorners[0][2]); 
          glEnd(); 
 
          // renable depth testing, disable blending 
          glDepthMask(GL_TRUE); 
          glDisable(GL_BLEND); 
     glPopMatrix(); 
} 
 
// Animate() 
// desc: handles the physics calculations (none for a table) 
void CTable::Animate(scalar_t deltaTime) {} 
 
// SetupTexture() 
// desc: initialize the texture with OpenGL 
void CTable::SetupTexture() 
{ 
     // set the proper parameters for an MD2 texture 
     glGenTextures(1, &iceTex.texID); 
     glBindTexture(GL_TEXTURE_2D, iceTex.texID); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR); 
     glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR); 
      
     switch (iceTex.textureType) 
     { 
     case BMP: 
          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGB, iceTex.width, iceTex.height,  
               GL_RGB, GL_UNSIGNED_BYTE, iceTex.data); 
          break; 
     case PCX: 
          gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, iceTex.width, iceTex.height, 
               GL_RGBA, GL_UNSIGNED_BYTE, iceTex.data); 
     case TGA:           // no TGA support 
          break; 
     default: 
          break; 
     } 
} 
 
// Load() 
// desc: initialize table info and setup texture 
void CTable::Load() 
{ 
     // Initialize table corner coordinates (300x500) 
     tableCorners[0][0] = 0.0; 
     tableCorners[0][1] = 0.0; 
     tableCorners[0][2] = 0.0; 
 
     tableCorners[1][0] = 0.0; 
     tableCorners[1][1] = 0.0; 
     tableCorners[1][2] = -500.0; 
 
     tableCorners[2][0] = 300.0; 
     tableCorners[2][1] = 0.0; 
     tableCorners[2][2] = -500.0; 
 
     tableCorners[3][0] = 300.0; 
     tableCorners[3][1] = 0.0; 
     tableCorners[3][2] = 0.0; 
 
     // Initialize the table walls (planes) 
     // 0 = left, 2 = opposite, 1 = right, 3 = player 
     // 1,0 left 
     // 3,2 right 
     // 2,1 opposite 
     // 3,0 player 
     tableWalls[0] = CPlane( 
                         CVector(tableCorners[0][0], tableCorners[0][1], tableCorners[0][2]), 
                         CVector(tableCorners[1][0], tableCorners[1][1], tableCorners[1][2]), 
                         CVector(tableCorners[1][0], 10.0, tableCorners[1][2]) 
                         ); 
 
     tableWalls[1] = CPlane( 
                         CVector(tableCorners[2][0], tableCorners[2][1], tableCorners[2][2]), 
                         CVector(tableCorners[3][0], tableCorners[3][1], tableCorners[3][2]), 
                         CVector(tableCorners[3][0], 10.0, tableCorners[3][2]) 
                         ); 
 
     tableWalls[2] = CPlane( 
                         CVector(tableCorners[1][0], tableCorners[1][1], tableCorners[1][2]), 
                         CVector(tableCorners[2][0], tableCorners[2][1], tableCorners[2][2]), 
                         CVector(tableCorners[2][0], 10.0, tableCorners[2][2]) 
                         ); 
 
     tableWalls[3] = CPlane( 
                         CVector(tableCorners[3][0], tableCorners[3][1], tableCorners[3][2]), 
                         CVector(tableCorners[0][0], tableCorners[0][1], tableCorners[0][2]), 
                         CVector(tableCorners[0][0], 10.0, tableCorners[0][2]) 
                         ); 
 
     // Load and initialize the texture 
     iceTex.LoadTexture("table.bmp"); 
     SetupTexture(); 
} 
 
// Unload() 
// desc: free texture 
void CTable::Unload() 
{ 
     iceTex.Unload(); 
}