@@ -62,10 +62,22 @@ void CRender::level_Load(IReader* fs)
6262 // VB,IB,SWI
6363 g_pGamePersistent->SetLoadStageTitle (" st_loading_geometry" );
6464 g_pGamePersistent->LoadTitle ();
65- CStreamReader* geom = FS.rs_open (" $level$" , " level.geom" );
66- LoadBuffers (geom);
67- LoadSWIs (geom);
68- FS.r_close (geom);
65+ {
66+ CStreamReader* geom = FS.rs_open (" $level$" , " level.geom" );
67+ R_ASSERT2 (geom, " level.geom" );
68+ LoadBuffers (geom, false );
69+ LoadSWIs (geom);
70+ FS.r_close (geom);
71+ }
72+
73+ // ...and alternate/fast geometry
74+ if (ps_r1_force_geomx)
75+ {
76+ CStreamReader* geom = FS.rs_open (" $level$" , " level.geomx" );
77+ R_ASSERT2 (geom, " level.geomX" );
78+ LoadBuffers (geom, true );
79+ FS.r_close (geom);
80+ }
6981
7082 // Visuals
7183 g_pGamePersistent->SetLoadStageTitle (" st_loading_spatial_db" );
@@ -147,13 +159,36 @@ void CRender::level_Unload()
147159 SWIs.clear ();
148160
149161 // *** VB/IB
150- for (I = 0 ; I < VB.size (); I++)
151- _RELEASE (VB[I]);
152- for (I = 0 ; I < IB.size (); I++)
153- _RELEASE (IB[I]);
154- DCL.clear ();
155- VB.clear ();
156- IB.clear ();
162+ for (I = 0 ; I < nVB.size (); I++)
163+ {
164+ HW.stats_manager .decrement_stats_vb (nVB[I]);
165+ _RELEASE (nVB[I]);
166+ }
167+
168+ for (I = 0 ; I < xVB.size (); I++)
169+ {
170+ HW.stats_manager .decrement_stats_vb (xVB[I]);
171+ _RELEASE (xVB[I]);
172+ }
173+ nVB.clear ();
174+ xVB.clear ();
175+
176+ for (I = 0 ; I < nIB.size (); I++)
177+ {
178+ HW.stats_manager .decrement_stats_ib (nIB[I]);
179+ _RELEASE (nIB[I]);
180+ }
181+
182+ for (I = 0 ; I < xIB.size (); I++)
183+ {
184+ HW.stats_manager .decrement_stats_ib (xIB[I]);
185+ _RELEASE (xIB[I]);
186+ }
187+
188+ nIB.clear ();
189+ xIB.clear ();
190+ nDC.clear ();
191+ xDC.clear ();
157192
158193 // *** Components
159194 xr_delete (Details);
@@ -172,19 +207,23 @@ void CRender::level_Unload()
172207 b_loaded = FALSE ;
173208}
174209
175- void CRender::LoadBuffers (CStreamReader* base_fs)
210+ void CRender::LoadBuffers (CStreamReader* base_fs, bool alternative )
176211{
177212 Resources->Evict ();
178213 u32 dwUsage = D3DUSAGE_WRITEONLY | (HW.Caps .geometry .bSoftware ? D3DUSAGE_SOFTWAREPROCESSING : 0 );
179214
215+ xr_vector<VertexDeclarator>& _DC = alternative ? xDC : nDC;
216+ xr_vector<ID3DVertexBuffer*>& _VB = alternative ? xVB : nVB;
217+ xr_vector<ID3DIndexBuffer*>& _IB = alternative ? xIB : nIB;
218+
180219 // Vertex buffers
181220 if (base_fs->find_chunk (fsL_VB))
182221 {
183222 // Use DX9-style declarators
184223 CStreamReader* fs = base_fs->open_chunk (fsL_VB);
185224 u32 count = fs->r_u32 ();
186- DCL .resize (count);
187- VB .resize (count);
225+ _DC .resize (count);
226+ _VB .resize (count);
188227
189228 u32 buffer_size = (MAXD3DDECLLENGTH + 1 ) * sizeof (D3DVERTEXELEMENT9);
190229 D3DVERTEXELEMENT9* dcl = (D3DVERTEXELEMENT9*)_alloca (buffer_size);
@@ -200,9 +239,9 @@ void CRender::LoadBuffers(CStreamReader* base_fs)
200239
201240 u32 dcl_len = D3DXGetDeclLength (dcl) + 1 ;
202241
203- DCL [i].resize (dcl_len);
204- fs->r (DCL [i].begin (), dcl_len * sizeof (D3DVERTEXELEMENT9));
205- // .????????? remove T&B from DCL []
242+ _DC [i].resize (dcl_len);
243+ fs->r (_DC [i].begin (), dcl_len * sizeof (D3DVERTEXELEMENT9));
244+ // .????????? remove T&B from _DC []
206245
207246 // count, size
208247 u32 vCount = fs->r_u32 ();
@@ -211,12 +250,12 @@ void CRender::LoadBuffers(CStreamReader* base_fs)
211250
212251 // Create and fill
213252 BYTE* pData = nullptr ;
214- R_CHK (HW.pDevice ->CreateVertexBuffer (vCount * vSize, dwUsage, 0 , D3DPOOL_MANAGED, &VB [i], nullptr ));
215- HW.stats_manager .increment_stats (vCount * vSize, enum_stats_buffer_type_vertex, D3DPOOL_MANAGED );
216- R_CHK (VB [i]->Lock (0 , 0 , (void **)&pData, 0 ));
253+ R_CHK (HW.pDevice ->CreateVertexBuffer (vCount * vSize, dwUsage, 0 , D3DPOOL_MANAGED, &_VB [i], nullptr ));
254+ HW.stats_manager .increment_stats_vb (_VB[i] );
255+ R_CHK (_VB [i]->Lock (0 , 0 , (void **)&pData, 0 ));
217256 fs->r (pData, vCount * vSize);
218257 // CopyMemory (pData,fs->pointer(),vCount*vSize); //.???? copy while skip T&B
219- VB [i]->Unlock ();
258+ _VB [i]->Unlock ();
220259
221260 // fs->advance (vCount*vSize);
222261 }
@@ -232,20 +271,20 @@ void CRender::LoadBuffers(CStreamReader* base_fs)
232271 {
233272 CStreamReader* fs = base_fs->open_chunk (fsL_IB);
234273 u32 count = fs->r_u32 ();
235- IB .resize (count);
274+ _IB .resize (count);
236275 for (u32 i = 0 ; i < count; i++)
237276 {
238277 u32 iCount = fs->r_u32 ();
239278 Msg (" * [Loading IB] %d indices, %d Kb" , iCount, (iCount * 2 ) / 1024 );
240279
241280 // Create and fill
242281 BYTE* pData = nullptr ;
243- R_CHK (HW.pDevice ->CreateIndexBuffer (iCount * 2 , dwUsage, D3DFMT_INDEX16, D3DPOOL_MANAGED, &IB [i], nullptr ));
244- HW.stats_manager .increment_stats (iCount * 2 , enum_stats_buffer_type_index, D3DPOOL_MANAGED );
245- R_CHK (IB [i]->Lock (0 , 0 , (void **)&pData, 0 ));
282+ R_CHK (HW.pDevice ->CreateIndexBuffer (iCount * 2 , dwUsage, D3DFMT_INDEX16, D3DPOOL_MANAGED, &_IB [i], nullptr ));
283+ HW.stats_manager .increment_stats_ib (_IB[i] );
284+ R_CHK (_IB [i]->Lock (0 , 0 , (void **)&pData, 0 ));
246285 // CopyMemory (pData,fs->pointer(),iCount*2);
247286 fs->r (pData, iCount * 2 );
248- IB [i]->Unlock ();
287+ _IB [i]->Unlock ();
249288
250289 // fs->advance (iCount*2);
251290 }
0 commit comments