bool CFileLoader::LoadAtomicFile(RwStream* stream, uint32_t modelIndex) { CAtomicModelInfo* info = CModelInfo::GetModelInfo(modelIndex)->AsAtomicModelInfoPtr(); v4 = 0; if (info && info->flags & 0x8000) { v4 = 1; CVehicleModelInfo::UseCommonVehicleTexDicationary(); } if (RwStreamFindChunk(stream, 16, NULL, NULL)) { RpClump* read = RpClumpStreamRead(stream); if (!read) { if (v4) { CVehicleModelInfo::StopUsingCommonVehicleTexDicationary(); } return false; } relatedModelIndex = modelIndex; RpClumpForAllAtomics(read, SetRelatedModelInfoCB, read); RpClumpDestroy(read); } if (!info->GetRwObject()) { return false; } if (v4) { CVehicleModelInfo::StopUsingCommonVehicleTexDicationary(); } return true; }
///////////////////////////////////////////////////////////////////////////// // // CRenderWareSA::RightSizeTxd // // Check textures in a txd and shrink if required. // Returns true if shrunk file was written // ///////////////////////////////////////////////////////////////////////////// bool CRenderWareSA::RightSizeTxd( const SString& strInTxdFilename, const SString& strOutTxdFilename, uint uiSizeLimit ) { // // Read txd from memory // RwStream* pStream = RwStreamOpen( STREAM_TYPE_FILENAME, STREAM_MODE_READ, *strInTxdFilename ); if ( pStream == NULL ) return false; // Find our txd chunk if ( RwStreamFindChunk( pStream, 0x16, NULL, NULL ) == false ) { RwStreamClose( pStream, NULL ); return false; } // read the txd RwTexDictionary* pTxd = RwTexDictionaryGtaStreamRead( pStream ); RwStreamClose( pStream, NULL ); if ( !pTxd ) return false; // // Process each texture in the txd // std::vector < RwTexture* > textureList; pGame->GetRenderWareSA()->GetTxdTextures( textureList, pTxd ); bool bChanged = false; for ( std::vector < RwTexture* > ::iterator iter = textureList.begin() ; iter != textureList.end() ; iter++ ) { RwTexture* pTexture = *iter; RwTexture* pNewRwTexture = RightSizeTexture( pTexture, uiSizeLimit ); if ( pNewRwTexture && pNewRwTexture != pTexture ) { // Replace texture in txd if changed RwTextureDestroy( pTexture ); RwTexDictionaryAddTexture( pTxd, pNewRwTexture ); bChanged = true; } else { // Keep texture (Reinsert to preserve order for easier debugging) RwTexDictionaryRemoveTexture( pTxd, pTexture ); RwTexDictionaryAddTexture( pTxd, pTexture ); } } // // Save shrunked txd if changed // if ( bChanged ) { pStream = RwStreamOpen( STREAM_TYPE_FILENAME, STREAM_MODE_WRITE, *strOutTxdFilename ); if ( pStream ) { RwTexDictionaryStreamWrite( pTxd, pStream ); RwStreamClose( pStream, NULL ); RwTexDictionaryDestroy( pTxd ); return true; } } RwTexDictionaryDestroy( pTxd ); return false; }