Intro_02.cpp
上传用户:sz83729876
上传日期:2013-03-07
资源大小:4140k
文件大小:6k
源码类别:

OpenGL

开发平台:

Windows_Unix

  1. #include <math.h>
  2. #include "intro_02.h" 
  3. //***************************************
  4. //  CMyObject
  5. //***************************************
  6. bool CMyObject::Render()
  7. {
  8.     glColor3f( 1, 1, 1 );
  9.     glEnable( GL_TEXTURE_2D );
  10.     glBindTexture( GL_TEXTURE_2D, m_texEnv );
  11.     for( int iMesh=0; iMesh<m_vMesh.size(); iMesh++ )
  12.     {
  13.         CMesh* pMesh = m_vMesh[ iMesh ];
  14.         glBegin( GL_TRIANGLES );
  15.         for( int i=0; i<pMesh->m_dwIndexCount/3; i++ )
  16.         {
  17.             CVertex v1 = pMesh->m_pVertices[ pMesh->m_pIndices[i*3+0] ];
  18.             CVertex v2 = pMesh->m_pVertices[ pMesh->m_pIndices[i*3+1] ];
  19.             CVertex v3 = pMesh->m_pVertices[ pMesh->m_pIndices[i*3+2] ];
  20.             glNormal3f( v1.nx, v1.ny, v1.nz );
  21.             glTexCoord2f( v1.tu, v1.tv ); 
  22.             glVertex3f( v1.x, v1.y, v1.z );
  23.             glNormal3f( v2.nx, v2.ny, v2.nz );
  24.             glTexCoord2f( v2.tu, v2.tv );
  25.             glVertex3f( v2.x, v2.y, v2.z );
  26.             glNormal3f( v3.nx, v3.ny, v3.nz );
  27.             glTexCoord2f( v3.tu, v3.tv ); 
  28.             glVertex3f( v3.x, v3.y, v3.z );
  29.         }
  30.         glEnd();
  31.     }
  32.     return true;
  33. }
  34. //***************************************
  35. //  CIntroScene2: Fish-Eyed-Title-Thingy
  36. //***************************************
  37. CIntroScene2::CIntroScene2()
  38. {
  39.     m_fFades[ FADEIN ].m_bOn = true;
  40.     m_fFades[ FADEIN ].m_fTime = 2.5f;
  41.     m_fFades[ FADEIN ].m_fColorR = 1.0;
  42.     m_fFades[ FADEIN ].m_fColorG = 1.0;
  43.     m_fFades[ FADEIN ].m_fColorB = 1.0;
  44.     m_fFades[ FADEOUT ].m_bOn = true; 
  45.     m_fFades[ FADEOUT ].m_fTime = 15.0f;
  46.     m_fFades[ FADEOUT ].m_fColorR = 0.0;
  47.     m_fFades[ FADEOUT ].m_fColorG = 0.0;
  48.     m_fFades[ FADEOUT ].m_fColorB = 0.0;
  49.     m_fLength = 18.0f;
  50.     SetSceneName( "Fish-Eyed-Title-Thingy" );
  51. }
  52. bool CIntroScene2::Initialize()
  53. {
  54.     Texture* tex = Texture::GetInstance();
  55.     tex->SetMipMaps( true );
  56.     m_texCloud = tex->LoadTexture( "cloud.jpg" );
  57.     if (m_texCloud==0xffff)
  58.         return false;
  59.     tex->SetMipMaps( false );
  60.     m_pTitle = new CMyObject();
  61.     if (!m_pTitle->LoadFrom3DS( "data\mytitle.3ds" ))
  62.         return false;
  63.     unsigned int iTemp = tex->LoadTexture( "reflection.jpg" );
  64.     if (iTemp==0xffff)
  65.         return false;
  66.     m_pTitle->SetTexture( iTemp );
  67.     m_listCurve = glGenLists( 1 );
  68.     float f = 2.1f;
  69.     float max = f * sqrtf( (11*11) + (11*11) );
  70.     float fZ;
  71.     glNewList( m_listCurve, GL_COMPILE );
  72.     glBegin( GL_QUADS );
  73.     for( int y=-11; y<11; y++ )
  74.         for( int x=-11; x<11; x++ )
  75.         {
  76.             float fX = x*f;
  77.             float fY = y*f;
  78.             fZ = f * sqrtf( (fX*fX) + (fY*fY) );
  79.             fZ = -20 * cos( fZ / max );
  80.             glTexCoord2f( ((float)(x+11)/22.0f), ((float)(y+11)/22.0f) );
  81.             glVertex3f( fX, fY, fZ );
  82.             fX = x*f + f;
  83.             fY = y*f;
  84.             fZ = f * sqrtf( (fX*fX) + (fY*fY) );
  85.             fZ = -20 * cos( fZ / max );
  86.             glTexCoord2f( ((float)(x+11)/22.0f) + (1.0f/22.0f), ((float)(y+11)/22.0f) );
  87.             glVertex3f( fX, fY, fZ );
  88.             fX = x*f + f;
  89.             fY = y*f + f;
  90.             fZ = f * sqrtf( (fX*fX) + (fY*fY) );
  91.             fZ = -20 * cos( fZ / max );
  92.             glTexCoord2f( ((float)(x+11)/22.0f) + (1.0f/22.0f), ((float)(y+11)/22.0f)  + (1.0f/22.0f) );
  93.             glVertex3f( fX, fY, fZ );
  94.             fX = x*f;
  95.             fY = y*f + f;
  96.             fZ = f * sqrtf( (fX*fX) + (fY*fY) );
  97.             fZ = -20 * cos( fZ / max );
  98.             glTexCoord2f( ((float)(x+11)/22.0f), ((float)(y+11)/22.0f)  + (1.0f/22.0f));
  99.             glVertex3f( fX, fY, fZ );
  100.         }
  101.     glEnd();
  102.     glEndList();
  103.     m_fBackgroundRotate = 0;
  104.     m_fLayer1Par = 0;
  105.     m_fLayer2Par = 0;
  106.     glTexGenf( GL_S, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );
  107.     glTexGenf( GL_T, GL_TEXTURE_GEN_MODE, GL_SPHERE_MAP );
  108.     return true;
  109. }
  110. bool CIntroScene2::Cleanup()
  111. {
  112.     glDeleteLists( m_listCurve, 1 );
  113.     if (m_pTitle)
  114.         delete m_pTitle;
  115.     return true;
  116. }
  117. bool CIntroScene2::Render( int iScreenWidth, int iScreenHeight )
  118. {
  119.     // set the fov extremely high
  120.     OpenGL* ogl = OpenGL::GetInstance();
  121.     ogl->SetFOV( 160.0f );
  122.     gluLookAt( 0, 0, 0,
  123.                0, 0, -1,
  124.                0, 1, 0 );
  125.     glDisable( GL_DEPTH_TEST );
  126.     glEnable( GL_TEXTURE_2D );
  127.     glBindTexture( GL_TEXTURE_2D, m_texCloud );
  128.     // semi-static background
  129.     glPushMatrix();
  130.     glRotatef( m_fBackgroundRotate, 0, 0, 1 );
  131.     glColor3f( 1, 0.5, 0 );
  132.     glCallList( m_listCurve );
  133.     glPopMatrix();
  134.     glEnable( GL_BLEND );
  135.     glBlendFunc( GL_SRC_COLOR, GL_ONE );
  136.     // layer 1
  137.     ScaleTextureMatrix( 1.5f + cos(m_fLayer1Par), 1.5f + sin(m_fLayer1Par*1.5), 0 );
  138.     glTranslatef( 0, 0, 3 );
  139.     glColor3f( 0.5, 0, 1 );
  140.     glCallList( m_listCurve );
  141.     RestoreTextureMatrix();
  142.     // layer 2
  143.     ScaleTextureMatrix( 1, 1.5f + cos(m_fLayer2Par), 1.5f + sin(m_fLayer2Par*1.5) );
  144.     glPushMatrix();
  145.     glTranslatef( 0, 0, 3 );
  146.     glColor3f( 1, 1, 1 );
  147.     glCallList( m_listCurve );
  148.     RestoreTextureMatrix();
  149.     // disable blend
  150.     glDisable( GL_BLEND );
  151.     glEnable( GL_DEPTH_TEST );
  152.     // restore field-of-view
  153.     ogl->SetFOV( 45.0f );
  154.     gluLookAt( 0, 0, 5,
  155.                0, 0, 0,
  156.                0, 1, 0 );
  157.     glEnable( GL_TEXTURE_GEN_S );
  158.     glEnable( GL_TEXTURE_GEN_T );
  159.     ScaleTextureMatrix( (1.5f + cos(m_fLayer1Par)) / 5.0f, (1.5f + sin(m_fLayer2Par*1.5)) / 5.0f, 0 );
  160.     glPushMatrix();
  161.     glScalef( 0.05, 0.05, 0.05 );
  162.     m_pTitle->Render();
  163.     glPopMatrix();
  164.     RestoreTextureMatrix();
  165.     glDisable( GL_TEXTURE_GEN_S );
  166.     glDisable( GL_TEXTURE_GEN_T );
  167.     return true;
  168. }
  169. bool CIntroScene2::Update()
  170. {
  171.     float fTime = Timer::GetTimer( TIMER_SINCELASTFRAME );
  172.     m_fBackgroundRotate += 10 * fTime;
  173.     m_fLayer1Par += 0.33f * fTime;
  174.     m_fLayer2Par += 0.43f * fTime;
  175.     return true;
  176. }
  177. void CIntroScene2::ScaleTextureMatrix( float x, float y, float z )
  178. {
  179.     glMatrixMode( GL_TEXTURE );
  180.     glPushMatrix();
  181.     glScalef( x, y, z );
  182.     glMatrixMode( GL_MODELVIEW );
  183.     glPushMatrix();
  184. }
  185. void CIntroScene2::RestoreTextureMatrix()
  186. {
  187.     glPopMatrix();
  188.     glMatrixMode( GL_TEXTURE );
  189.     glPopMatrix();
  190.     glMatrixMode( GL_MODELVIEW );
  191. }