Tiberian Sun Iso tiles now load into the placement dialog editor.

This commit is contained in:
Justin Marshall
2020-06-30 12:17:42 -07:00
parent 9808598a07
commit f6beb9b4ee
4 changed files with 263 additions and 255 deletions
-104
View File
@@ -29,112 +29,8 @@
using std::memcpy;
class GraphicViewPortClass;
struct IsoTileHeader_t {
int TileWidth;
int TileHeight;
int TileImageWidth;
int TileImageHeight;
};
byte TempTSStampData[48 * 24 * 4];
struct IsoTileImageHeader
{
int TileX;
int TileY;
uint8_t* GetExtraData(IsoTile *tile)
{
return reinterpret_cast<uint8_t*>(tile) + ExtraOffset;
}
uint8_t* GetZData(IsoTile* tile)
{
return reinterpret_cast<uint8_t*>(tile) + ZDataoffset;
}
uint8_t* GetExtraZData(IsoTile* tile)
{
return reinterpret_cast<uint8_t*>(tile) + ExtraZOffset;
}
uint8_t* GetData() {
return reinterpret_cast<uint8_t*>(this) + sizeof(IsoTileImageHeader);
}
// https://xhp.xwis.net/documents/TMP_TS_Format.html
uint8_t* GetRasterizedData() {
memset(TempTSStampData, 0, sizeof(TempTSStampData));
uint8_t* tileData = GetData();
byte* w_line = TempTSStampData;
int x = 24;
int global_cx = 48;
int cx = 0;
for (int y = 0; y < 12; y++)
{
cx += 4;
x -= 2;
memcpy(w_line + x, tileData, cx);
tileData += cx;
w_line += global_cx;
}
for (; y < 23; y++)
{
cx -= 4;
x += 2;
memcpy(w_line + x, tileData, cx);
tileData += cx;
w_line += global_cx;
}
return TempTSStampData;
}
int32_t ExtraOffset;
int32_t ZDataoffset;
int32_t ExtraZOffset;
signed int ExtraX;
signed int ExtraY;
int ExtraWidth;
int ExtraHeight;
struct Flags
{
unsigned int HasExtraData : 1; //1
unsigned int HasZData : 1; //2
unsigned int HasDamagedData : 1; //4
// invalid cause memory wasn'y cleared so all bitfields are at 0xCD by default
//unsigned int Bit8 : 1; //8
//unsigned int Bit16 : 1; //16
//unsigned int Bit32 : 1; //32
//unsigned int Bit64 : 1; //64
//unsigned int Bit128 : 1; //128
};
unsigned char Height;
unsigned char TileType;
unsigned char RampType;
RGBClass LowRGB;
RGBClass HighRGB;
unsigned char Padding[3];
};
class IsoTile {
public:
int TileImageWidth() { return header.TileImageWidth; }
int TileImageHeight() { return header.TileImageHeight; }
IsoTileImageHeader *GetTileInfo(int idx) {
uint8_t* ptr = reinterpret_cast<uint8_t*>(this);
ptr += sizeof(IsoTileHeader_t);
uint32_t* offsets = (uint32_t*)ptr;
IsoTileImageHeader* tileImageHeaders = (IsoTileImageHeader * )(((uint8_t*)this) + offsets[idx]);
return tileImageHeaders;
}
int NumTiles(void) { return header.TileWidth * header.TileHeight; }
private:
IsoTileHeader_t header;
};
Image_t* Load_StampHD(int theater, const char* iconName, const void* icondata) {
char filename[2048];
Image_t* image = NULL;