MapFileSerializer.cpp 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146
  1. #include "data/worldmap/MapFileSerializer.h"
  2. #include "common/LzsFile.h"
  3. namespace QGears {
  4. const int kWorldMapBlockSize = 0xB800;
  5. MapFileSerializer::MapFileSerializer()
  6. {
  7. }
  8. MapFileSerializer::~MapFileSerializer()
  9. {
  10. }
  11. void MapFileSerializer::importMapFile( Ogre::DataStreamPtr& stream, WorldMapFile& dest )
  12. {
  13. const auto fileSize = stream->size();
  14. auto numBlocks = fileSize / kWorldMapBlockSize;
  15. for ( unsigned int j=0; j<numBlocks; j++ )
  16. {
  17. SBlock block;
  18. const size_t basePos = kWorldMapBlockSize*j;
  19. stream->seek( basePos );
  20. // Read the offset to compressed data in this block
  21. BlockHeader header = {};
  22. for ( auto i=0u; i<16; i++)
  23. {
  24. readUInt32( stream, header.mCompressedDataOffsets[i] );
  25. }
  26. for ( auto i=0u; i<16; i++)
  27. {
  28. SBlockPart blockPart;
  29. // Go to the offset
  30. stream->seek( basePos + header.mCompressedDataOffsets[i] );
  31. // Read the size of the compressed data
  32. uint32 compressedDataSize = 0;
  33. readUInt32( stream, compressedDataSize );
  34. // Go back to before the compressed data size
  35. stream->seek( basePos + header.mCompressedDataOffsets[i] );
  36. // Read the compressed data into a temp buffer, including the compressed data size
  37. std::vector<uint8> buffer( compressedDataSize + 4 );
  38. stream->read(buffer.data(), buffer.size());
  39. // Decompress the data
  40. auto decompressed = LzsBuffer::Decompress(buffer);
  41. Ogre::MemoryDataStream decStream(decompressed.data(), decompressed.size(), false, true);
  42. readUInt16(decStream, blockPart.mHeader.NumberOfTriangles);
  43. readUInt16(decStream, blockPart.mHeader.NumberOfVertices);
  44. /*
  45. std::cout << "block: " << j
  46. << " from offset " << header.mCompressedDataOffsets[i]
  47. << " old size: " << buffer.size()
  48. << " decompressed size is " << decompressed.size()
  49. << " header is tris: " << blockPart.mHeader.NumberOfTriangles
  50. << " verts " << blockPart.mHeader.NumberOfVertices
  51. << std::endl;*/
  52. blockPart.mTris.resize(blockPart.mHeader.NumberOfTriangles);
  53. for ( int k=0; k<blockPart.mHeader.NumberOfTriangles; k++)
  54. {
  55. BlockTriangle& s = blockPart.mTris[k];
  56. readUInt8( decStream, s.Vertex0Index );
  57. readUInt8( decStream, s.Vertex1Index );
  58. readUInt8( decStream, s.Vertex2Index );
  59. readUInt8( decStream, s.WalkabilityInfo );
  60. //readUInt8( decStream, s.Unknown );
  61. readUInt8( decStream, s.uVertex0 );
  62. readUInt8( decStream, s.vVertex0 );
  63. readUInt8( decStream, s.uVertex1 );
  64. readUInt8( decStream, s.vVertex1 );
  65. readUInt8( decStream, s.uVertex2 );
  66. readUInt8( decStream, s.vVertex2 );
  67. readUInt16( decStream, s.TextureInfo );
  68. s.TextureInfo = s.TextureInfo & 0x1FF;
  69. //readUInt16( decStream, s.Location );
  70. /*
  71. std::cout << "v0: " << int(s.Vertex0Index)
  72. << " v1 " << int(s.Vertex1Index)
  73. << " v2 " << int(s.Vertex2Index)
  74. << " walk " << int(s.WalkabilityInfo)
  75. << " u1 " << int(s.uVertex1)
  76. << " v1 " << int(s.vVertex1)
  77. << " v2 " << int(s.uVertex2)
  78. << " u2 " << int(s.vVertex2)
  79. << " texture " << s.TextureInfo
  80. << " locId " << s.Location
  81. << std::endl;*/
  82. }
  83. blockPart.mNormal.resize( blockPart.mHeader.NumberOfVertices );
  84. blockPart.mVertices.resize( blockPart.mHeader.NumberOfVertices );
  85. // All verts
  86. for ( int k=0; k<blockPart.mHeader.NumberOfVertices; k++)
  87. {
  88. Vertex& v = blockPart.mVertices[k];
  89. readInt16( decStream, v.X );
  90. readInt16( decStream, v.Y );
  91. readInt16( decStream, v.Z );
  92. readUInt16( decStream, v.Unused );
  93. }
  94. // Then all normals
  95. for ( int k=0; k<blockPart.mHeader.NumberOfVertices; k++)
  96. {
  97. Normal& n = blockPart.mNormal[k];
  98. readInt16( decStream, n.X );
  99. readInt16( decStream, n.Y );
  100. readInt16( decStream, n.Z );
  101. readUInt16( decStream, n.Unused );
  102. }
  103. block.mMeshes.push_back( blockPart );
  104. }
  105. mBlocks.push_back(block);
  106. }
  107. }
  108. } // namespace QGears