Skip to content

Commit 6857bbc

Browse files
committed
- fix areadata loading bug
1 parent 909cf8b commit 6857bbc

4 files changed

Lines changed: 57 additions & 91 deletions

File tree

DriverLevelTool/driver_routines/models.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -78,6 +78,7 @@ struct CarModelData_t
7878

7979
class CDriverLevelModels
8080
{
81+
friend class CDriver2LevelMap;
8182
public:
8283
CDriverLevelModels();
8384
virtual ~CDriverLevelModels();

DriverLevelTool/driver_routines/regions.cpp

Lines changed: 47 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -28,23 +28,12 @@ void CDriver2LevelRegion::FreeAll()
2828

2929
m_owner->OnRegionFreed(this);
3030

31-
if(m_models)
32-
{
33-
for (int i = 0; i < MAX_MODELS; i++)
34-
{
35-
if (m_models[i].model)
36-
free(m_models[i].model);
37-
}
38-
}
39-
40-
delete[] m_models;
41-
m_models = nullptr;
42-
4331
// do I need that?
44-
if(m_areaDataNum != -1)
32+
if(m_spoolInfo && m_spoolInfo->super_region != 0xFF)
4533
{
46-
int numAreaTpages = m_owner->m_areaData[m_areaDataNum].num_tpages;
47-
AreaTPage_t& areaTPages = m_owner->m_areaTPages[m_areaDataNum];
34+
int areaDataNum = m_spoolInfo->super_region;
35+
int numAreaTpages = m_owner->m_areaData[areaDataNum].num_tpages;
36+
AreaTPage_t& areaTPages = m_owner->m_areaTPages[areaDataNum];
4837

4938
for (int i = 0; numAreaTpages; i++)
5039
{
@@ -55,7 +44,7 @@ void CDriver2LevelRegion::FreeAll()
5544
tpage->FreeBitmap();
5645
}
5746
}
58-
m_areaDataNum = -1;
47+
m_spoolInfo = nullptr;
5948

6049
if(m_cells)
6150
free(m_cells);
@@ -154,6 +143,8 @@ int CDriver2LevelRegion::UnpackCellPointers(ushort* dest_ptrs, char* src_data, i
154143

155144
void CDriver2LevelRegion::LoadRegionData(IVirtualStream* pFile, Spool* spool)
156145
{
146+
m_spoolInfo = spool;
147+
157148
//Msg("---------\nSpool %d %d (offset: %d)\n", x, y, g_regionSpoolInfoOffsets[sPosIdx]);
158149
Msg(" - offset: %d\n", spool->offset);
159150

@@ -259,12 +250,22 @@ void CDriver2LevelRegion::LoadRegionData(IVirtualStream* pFile, Spool* spool)
259250
}
260251

261252
void CDriver2LevelRegion::LoadAreaData(IVirtualStream* pFile)
262-
{
253+
{
254+
if (m_spoolInfo->super_region == 0xFF)
255+
return;
256+
257+
int areaDataNum = m_spoolInfo->super_region;
258+
259+
if (m_owner->m_areaDataStates[areaDataNum])
260+
return;
261+
263262
// load in-area textures
264-
m_owner->LoadInAreaTPages(pFile, m_areaDataNum);
263+
m_owner->LoadInAreaTPages(pFile, areaDataNum);
265264

266265
// load in-area models
267-
m_models = m_owner->LoadInAreaModels(pFile, m_areaDataNum);
266+
m_owner->LoadInAreaModels(pFile, areaDataNum);
267+
268+
m_owner->m_areaDataStates[areaDataNum] = true;
268269
}
269270

270271
PACKED_CELL_OBJECT* CDriver2LevelRegion::GetCellObject(int num) const
@@ -280,24 +281,6 @@ PACKED_CELL_OBJECT* CDriver2LevelRegion::GetCellObject(int num) const
280281
return &m_owner->m_straddlers[num];
281282
}
282283

283-
ModelRef_t* CDriver2LevelRegion::GetModel(int nIndex) const
284-
{
285-
if (nIndex >= 0 && nIndex < MAX_MODELS)
286-
{
287-
if (!m_models)
288-
return nullptr;
289-
290-
ModelRef_t* ref = &m_models[nIndex];
291-
292-
if (!ref->model)
293-
return nullptr;
294-
295-
return ref;
296-
}
297-
298-
return nullptr;
299-
}
300-
301284
//-------------------------------------------------------------------------------------------
302285

303286
CDriver2LevelMap::CDriver2LevelMap()
@@ -336,6 +319,9 @@ void CDriver2LevelMap::FreeAll()
336319

337320
delete[] m_areaData;
338321
m_areaData = nullptr;
322+
323+
delete[] m_areaDataStates;
324+
m_areaDataStates = nullptr;
339325
}
340326

341327
//-------------------------------------------------------------
@@ -486,8 +472,6 @@ void CDriver2LevelMap::LoadSpoolInfoLump(IVirtualStream* pFile)
486472

487473
for (int i = 0; i < total_regions; i++)
488474
{
489-
ushort spoolInfoOffset = m_regionSpoolInfoOffsets[i];
490-
491475
const int region_x = i % m_regions_across;
492476
const int region_z = (i - region_x) / m_regions_across;
493477

@@ -496,15 +480,10 @@ void CDriver2LevelMap::LoadSpoolInfoLump(IVirtualStream* pFile)
496480
m_regions[i].m_regionZ = region_z;
497481
m_regions[i].m_regionNumber = i;
498482
m_regions[i].m_regionBarrelNumber = (region_x & 1) + (region_z & 1) * 2;
499-
500-
if (spoolInfoOffset != REGION_EMPTY)
501-
{
502-
Spool* spool = (Spool*)((ubyte*)m_regionSpoolInfo + m_regionSpoolInfoOffsets[i]);
503-
m_regions[i].m_areaDataNum = spool->super_region == 255 ? -1 : spool->super_region;
504-
}
505-
else
506-
m_regions[i].m_areaDataNum = -1;
507483
}
484+
485+
m_areaDataStates = new bool[m_numAreas];
486+
memset(m_areaDataStates, 0, m_numAreas);
508487
}
509488

510489
int CDriver2LevelMap::GetAreaDataCount() const
@@ -514,7 +493,7 @@ int CDriver2LevelMap::GetAreaDataCount() const
514493

515494
void CDriver2LevelMap::LoadInAreaTPages(IVirtualStream* pFile, int areaDataNum) const
516495
{
517-
if (areaDataNum == -1)
496+
if (areaDataNum == 255)
518497
return;
519498

520499
AreaDataStr& areaData = m_areaData[areaDataNum];
@@ -537,23 +516,23 @@ void CDriver2LevelMap::LoadInAreaTPages(IVirtualStream* pFile, int areaDataNum)
537516
}
538517
}
539518

540-
ModelRef_t* CDriver2LevelMap::LoadInAreaModels(IVirtualStream* pFile, int areaDataNum) const
519+
void CDriver2LevelMap::LoadInAreaModels(IVirtualStream* pFile, int areaDataNum) const
541520
{
542521
if (areaDataNum == -1)
543-
return nullptr;
544-
545-
// allocate model reference slots
546-
ModelRef_t* newModels = new ModelRef_t[MAX_MODELS];
547-
memset(newModels, 0, sizeof(ModelRef_t) * MAX_MODELS);
522+
return;
523+
524+
AreaDataStr& areaData = m_areaData[areaDataNum];
525+
526+
int length = areaData.model_size;
548527

549-
const int modelsCountOffset = g_levInfo.spooldata_offset + SPOOL_CD_BLOCK_SIZE * (m_areaData->model_offset + m_areaData->model_size - 1);
550-
const int modelsOffset = g_levInfo.spooldata_offset + SPOOL_CD_BLOCK_SIZE * m_areaData->model_offset;
528+
const int modelsCountOffset = g_levInfo.spooldata_offset + (areaData.model_offset + length - 1) * SPOOL_CD_BLOCK_SIZE;
529+
const int modelsOffset = g_levInfo.spooldata_offset + areaData.model_offset * SPOOL_CD_BLOCK_SIZE;
551530

552531
ushort numModels;
553532

554533
pFile->Seek(modelsCountOffset, VS_SEEK_SET);
555534
pFile->Read(&numModels, 1, sizeof(ushort));
556-
535+
557536
// read model indexes
558537
ushort* new_model_numbers = new ushort[numModels];
559538
pFile->Read(new_model_numbers, numModels, sizeof(short));
@@ -568,19 +547,23 @@ ModelRef_t* CDriver2LevelMap::LoadInAreaModels(IVirtualStream* pFile, int areaDa
568547

569548
if (modelSize > 0)
570549
{
571-
ModelRef_t& ref = newModels[new_model_numbers[i]];
550+
ModelRef_t* ref = g_levModels.GetModelByIndex(new_model_numbers[i]);
572551

573-
ref.index = new_model_numbers[i];
574-
ref.model = (MODEL*)malloc(modelSize);
575-
ref.size = modelSize;
552+
// maybe there is a simple case of area data model duplication?
553+
if (ref->model && ref->size != modelSize)
554+
MsgError("Spool model in slot %d OVERLAP!\n", new_model_numbers[i]);
555+
556+
ref->index = new_model_numbers[i];
557+
ref->model = (MODEL*)malloc(modelSize);
558+
ref->size = modelSize;
576559

577-
pFile->Read(ref.model, modelSize, 1);
560+
pFile->Read(ref->model, modelSize, 1);
561+
562+
g_levModels.OnModelLoaded(ref);
578563
}
579564
}
580565

581566
delete[] new_model_numbers;
582-
583-
return newModels;
584567
}
585568

586569
CDriver2LevelRegion* CDriver2LevelMap::GetRegion(const XZPAIR& cell) const

DriverLevelTool/driver_routines/regions.h

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -44,15 +44,14 @@ class CDriver2LevelRegion
4444
void LoadAreaData(IVirtualStream* pFile);
4545

4646
PACKED_CELL_OBJECT* GetCellObject(int num) const;
47-
ModelRef_t* GetModel(int num) const;
48-
47+
4948
protected:
5049
static int UnpackCellPointers(ushort* dest_ptrs, char* src_data, int cell_slots_add, int targetRegion = 0);
5150

52-
ModelRef_t* m_models{ nullptr }; // loaded region models
53-
5451
CDriver2LevelMap* m_owner;
5552

53+
Spool* m_spoolInfo{ nullptr };
54+
5655
CELL_DATA* m_cells{ nullptr }; // cell data that holding information about cell pointers. 3D world seeks cells first here
5756
ushort* m_cellPointers{ nullptr }; // cell pointers that holding indexes of cell objects. Designed for cell iterator
5857
PACKED_CELL_OBJECT* m_cellObjects{ nullptr }; // cell objects that represents objects placed in the world
@@ -63,7 +62,6 @@ class CDriver2LevelRegion
6362
int m_regionX{ -1 };
6463
int m_regionZ{ -1 };
6564
int m_regionNumber{ -1 };
66-
int m_areaDataNum{ -1 };
6765
int m_regionBarrelNumber{ -1 };
6866
bool m_loaded{ false };
6967
};
@@ -90,7 +88,7 @@ class CDriver2LevelMap
9088

9189
int GetAreaDataCount() const;
9290
void LoadInAreaTPages(IVirtualStream* pFile, int areaDataNum) const;
93-
ModelRef_t* LoadInAreaModels(IVirtualStream* pFile, int areaDataNum) const;
91+
void LoadInAreaModels(IVirtualStream* pFile, int areaDataNum) const;
9492

9593

9694

@@ -129,6 +127,7 @@ class CDriver2LevelMap
129127

130128
AreaDataStr* m_areaData{ nullptr }; // region model/texture data descriptors
131129
AreaTPage_t* m_areaTPages{ nullptr }; // region texpage usage table
130+
bool* m_areaDataStates{ nullptr }; // area data loading states
132131

133132
int m_numStraddlers{ 0 };
134133

DriverLevelTool/viewer/viewer.cpp

Lines changed: 4 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -355,14 +355,11 @@ void DrawLevelDriver2(const Vector3D& cameraPos)
355355
GR_SetMatrix(MATRIX_WORLD, objectMatrix);
356356
GR_UpdateMatrixUniforms();
357357

358-
ModelRef_t* ref = ci.region->GetModel(co.type);
359-
360-
if(!ref)
361-
ref = g_levModels.GetModelByIndex(co.type);
362-
358+
ModelRef_t* ref = g_levModels.GetModelByIndex(co.type);
359+
363360
CRenderModel* renderModel = (CRenderModel*)ref->userData;
364361

365-
if(renderModel)
362+
if (renderModel)
366363
renderModel->Draw();
367364

368365
ppco = g_levMap.GetNextPackedCop(&ci);
@@ -455,21 +452,7 @@ void RenderView()
455452

456453
void OnRegionLoaded(CDriver2LevelRegion* region)
457454
{
458-
// load tpages
459-
for(int i = 0; i < MAX_MODELS; i++)
460-
{
461-
ModelRef_t* ref = region->GetModel(i);
462-
463-
if (ref && ref->model)
464-
{
465-
CRenderModel* renderModel = new CRenderModel();
466-
467-
if(renderModel->Initialize(ref))
468-
ref->userData = renderModel;
469-
else
470-
delete renderModel;
471-
}
472-
}
455+
473456
}
474457

475458
void OnModelLoaded(ModelRef_t* ref)

0 commit comments

Comments
 (0)