//=========================================================================== // Copyright (C) 2000 Radical Entertainment Ltd. All rights reserved. // // Component: CGuiManagerBackEnd // // Description: Implementation of the CGuiManagerBackEnd class. // // Authors: Tony Chu // // Revisions Date Author Revision // 2002/07/15 TChu Created for SRR2 // //=========================================================================== //=========================================================================== // Includes //=========================================================================== #include #include #include #include #include #include // for window IDs #include #include #include #include // Foundation //=========================================================================== // Global Data, Local Data, Local Classes //=========================================================================== //=========================================================================== // Public Member Functions //=========================================================================== //=========================================================================== // CGuiManagerBackEnd::CGuiManagerBackEnd //=========================================================================== // Description: Constructor. // // Constraints: None. // // Parameters: None. // // Return: N/A. // //=========================================================================== CGuiManagerBackEnd::CGuiManagerBackEnd ( Scrooby::Project* pProject, CGuiEntity* pParent ) : CGuiManager( pProject, pParent ), m_isQuittingDemo( false ), m_isBackendPreRun( false ) { } //=========================================================================== // CGuiManagerBackEnd::~CGuiManagerBackEnd //=========================================================================== // Description: Destructor. // // Constraints: None. // // Parameters: None. // // Return: N/A. // //=========================================================================== CGuiManagerBackEnd::~CGuiManagerBackEnd() { for( int i = 0; i < CGuiWindow::NUM_GUI_WINDOW_IDS; i++ ) { if( m_windows[ i ] != NULL ) { delete m_windows[ i ]; m_windows[ i ] = NULL; } } } //=========================================================================== // CGuiManagerBackEnd::Populate //=========================================================================== // Description: // // Constraints: None. // // Parameters: None. // // Return: // //=========================================================================== void CGuiManagerBackEnd::Populate() { MEMTRACK_PUSH_GROUP( "CGUIManagerBackEnd" ); Scrooby::Screen* pScroobyScreen; CGuiScreen* pScreen; pScroobyScreen = m_pScroobyProject->GetScreen( "Loading" ); if( pScroobyScreen != NULL ) { pScreen = new CGuiScreenLoading( pScroobyScreen, this ); this->AddWindow( CGuiWindow::GUI_SCREEN_ID_LOADING, pScreen ); } pScroobyScreen = m_pScroobyProject->GetScreen( "LoadingFE" ); if( pScroobyScreen != NULL ) { pScreen = new CGuiScreenLoadingFE( pScroobyScreen, this ); this->AddWindow( CGuiWindow::GUI_SCREEN_ID_LOADING_FE, pScreen ); } pScroobyScreen = m_pScroobyProject->GetScreen( "Demo" ); if( pScroobyScreen != NULL ) { pScreen = new CGuiScreenDemo( pScroobyScreen, this ); this->AddWindow( CGuiWindow::GUI_SCREEN_ID_DEMO, pScreen ); } MEMTRACK_POP_GROUP( "CGUIManagerBackEnd" ); } void CGuiManagerBackEnd::Start( CGuiWindow::eGuiWindowID initialWindow ) { rAssert( m_state == GUI_FE_UNINITIALIZED ); m_state = GUI_FE_SCREEN_RUNNING; /* m_nextScreen = initialWindow != CGuiWindow::GUI_WINDOW_ID_UNDEFINED ? initialWindow : CGuiWindow::GUI_SCREEN_ID_LOADING; m_state = GUI_FE_CHANGING_SCREENS; // must be set before calling GotoScreen() CGuiScreen* nextScreen = static_cast< CGuiScreen* >( this->FindWindowByID( m_nextScreen ) ); rAssert( nextScreen != NULL ); m_pScroobyProject->GotoScreen( nextScreen->GetScroobyScreen(), this ); */ } //=========================================================================== // CGuiManagerBackEnd::HandleMessage //=========================================================================== // Description: // // Constraints: None. // // Parameters: None. // // Return: // //=========================================================================== void CGuiManagerBackEnd::HandleMessage ( eGuiMessage message, unsigned int param1, unsigned int param2 ) { switch( message ) { case GUI_MSG_PRE_RUN_BACKEND: { this->GotoLoadingScreen( param1 ); m_isBackendPreRun = true; break; } case GUI_MSG_RUN_BACKEND: { if( !m_isBackendPreRun ) { this->GotoLoadingScreen( param1 ); } // load dynamic resources for loading screen // CGuiWindow* loadingScreen = this->FindWindowByID( m_nextScreen ); rAssert( loadingScreen != NULL ); loadingScreen->HandleMessage( GUI_MSG_LOAD_RESOURCES ); break; } case GUI_MSG_QUIT_BACKEND: { m_isBackendPreRun = false; // Tell the current screen to shut down. // this->FindWindowByID( m_currentScreen )->HandleMessage( GUI_MSG_WINDOW_EXIT ); // Go to a blank screen. // m_pScroobyProject->GotoScreen( "Blank", NULL ); break; } case GUI_MSG_RUN_DEMO: { CGuiManager::HandleMessage( GUI_MSG_GOTO_SCREEN, CGuiWindow::GUI_SCREEN_ID_DEMO, CLEAR_WINDOW_HISTORY | FORCE_WINDOW_RELOAD | FORCE_WINDOW_CHANGE_IMMEDIATE ); break; } case GUI_MSG_QUIT_DEMO: { m_isQuittingDemo = true; CGuiManager::HandleMessage( GUI_MSG_GOTO_SCREEN, CGuiWindow::GUI_SCREEN_ID_LOADING_FE, CLEAR_WINDOW_HISTORY ); break; } case GUI_MSG_WINDOW_FINISHED: { if( GUI_FE_CHANGING_SCREENS == m_state ) { if( m_isQuittingDemo ) { m_isQuittingDemo = false; // switch to frontend context // GetGameFlow()->SetContext( CONTEXT_FRONTEND ); } m_currentScreen = m_nextScreen; CGuiScreen* nextScreen = static_cast< CGuiScreen* >( this->FindWindowByID( m_nextScreen ) ); rAssert( nextScreen != NULL ); m_pScroobyProject->GotoScreen( nextScreen->GetScroobyScreen(), this ); } break; } default: { if( m_state != GUI_FE_UNINITIALIZED && m_currentScreen != CGuiWindow::GUI_WINDOW_ID_UNDEFINED ) { // Send the messages down to the current screen. // CGuiWindow* pScreen = this->FindWindowByID( m_currentScreen ); rAssert( pScreen ); pScreen->HandleMessage( message, param1, param2 ); } } } // propogate message up the hierarchy CGuiManager::HandleMessage( message, param1, param2 ); } //=========================================================================== // Private Member Functions //=========================================================================== void CGuiManagerBackEnd::GotoLoadingScreen( unsigned int param1 ) { bool isLoadingGameplay = (param1 == IS_LOADING_GAMEPLAY || GetGameFlow()->GetNextContext() == CONTEXT_LOADING_GAMEPLAY); unsigned int loadingScreenID = isLoadingGameplay ? CGuiWindow::GUI_SCREEN_ID_LOADING : CGuiWindow::GUI_SCREEN_ID_LOADING_FE; /* #ifdef RAD_E3 // always show I&S loading screen for E3 build // loadingScreenID = CGuiWindow::GUI_SCREEN_ID_LOADING_FE; #endif */ CGuiManager::HandleMessage( GUI_MSG_GOTO_SCREEN, loadingScreenID, CLEAR_WINDOW_HISTORY | FORCE_WINDOW_RELOAD | FORCE_WINDOW_CHANGE_IMMEDIATE ); }