@@ -171,9 +171,6 @@ void CModelPool::Instance_Register(LPCSTR N, dxRender_Visual* V)
171171
172172void CModelPool::Destroy ()
173173{
174- // Pool
175- Pool.clear ();
176-
177174 // Registry
178175 while (!Registry.empty ())
179176 {
@@ -239,39 +236,22 @@ dxRender_Visual* CModelPool::Create(const char* name, IReader* data)
239236 xr_strcpy (low_name, name);
240237 strlwr (low_name);
241238 if (strext (low_name)) *strext (low_name) = 0 ;
242- // Msg ("-CREATE %s",low_name);
243-
244- // 0. Search POOL
245- POOL_IT it = Pool.find (low_name);
246- if (it != Pool.end ())
239+
240+ // 1. Search for already loaded model (reference, base model)
241+ dxRender_Visual* Base = Instance_Find (low_name);
242+ if (0 == Base)
247243 {
248- // 1. Instance found
249- dxRender_Visual* Model = it-> second ;
250- Model-> Spawn ( );
251- Pool. erase (it );
252- return Model ;
244+ // 2. If not found
245+ bAllowChildrenDuplicate = FALSE ;
246+ if (data) Base = Instance_Load (low_name, data, TRUE );
247+ else Base = Instance_Load (low_name, TRUE );
248+ bAllowChildrenDuplicate = TRUE ;
253249 }
254- else
255- {
256- // 1. Search for already loaded model (reference, base model)
257- dxRender_Visual* Base = Instance_Find (low_name);
258250
259- if (0 == Base)
260- {
261- // 2. If not found
262- bAllowChildrenDuplicate = FALSE ;
263- if (data) Base = Instance_Load (low_name, data,TRUE );
264- else Base = Instance_Load (low_name,TRUE );
265- bAllowChildrenDuplicate = TRUE ;
266- #ifdef _EDITOR
267- if (!Base) return 0 ;
268- #endif
269- }
270- // 3. If found - return (cloned) reference
271- dxRender_Visual* Model = Instance_Duplicate (Base);
272- Registry.insert (mk_pair (Model, low_name));
273- return Model;
274- }
251+ // 3. If found - return (cloned) reference
252+ dxRender_Visual* Model = Instance_Duplicate (Base);
253+ Registry.insert (mk_pair (Model, low_name));
254+ return Model;
275255}
276256
277257dxRender_Visual* CModelPool::CreateChild (LPCSTR name, IReader* data)
@@ -302,25 +282,7 @@ void CModelPool::DeleteInternal(dxRender_Visual* & V, BOOL bDiscard)
302282 VERIFY (!g_bRendering);
303283 if (!V) return ;
304284 V->Depart ();
305- if (bDiscard || bForceDiscard)
306- {
307- Discard (V, TRUE );
308- }
309- else
310- {
311- //
312- REGISTRY_IT it = Registry.find (V);
313- if (it != Registry.end ())
314- {
315- // Registry entry found - move it to pool
316- Pool.insert (mk_pair (it->second , V));
317- }
318- else
319- {
320- // Registry entry not-found - just special type of visual / particles / etc.
321- xr_delete (V);
322- }
323- }
285+ Discard (V, bDiscard || bForceDiscard);
324286 V = NULL ;
325287}
326288
@@ -329,20 +291,18 @@ void CModelPool::Delete(dxRender_Visual* & V, BOOL bDiscard)
329291 if (NULL == V) return ;
330292 if (g_bRendering)
331293 {
332- VERIFY (!bDiscard);
333- ModelsToDelete.push_back (V);
294+ ModelsToDelete.insert (mk_pair (V, !!bDiscard));
334295 }
335296 else
336297 {
337298 DeleteInternal (V, bDiscard);
338299 }
339- V = NULL ;
340300}
341301
342302void CModelPool::DeleteQueue ()
343303{
344- for (u32 it = 0 ; it < ModelsToDelete.size (); it++)
345- DeleteInternal (ModelsToDelete[it] );
304+ for (xr_map<dxRender_Visual*, bool >::iterator it = ModelsToDelete. begin () ; it != ModelsToDelete.end (); it++)
305+ DeleteInternal ((dxRender_Visual*)it-> first , it-> second );
346306 ModelsToDelete.clear ();
347307}
348308
@@ -352,8 +312,6 @@ void CModelPool::Discard(dxRender_Visual* & V, BOOL b_complete)
352312 REGISTRY_IT it = Registry.find (V);
353313 if (it != Registry.end ())
354314 {
355- // Pool - OK
356-
357315 // Base
358316 const shared_str& name = it->second ;
359317 xr_vector<ModelDef>::iterator I = Models.begin ();
@@ -387,7 +345,6 @@ void CModelPool::Discard(dxRender_Visual* & V, BOOL b_complete)
387345 }
388346 // Registry
389347 xr_delete (V);
390- // . xr_free (name);
391348 Registry.erase (it);
392349 }
393350 else
@@ -420,17 +377,6 @@ void CModelPool::Prefetch_One(LPCSTR N)
420377 Delete (V,FALSE );
421378}
422379
423- void CModelPool::ClearPool (BOOL b_complete)
424- {
425- POOL_IT _I = Pool.begin ();
426- POOL_IT _E = Pool.end ();
427- for (; _I != _E; _I++)
428- {
429- Discard (_I->second , b_complete);
430- }
431- Pool.clear ();
432- }
433-
434380dxRender_Visual* CModelPool::CreatePE (PS::CPEDef* source)
435381{
436382 PS::CParticleEffect* V = (PS::CParticleEffect*)Instance_Create (MT_PARTICLE_EFFECT);
@@ -463,7 +409,6 @@ void CModelPool::dump()
463409 Msg (" --- models: %d, mem usage: %d Kb " , k, sz / 1024 );
464410 sz = 0 ;
465411 k = 0 ;
466- int free_cnt = 0 ;
467412 for (REGISTRY_IT it = Registry.begin (); it != Registry.end (); it++)
468413 {
469414 CKinematics* K = PCKinematics ((dxRender_Visual*)it->first );
@@ -472,12 +417,10 @@ void CModelPool::dump()
472417 {
473418 u32 cur = K->mem_usage (true );
474419 sz += cur;
475- bool b_free = (Pool.find (it->second ) != Pool.end ());
476- if (b_free) ++free_cnt;
477- Msg (" #%3d: [%s] [%5d Kb] - %s" , k++, (b_free) ? " free" : " used" , cur / 1024 , it->second .c_str ());
420+ Msg (" #%3d: [%5d Kb] - %s" , k++, cur / 1024 , it->second .c_str ());
478421 }
479422 }
480- Msg (" --- instances: %d, free %d, mem usage: %d Kb " , k, free_cnt , sz / 1024 );
423+ Msg (" --- instances: %d, mem usage: %d Kb " , k, sz / 1024 );
481424 Log (" --- model pool --- end." );
482425}
483426
0 commit comments