void FileChangeMonitor::Update() { for (uint32 k=0; k < m_changes.size(); ++k) { gkNormalizePath(m_changes[k]); for (uint32 i=0; i < m_listeners.size(); ++i) { if (m_listeners[i] != NULL) { m_listeners[i]->OnFileChange(m_changes[k].c_str()); } } } m_changes.clear(); }
bool gkPak::checkPakFile(const TCHAR* pszRelFilename) { // NORMALIZE THE FILENAME gkStdString finalpath(pszRelFilename); gkNormalizePath( finalpath ); // UNICODE SHOULD TRANSLATE #ifdef UNICODE char buffer[MAX_PATH]; WideCharToMultiByte(CP_ACP, 0, finalpath.c_str(), -1, buffer, MAX_PATH, NULL, NULL); uint32 crc32 = gkPak::s_crcGenerator.GetCRC32Lowercase( buffer ); #else uint32 crc32 = gkPak::s_crcGenerator.GetCRC32Lowercase( finalpath.c_str() ); #endif gkPakRecordMap::iterator it = m_pakMap.find( crc32 ); if ( it != m_pakMap.end() ) { return true; } return false; }
bool gkPak::openPakFile( const TCHAR* pszRelFilename, char** pData, size_t &size ) { // NORMALIZE THE FILENAME gkStdString finalpath(pszRelFilename); gkNormalizePath( finalpath ); // UNICODE SHOULD TRANSLATE #ifdef UNICODE char buffer[MAX_PATH]; WideCharToMultiByte(CP_ACP, 0, finalpath.c_str(), -1, buffer, MAX_PATH, NULL, NULL); uint32 crc32 = gkPak::s_crcGenerator.GetCRC32Lowercase( buffer ); #else uint32 crc32 = gkPak::s_crcGenerator.GetCRC32Lowercase( finalpath.c_str() ); #endif gkPakRecordMap::iterator it = m_pakMap.find( crc32 ); if ( it != m_pakMap.end() ) { // 如果size不为0, 这里就是读文件头 [3/24/2013 Kaiming] bool readHeader = true; if (size == 0) { readHeader = false; } if ( size == 0 || size > it->second.size) { size = it->second.size; } // read the data char* pTmp = new char[size]; ////////////////////////////////////////////////////////////////////////// // 文件操作,加锁 { gkAutoLock<gkCritcalSectionLock> lock(eLGID_global, eLID_file_seek ); // find it fseek(m_handle, m_pakHeader.m_data_offset + it->second.start, SEEK_SET); } size_t BytesRead = fread(pTmp, 1, size, m_handle); //fseek(m_handle, 0, SEEK_SET); ////////////////////////////////////////////////////////////////////////// if (BytesRead != size) { delete [] pTmp; size = 0; } else if (readHeader) { // 读文件头,直接返回了 *pData = pTmp; return true; } else { // 读取到了一个文件的数据,判断是否经过压缩 [3/7/2013 Kaiming] if (it->second.compressHeaderSize != 0) { float decompress_start = gEnv->pTimer->GetAsyncCurTime(); char* pTmpUnCompressed = new char[it->second.compressHeaderSize]; size_t unCompressedSize = it->second.compressHeaderSize - GKPAK_UNCOMPRESS_HEADER_SIZE; size_t realSize = size - LZMA_PROPS_SIZE - GKPAK_UNCOMPRESS_HEADER_SIZE; // 前1KB是不压缩的 // | UNCOMPRESS 1024 | HEADER | COMPRESSED memcpy( pTmpUnCompressed, pTmp, GKPAK_UNCOMPRESS_HEADER_SIZE); //ELzmaStatus status; //SRes res = LzmaDecode((unsigned char*)pTmpUnCompressed, &unCompressedSize, (unsigned char*)(pTmp + LZMA_PROPS_SIZE), &realSize, (unsigned char*)pTmp, LZMA_PROPS_SIZE, LZMA_FINISH_END, &status, &g_Alloc); SRes res = LzmaUncompress( (unsigned char*)pTmpUnCompressed + GKPAK_UNCOMPRESS_HEADER_SIZE, &unCompressedSize, (unsigned char*)(pTmp + LZMA_PROPS_SIZE + GKPAK_UNCOMPRESS_HEADER_SIZE), &realSize, (unsigned char*)pTmp + GKPAK_UNCOMPRESS_HEADER_SIZE, LZMA_PROPS_SIZE ); if (res == SZ_OK && (unCompressedSize + GKPAK_UNCOMPRESS_HEADER_SIZE) == it->second.compressHeaderSize) { *pData = pTmpUnCompressed; size = unCompressedSize + GKPAK_UNCOMPRESS_HEADER_SIZE; delete[] pTmp; } else { *pData = pTmp; delete[] pTmpUnCompressed; } decompress_start = gEnv->pTimer->GetAsyncCurTime() - decompress_start; #ifdef OS_WIN32 uint32 threadid = ::GetCurrentThreadId(); if ( threadid == gEnv->pSystemInfo->mainThreadId) { gkLogMessage( _T("thread[main] lzma-dec [%s] using %.2fms"), finalpath.c_str(), decompress_start * 1000); } else { gkLogMessage( _T("thread[%d] lzma-dec [%s] using %.2fms"), threadid, finalpath.c_str(), decompress_start * 1000); } #endif } else { *pData = pTmp; } return true; } } else { return false; } return false; }
bool gkSystem::Init( ISystemInitInfo& sii ) { gkLogMessage(_T("Initializing gkSystem...")); std::vector<gkStdString> result; gkStdString path; #ifdef OS_IOS path = gkGetExecRootDir(); #else path = gkGetExecRootDir() + _T("paks/"); #endif enum_all_files_in_folder(path.c_str(), result, false); for (int i=0; i < result.size(); ++i) { gkStdString file = result[i]; const TCHAR* strLastSlash = _tcsrchr( file.c_str(), _T( '.' ) ); if( strLastSlash ) { if ( !_tcsicmp( strLastSlash, _T(".gpk") ) ) { gkNormalizePath(file); gkStdString filename = gkGetFilename( file.c_str() ); #ifdef OS_IOS #else file = _T("/paks") + file; #endif gkLogMessage( _T("pak file [%s] loaded."), filename.c_str() ); m_ResFileManager.openPak( file.c_str() ); } } } #ifdef OS_WIN32 m_fileMonitor = new FileChangeMonitor(); m_fileMonitor->StartMonitor(); gEnv->pFileChangeMonitor = m_fileMonitor; #endif m_bEditor = (sii.hInstance != 0); //CrashRptHead(); m_bIsSceneEmpty = true; /************************************************************************/ /* Module Loading /************************************************************************/ #ifdef WIN32 TCHAR wszRenderDll[MAX_PATH] = _T("gkRendererD3D9"); if (!IsEditor()) { gkStdString cfgfile = gkGetExecRootDir() + _T("media/config/startup.cfg"); GetPrivateProfileString( _T("launcher"), _T("renderer"), _T("gkRendererD3D9"), wszRenderDll, MAX_PATH, cfgfile.c_str() ); } #else TCHAR wszRenderDll[MAX_PATH] = _T("gkRendererGLES2"); #endif #ifndef _STATIC_LIB if ( !_tcsicmp( wszRenderDll, _T("gkRendererD3D9") )) { LOAD_MODULE_GLOBAL( m_moduleHandles.hRenderer, gkRendererD3D9 ); } else if ( !_tcsicmp( wszRenderDll, _T("gkRendererGLES2") ) ) { LOAD_MODULE_GLOBAL( m_moduleHandles.hRenderer, gkRendererGLES2 ); } else if ( !_tcsicmp( wszRenderDll, _T("gkRendererGL330") ) ) { LOAD_MODULE_GLOBAL( m_moduleHandles.hRenderer, gkRendererGL330 ); } #else //LOAD_MODULE_GLOBAL( m_moduleHandles.hRenderer, gkRendererGLES2 ); #ifdef OS_APPLE LOAD_MODULE_GLOBAL( m_moduleHandles.hRenderer, gkRendererGL330 ); #elif defined( OS_IOS ) LOAD_MODULE_GLOBAL( m_moduleHandles.hRenderer, gkRendererGLES2 ); #else LOAD_MODULE_GLOBAL( m_moduleHandles.hRenderer, gkRendererD3D9 ); #endif #endif LOAD_MODULE_GLOBAL(m_moduleHandles.h3DEngine, gkCore); gEnv->p3DEngine->Init(); LOAD_MODULE_GLOBAL(m_moduleHandles.hInputLayer, gkInput); //LoadLib(m_moduleHandles.hNetworkLayer, _T("gkNetwork")); ////////////////////////////////////////////////////////////////////////// // load physics module #ifndef MUTE_PHYSICS # ifdef WIN32 TCHAR wszPhysicDll[MAX_PATH] = _T(""); gkStdString cfgfile = gkGetExecRootDir() + _T("media/config/startup.cfg"); GetPrivateProfileString( _T("launcher"), _T("physicsengine"), _T(""), wszPhysicDll, MAX_PATH, cfgfile.c_str() ); # else TCHAR wszPhysicDll[MAX_PATH] = _T("gkHavok"); # endif // WIN32 # ifndef _STATIC_LIB gkLoadModule( m_moduleHandles.hPhysics, wszPhysicDll ); # else //LOAD_MODULE_GLOBAL( m_moduleHandles.hPhysics, gkHavok ); # endif // _STATIC_LIB #endif // MUTE_PHYSICS ////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////// // load animation module { # ifdef WIN32 TCHAR wszAnimationDll[MAX_PATH] = _T("gkAnimationHavok"); gkStdString cfgfile = gkGetExecRootDir() + _T("media/config/startup.cfg"); GetPrivateProfileString( _T("launcher"), _T("animationengine"), _T("gkAnimationHavok"), wszAnimationDll, MAX_PATH, cfgfile.c_str() ); # else TCHAR wszAnimationDll[MAX_PATH] = _T("gkAnimationHavok"); # endif // WIN32 #ifdef OS_APPLE #else # ifndef _STATIC_LIB gkLoadModule( m_moduleHandles.hAnimation, wszAnimationDll ); # else #if TARGET_OS_IPHONE LOAD_MODULE_GLOBAL( m_moduleHandles.hAnimation, gkAnimation ); #endif # endif // _STATIC_LIB #endif } ////////////////////////////////////////////////////////////////////////// LOAD_MODULE_GLOBAL(m_moduleHandles.hGameObjectSystem, gkGameObjectSystem); LOAD_MODULE_GLOBAL(m_moduleHandles.hFont, gkFont); #ifdef OS_WIN32 LOAD_MODULE_GLOBAL(m_moduleHandles.hTrackBus, gkTrackBus); LOAD_MODULE_GLOBAL(m_moduleHandles.hSound, gkSound); //LOAD_MODULE_GLOBAL(m_moduleHandles.hVideo, gkVideo); //LOAD_MODULE_GLOBAL(m_moduleHandles.hStereoDevice, gkStereoDevice); { TCHAR wszStereoDevDll[MAX_PATH] = _T("null"); gkStdString cfgfile = gkGetExecRootDir() + _T("media/config/startup.cfg"); GetPrivateProfileString( _T("launcher"), _T("stereodevice"), _T("null"), wszStereoDevDll, MAX_PATH, cfgfile.c_str() ); gkLoadModule( m_moduleHandles.hStereoDevice, wszStereoDevDll ); } #endif m_CVManager.initInput(); gkLogMessage(_T("CVar Manager Initialized.")); m_pSystemCVars = new gkSystemCVars; g_pSystemCVars = m_pSystemCVars; gkLogMessage(_T("System CVar Initialized.")); m_CVManager.reloadAllParameters(); // init Timer if (!m_Timer.Init(this)) return (false); m_Timer.ResetTimer(); gkLogMessage(_T("Timer Initialized.")); gkIniParser startupFile( _T("config/startup.cfg") ); startupFile.Parse(); gkStdString ret = startupFile.FetchValue( _T("launcher"), _T("width") ); if( !ret.empty() ) { gkStdStringstream ss(ret); ss >> sii.fWidth; }