@@ -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
6359int 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
0 commit comments