⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 table.cpp

📁 一本关于OPenGL的很好的电子书
💻 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();
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -