/* ================= Sys_GetProcessorFeatures ================= */ cpuFeatures_t Sys_GetProcessorFeatures( void ) { cpuFeatures_t features = 0; #ifndef DEDICATED if( SDL_HasRDTSC( ) ) features |= CF_RDTSC; if( SDL_HasMMX( ) ) features |= CF_MMX; if( SDL_HasMMXExt( ) ) features |= CF_MMX_EXT; if( SDL_Has3DNow( ) ) features |= CF_3DNOW; if( SDL_Has3DNowExt( ) ) features |= CF_3DNOW_EXT; if( SDL_HasSSE( ) ) features |= CF_SSE; if( SDL_HasSSE2( ) ) features |= CF_SSE2; if( SDL_HasAltiVec( ) ) features |= CF_ALTIVEC; #endif return features; }
CPUfeatures sysgetprocessorfeatures(void) { CPUfeatures f; f = 0; #ifndef DEDICATED if(SDL_HasRDTSC()) f |= CF_RDTSC; if(SDL_HasMMX()) f |= CF_MMX; if(SDL_HasMMXExt()) f |= CF_MMX_EXT; if(SDL_Has3DNow()) f |= CF_3DNOW; if(SDL_Has3DNowExt()) f |= CF_3DNOW_EXT; if(SDL_HasSSE()) f |= CF_SSE; if(SDL_HasSSE2()) f |= CF_SSE2; if(SDL_HasAltiVec()) f |= CF_ALTIVEC; #endif return f; }
bool allegro_init() { cpu_capabilities = 0; notes << "Allegro: "; if(cfgUseSSE && SDL_HasSSE()) cpu_capabilities |= CPU_SSE; if(cfgUseMMX && SDL_HasMMX()) cpu_capabilities |= CPU_MMX; if(cfgUseMMXExt && SDL_HasMMXExt()) cpu_capabilities |= CPU_MMXPLUS; if(cpu_capabilities & CPU_SSE) notes << "SSE, "; else notes << "no SSE, "; if(cpu_capabilities & CPU_MMX) notes << "MMX, "; else notes << "no MMX, "; if(cpu_capabilities & CPU_MMXPLUS) notes << "MMXExt"; else notes << "no MMXExt"; notes << endl; screen = create_bitmap_ex(32, SCREEN_W, SCREEN_H); notes << "Allegro screen format:" << endl; DumpPixelFormat(screen->surf->format); return true; }
bool Application::initialize( int argc, char **argv ) { // this is used when hunting for memory leaks #ifdef YAF3D_ENABLE_HEAPCHECK // trigger debugger //__asm int 3; #endif std::string arg_levelname; // use an ArgumentParser object to manage the program arguments. osg::ArgumentParser arguments( &argc,argv ); osg::ArgumentParser::Parameter levelparam( arg_levelname ); arguments.read( "-level", arg_levelname ); // read the level file if one given int argpos; // set proper game mode GameState::get()->setMode( GameState::Standalone ); if ( ( argpos = arguments.find( "-server" ) ) != 0 ) { GameState::get()->setMode( GameState::Server ); arguments.remove( argpos ); } else if ( ( argpos = arguments.find( "-client" ) ) != 0 ) { GameState::get()->setMode( GameState::Client ); arguments.remove( argpos ); } // note: before beginning to initialize the framework modules the media path must be set, // other modules need it for loading resources etc. //------------------- std::vector< std::string > path; std::string dir; { char* p_env = getenv( YAF3D_ENV_MEDIA_DIR ); if ( p_env ) { _mediaPath = p_env; } else { dir = getCurrentWorkingDirectory(); dir = cleanPath( dir ); dir += "/"; path.clear(); explode( dir, "/", &path ); #ifdef LINUX dir = "/"; #endif #ifdef WIN32 dir = ""; #endif for ( size_t cnt = 0; cnt < path.size() - 2; ++cnt ) dir += path[ cnt ] + "/"; dir.erase( dir.size() -1 ); _mediaPath = dir; _mediaPath += YAF3D_MEDIA_PATH; } } //------------------- // set the ful binary path of application _fulBinaryPath = arguments.getApplicationName(); _fulBinaryPath = cleanPath( _fulBinaryPath ); _fulBinaryPath = _fulBinaryPath.substr( 0, _fulBinaryPath.rfind( '/' ) ); //------------------- // load the standard configuration before changing to 'Initializing' state Configuration::get()->load(); // set game state _p_gameState->setState( GameState::Initializing ); // setup log system { std::string loglevel; bool invalidloglevel = false; Log::Level level = Log::L_ERROR; // get the log level from configuration Configuration::get()->getSettingValue( YAF3D_GS_LOG_LEVEL, loglevel ); if ( loglevel == "error" ) level = Log::L_ERROR; else if ( loglevel == "warning" ) level = Log::L_WARNING; else if ( loglevel == "debug" ) level = Log::L_DEBUG; else if ( loglevel == "info" ) level = Log::L_INFO; else invalidloglevel = true; // create log sinks with configured log level if ( GameState::get()->getMode() != GameState::Server ) log.addSink( "file", getMediaPath() + std::string( LOG_FILE_NAME ), level ); else log.addSink( "file", getMediaPath() + std::string( LOG_FILE_NAME_SERVER ), level ); // only the server needs an console stdout #ifdef YAF3D_HAS_CONSOLE log.addSink( "stdout", std::cout, level ); #endif // check if we have to report an invalid log level in configuration if ( invalidloglevel ) log_warning << "Application: configuration contains an invalid log level, possible values are: error, warning, debug, info. set to error." << std::endl; } log.enableSeverityLevelPrinting( false ); log_info << std::endl; log << " *******************************************" << std::endl; log << " * yaf3d -- Yet another Framework 3D *" << std::endl; log << " * version: " << std::string( YAF3D_VERSION ) << " *" << std::endl; log << " * project: Yag2002 *" << std::endl; log << " * site: http://yag2002.sourceforge.net *" << std::endl; log << " * contact: [email protected] *" << std::endl; log << " *******************************************" << std::endl; log << "" << std::endl; log.enableSeverityLevelPrinting( true ); log << "Application: time " << yaf3d::getTimeStamp(); // print cpu info { std::stringstream cpuinfo; cpuinfo << "Application: CPU supports "; if ( SDL_HasRDTSC() ) cpuinfo << "RDTSC "; if ( SDL_HasMMX() ) cpuinfo << "MMX "; if ( SDL_HasMMXExt() ) cpuinfo << "MMXExt "; if ( SDL_Has3DNow() ) cpuinfo << "3DNow "; if ( SDL_Has3DNowExt() ) cpuinfo << "3DNowExt "; if ( SDL_HasSSE() ) cpuinfo << "SSE "; if ( SDL_HasSSE2() ) cpuinfo << "SSE2 "; if ( SDL_HasAltiVec() ) cpuinfo << "AltiVec "; log << cpuinfo.str() << std::endl; } log << "Application: initializing viewer" << std::endl; log << "Application: using media path: " << _mediaPath << std::endl; // setup the viewer //---------- // load the display settings Configuration::get()->getSettingValue( YAF3D_GS_SCREENWIDTH, _screenWidth ); Configuration::get()->getSettingValue( YAF3D_GS_SCREENHEIGHT, _screenHeight ); Configuration::get()->getSettingValue( YAF3D_GS_FULLSCREEN, _fullScreen ); unsigned int colorBits = 24; Configuration::get()->getSettingValue( YAF3D_GS_COLORBITS, colorBits ); // init SDL SDL_Init( SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE ); // set the icon and caption title SDL_WM_SetCaption( YAF3D_APP_TITLE, NULL ); SDL_Surface* p_bmpsurface = SDL_LoadBMP( YAF3D_APP_ICON ); if ( p_bmpsurface ) { Uint32 col = SDL_MapRGB( p_bmpsurface->format, 255, 255, 255 ); SDL_SetColorKey( p_bmpsurface, SDL_SRCCOLORKEY, col ); SDL_WM_SetIcon( p_bmpsurface, NULL ); } // enable unicode translation SDL_EnableUNICODE( 1 ); SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); // enable key repeating _p_viewer = new osgSDL::Viewer; _rootSceneNode = new osg::Group; _rootSceneNode->setName( "_topSceneGroup_" ); osgSDL::Viewport* p_viewport = new osgSDL::Viewport( _rootSceneNode.get() ); osgUtil::SceneView* p_sceneView = p_viewport->getSceneView(); p_sceneView->setDefaults( osgUtil::SceneView::COMPILE_GLOBJECTS_AT_INIT ); _p_viewer->addViewport( p_viewport ); _p_viewer->requestContinuousUpdate( true ); // force event generation for FRAMEs, we need this for animations, etc. int flags = SDL_HWSURFACE; if ( _fullScreen ) flags |= SDL_FULLSCREEN; if ( GameState::get()->getMode() == GameState::Server ) { SDL_WM_SetCaption( YAF3D_APP_TITLE "-server", NULL ); } _p_viewer->setDisplayMode( _screenWidth, _screenHeight, colorBits, flags ); _p_viewer->setCursorEnabled( false ); //------------ // setup keyboard map std::string keybType; Configuration::get()->getSettingValue( YAF3D_GS_KEYBOARD, keybType ); log_info << "Application: setup keyboard map to: " << keybType << std::endl; if ( keybType == YAF3D_GS_KEYBOARD_ENGLISH ) KeyMap::get()->setup( KeyMap::English ); else KeyMap::get()->setup( KeyMap::German ); // get the instance of gui manager _p_guiManager = GuiManager::get(); // setup networking _p_networkDevice = NetworkDevice::get(); // avoid creating of remote clients so long we are initializing the system _p_networkDevice->lockObjects(); if ( GameState::get()->getMode() == GameState::Server ) { log_info << "Application: loading level file '" << arg_levelname << "'" << std::endl; // load the level and setup things osg::ref_ptr< osg::Group > sceneroot = LevelManager::get()->loadLevel( YAF3D_LEVEL_SERVER_DIR + arg_levelname ); if ( !sceneroot.valid() ) return false; // start networking before setting up entities std::string servername; Configuration::get()->getSettingValue( YAF3D_GS_SERVER_NAME, servername ); NodeInfo nodeinfo( arg_levelname, servername ); unsigned int channel; Configuration::get()->getSettingValue( YAF3D_GS_SERVER_PORT, channel ); // try to setup server try { _p_networkDevice->setupServer( channel, nodeinfo ); } catch ( const NetworkExpection& e ) { log_error << "Application: error starting server, reason: " << e.what() << std::endl; return false; } // complete level loading LevelManager::get()->finalizeLoading(); // the server needs no drawing _p_viewer->setUpdateAllViewports( false ); } else if ( GameState::get()->getMode() == GameState::Client ) { std::string url; Configuration::get()->getSettingValue( YAF3D_GS_SERVER_IP, url ); std::string clientname( "vrc-client" ); NodeInfo nodeinfo( "", clientname ); unsigned int channel; Configuration::get()->getSettingValue( YAF3D_GS_SERVER_PORT, channel ); // try to setup client networking try { _p_networkDevice->setupClient( url, channel, nodeinfo ); } catch ( const NetworkExpection& e ) { log_error << "Application: error setting up client networking, reason: " << e.what() << std::endl; return false; } // now load level std::string levelname = YAF3D_LEVEL_CLIENT_DIR + _p_networkDevice->getNodeInfo()->getLevelName(); log_info << "Application: loading level file '" << levelname << "'" << std::endl; // load the level and setup things osg::ref_ptr< osg::Group > sceneroot = LevelManager::get()->loadLevel( levelname ); if ( !sceneroot.valid() ) return false; // complete level loading LevelManager::get()->finalizeLoading(); // if we directly start a client with cmd line option then we must send a leave-menu notification to entities // as many entities do special steps when leaving the menu EntityNotification notification( YAF3D_NOTIFY_MENU_LEAVE ); EntityManager::get()->sendNotification( notification ); } else // check for any level file name, so we try to start in Standalone mode { std::string defaultlevel = arg_levelname.length() ? ( std::string( YAF3D_LEVEL_SALONE_DIR ) + arg_levelname ) : std::string( YAF3D_DEFAULT_LEVEL ); log_info << "Application: loading level file '" << defaultlevel << "'" << std::endl; // set game mode GameState::get()->setMode( GameState::Standalone ); // load the level and setup things osg::ref_ptr< osg::Group > sceneroot = LevelManager::get()->loadLevel( defaultlevel ); if ( !sceneroot.valid() ) return false; // complete level loading LevelManager::get()->finalizeLoading(); // if we directly start a client with cmd line option then we must send a leave-menu notification to entities // as many entities do special steps when leaving the menu EntityNotification notification( YAF3D_NOTIFY_MENU_LEAVE ); EntityManager::get()->sendNotification( notification ); } return true; }
bool Application::initialize( int argc, char **argv ) { // this is used when hunting for memory leaks #ifdef YAF3D_ENABLE_HEAPCHECK // trigger debugger //__asm int 3; #endif //! NOTE: on multi-core systems running win32, sometimes a noticable performance drop has been observed // when the application uses more than one cpu for its threads. here we assign only one cpu to the entire app. #ifdef WIN32 SYSTEM_INFO sysInfo; GetSystemInfo( &sysInfo ); if ( sysInfo.dwNumberOfProcessors > 1 ) { // take the first cpu for our application DWORD_PTR processAffinityMask = 0x1; SetProcessAffinityMask( GetCurrentProcess(), processAffinityMask ); } #endif // seed the standard pseudo random generator time_t t = time( NULL ); srand( static_cast< unsigned int >( t ) ); std::string arg_levelname; bool arg_nodefaultlvl = false; // use an ArgumentParser object to manage the program arguments. osg::ArgumentParser arguments( &argc,argv ); osg::ArgumentParser::Parameter levelparam( arg_levelname ); arguments.read( "-level", arg_levelname ); // read the level file if one given int argpos; // set proper game mode GameState::get()->setMode( GameState::Standalone ); if ( ( argpos = arguments.find( "-server" ) ) > 0 ) { GameState::get()->setMode( GameState::Server ); arguments.remove( argpos ); } else if ( ( argpos = arguments.find( "-client" ) ) > 0 ) { GameState::get()->setMode( GameState::Client ); arguments.remove( argpos ); } if ( ( argpos = arguments.find( "-nodefaultlevel" ) ) > 0 ) { arg_nodefaultlvl = true; arguments.remove( argpos ); } // note: before beginning to initialize the framework modules the media path must be set, // other modules need it for loading resources etc. //------------------- std::vector< std::string > path; std::string dir; { char* p_env = getenv( YAF3D_ENV_MEDIA_DIR ); if ( p_env ) { _mediaPath = p_env; } else { dir = getCurrentWorkingDirectory(); dir = cleanPath( dir ); dir += "/"; path.clear(); explode( dir, "/", &path ); #ifdef LINUX dir = "/"; #endif #ifdef WIN32 dir = ""; #endif for ( size_t cnt = 0; cnt < path.size() - 2; ++cnt ) dir += path[ cnt ] + "/"; dir.erase( dir.size() -1 ); _mediaPath = dir; _mediaPath += YAF3D_MEDIA_PATH; } } //------------------- // set the ful binary path of application _fulBinaryPath = arguments.getApplicationName(); _fulBinaryPath = cleanPath( _fulBinaryPath ); _fulBinaryPath = _fulBinaryPath.substr( 0, _fulBinaryPath.rfind( '/' ) ); //------------------- // load the standard configuration before changing to 'Initializing' state Configuration::get()->load(); // set game state _p_gameState->setState( GameState::Initializing ); // setup log system { std::string loglevel; Log::Level level = Log::L_ERROR; // get the log level from configuration Configuration::get()->getSettingValue( YAF3D_GS_LOG_LEVEL, loglevel ); // check if we have to report an invalid log level in configuration if ( loglevel == "error" ) level = Log::L_ERROR; else if ( loglevel == "warning" ) level = Log::L_WARNING; else if ( loglevel == "debug" ) level = Log::L_DEBUG; else if ( loglevel == "info" ) level = Log::L_INFO; else if ( loglevel == "verbose" ) level = Log::L_VERBOSE; else log_warning << "Application: configuration contains an invalid log level, possible values are: error, warning, debug, info, verbose. set to error." << std::endl; // create log sinks with configured log level if ( GameState::get()->getMode() != GameState::Server ) log_out.addSink( "file", getMediaPath() + std::string( LOG_FILE_NAME ), level ); else log_out.addSink( "file", getMediaPath() + std::string( LOG_FILE_NAME_SERVER ), level ); // only the server needs an console stdout #ifdef YAF3D_HAS_CONSOLE log_out.addSink( "stdout", std::cout, level ); #endif } log_out.enableSeverityLevelPrinting( false ); log_info << std::endl; log_out << " *******************************************" << std::endl; log_out << " * yaf3d -- Yet another Framework 3D *" << std::endl; log_out << " * version: " << std::string( YAF3D_VERSION ) << " *" << std::endl; log_out << " * project: Yag2002 *" << std::endl; log_out << " * site: http://yag2002.sourceforge.net *" << std::endl; log_out << " * contact: [email protected] *" << std::endl; log_out << " *******************************************" << std::endl; log_out << "" << std::endl; log_out.enableSeverityLevelPrinting( true ); log_out << "Application: time " << yaf3d::getTimeStamp(); // print cpu info { std::stringstream cpuinfo; cpuinfo << "Application: CPU supports "; if ( SDL_HasRDTSC() ) cpuinfo << "RDTSC "; if ( SDL_HasMMX() ) cpuinfo << "MMX "; if ( SDL_HasMMXExt() ) cpuinfo << "MMXExt "; if ( SDL_Has3DNow() ) cpuinfo << "3DNow "; if ( SDL_Has3DNowExt() ) cpuinfo << "3DNowExt "; if ( SDL_HasSSE() ) cpuinfo << "SSE "; if ( SDL_HasSSE2() ) cpuinfo << "SSE2 "; if ( SDL_HasAltiVec() ) cpuinfo << "AltiVec "; log_out << cpuinfo.str() << std::endl; } // implement the signal handler implementSignalHandler(); log_out << "Application: using media path: " << _mediaPath << std::endl; log_out << "Application: setup virtual file system" << std::endl; try { FileSystem::get()->initialize( argv ); FileSystem::get()->mountResource( _mediaPath, "/" ); if ( fileExists( _mediaPath + YAF3D_MEDIA_PACK ) ) { FileSystem::get()->mountResource( _mediaPath + YAF3D_MEDIA_PACK, "/" ); } } catch ( const FileSystemException& e ) { log_error << "Application: problem occured while setting up the virtual file system!" << std::endl; log_error << " reason:" << e.what() << std::endl; return false; } // setup the viewer //---------- // load the display settings log_out << "Application: initializing viewer" << std::endl; Configuration::get()->getSettingValue( YAF3D_GS_SCREENWIDTH, _screenWidth ); Configuration::get()->getSettingValue( YAF3D_GS_SCREENHEIGHT, _screenHeight ); Configuration::get()->getSettingValue( YAF3D_GS_FULLSCREEN, _fullScreen ); unsigned int colorBits = 24; Configuration::get()->getSettingValue( YAF3D_GS_COLORBITS, colorBits ); // set the icon and caption title only for non-servers if ( GameState::get()->getMode() != GameState::Server ) { // init SDL with video SDL_Init( SDL_INIT_VIDEO | SDL_INIT_NOPARACHUTE ); // set application window's title _appWindowTitle = YAF3D_APP_TITLE " " YAF3D_VERSION; setWindowTitle( _appWindowTitle ); SDL_Surface* p_bmpsurface = SDL_LoadBMP( YAF3D_APP_ICON ); if ( p_bmpsurface ) { Uint32 col = SDL_MapRGB( p_bmpsurface->format, 255, 255, 255 ); SDL_SetColorKey( p_bmpsurface, SDL_SRCCOLORKEY, col ); SDL_WM_SetIcon( p_bmpsurface, NULL ); } } else { // init SDl witout video for server SDL_Init( SDL_INIT_NOPARACHUTE ); } // enable unicode translation SDL_EnableUNICODE( 1 ); SDL_EnableKeyRepeat( SDL_DEFAULT_REPEAT_DELAY, SDL_DEFAULT_REPEAT_INTERVAL ); // enable key repeating _p_viewer = new osgSDL::Viewer; _rootSceneNode = new osg::Group; _rootSceneNode->setName( "_topSceneGroup_" ); osgSDL::Viewport* p_viewport = new osgSDL::Viewport( _rootSceneNode.get() ); osgUtil::SceneView* p_sceneView = p_viewport->getSceneView(); p_sceneView->setDefaults( osgUtil::SceneView::COMPILE_GLOBJECTS_AT_INIT ); _p_viewer->addViewport( p_viewport ); _p_viewer->requestContinuousUpdate( true ); // force event generation for FRAMEs, we need this for animations, etc. int flags = SDL_HWSURFACE; if ( _fullScreen ) flags |= SDL_FULLSCREEN; _p_viewer->setDisplayMode( _screenWidth, _screenHeight, colorBits, flags ); _p_viewer->setCursorEnabled( false ); //------------ // setup keyboard map std::string keybType; Configuration::get()->getSettingValue( YAF3D_GS_KEYBOARD, keybType ); log_info << "Application: setup keyboard map to: " << keybType << std::endl; if ( keybType == YAF3D_GS_KEYBOARD_ENGLISH ) KeyMap::get()->setup( KeyMap::English ); else KeyMap::get()->setup( KeyMap::German ); // get the instance of gui manager _p_guiManager = GuiManager::get(); // setup networking _p_networkDevice = NetworkDevice::get(); if ( GameState::get()->getMode() == GameState::Server ) { log_info << "Application: loading level file '" << arg_levelname << "'" << std::endl; // load the level and setup things osg::ref_ptr< osg::Group > sceneroot = LevelManager::get()->loadLevel( YAF3D_LEVEL_SERVER_DIR + arg_levelname ); if ( !sceneroot.valid() ) { log_error << "Application: could not load level '" << YAF3D_LEVEL_SERVER_DIR + arg_levelname << "'" << std::endl; return false; } // append the level node to scene root node _rootSceneNode->addChild( sceneroot.get() ); // start networking before setting up entities std::string servername; Configuration::get()->getSettingValue( YAF3D_GS_SERVER_NAME, servername ); NodeInfo nodeinfo( arg_levelname, servername ); unsigned int channel = 0; Configuration::get()->getSettingValue( YAF3D_GS_SERVER_PORT, channel ); bool needsAuth = false; Configuration::get()->getSettingValue( YAF3D_GS_SERVER_AUTH, needsAuth ); nodeinfo.setNeedAuthentification( needsAuth ); // try to setup server try { _p_networkDevice->setupServer( channel, nodeinfo ); } catch ( const NetworkException& e ) { log_error << "Application: error starting server, reason: " << e.what() << std::endl; return false; } // complete level loading LevelManager::get()->finalizeLoading(); // the server needs no drawing _p_viewer->setUpdateAllViewports( false ); } else if ( GameState::get()->getMode() == GameState::Client ) { std::string url; Configuration::get()->getSettingValue( YAF3D_GS_SERVER_IP, url ); std::string clientname( "vrc-client" ); NodeInfo nodeinfo( "", clientname ); unsigned int channel = 0; Configuration::get()->getSettingValue( YAF3D_GS_SERVER_PORT, channel ); // try to setup client networking try { _p_networkDevice->setupClient( url, channel, nodeinfo ); } catch ( const NetworkException& e ) { log_error << "Application: error setting up client networking, reason: " << e.what() << std::endl; return false; } // now load level std::string levelname = YAF3D_LEVEL_CLIENT_DIR + nodeinfo.getLevelName(); log_info << "Application: loading level file '" << levelname << "'" << std::endl; // load the level and setup things osg::ref_ptr< osg::Group > sceneroot = LevelManager::get()->loadLevel( levelname ); if ( !sceneroot.valid() ) { log_error << "Application: could not load level '" << levelname << "'" << std::endl; return false; } // append the level node to scene root node _rootSceneNode->addChild( sceneroot.get() ); // complete level loading LevelManager::get()->finalizeLoading(); // if we directly start a client with cmd line option then we must send a leave-menu notification to entities // as many entities do special steps when leaving the menu EntityNotification notification( YAF3D_NOTIFY_MENU_LEAVE ); EntityManager::get()->sendNotification( notification ); } else if ( !arg_nodefaultlvl ) // check for any level file name, so we try to start in Standalone mode if not no-default-level option is given { std::string defaultlevel = arg_levelname.length() ? ( std::string( YAF3D_LEVEL_SALONE_DIR ) + arg_levelname ) : std::string( YAF3D_DEFAULT_LEVEL ); log_info << "Application: loading level file '" << defaultlevel << "'" << std::endl; // set game mode GameState::get()->setMode( GameState::Standalone ); // load the level and setup things osg::ref_ptr< osg::Group > sceneroot = LevelManager::get()->loadLevel( defaultlevel ); if ( !sceneroot.valid() ) { log_error << "Application: could not load level '" << defaultlevel << "'" << std::endl; return false; } // append the level node to scene root node _rootSceneNode->addChild( sceneroot.get() ); // complete level loading LevelManager::get()->finalizeLoading(); // if we directly start a level with cmd line option then we must send a leave-menu notification to entities // as many entities do special steps when leaving the menu if ( arg_levelname.length() ) { EntityNotification notification( YAF3D_NOTIFY_MENU_LEAVE ); EntityManager::get()->sendNotification( notification ); } } if ( arg_nodefaultlvl ) { // set game mode to standalone GameState::get()->setMode( GameState::Standalone ); // setup the level manager LevelManager::get()->finalizeLoading(); // setup the root node _rootSceneNode->addChild( LevelManager::get()->getTopNodeGroup().get() ); } // setup the shadow mananger now if ( GameState::get()->getMode() != GameState::Server ) { bool shadow = true; // if glsl is not available then disable dynamic shadow flag in configuration if ( !yaf3d::isGlslAvailable() ) { log_info << "Dynamic shadows disabled as GLSL is not available!" << std::endl; shadow = false; yaf3d::Configuration::get()->setSettingValue( YAF3D_GS_SHADOW_ENABLE, shadow ); yaf3d::Configuration::get()->store(); } bool shadowEnable = false; Configuration::get()->getSettingValue( YAF3D_GS_SHADOW_ENABLE, shadowEnable ); if ( shadow && shadowEnable ) { unsigned int shadowTexSizeX = 0, shadowTexSizeY = 0, shadowTexChannel = 0; yaf3d::Configuration::get()->getSettingValue( YAF3D_GS_SHADOW_TEXSIZEX, shadowTexSizeX ); yaf3d::Configuration::get()->getSettingValue( YAF3D_GS_SHADOW_TEXSIZEY, shadowTexSizeY ); yaf3d::Configuration::get()->getSettingValue( YAF3D_GS_SHADOW_TEXCHANNEL, shadowTexChannel ); ShadowManager::get()->setup( shadowTexSizeX, shadowTexSizeY, shadowTexChannel ); } } // store sound manager reference for faster access in loop _p_soundManager = SoundManager::get(); // from now on game state can handle application window state changes _p_gameState->initAppWindowStateHandler(); // setup local app window state handler _p_appWindowStateHandler = new AppWindowStateHandler( this ); return true; }