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
+137 -132
View File
@@ -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));
}
+18 -18
View File
@@ -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
+108 -1
View File
@@ -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);
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<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;
};
-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;