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

OpenGL

开发平台:

Windows_Unix

  1. #include <math.h>
  2. #include "Tube.h"
  3. CTubeScene::CTubeScene()
  4. {
  5.     m_fFades[ FADEIN ].m_bOn = true;
  6.     m_fFades[ FADEIN ].m_fTime = 2.5f;
  7.     m_fFades[ FADEIN ].m_fColorR = 0.0;
  8.     m_fFades[ FADEIN ].m_fColorG = 0.0;
  9.     m_fFades[ FADEIN ].m_fColorB = 0.0;
  10.     m_fFades[ FADEOUT ].m_bOn = true; 
  11.     m_fFades[ FADEOUT ].m_fTime = 15.0f;
  12.     m_fFades[ FADEOUT ].m_fColorR = 0.0;
  13.     m_fFades[ FADEOUT ].m_fColorG = 0.0;
  14.     m_fFades[ FADEOUT ].m_fColorB = 0.0;
  15.     m_fLength = 18.0f;
  16.     SetSceneName( "Tube Scene" );
  17. }
  18. bool CTubeScene::Initialize()
  19. {
  20.     Texture* tex = Texture::GetInstance();
  21.     tex->SetMipMaps( true );
  22.     m_pTube = new CObject();
  23.     if (!m_pTube->LoadFrom3DS( "data\tube2.3ds" ))
  24.         return false;
  25.     m_pPlates = new CObject();
  26.     if (!m_pPlates->LoadFrom3DS( "data\tube.3ds" ))
  27.         return false;
  28.     tex->SetMipMaps( false );
  29.     //*** create lights
  30.     m_vLights.clear();
  31.     CLight light2;
  32.     light2.m_rgbAmbient.Set( 0.0, 0.0, 0.0 );
  33.     light2.m_rgbDiffuse.Set( 0.0, 0.0, 0.75 );
  34.     light2.m_vPosition.Set( 0, 0, -150 );
  35.     light2.Create( GL_LIGHT1 );
  36.     m_vLights.push_back( light2 );
  37.     CLight light3;
  38.     light3.m_rgbAmbient.Set( 0.0, 0.0, 0.0 );
  39.     light3.m_rgbDiffuse.Set( 0.75, 0.0, 0.0 );
  40.     light3.m_vPosition.Set( 0, 10, 0 );
  41.     light3.Create( GL_LIGHT2 );
  42.     m_vLights.push_back( light3 );
  43.     return true;
  44. }
  45. bool CTubeScene::Cleanup()
  46. {
  47.     if (m_pTube)
  48.         delete m_pTube;
  49.     if (m_pPlates)
  50.         delete m_pPlates;
  51.     return true;
  52. }
  53. bool CTubeScene::Render( int iScreenWidth, int iScreenHeight )
  54. {
  55.     float fTime = Timer::GetTimer( TIMER_SINCEAPPSTART );
  56.     gluLookAt( 15*cos(fTime), 0, 150,
  57.                0, 0, 0,
  58.                0, 1, 0 );
  59.     glEnable( GL_LIGHTING );
  60.     glDisable( GL_COLOR_MATERIAL );
  61.     m_pTube->Render();
  62.     //fTime /= 5.0f;
  63.     glPushMatrix();
  64.         glRotatef( fTime*70, 0, 0, 1 );
  65.         glRotatef( 180, 0, 1, 0 );
  66.         m_pPlates->Render();
  67.     glPopMatrix();
  68.     
  69.     glPushMatrix();
  70.         glScalef( 0.70, 0.70, 1.0 );
  71.         glRotatef( -fTime*70, 0, 0, 1 );
  72.         glRotatef( 180, 0, 1, 0 );
  73.         m_pPlates->Render();
  74.     glPopMatrix();
  75.     glPushMatrix();
  76.         glScalef( 0.45, 0.45, 1.0 );
  77.         glRotatef( fTime*70, 0, 0, 1 );
  78.         glRotatef( 180, 0, 1, 0 );
  79.         m_pPlates->Render();
  80.     glPopMatrix();
  81.     glPushMatrix();
  82.         glScalef( 0.25, 0.25, 1.0 );
  83.         glRotatef( -fTime*70, 0, 0, 1 );
  84.         glRotatef( 180, 0, 1, 0 );
  85.         m_pPlates->Render();
  86.     glPopMatrix();
  87.     glDisable( GL_LIGHTING );
  88.     glEnable( GL_COLOR_MATERIAL );
  89.     return true;
  90. }
  91. bool CTubeScene::Update()
  92. {
  93.     float fTime = Timer::GetTimer( TIMER_SINCELASTFRAME );
  94.     m_vLights[0].m_vPosition.z += 60.0f * fTime;
  95.     if (m_vLights[0].m_vPosition.z>100)
  96.     {
  97.         float f = 0.75f - ((0.75f / 50.0f) * (m_vLights[0].m_vPosition.z-100));
  98.         m_vLights[0].m_rgbDiffuse.Set( 0, 0, f );
  99.         if (m_vLights[0].m_vPosition.z>150)
  100.         {
  101.             m_vLights[0].m_vPosition.z=-150.0f;
  102.             m_vLights[0].m_rgbDiffuse.Set( 0, 0, 0.75f );
  103.         }
  104.     }
  105.     m_vLights[0].Create();
  106.     fTime = Timer::GetTimer( TIMER_SINCEAPPSTART );
  107.     m_vLights[1].m_vPosition.Set( 50*cos(0.5*fTime), 50*sin(0.5*fTime), -150 );
  108.     m_vLights[1].Create();
  109.     return true;
  110. }