TxzFileSerializer.h 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. #ifndef _TXZ_FILE_SERIALIZER_H_
  2. #define _TXZ_FILE_SERIALIZER_H_
  3. #include "common/TypeDefine.h"
  4. #include "data/QGearsSerializer.h"
  5. #include <array>
  6. namespace QGears {
  7. class TxzFile;
  8. class TxzFileSerializer : public Serializer
  9. {
  10. public:
  11. #ifdef _MSC_VER
  12. #pragma pack(push)
  13. #pragma pack(1)
  14. #endif
  15. struct wm_texture
  16. {
  17. unsigned int clutx:6;
  18. unsigned int cluty:10;
  19. unsigned int tx:4;
  20. unsigned int ty:1;
  21. unsigned int abr:2;
  22. unsigned int tp:2;
  23. unsigned int reserved:7;
  24. #ifdef _MSC_VER
  25. };
  26. #pragma pack(pop)
  27. #else
  28. // Assume GCC
  29. } __attribute__((packed));
  30. #endif
  31. #ifdef _MSC_VER
  32. #pragma pack(push)
  33. #pragma pack(1)
  34. #endif
  35. struct psx_pixel
  36. {
  37. uint16 r:5;
  38. uint16 g:5;
  39. uint16 b:5;
  40. uint16 trans:1;
  41. #ifdef _MSC_VER
  42. };
  43. #pragma pack(pop)
  44. #else
  45. // Assume GCC
  46. } __attribute__((packed));
  47. #endif
  48. #ifdef _MSC_VER
  49. #pragma pack(push)
  50. #pragma pack(1)
  51. #endif
  52. struct psx_pixel_4bit
  53. {
  54. uint8 index1:4;
  55. uint8 index2:4;
  56. #ifdef _MSC_VER
  57. };
  58. #pragma pack(pop)
  59. #else
  60. // Assume GCC
  61. } __attribute__((packed));
  62. #endif
  63. #ifdef _MSC_VER
  64. #pragma pack(push)
  65. #pragma pack(1)
  66. #endif
  67. struct rgba
  68. {
  69. unsigned char r = 0;
  70. unsigned char g = 0;
  71. unsigned char b = 0;
  72. unsigned char a = 0;
  73. #ifdef _MSC_VER
  74. };
  75. #pragma pack(pop)
  76. #else
  77. // Assume GCC
  78. } __attribute__((packed));
  79. #endif
  80. struct vram_block
  81. {
  82. uint32 mBlockSize = 0;
  83. uint16 mDstX = 0;
  84. uint16 mDstY = 0;
  85. uint16 mWidth = 0;
  86. uint16 mHeight = 0;
  87. // Data is w*h*2
  88. std::vector<uint8> mPixels;
  89. };
  90. TxzFileSerializer();
  91. virtual ~TxzFileSerializer();
  92. void import( Ogre::DataStreamPtr& stream, TxzFile& dest );
  93. std::vector<std::vector<rgba>> GetWorldMapTexture(uint32 id);
  94. private:
  95. std::vector<vram_block> mVramBlocks;
  96. void import_decompressed( Ogre::DataStream& stream, TxzFile& dest);
  97. void import_texture_section( Ogre::DataStream& stream, TxzFile& dest, size_t sectionEnd);
  98. void extract_texture(const std::array<wm_texture,512>& palTable);
  99. std::map<uint32, std::vector<std::vector<rgba>>> mTextures;
  100. };
  101. static_assert(sizeof(TxzFileSerializer::wm_texture)==4, "wm_texture is not packed");
  102. static_assert(sizeof(TxzFileSerializer::psx_pixel)==2, "psx_pixel is not packed");
  103. } // namespace QGears
  104. #endif // _TXZ_FILE_SERIALIZER_H_