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

OpenGL

开发平台:

Windows_Unix

  1. #include <math.h>
  2. #include "Scene.h"
  3. //********************************
  4. //  CScene
  5. //********************************
  6. CScene::CScene()
  7. {
  8.     m_strSceneName = "Unnamed Scene";
  9.     m_bRunning     = false;
  10.     m_fLength      = 0.0f;
  11.     m_fFades[ FADEIN ].m_bOn    = false;
  12.     m_fFades[ FADEIN ].m_fTime  = 0;
  13.     m_fFades[ FADEOUT ].m_bOn   = false;
  14.     m_fFades[ FADEOUT ].m_fTime = 0;
  15. }
  16. CScene::~CScene()
  17. {
  18. }
  19. //********************************
  20. //  SceneManager
  21. //********************************
  22. SceneManager::SceneManager()
  23. {
  24.     m_vScenes.clear();
  25.     m_vPlaylist.clear();
  26.     m_bRunning = false;
  27. }
  28. SceneManager::~SceneManager()
  29. {
  30.     ClearScenes();
  31. }
  32. void SceneManager::SetResolution( int iWidth, int iHeight )
  33. {
  34.     m_iWindowWidth  = iWidth;
  35.     m_iWindowHeight = iHeight;
  36. }
  37. bool SceneManager::AddScene( CScene* pScene )
  38. {
  39.     if (pScene)
  40.     {
  41.         m_vScenes.push_back( pScene );
  42.         pScene->m_iVectorTag = m_vScenes.size() - 1;
  43.         pScene->m_iQuality = m_iQuality;
  44.         return true;
  45.     }
  46.     return false;
  47. }
  48. bool SceneManager::ClearScenes()
  49. {
  50.     for( int i=0; i<m_vScenes.size(); i++ )
  51.         if (m_vScenes[i])
  52.             delete m_vScenes[i];
  53.     m_vScenes.clear();
  54.     return true;
  55. }
  56. bool SceneManager::InitializeScenes()
  57. {
  58.     for( int i=0; i<m_vScenes.size(); i++ )
  59.         if (m_vScenes[i])
  60.             if (!m_vScenes[i]->Initialize())
  61.                 return false;
  62.     return true;
  63. }
  64. bool SceneManager::CleanupScenes()
  65. {
  66.     for( int i=0; i<m_vScenes.size(); i++ )
  67.         if (m_vScenes[i])
  68.             if (!m_vScenes[i]->Cleanup())
  69.                 return false;
  70.     return true;
  71. }
  72. bool SceneManager::Start( bool bLoop )
  73. {
  74.     if (m_bRunning)
  75.         return false;
  76.     m_iCurrentScene = 0;
  77.     m_fStartTime    = Timer::GetTimer( TIMER_SINCEAPPSTART );
  78.     m_fSceneStart   = m_fStartTime;
  79.     m_bLoop         = bLoop;
  80.     m_bRunning = true;
  81.     return true;
  82. }
  83. bool SceneManager::Stop()
  84. {
  85.     if (!m_bRunning)
  86.         return false;
  87.     m_iCurrentScene = 0;
  88.     m_bRunning      = false;
  89.     return true;
  90. }
  91. bool SceneManager::UpdateAndRender()
  92. {
  93.     if (!m_bRunning)
  94.         return true; // return no error
  95.     CScene* pScene = m_vScenes[ m_iCurrentScene ];
  96.     if (pScene)
  97.     {
  98.         float fTime = Timer::GetTimer( TIMER_SINCEAPPSTART );
  99.         float fRunTime = fTime - m_fSceneStart;
  100.         // see if we need to start the next frame
  101.         if ( fRunTime >= pScene->m_fLength )
  102.         {
  103.             m_iCurrentScene++;
  104.             // check if there's a next scene
  105.             if (m_iCurrentScene==m_vScenes.size())
  106.             {
  107.                 Stop();
  108.                 // if we're loopin'...... restart
  109.                 if (m_bLoop)
  110.                 {
  111.                     Start( true );
  112.                     return true;
  113.                 } else
  114.                     return false;
  115.             }
  116.             m_fSceneStart = fTime;
  117.         }
  118.         // update and render the current scene
  119.         pScene->SetRunningTime( fRunTime );
  120.         pScene->Update();                                  // for some reason i'd like to
  121.         pScene->Render( m_iWindowWidth, m_iWindowHeight ); // keep updating and rendering seperate
  122.         HandleFades( pScene, fRunTime );
  123.     }
  124.     return true;
  125. }
  126. void SceneManager::HandleFades( CScene *pScene, float fRunTime )
  127. {
  128.     float fAlpha;
  129.     float fR, fG, fB;
  130.     int iFade;
  131.     if ( !pScene->m_fFades[FADEIN].m_bOn && !pScene->m_fFades[FADEOUT].m_bOn )
  132.         return; // no fade needed
  133.     if ( pScene->m_fFades[FADEIN].m_bOn &&
  134.          (fRunTime < pScene->m_fFades[FADEIN].m_fTime) )
  135.         {
  136.             iFade = FADEIN;
  137.         }
  138.     if ( pScene->m_fFades[FADEOUT].m_bOn &&
  139.          (fRunTime > pScene->m_fFades[FADEOUT].m_fTime) )
  140.         {
  141.             iFade = FADEOUT;
  142.         }
  143.     switch( iFade )
  144.     {
  145.         case FADEIN:
  146.             fAlpha = 1.0f - (1.0f / (pScene->m_fFades[FADEIN].m_fTime / fRunTime));
  147.             fR = pScene->m_fFades[ FADEIN ].m_fColorR;
  148.             fG = pScene->m_fFades[ FADEIN ].m_fColorG;
  149.             fB = pScene->m_fFades[ FADEIN ].m_fColorB;
  150.             break;
  151.         case FADEOUT:
  152.             fAlpha = 1.0f / ((pScene->m_fLength - pScene->m_fFades[FADEOUT].m_fTime) / (fRunTime - pScene->m_fFades[FADEOUT].m_fTime));
  153.             fR = pScene->m_fFades[ FADEOUT ].m_fColorR;
  154.             fG = pScene->m_fFades[ FADEOUT ].m_fColorG;
  155.             fB = pScene->m_fFades[ FADEOUT ].m_fColorB;
  156.             break;
  157.             
  158.         default:
  159.             return;
  160.     }
  161.     // go into ortho mode and draw a quad filling
  162.     // the screen at the calculated alpha value
  163.     glMatrixMode( GL_PROJECTION );
  164.     glPushMatrix();
  165.         glLoadIdentity();
  166.         glOrtho( 0, m_iWindowWidth, m_iWindowHeight, 0, -1, 1 );
  167.     glMatrixMode( GL_MODELVIEW );
  168.     glPushMatrix();
  169.         glLoadIdentity();
  170.     glDisable( GL_TEXTURE_2D );
  171.     glDisable( GL_DEPTH_TEST );
  172.     glEnable( GL_BLEND );
  173.     glBlendFunc( GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA );
  174.     glColor4f( fR, fG, fB, fAlpha );
  175.     glBegin( GL_QUADS );
  176.         glVertex3f( m_iWindowWidth,               0, 0 );
  177.         glVertex3f(              0,               0, 0 );
  178.         glVertex3f(              0, m_iWindowHeight, 0 );
  179.         glVertex3f( m_iWindowWidth, m_iWindowHeight, 0 );
  180.     glEnd();
  181.     glEnable( GL_DEPTH_TEST );
  182.     glDisable( GL_BLEND );
  183.     glMatrixMode( GL_PROJECTION );
  184.     glPopMatrix();
  185.     glMatrixMode( GL_MODELVIEW );
  186.     glPopMatrix();
  187.     glColor4f( 1, 1, 1, 1 );
  188. }