#include "data/worldmap/MapFileSerializer.h" #include "common/LzsFile.h" namespace QGears { const int kWorldMapBlockSize = 0xB800; MapFileSerializer::MapFileSerializer() { } MapFileSerializer::~MapFileSerializer() { } void MapFileSerializer::importMapFile( Ogre::DataStreamPtr& stream, WorldMapFile& dest ) { const auto fileSize = stream->size(); auto numBlocks = fileSize / kWorldMapBlockSize; for ( unsigned int j=0; jseek( basePos ); // Read the offset to compressed data in this block BlockHeader header = {}; for ( auto i=0u; i<16; i++) { readUInt32( stream, header.mCompressedDataOffsets[i] ); } for ( auto i=0u; i<16; i++) { SBlockPart blockPart; // Go to the offset stream->seek( basePos + header.mCompressedDataOffsets[i] ); // Read the size of the compressed data uint32 compressedDataSize = 0; readUInt32( stream, compressedDataSize ); // Go back to before the compressed data size stream->seek( basePos + header.mCompressedDataOffsets[i] ); // Read the compressed data into a temp buffer, including the compressed data size std::vector buffer( compressedDataSize + 4 ); stream->read(buffer.data(), buffer.size()); // Decompress the data auto decompressed = LzsBuffer::Decompress(buffer); Ogre::MemoryDataStream decStream(decompressed.data(), decompressed.size(), false, true); readUInt16(decStream, blockPart.mHeader.NumberOfTriangles); readUInt16(decStream, blockPart.mHeader.NumberOfVertices); /* std::cout << "block: " << j << " from offset " << header.mCompressedDataOffsets[i] << " old size: " << buffer.size() << " decompressed size is " << decompressed.size() << " header is tris: " << blockPart.mHeader.NumberOfTriangles << " verts " << blockPart.mHeader.NumberOfVertices << std::endl;*/ blockPart.mTris.resize(blockPart.mHeader.NumberOfTriangles); for ( int k=0; k