From f6beb9b4ee44d486085bd2880132080ef75ea373 Mon Sep 17 00:00:00 2001 From: Justin Marshall Date: Tue, 30 Jun 2020 12:17:42 -0700 Subject: [PATCH] Tiberian Sun Iso tiles now load into the placement dialog editor. --- code/redalert/cdata.cpp | 269 +++++++++++++++++++------------------- code/redalert/defines.h | 36 ++--- code/redalert/image.h | 109 ++++++++++++++- code/redalert/tileset.cpp | 104 --------------- 4 files changed, 263 insertions(+), 255 deletions(-) diff --git a/code/redalert/cdata.cpp b/code/redalert/cdata.cpp index b20771f..a89995b 100644 --- a/code/redalert/cdata.cpp +++ b/code/redalert/cdata.cpp @@ -1769,102 +1769,102 @@ static TemplateTypeClass const WALL0049( TXT_INTERIOR ); -static TemplateTypeClass const Xtra0001( - TEMPLATE_XTRA0001, - THEATERF_INTERIOR, - "XTRA0001", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0002( - TEMPLATE_XTRA0002, - THEATERF_INTERIOR, - "XTRA0002", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0003( - TEMPLATE_XTRA0003, - THEATERF_INTERIOR, - "XTRA0003", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0004( - TEMPLATE_XTRA0004, - THEATERF_INTERIOR, - "XTRA0004", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0005( - TEMPLATE_XTRA0005, - THEATERF_INTERIOR, - "XTRA0005", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0006( - TEMPLATE_XTRA0006, - THEATERF_INTERIOR, - "XTRA0006", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0007( - TEMPLATE_XTRA0007, - THEATERF_INTERIOR, - "XTRA0007", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0008( - TEMPLATE_XTRA0008, - THEATERF_INTERIOR, - "XTRA0008", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0009( - TEMPLATE_XTRA0009, - THEATERF_INTERIOR, - "XTRA0009", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0010( - TEMPLATE_XTRA0010, - THEATERF_INTERIOR, - "XTRA0010", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0011( - TEMPLATE_XTRA0011, - THEATERF_INTERIOR, - "XTRA0011", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0012( - TEMPLATE_XTRA0012, - THEATERF_INTERIOR, - "XTRA0012", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0013( - TEMPLATE_XTRA0013, - THEATERF_INTERIOR, - "XTRA0013", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0014( - TEMPLATE_XTRA0014, - THEATERF_INTERIOR, - "XTRA0014", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0015( - TEMPLATE_XTRA0015, - THEATERF_INTERIOR, - "XTRA0015", - TXT_INTERIOR -); -static TemplateTypeClass const Xtra0016( - TEMPLATE_XTRA0016, - THEATERF_INTERIOR, - "XTRA0016", - TXT_INTERIOR -); +//static TemplateTypeClass const Xtra0001( +// TEMPLATE_XTRA0001, +// THEATERF_INTERIOR, +// "XTRA0001", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0002( +// TEMPLATE_XTRA0002, +// THEATERF_INTERIOR, +// "XTRA0002", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0003( +// TEMPLATE_XTRA0003, +// THEATERF_INTERIOR, +// "XTRA0003", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0004( +// TEMPLATE_XTRA0004, +// THEATERF_INTERIOR, +// "XTRA0004", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0005( +// TEMPLATE_XTRA0005, +// THEATERF_INTERIOR, +// "XTRA0005", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0006( +// TEMPLATE_XTRA0006, +// THEATERF_INTERIOR, +// "XTRA0006", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0007( +// TEMPLATE_XTRA0007, +// THEATERF_INTERIOR, +// "XTRA0007", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0008( +// TEMPLATE_XTRA0008, +// THEATERF_INTERIOR, +// "XTRA0008", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0009( +// TEMPLATE_XTRA0009, +// THEATERF_INTERIOR, +// "XTRA0009", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0010( +// TEMPLATE_XTRA0010, +// THEATERF_INTERIOR, +// "XTRA0010", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0011( +// TEMPLATE_XTRA0011, +// THEATERF_INTERIOR, +// "XTRA0011", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0012( +// TEMPLATE_XTRA0012, +// THEATERF_INTERIOR, +// "XTRA0012", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0013( +// TEMPLATE_XTRA0013, +// THEATERF_INTERIOR, +// "XTRA0013", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0014( +// TEMPLATE_XTRA0014, +// THEATERF_INTERIOR, +// "XTRA0014", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0015( +// TEMPLATE_XTRA0015, +// THEATERF_INTERIOR, +// "XTRA0015", +// TXT_INTERIOR +//); +//static TemplateTypeClass const Xtra0016( +// TEMPLATE_XTRA0016, +// THEATERF_INTERIOR, +// "XTRA0016", +// TXT_INTERIOR +//); #ifdef FIXIT_ANTS static TemplateTypeClass const AntHill( @@ -2135,22 +2135,22 @@ static void _Watcom_Ugh_Hack(void) (void)new TemplateTypeClass(Bridge1x); // TEMPLATE_BRIDGE1X (void)new TemplateTypeClass(Bridge2x); // TEMPLATE_BRIDGE2X - (void)new TemplateTypeClass(Xtra0001); // TEMPLATE_XTRA0001 - (void)new TemplateTypeClass(Xtra0002); // TEMPLATE_XTRA0002 - (void)new TemplateTypeClass(Xtra0003); // TEMPLATE_XTRA0003 - (void)new TemplateTypeClass(Xtra0004); // TEMPLATE_XTRA0004 - (void)new TemplateTypeClass(Xtra0005); // TEMPLATE_XTRA0005 - (void)new TemplateTypeClass(Xtra0006); // TEMPLATE_XTRA0006 - (void)new TemplateTypeClass(Xtra0007); // TEMPLATE_XTRA0007 - (void)new TemplateTypeClass(Xtra0008); // TEMPLATE_XTRA0008 - (void)new TemplateTypeClass(Xtra0009); // TEMPLATE_XTRA0009 - (void)new TemplateTypeClass(Xtra0010); // TEMPLATE_XTRA0010 - (void)new TemplateTypeClass(Xtra0011); // TEMPLATE_XTRA0011 - (void)new TemplateTypeClass(Xtra0012); // TEMPLATE_XTRA0012 - (void)new TemplateTypeClass(Xtra0013); // TEMPLATE_XTRA0013 - (void)new TemplateTypeClass(Xtra0014); // TEMPLATE_XTRA0014 - (void)new TemplateTypeClass(Xtra0015); // TEMPLATE_XTRA0015 - (void)new TemplateTypeClass(Xtra0016); // TEMPLATE_XTRA0016 + //(void)new TemplateTypeClass(Xtra0001); // TEMPLATE_XTRA0001 + //(void)new TemplateTypeClass(Xtra0002); // TEMPLATE_XTRA0002 + //(void)new TemplateTypeClass(Xtra0003); // TEMPLATE_XTRA0003 + //(void)new TemplateTypeClass(Xtra0004); // TEMPLATE_XTRA0004 + //(void)new TemplateTypeClass(Xtra0005); // TEMPLATE_XTRA0005 + //(void)new TemplateTypeClass(Xtra0006); // TEMPLATE_XTRA0006 + //(void)new TemplateTypeClass(Xtra0007); // TEMPLATE_XTRA0007 + //(void)new TemplateTypeClass(Xtra0008); // TEMPLATE_XTRA0008 + //(void)new TemplateTypeClass(Xtra0009); // TEMPLATE_XTRA0009 + //(void)new TemplateTypeClass(Xtra0010); // TEMPLATE_XTRA0010 + //(void)new TemplateTypeClass(Xtra0011); // TEMPLATE_XTRA0011 + //(void)new TemplateTypeClass(Xtra0012); // TEMPLATE_XTRA0012 + //(void)new TemplateTypeClass(Xtra0013); // TEMPLATE_XTRA0013 + //(void)new TemplateTypeClass(Xtra0014); // TEMPLATE_XTRA0014 + //(void)new TemplateTypeClass(Xtra0015); // TEMPLATE_XTRA0015 + //(void)new TemplateTypeClass(Xtra0016); // TEMPLATE_XTRA0016 #ifdef FIXIT_ANTS (void)new TemplateTypeClass(AntHill); // TEMPLATE_ROAD36 @@ -2495,29 +2495,30 @@ void TemplateTypeClass::Display(int x, int y, WindowNumberType window, HousesTyp int index; bool scale; // Should the template be half sized? - w = Bound(Width, 1, 13); - h = Bound(Height, 1, 8); - scale = (w > 3 || h > 3); - if (scale) { - x -= (w * ICON_PIXEL_W) / 4; - y -= (h * ICON_PIXEL_H) / 4; - } else { - x -= (w * ICON_PIXEL_W) / 2; - y -= (h * ICON_PIXEL_H) / 2; - } - x += WindowList[window][WINDOWX]; - y += WindowList[window][WINDOWY]; + Image_t* img = Get_HDImage_Data(); - IconsetClass const * iconset = (IconsetClass const *)Get_Image_Data(); - unsigned char const * map = iconset->Map_Data(); + w = Bound(img->width, 1, 13); + h = Bound(img->height, 1, 8); + //scale = (w > 3 || h > 3); + //if (scale) { + // x -= (w * ICON_PIXEL_W) / 4; + // y -= (h * ICON_PIXEL_H) / 4; + //} else { + // x -= (w * ICON_PIXEL_W) / 2; + // y -= (h * ICON_PIXEL_H) / 2; + //} + //x += WindowList[window][WINDOWX]; + //y += WindowList[window][WINDOWY]; - for (index = 0; index < w*h; index++) { - if (map[index] != 0xFF) { - Image_t* image = Get_HDImage_Data(); - int stamp_index = Stamp_GetIconIndex(image, index); + //IconsetClass const * iconset = (IconsetClass const *)Get_Image_Data(); + //unsigned char const * map = iconset->Map_Data(); - GL_RenderForeGroundImage(image, x + ((index % w) * (ICON_PIXEL_W / 2)), y + ((index / w) * (ICON_PIXEL_H / 2)), ICON_PIXEL_W / 2, ICON_PIXEL_H / 2, 0, stamp_index); - } + for (index = 0; index < img->isoTileInfo->NumTiles(); index++) { + IsoTileImageHeader* isoImage = img->isoTileInfo->GetTileInfo(index); + if (isoImage == NULL) + continue; + + GL_RenderForeGroundImage(img, x + isoImage->TileX, y + isoImage->TileY, ICON_PIXEL_W, ICON_PIXEL_H, 0, index); } } @@ -2544,6 +2545,10 @@ void TemplateTypeClass::Display(int x, int y, WindowNumberType window, HousesTyp void TemplateTypeClass::Prep_For_Add(void) { for (TemplateType index = TEMPLATE_CLEAR1; index < TEMPLATE_COUNT; index++) { +// jmarshall + if (index > TEMPLATE_SHORE41) + return; +// jmarshall end if (As_Reference(index).Get_Image_Data()) { Map.Add_To_List(&As_Reference(index)); } diff --git a/code/redalert/defines.h b/code/redalert/defines.h index cf0cbbf..fc7d391 100644 --- a/code/redalert/defines.h +++ b/code/redalert/defines.h @@ -2121,24 +2121,24 @@ typedef enum TemplateType : unsigned short { TEMPLATE_BRIDGE_2AX, TEMPLATE_BRIDGE1X, TEMPLATE_BRIDGE2X, - - TEMPLATE_XTRA0001, - TEMPLATE_XTRA0002, - TEMPLATE_XTRA0003, - TEMPLATE_XTRA0004, - TEMPLATE_XTRA0005, - TEMPLATE_XTRA0006, - TEMPLATE_XTRA0007, - TEMPLATE_XTRA0008, - TEMPLATE_XTRA0009, - TEMPLATE_XTRA0010, - TEMPLATE_XTRA0011, - TEMPLATE_XTRA0012, - TEMPLATE_XTRA0013, - TEMPLATE_XTRA0014, - TEMPLATE_XTRA0015, - TEMPLATE_XTRA0016, - +// jmarshall + //TEMPLATE_XTRA0001, + //TEMPLATE_XTRA0002, + //TEMPLATE_XTRA0003, + //TEMPLATE_XTRA0004, + //TEMPLATE_XTRA0005, + //TEMPLATE_XTRA0006, + //TEMPLATE_XTRA0007, + //TEMPLATE_XTRA0008, + //TEMPLATE_XTRA0009, + //TEMPLATE_XTRA0010, + //TEMPLATE_XTRA0011, + //TEMPLATE_XTRA0012, + //TEMPLATE_XTRA0013, + //TEMPLATE_XTRA0014, + //TEMPLATE_XTRA0015, + //TEMPLATE_XTRA0016, +// jmarshall end #ifdef FIXIT_ANTS TEMPLATE_HILL01, #endif diff --git a/code/redalert/image.h b/code/redalert/image.h index d400d1d..752de93 100644 --- a/code/redalert/image.h +++ b/code/redalert/image.h @@ -5,6 +5,8 @@ #define MAX_IMAGE_FRAMES 12 #define MAX_HOUSE_COLORS 8 +#include "rgb.h" + struct HouseImage_t { unsigned int image[MAX_IMAGE_SHAPES][MAX_IMAGE_FRAMES]; }; @@ -51,4 +53,109 @@ bool Image_Add32BitImage(const char* name, Image_t* image, int HouseId, int Shap Image_t* Image_CreateBlankImage(const char* name, int width, int height); void Image_UploadRaw(Image_t* image, uint8_t* data, bool paletteRebuild, uint8_t *palette); -void Sys_SetOverlayImage(Image_t* image); \ No newline at end of file +void Sys_SetOverlayImage(Image_t* image); + +extern byte TempTSStampData[48 * 24 * 4]; + +struct IsoTileHeader_t { + int TileWidth; + int TileHeight; + int TileImageWidth; + int TileImageHeight; +}; + +struct IsoTileImageHeader +{ + int TileX; + int TileY; + uint8_t* GetExtraData(IsoTile* tile) + { + return reinterpret_cast(tile) + ExtraOffset; + } + + uint8_t* GetZData(IsoTile* tile) + { + return reinterpret_cast(tile) + ZDataoffset; + } + + uint8_t* GetExtraZData(IsoTile* tile) + { + return reinterpret_cast(tile) + ExtraZOffset; + } + + uint8_t* GetData() { + return reinterpret_cast(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(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; +}; \ No newline at end of file diff --git a/code/redalert/tileset.cpp b/code/redalert/tileset.cpp index 9c698b1..187c776 100644 --- a/code/redalert/tileset.cpp +++ b/code/redalert/tileset.cpp @@ -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(tile) + ExtraOffset; - } - - uint8_t* GetZData(IsoTile* tile) - { - return reinterpret_cast(tile) + ZDataoffset; - } - - uint8_t* GetExtraZData(IsoTile* tile) - { - return reinterpret_cast(tile) + ExtraZOffset; - } - - uint8_t* GetData() { - return reinterpret_cast(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(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;