Skip to content

Commit 909cf8b

Browse files
committed
- added loading callbacks, fixed critical bugs
1 parent ebdd4fd commit 909cf8b

10 files changed

Lines changed: 274 additions & 136 deletions

File tree

DriverLevelTool/driver_routines/models.cpp

Lines changed: 88 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -23,46 +23,42 @@ void CDriverLevelModels::FreeAll()
2323
{
2424
for (int i = 0; i < MAX_MODELS; i++)
2525
{
26-
if (m_levelModels[i].model)
27-
free(m_levelModels[i].model);
26+
ModelRef_t& ref = m_levelModels[i];
27+
28+
OnModelFreed(&ref);
29+
30+
if (ref.model)
31+
free(ref.model);
2832
}
2933

3034
for (int i = 0; i < MAX_CAR_MODELS; i++)
3135
{
32-
if (m_carModels[i].cleanmodel)
33-
free(m_carModels[i].cleanmodel);
36+
CarModelData_t& carModelData = m_carModels[i];
37+
38+
OnCarModelFreed(&carModelData);
39+
40+
if (carModelData.cleanmodel)
41+
free(carModelData.cleanmodel);
3442

35-
if (m_carModels[i].dammodel)
36-
free(m_carModels[i].dammodel);
43+
if (carModelData.dammodel)
44+
free(carModelData.dammodel);
3745

38-
if (m_carModels[i].lowmodel)
39-
free(m_carModels[i].lowmodel);
46+
if (carModelData.lowmodel)
47+
free(carModelData.lowmodel);
4048
}
4149
}
4250

43-
ModelRef_t* CDriverLevelModels::GetModelByIndex(int nIndex, RegionModels_t* models) const
51+
ModelRef_t* CDriverLevelModels::GetModelByIndex(int nIndex) const
4452
{
45-
if (nIndex >= 0 && nIndex < 1536)
46-
{
47-
// try searching in region datas
48-
if (m_levelModels[nIndex].swap && models)
49-
{
50-
for (int i = 0; i < models->modelRefs.numElem(); i++)
51-
{
52-
if (models->modelRefs[i].index == nIndex)
53-
return &models->modelRefs[i];
54-
}
55-
}
56-
53+
if (nIndex >= 0 && nIndex < MAX_MODELS)
5754
return (ModelRef_t*)&m_levelModels[nIndex];
58-
}
5955

6056
return nullptr;
6157
}
6258

6359
int CDriverLevelModels::FindModelIndexByName(const char* name) const
6460
{
65-
for (int i = 0; i < 1536; i++)
61+
for (int i = 0; i < MAX_MODELS; i++)
6662
{
6763
if (!strcmp(m_model_names[i].c_str(), name))
6864
return i;
@@ -111,41 +107,45 @@ void CDriverLevelModels::LoadCarModelsLump(IVirtualStream* pFile, int size)
111107
{
112108
Msg("car model: %d %d %d\n", model_entries[i].cleanOffset != -1, model_entries[i].damOffset != -1, model_entries[i].lowOffset != -1);
113109

110+
CarModelData_t& carModelData = m_carModels[i];
111+
114112
if (model_entries[i].cleanOffset != -1)
115113
{
116114
pFile->Seek(r_ofs + model_entries[i].cleanOffset, VS_SEEK_SET);
117115

118-
pFile->Read(&m_carModels[i].cleanSize, 1, sizeof(int));
116+
pFile->Read(&carModelData.cleanSize, 1, sizeof(int));
119117

120-
m_carModels[i].cleanmodel = (MODEL*)malloc(m_carModels[i].cleanSize);
121-
pFile->Read(m_carModels[i].cleanmodel, 1, m_carModels[i].cleanSize);
118+
carModelData.cleanmodel = (MODEL*)malloc(carModelData.cleanSize);
119+
pFile->Read(carModelData.cleanmodel, 1, carModelData.cleanSize);
122120
}
123121
else
124-
m_carModels[i].cleanmodel = nullptr;
122+
carModelData.cleanmodel = nullptr;
125123

126124
if (model_entries[i].damOffset != -1)
127125
{
128126
pFile->Seek(r_ofs + model_entries[i].damOffset, VS_SEEK_SET);
129127

130-
pFile->Read(&m_carModels[i].damSize, 1, sizeof(int));
128+
pFile->Read(&carModelData.damSize, 1, sizeof(int));
131129

132-
m_carModels[i].dammodel = (MODEL*)malloc(m_carModels[i].damSize);
133-
pFile->Read(m_carModels[i].dammodel, 1, m_carModels[i].damSize);
130+
carModelData.dammodel = (MODEL*)malloc(carModelData.damSize);
131+
pFile->Read(carModelData.dammodel, 1, carModelData.damSize);
134132
}
135133
else
136-
m_carModels[i].dammodel = nullptr;
134+
carModelData.dammodel = nullptr;
137135

138136
if (model_entries[i].lowOffset != -1)
139137
{
140138
pFile->Seek(r_ofs + model_entries[i].lowOffset, VS_SEEK_SET);
141139

142-
pFile->Read(&m_carModels[i].lowSize, 1, sizeof(int));
140+
pFile->Read(&carModelData.lowSize, 1, sizeof(int));
143141

144-
m_carModels[i].lowmodel = (MODEL*)malloc(m_carModels[i].lowSize);
145-
pFile->Read(m_carModels[i].lowmodel, 1, m_carModels[i].lowSize);
142+
carModelData.lowmodel = (MODEL*)malloc(carModelData.lowSize);
143+
pFile->Read(carModelData.lowmodel, 1, carModelData.lowSize);
146144
}
147145
else
148-
m_carModels[i].lowmodel = nullptr;
146+
carModelData.lowmodel = nullptr;
147+
148+
OnCarModelLoaded(&carModelData);
149149
}
150150

151151
pFile->Seek(l_ofs, VS_SEEK_SET);
@@ -200,15 +200,15 @@ void CDriverLevelModels::LoadLevelModelsLump(IVirtualStream* pFile)
200200

201201
if (modelSize > 0)
202202
{
203-
char* data = (char*)malloc(modelSize);
204-
205-
pFile->Read(data, modelSize, 1);
206-
207203
ModelRef_t& ref = m_levelModels[i];
208204
ref.index = i;
209-
ref.model = (MODEL*)data;
205+
ref.model = (MODEL*)malloc(modelSize);
210206
ref.size = modelSize;
211207
ref.swap = false;
208+
209+
pFile->Read(ref.model, modelSize, 1);
210+
211+
212212
}
213213
else // leave empty as swap
214214
{
@@ -220,9 +220,50 @@ void CDriverLevelModels::LoadLevelModelsLump(IVirtualStream* pFile)
220220
}
221221
}
222222

223+
for (int i = 0; i < modelCount; i++)
224+
{
225+
OnModelLoaded(&m_levelModels[i]);
226+
}
227+
223228
pFile->Seek(l_ofs, VS_SEEK_SET);
224229
}
225230

231+
void CDriverLevelModels::SetModelLoadingCallbacks(OnModelLoaded_t onLoaded, OnModelFreed_t onFreed)
232+
{
233+
m_onModelLoaded = onLoaded;
234+
m_onModelFreed = onFreed;
235+
}
236+
237+
void CDriverLevelModels::SetCarModelLoadingCallbacks(OnCarModelLoaded_t onLoaded, OnCarModelFreed_t onFreed)
238+
{
239+
m_onCarModelLoaded = onLoaded;
240+
m_onCarModelFreed = onFreed;
241+
}
242+
243+
void CDriverLevelModels::OnModelLoaded(ModelRef_t* ref)
244+
{
245+
if (m_onModelLoaded)
246+
m_onModelLoaded(ref);
247+
}
248+
249+
void CDriverLevelModels::OnModelFreed(ModelRef_t* ref)
250+
{
251+
if (m_onModelFreed)
252+
m_onModelFreed(ref);
253+
}
254+
255+
void CDriverLevelModels::OnCarModelLoaded(CarModelData_t* data)
256+
{
257+
if (m_onCarModelLoaded)
258+
m_onCarModelLoaded(data);
259+
}
260+
261+
void CDriverLevelModels::OnCarModelFreed(CarModelData_t* data)
262+
{
263+
if (m_onCarModelFreed)
264+
m_onCarModelFreed(data);
265+
}
266+
226267
//--------------------------------------------------------------------------------
227268

228269
// From Car Poly code of D2
@@ -316,7 +357,10 @@ int decode_poly(const char* polyList, dpoly_t* out)
316357
*(ushort*)out->uv[0] = *(uint*)&pft3->uv0;
317358
*(ushort*)out->uv[1] = *(uint*)&pft3->uv1;
318359
*(ushort*)out->uv[2] = *(uint*)&pft3->uv2;
319-
*(uint*)out->color = *(uint*)&pft3->color;
360+
361+
if(ptype != 10)
362+
*(uint*)out->color = *(uint*)&pft3->color;
363+
320364
out->page = pft3->texture_set;
321365
out->detail = pft3->texture_id;
322366

@@ -338,7 +382,9 @@ int decode_poly(const char* polyList, dpoly_t* out)
338382
*(ushort*)out->uv[2] = *(uint*)&pft4->uv2;
339383
*(ushort*)out->uv[3] = *(uint*)&pft4->uv3;
340384

341-
*(uint*)out->color = *(uint*)&pft4->color;
385+
if(ptype != 11)
386+
*(uint*)out->color = *(uint*)&pft4->color;
387+
342388
out->page = pft4->texture_set;
343389
out->detail = pft4->texture_id;
344390

DriverLevelTool/driver_routines/models.h

Lines changed: 28 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,16 @@
1515
// forward
1616
class IVirtualStream;
1717
struct RegionModels_t;
18+
struct ModelRef_t;
19+
struct CarModelData_t;
20+
21+
//------------------------------------------------------------------------------------------------------------
22+
23+
typedef void (*OnModelLoaded_t)(ModelRef_t* tp);
24+
typedef void (*OnModelFreed_t)(ModelRef_t* tp);
25+
26+
typedef void (*OnCarModelLoaded_t)(CarModelData_t* tp);
27+
typedef void (*OnCarModelFreed_t)(CarModelData_t* tp);
1828

1929
struct dpoly_t
2030
{
@@ -75,20 +85,37 @@ class CDriverLevelModels
7585
// release all data
7686
void FreeAll();
7787

88+
//----------------------------------------------
89+
void SetModelLoadingCallbacks(OnModelLoaded_t onLoaded, OnModelFreed_t onFreed);
90+
void SetCarModelLoadingCallbacks(OnCarModelLoaded_t onLoaded, OnCarModelFreed_t onFreed);
91+
92+
//----------------------------------------------
93+
7894
void LoadCarModelsLump(IVirtualStream* pFile, int size);
7995
void LoadModelNamesLump(IVirtualStream* pFile, int size);
8096
void LoadLevelModelsLump(IVirtualStream* pFile);
8197

82-
ModelRef_t* GetModelByIndex(int nIndex, RegionModels_t* models) const;
98+
ModelRef_t* GetModelByIndex(int nIndex) const;
8399
int FindModelIndexByName(const char* name) const;
84100
const char* GetModelName(ModelRef_t* model) const;
85101

86102
CarModelData_t* GetCarModel(int index) const;
87103

88104
protected:
105+
void OnModelLoaded(ModelRef_t* ref);
106+
void OnModelFreed(ModelRef_t* ref);
107+
108+
void OnCarModelLoaded(CarModelData_t* data);
109+
void OnCarModelFreed(CarModelData_t* data);
110+
89111
ModelRef_t m_levelModels[MAX_MODELS];
90112
CarModelData_t m_carModels[MAX_CAR_MODELS];
91113
DkList<std::string> m_model_names;
114+
115+
OnModelLoaded_t m_onModelLoaded;
116+
OnModelFreed_t m_onModelFreed;
117+
OnCarModelLoaded_t m_onCarModelLoaded;
118+
OnCarModelFreed_t m_onCarModelFreed;
92119
};
93120

94121
//------------------------------------------------------------------------------------------------------------

DriverLevelTool/driver_routines/regions.cpp

Lines changed: 41 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,11 @@ CDriver2LevelRegion::~CDriver2LevelRegion()
2323

2424
void CDriver2LevelRegion::FreeAll()
2525
{
26+
if (!m_loaded)
27+
return;
28+
29+
m_owner->OnRegionFreed(this);
30+
2631
if(m_models)
2732
{
2833
for (int i = 0; i < MAX_MODELS; i++)
@@ -220,6 +225,8 @@ void CDriver2LevelRegion::LoadRegionData(IVirtualStream* pFile, Spool* spool)
220225
// even if error occured we still need it to be here
221226
m_loaded = true;
222227

228+
m_owner->OnRegionLoaded(this);
229+
223230
// TODO: PVS and heightmap data
224231

225232
#if 0
@@ -252,7 +259,7 @@ void CDriver2LevelRegion::LoadRegionData(IVirtualStream* pFile, Spool* spool)
252259
}
253260

254261
void CDriver2LevelRegion::LoadAreaData(IVirtualStream* pFile)
255-
{
262+
{
256263
// load in-area textures
257264
m_owner->LoadInAreaTPages(pFile, m_areaDataNum);
258265

@@ -273,17 +280,22 @@ PACKED_CELL_OBJECT* CDriver2LevelRegion::GetCellObject(int num) const
273280
return &m_owner->m_straddlers[num];
274281
}
275282

276-
ModelRef_t* CDriver2LevelRegion::GetModel(int num) const
283+
ModelRef_t* CDriver2LevelRegion::GetModel(int nIndex) const
277284
{
278-
if (!m_models)
279-
return nullptr;
280-
281-
ModelRef_t* ref = &m_models[num];
285+
if (nIndex >= 0 && nIndex < MAX_MODELS)
286+
{
287+
if (!m_models)
288+
return nullptr;
282289

283-
if (!ref->model)
284-
return nullptr;
285-
286-
return ref;
290+
ModelRef_t* ref = &m_models[nIndex];
291+
292+
if (!ref->model)
293+
return nullptr;
294+
295+
return ref;
296+
}
297+
298+
return nullptr;
287299
}
288300

289301
//-------------------------------------------------------------------------------------------
@@ -326,7 +338,6 @@ void CDriver2LevelMap::FreeAll()
326338
m_areaData = nullptr;
327339
}
328340

329-
330341
//-------------------------------------------------------------
331342
// parses LUMP_MAP and it's straddler objects
332343
//-------------------------------------------------------------
@@ -489,7 +500,7 @@ void CDriver2LevelMap::LoadSpoolInfoLump(IVirtualStream* pFile)
489500
if (spoolInfoOffset != REGION_EMPTY)
490501
{
491502
Spool* spool = (Spool*)((ubyte*)m_regionSpoolInfo + m_regionSpoolInfoOffsets[i]);
492-
m_regions[i].m_areaDataNum = spool->super_region;
503+
m_regions[i].m_areaDataNum = spool->super_region == 255 ? -1 : spool->super_region;
493504
}
494505
else
495506
m_regions[i].m_areaDataNum = -1;
@@ -738,4 +749,22 @@ void CDriver2LevelMap::WorldPositionToCellXZ(XZPAIR& cell, const VECTOR_NOPAD& p
738749

739750
cell.x = (position.vx + units_across_halved) / m_mapInfo.cell_size;
740751
cell.z = (position.vz + units_down_halved) / m_mapInfo.cell_size;
752+
}
753+
754+
void CDriver2LevelMap::SetLoadingCallbacks(OnRegionLoaded_t onLoaded, OnRegionFreed_t onFreed)
755+
{
756+
m_onRegionLoaded = onLoaded;
757+
m_onRegionFreed = onFreed;
758+
}
759+
760+
void CDriver2LevelMap::OnRegionLoaded(CDriver2LevelRegion* region)
761+
{
762+
if (m_onRegionLoaded)
763+
m_onRegionLoaded(region);
764+
}
765+
766+
void CDriver2LevelMap::OnRegionFreed(CDriver2LevelRegion* region)
767+
{
768+
if (m_onRegionFreed)
769+
m_onRegionFreed(region);
741770
}

0 commit comments

Comments
 (0)