@@ -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
155144void 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
261252void 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
270271PACKED_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
303286CDriver2LevelMap::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
510489int CDriver2LevelMap::GetAreaDataCount () const
@@ -514,7 +493,7 @@ int CDriver2LevelMap::GetAreaDataCount() const
514493
515494void 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
586569CDriver2LevelRegion* CDriver2LevelMap::GetRegion (const XZPAIR& cell) const
0 commit comments