void trpgrImageHelper::Init(trpgEndian inNess,char *inDir, const trpgMatTable &inMatTable,const trpgTexTable &inTexTable,bool separateGeoTyp) { ness = inNess; strcpy(dir,inDir); this->separateGeoTyp = separateGeoTyp; matTable = &inMatTable; texTable = &inTexTable; // Set up the texture cache // It doesn't do anything until it's called anyway char fullBase[1024]; sprintf(fullBase,"%s" PATHSEPERATOR "texFile",dir); texCache = GetNewRAppFileCache(fullBase,"txf"); if(separateGeoTyp) { sprintf(fullBase,"%s" PATHSEPERATOR "geotypFile",dir); geotypCache = GetNewRAppFileCache(fullBase,"txf"); } else { geotypCache = texCache; } }
// Read Header // Run through the rest of the header information bool trpgr_Archive::ReadHeader(bool readAllBlocks) { int ret; if (!fp || headerRead) return false; headerRead = true; // Next int64 should be the header size trpgEndian cpuNess = trpg_cpu_byte_order(); int32 headerSize; if (fread(&headerSize,sizeof(int32),1,fp) != 1) return false; if (ness != cpuNess) headerSize = trpg_byteswap_int(headerSize); int headLen = headerSize; if (headLen < 0) return false; // Read in the header whole trpgMemReadBuffer buf(ness); buf.SetLength(headLen); char *data = buf.GetDataPtr(); if ((ret = GetHeaderData(data,headLen,fp)) != headLen) return false; // Set up a parser // Catch the tables we need for the archive trpgMatTable1_0 oldMatTable; trpgTexTable1_0 oldTexTable; trpgr_Parser parser; parser.AddCallback(TRPGHEADER,&header); parser.AddCallback(TRPGMATTABLE,&materialTable); // Went back to oldest style for 2.0 parser.AddCallback(TRPGMATTABLE2,&oldMatTable); // Added 11-14-98 (1.0 material table) parser.AddCallback(TRPGTEXTABLE,&oldTexTable); parser.AddCallback(TRPGTEXTABLE2,&texTable); // Added for 2.0 parser.AddCallback(TRPGMODELTABLE,&modelTable); parser.AddCallback(TRPGLIGHTTABLE,&lightTable); // Added for 2.0 parser.AddCallback(TRPGRANGETABLE,&rangeTable); // Added for 2.0 parser.AddCallback(TRPG_TEXT_STYLE_TABLE,&textStyleTable); // Added for 2.1 parser.AddCallback(TRPG_SUPPORT_STYLE_TABLE,&supportStyleTable); parser.AddCallback(TRPG_LABEL_PROPERTY_TABLE,&labelPropertyTable); // Don't read the tile table for v1.0 archives // It's only really used for 2.0 archives parser.AddCallback(TRPGTILETABLE2,&tileTable); // Parse the buffer if (!parser.Parse(buf)) return false; if(header.GetIsMaster()) { // bool firstBlock = true; //if the master has textures, we want to use them instead of the tables in the //block archives // int numTiles = 0; //tileTable. int totalrows,totalcols; trpg2dPoint mhdr_swExtents; trpg2dPoint mhdr_neExtents; trpg3dPoint mhdr_Origin; // integrate header information from the block header. header.GetExtents(mhdr_swExtents,mhdr_neExtents); header.GetOrigin(mhdr_Origin); header.GetBlocks(totalrows,totalcols); if(readAllBlocks) { for(int row=0;row<totalrows;row++) { for(int col=0;col<totalcols;col++) { // Read each block -- Warning, this can take a while!!! ReadSubArchive( row, col, cpuNess); } } } else { ReadSubArchive( 0, 0, cpuNess);//Get the first archive! } } tileTable.SetCurrentBlock(-1,-1,false); // 1.0 Compatibility // If we see an older style material table, convert it to the new style // This isn't terribly memory efficient, but it does work if (oldMatTable.isValid()) materialTable = oldMatTable; if (oldTexTable.isValid()) texTable = oldTexTable; // Set up a tile cache, if needed trpgTileTable::TileMode tileMode; tileTable.GetMode(tileMode); if (tileMode == trpgTileTable::Local) { if (tileCache) delete tileCache; char fullBase[1060]; sprintf(fullBase,"%s" PATHSEPERATOR "tileFile",dir); tileCache = GetNewRAppFileCache(fullBase,"tpf"); } valid = true; return true; }