Skip to content

Commit f97b77b

Browse files
committed
- simplify extra CLUT lookups
1 parent 765ab56 commit f97b77b

8 files changed

Lines changed: 113 additions & 109 deletions

File tree

DriverLevelTool/driver_level.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@
2121

2222
// extern some vars
2323
extern IVirtualStream* g_levStream;
24+
extern CDriverLevelTextures g_levTextures;
2425

2526
//----------------------------------------------------------
2627

DriverLevelTool/driver_routines/level.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,8 @@ char* g_overlayMapData = nullptr;
1313

1414
extern DkList<std::string> g_model_names;
1515

16+
CDriverLevelTextures g_levTextures;
17+
1618
//-------------------------------------------------------------
1719
// parses model lumps and exports models to OBJ
1820
//-------------------------------------------------------------

DriverLevelTool/driver_routines/level.h

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,13 @@ enum ELevelFormat
5252

5353
LEV_FORMAT_DRIVER1 = 0, // driver 1
5454
LEV_FORMAT_DRIVER2_ALPHA16, // driver 2 alpha 1.6 format
55-
LEV_FORMAT_DRIVER2_RETAIL, // driver 2 retail format
55+
LEV_FORMAT_DRIVER2_RETAIL, // driver 2 retail format
5656
};
5757

58+
// forward
59+
class IVirtualStream;
60+
struct RegionModels_t;
61+
5862
//------------------------------------------------------------------------------------------------------------
5963
// globals
6064

@@ -63,8 +67,7 @@ extern ELevelFormat g_format;
6367
//------------------------------------------------------------------------------------------------------------
6468
// functions
6569

66-
class IVirtualStream;
67-
struct RegionModels_t;
70+
6871

6972
void LoadModelNamesLump(IVirtualStream* pFile, int size);
7073

DriverLevelTool/driver_routines/regions.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,8 @@
22

33
#include <malloc.h>
44

5+
6+
#include "driver_level.h"
57
#include "textures.h"
68

79
#include "core/IVirtualStream.h"

DriverLevelTool/driver_routines/textures.cpp

Lines changed: 30 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,6 @@
77

88
//-------------------------------------------------------------------------------
99

10-
CDriverLevelTextures g_levTextures;
11-
1210
// 16 bit color to BGRA
1311
// originalTransparencyKey makes it pink
1412
TVec4D<ubyte> rgb5a1_ToBGRA8(ushort color, bool originalTransparencyKey /*= true*/)
@@ -115,10 +113,12 @@ void CTexturePage::ConvertIndexedTextureToRGBA(uint* dest_color_data, int detail
115113
if (clut == nullptr)
116114
clut = &bitmap.clut[detail];
117115

118-
int ox = m_details[detail].x;
119-
int oy = m_details[detail].y;
120-
int w = m_details[detail].width;
121-
int h = m_details[detail].height;
116+
TEXINF& texInfo = m_details[detail].info;
117+
118+
int ox = texInfo.x;
119+
int oy = texInfo.y;
120+
int w = texInfo.width;
121+
int h = texInfo.height;
122122

123123
if (w == 0)
124124
w = 256;
@@ -172,8 +172,15 @@ void CTexturePage::InitFromFile(int id, TEXPAGE_POS& tp, IVirtualStream* pFile)
172172
if (m_numDetails)
173173
{
174174
// read texture detail info
175-
m_details = new TEXINF[m_numDetails];
176-
pFile->Read(m_details, m_numDetails, sizeof(TEXINF));
175+
m_details = new TexDetailInfo_t[m_numDetails];
176+
177+
for(int i = 0; i < m_numDetails; i++)
178+
{
179+
m_details[i].numExtraCLUTs = 0;
180+
memset(m_details[i].extraCLUTs, 0, sizeof(m_details[i].extraCLUTs));
181+
182+
pFile->Read(&m_details[i].info, 1, sizeof(TEXINF));
183+
}
177184
}
178185
else
179186
m_details = nullptr;
@@ -257,11 +264,11 @@ bool CTexturePage::LoadTPageAndCluts(IVirtualStream* pFile, bool isSpooled)
257264
//-------------------------------------------------------------------------------
258265
// searches for detail in this TPAGE
259266
//-------------------------------------------------------------------------------
260-
TEXINF* CTexturePage::FindTextureDetail(const char* name) const
267+
TexDetailInfo_t* CTexturePage::FindTextureDetail(const char* name) const
261268
{
262269
for (int i = 0; i < m_numDetails; i++)
263270
{
264-
const char* pTexName = g_levTextures.GetTextureDetailName(&m_details[i]);
271+
const char* pTexName = m_owner->GetTextureDetailName(&m_details[i].info);
265272

266273
if (!strcmp(pTexName, name)) // FIXME: hashing and case insensitive?
267274
return &m_details[i];
@@ -270,7 +277,7 @@ TEXINF* CTexturePage::FindTextureDetail(const char* name) const
270277
return nullptr;
271278
}
272279

273-
TEXINF* CTexturePage::GetTextureDetail(int num) const
280+
TexDetailInfo_t* CTexturePage::GetTextureDetail(int num) const
274281
{
275282
return &m_details[num];
276283
}
@@ -387,6 +394,8 @@ void CDriverLevelTextures::LoadTextureInfoLump(IVirtualStream* pFile)
387394
for(int i = 0; i < numPages; i++)
388395
{
389396
CTexturePage& tp = m_texPages[i];
397+
tp.m_owner = this;
398+
390399
tp.InitFromFile(i, tpage_position[i], pFile);
391400
}
392401

@@ -486,6 +495,10 @@ void CDriverLevelTextures::ProcessPalletLump(IVirtualStream* pFile)
486495

487496
pFile->Read(clutTablePtr, 16, sizeof(ushort));
488497

498+
// reference
499+
TexDetailInfo_t& detail = m_texPages[data.tpage].m_details[info.texnum];
500+
detail.extraCLUTs[data.palette] = &data.clut;
501+
489502
added_cluts++;
490503

491504
// only in D1 we need to check count
@@ -497,12 +510,14 @@ void CDriverLevelTextures::ProcessPalletLump(IVirtualStream* pFile)
497510
}
498511
else
499512
{
500-
//Msg(" reference clut: %d, tex %d\n", info.clut_number, info.texnum);
501-
502513
ExtClutData_t& data = m_extraPalettes[info.clut_number];
503514

504515
// add texture number to existing clut
505516
data.texnum[data.texcnt++] = info.texnum;
517+
518+
// reference
519+
TexDetailInfo_t& detail = m_texPages[data.tpage].m_details[info.texnum];
520+
detail.extraCLUTs[data.palette] = &data.clut;
506521
}
507522
}
508523

@@ -514,11 +529,11 @@ void CDriverLevelTextures::ProcessPalletLump(IVirtualStream* pFile)
514529

515530
//----------------------------------------------------------------------------------------------------
516531

517-
TEXINF* CDriverLevelTextures::FindTextureDetail(const char* name) const
532+
TexDetailInfo_t* CDriverLevelTextures::FindTextureDetail(const char* name) const
518533
{
519534
for(int i = 0; i < m_numTexPages; i++)
520535
{
521-
TEXINF* found = m_texPages[i].FindTextureDetail(name);
536+
TexDetailInfo_t* found = m_texPages[i].FindTextureDetail(name);
522537

523538
if (found)
524539
return found;

DriverLevelTool/driver_routines/textures.h

Lines changed: 45 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
// forward
1212
class IVirtualStream;
13+
class CDriverLevelTextures;
1314

1415
//---------------------------------------------------------------------------------------------------------------------------------
1516

@@ -22,9 +23,26 @@ struct TexBitmap_t
2223
int numPalettes{ 0 };
2324
};
2425

26+
struct ExtClutData_t
27+
{
28+
TEXCLUT clut;
29+
int texnum[32];
30+
int texcnt;
31+
int palette;
32+
int tpage;
33+
};
34+
35+
struct TexDetailInfo_t
36+
{
37+
TEXINF info;
38+
TEXCLUT* extraCLUTs[32];
39+
int numExtraCLUTs;
40+
};
41+
2542
//---------------------------------------------------------------------------------------------------------------------------------
2643
class CTexturePage
2744
{
45+
friend class CDriverLevelTextures;
2846
public:
2947
CTexturePage();
3048
virtual ~CTexturePage();
@@ -41,8 +59,8 @@ class CTexturePage
4159
bool outputBGR = false, bool originalTransparencyKey = true);
4260

4361
// searches for detail in this TPAGE
44-
TEXINF* FindTextureDetail(const char* name) const;
45-
TEXINF* GetTextureDetail(int num) const;
62+
TexDetailInfo_t* FindTextureDetail(const char* name) const;
63+
TexDetailInfo_t* GetTextureDetail(int num) const;
4664
int GetDetailCount() const;
4765

4866
// returns the 4bit map data
@@ -55,67 +73,60 @@ class CTexturePage
5573
void LoadCompressedTexture(IVirtualStream* pFile);
5674

5775
TexBitmap_t m_bitmap;
58-
TEXINF* m_details{ nullptr };
5976
TEXPAGE_POS m_tp;
77+
78+
TexDetailInfo_t* m_details{ nullptr };
79+
80+
CDriverLevelTextures* m_owner;
6081

6182
int m_id{ -1 };
6283
int m_numDetails{ 0 };
6384
};
6485

65-
struct ExtClutData_t
66-
{
67-
TEXCLUT clut;
68-
int texnum[32];
69-
int texcnt;
70-
int palette;
71-
int tpage;
72-
};
73-
7486
//---------------------------------------------------------------------------------------------------------------------------------
7587

7688
class CDriverLevelTextures
7789
{
90+
friend class CTexturePage;
7891
public:
7992
CDriverLevelTextures();
8093
virtual ~CDriverLevelTextures();
8194

8295
// loaders
83-
void LoadTextureInfoLump(IVirtualStream* pFile);
84-
void LoadPermanentTPages(IVirtualStream* pFile);
85-
void LoadTextureNamesLump(IVirtualStream* pFile, int size);
86-
void ProcessPalletLump(IVirtualStream* pFile);
96+
void LoadTextureInfoLump(IVirtualStream* pFile);
97+
void LoadPermanentTPages(IVirtualStream* pFile);
98+
void LoadTextureNamesLump(IVirtualStream* pFile, int size);
99+
void ProcessPalletLump(IVirtualStream* pFile);
87100

88101
// release all data
89-
void FreeAll();
102+
void FreeAll();
90103

91104
// getters
92-
CTexturePage* GetTPage(int page) const;
93-
int GetTPageCount() const;
105+
CTexturePage* GetTPage(int page) const;
106+
int GetTPageCount() const;
94107

95-
ExtClutData_t* GetExtraCLUT(int clut) const;
96-
int GetExtraCLUTCount() const;
108+
ExtClutData_t* GetExtraCLUT(int clut) const;
109+
int GetExtraCLUTCount() const;
97110

98-
TEXINF* FindTextureDetail(const char* name) const;
99-
const char* GetTextureDetailName(TEXINF* info) const;
111+
TexDetailInfo_t* FindTextureDetail(const char* name) const;
112+
const char* GetTextureDetailName(TEXINF* info) const;
100113

101114
protected:
102-
char* m_textureNamesData{ nullptr };
115+
char* m_textureNamesData{ nullptr };
103116

104-
CTexturePage* m_texPages{ nullptr };
105-
int m_numTexPages{ 0 };
117+
CTexturePage* m_texPages{ nullptr };
118+
int m_numTexPages{ 0 };
106119

107-
XYPAIR m_permsList[16];
108-
int m_numPermanentPages{ 0 };
120+
XYPAIR m_permsList[16];
121+
int m_numPermanentPages{ 0 };
109122

110-
int m_numSpecPages{ 0 };
111-
XYPAIR m_specList[16];
123+
int m_numSpecPages{ 0 };
124+
XYPAIR m_specList[16];
112125

113-
ExtClutData_t* m_extraPalettes{ nullptr };
114-
int m_numExtraPalettes{ 0 };
126+
ExtClutData_t* m_extraPalettes{ nullptr };
127+
int m_numExtraPalettes{ 0 };
115128
};
116129

117-
extern CDriverLevelTextures g_levTextures;
118-
extern char* g_overlayMapData;
119130
//---------------------------------------------------------------------------------------------------------------------------------
120131

121132
TVec4D<ubyte> rgb5a1_ToBGRA8(ushort color, bool originalTransparencyKey = true);

0 commit comments

Comments
 (0)