@@ -201,8 +201,11 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
201
201
@see IAssetLoader
202
202
@see SAssetBundle
203
203
*/
204
- SAssetBundle getAssetInHierarchy (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
204
+ template <bool RestoreWholeBundle>
205
+ SAssetBundle getAssetInHierarchy_impl (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
205
206
{
207
+ const uint32_t restoreLevels = (_hierarchyLevel >= _params.restoreLevels ) ? 0u : (_params.restoreLevels - _hierarchyLevel);
208
+
206
209
IAssetLoader::SAssetLoadParams params (_params);
207
210
if (params.meshManipulatorOverride == nullptr )
208
211
{
@@ -212,19 +215,19 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
212
215
IAssetLoader::SAssetLoadContext ctx{params, _file};
213
216
214
217
std::string filename = _file ? _file->getFileName ().c_str () : _supposedFilename;
215
- io::IReadFile* file = _override->getLoadFile (_file, filename, ctx, _hierarchyLevel);
218
+ io::IReadFile* file = _override->getLoadFile (_file, filename, ctx, _hierarchyLevel); // WARNING: mem-leak possibility: _override should return smart_ptr<IReadFile> (TODO, inspect this)
216
219
filename = file ? file->getFileName ().c_str () : _supposedFilename;
217
220
218
221
const uint64_t levelFlags = params.cacheFlags >> ((uint64_t )_hierarchyLevel * 2ull );
219
222
220
- SAssetBundle asset ;
223
+ SAssetBundle bundle ;
221
224
if ((levelFlags & IAssetLoader::ECF_DUPLICATE_TOP_LEVEL) != IAssetLoader::ECF_DUPLICATE_TOP_LEVEL)
222
225
{
223
226
auto found = findAssets (filename);
224
227
if (found->size ())
225
228
return _override->chooseRelevantFromFound (found->begin (), found->end (), ctx, _hierarchyLevel);
226
- else if (!(asset = _override->handleSearchFail (filename, ctx, _hierarchyLevel)).getContents ().empty ())
227
- return asset ;
229
+ else if (!(bundle = _override->handleSearchFail (filename, ctx, _hierarchyLevel)).getContents ().empty ())
230
+ return bundle ;
228
231
}
229
232
230
233
// if at this point, and after looking for an asset in cache, file is still nullptr, then return nullptr
@@ -235,41 +238,86 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
235
238
// loaders associated with the file's extension tryout
236
239
for (auto & loader : capableLoadersRng)
237
240
{
238
- if (loader.second ->isALoadableFileFormat (file) && !(asset = loader.second ->loadAsset (file, params, _override, _hierarchyLevel)).getContents ().empty ())
241
+ if (loader.second ->isALoadableFileFormat (file) && !(bundle = loader.second ->loadAsset (file, params, _override, _hierarchyLevel)).getContents ().empty ())
239
242
break ;
240
243
}
241
- for (auto loaderItr = std::begin (m_loaders.vector ); asset .getContents ().empty () && loaderItr != std::end (m_loaders.vector ); ++loaderItr) // all loaders tryout
244
+ for (auto loaderItr = std::begin (m_loaders.vector ); bundle .getContents ().empty () && loaderItr != std::end (m_loaders.vector ); ++loaderItr) // all loaders tryout
242
245
{
243
- if ((*loaderItr)->isALoadableFileFormat (file) && !(asset = (*loaderItr)->loadAsset (file, params, _override, _hierarchyLevel)).getContents ().empty ())
246
+ if ((*loaderItr)->isALoadableFileFormat (file) && !(bundle = (*loaderItr)->loadAsset (file, params, _override, _hierarchyLevel)).getContents ().empty ())
244
247
break ;
245
248
}
246
249
247
- if (!asset .getContents ().empty () &&
250
+ if (!bundle .getContents ().empty () &&
248
251
((levelFlags & IAssetLoader::ECF_DONT_CACHE_TOP_LEVEL) != IAssetLoader::ECF_DONT_CACHE_TOP_LEVEL) &&
249
252
((levelFlags & IAssetLoader::ECF_DUPLICATE_TOP_LEVEL) != IAssetLoader::ECF_DUPLICATE_TOP_LEVEL))
250
253
{
251
- _override->insertAssetIntoCache (asset , filename, ctx, _hierarchyLevel);
254
+ _override->insertAssetIntoCache (bundle , filename, ctx, _hierarchyLevel);
252
255
}
253
- else if (asset .getContents ().empty ())
256
+ else if (bundle .getContents ().empty ())
254
257
{
255
258
bool addToCache;
256
- asset = _override->handleLoadFail (addToCache, file, filename, filename, ctx, _hierarchyLevel);
257
- if (!asset.getContents ().empty () && addToCache)
258
- _override->insertAssetIntoCache (asset, filename, ctx, _hierarchyLevel);
259
+ bundle = _override->handleLoadFail (addToCache, file, filename, filename, ctx, _hierarchyLevel);
260
+ if (!bundle.getContents ().empty () && addToCache)
261
+ _override->insertAssetIntoCache (bundle, filename, ctx, _hierarchyLevel);
262
+ }
263
+
264
+ auto whole_bundle_not_dummy = [restoreLevels](const SAssetBundle& _b) {
265
+ auto rng = _b.getContents ();
266
+ for (const auto & a : rng)
267
+ if (a->isAnyDependencyDummy (restoreLevels))
268
+ return false ;
269
+ return true ;
270
+ };
271
+ if (bundle.getContents ().empty () || whole_bundle_not_dummy (bundle))
272
+ return bundle;
273
+
274
+ if (restoreLevels)
275
+ {
276
+ auto reloadParams = IAssetLoader::SAssetLoadParams (_params, true );
277
+ {
278
+ using flags_t = std::underlying_type_t <IAssetLoader::E_CACHING_FLAGS>;
279
+ constexpr uint32_t bitdepth = sizeof (flags_t )*8u ;
280
+ const flags_t zeroOutMask = (~static_cast <flags_t >(0 )) >> (bitdepth - 2u *(restoreLevels + _hierarchyLevel));
281
+ flags_t reloadFlags = reloadParams.cacheFlags ;
282
+ reloadFlags &= zeroOutMask; // make sure we never pointlessy reload levels above (_restoreLevels+_hierLevel) in reload pass
283
+ // set flags for levels [_hierLevel,_hierLevel+_restoreLevels) to dont look into cache and dont put into cache
284
+ reloadFlags = core::bitfieldInsert<flags_t >(reloadFlags, IAssetLoader::ECF_DUPLICATE_REFERENCES, _hierarchyLevel*2u , restoreLevels*2u );
285
+ reloadParams.cacheFlags = static_cast <IAssetLoader::E_CACHING_FLAGS>(reloadFlags);
286
+ reloadParams.restoreLevels = 0u ; // make sure it wont turn into infinite recursion
287
+ }
288
+
289
+ auto reloadBundle = getAssetInHierarchy_impl<RestoreWholeBundle>(_file, _supposedFilename, reloadParams, _hierarchyLevel, _override);
290
+
291
+ if constexpr (!RestoreWholeBundle)
292
+ {
293
+ IAssetLoader::SAssetLoadContext ctx (params, file);
294
+ auto asset = _override->chooseDefaultAsset (bundle, ctx);
295
+
296
+ auto newChosenAsset = _override->handleRestore (std::move (asset), bundle, reloadBundle, restoreLevels);
297
+ if (!newChosenAsset || newChosenAsset->isAnyDependencyDummy (restoreLevels))
298
+ return {};
299
+ }
300
+ else
301
+ {
302
+ _override->handleRestore (bundle, reloadBundle, restoreLevels);
303
+ if (!whole_bundle_not_dummy (bundle))
304
+ return {};
305
+ }
259
306
}
260
307
261
- return asset ;
308
+ return bundle ;
262
309
}
263
310
// TODO change name
264
- SAssetBundle getAssetInHierarchy (const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
311
+ template <bool RestoreWholeBundle>
312
+ SAssetBundle getAssetInHierarchy_impl (const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
265
313
{
266
314
IAssetLoader::SAssetLoadContext ctx (_params, nullptr );
267
315
268
316
std::string filePath = _filePath;
269
317
_override->getLoadFilename (filePath, ctx, _hierarchyLevel);
270
318
io::IReadFile* file = m_fileSystem->createAndOpenFile (filePath.c_str ());
271
319
272
- SAssetBundle asset = getAssetInHierarchy (file, _filePath, _params, _hierarchyLevel, _override);
320
+ SAssetBundle asset = getAssetInHierarchy_impl<RestoreWholeBundle> (file, _filePath, _params, _hierarchyLevel, _override);
273
321
274
322
if (file)
275
323
file->drop ();
@@ -278,15 +326,52 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
278
326
}
279
327
280
328
// TODO change name
281
- SAssetBundle getAssetInHierarchy (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
329
+ template <bool RestoreWholeBundle>
330
+ SAssetBundle getAssetInHierarchy_impl (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
282
331
{
283
- return getAssetInHierarchy (_file, _supposedFilename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
332
+ return getAssetInHierarchy_impl<RestoreWholeBundle> (_file, _supposedFilename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
284
333
}
285
334
286
335
// TODO change name
336
+ template <bool RestoreWholeBundle>
337
+ SAssetBundle getAssetInHierarchy_impl (const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
338
+ {
339
+ return getAssetInHierarchy_impl<RestoreWholeBundle>(_filename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
340
+ }
341
+
342
+
343
+ SAssetBundle getAssetInHierarchy (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
344
+ {
345
+ return getAssetInHierarchy_impl<false >(_file, _supposedFilename, _params, _hierarchyLevel, _override);
346
+ }
347
+ SAssetBundle getAssetInHierarchy (const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
348
+ {
349
+ return getAssetInHierarchy_impl<false >(_filePath, _params, _hierarchyLevel, _override);
350
+ }
351
+ SAssetBundle getAssetInHierarchy (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
352
+ {
353
+ return getAssetInHierarchy_impl<false >(_file, _supposedFilename, _params, _hierarchyLevel);
354
+ }
287
355
SAssetBundle getAssetInHierarchy (const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
288
356
{
289
- return getAssetInHierarchy (_filename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
357
+ return getAssetInHierarchy_impl<false >(_filename, _params, _hierarchyLevel);
358
+ }
359
+
360
+ SAssetBundle getAssetInHierarchyWholeBundleRestore (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
361
+ {
362
+ return getAssetInHierarchy_impl<true >(_file, _supposedFilename, _params, _hierarchyLevel, _override);
363
+ }
364
+ SAssetBundle getAssetInHierarchyWholeBundleRestore (const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
365
+ {
366
+ return getAssetInHierarchy_impl<true >(_filePath, _params, _hierarchyLevel, _override);
367
+ }
368
+ SAssetBundle getAssetInHierarchyWholeBundleRestore (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
369
+ {
370
+ return getAssetInHierarchy_impl<true >(_file, _supposedFilename, _params, _hierarchyLevel);
371
+ }
372
+ SAssetBundle getAssetInHierarchyWholeBundleRestore (const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
373
+ {
374
+ return getAssetInHierarchy_impl<true >(_filename, _params, _hierarchyLevel);
290
375
}
291
376
292
377
public:
@@ -302,13 +387,11 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
302
387
{
303
388
return getAssetInHierarchy (_file, _supposedFilename, _params, 0u , _override);
304
389
}
305
-
306
390
// TODO change name
307
391
SAssetBundle getAsset (const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params)
308
392
{
309
393
return getAsset (_filename, _params, &m_defaultLoaderOverride);
310
394
}
311
-
312
395
// TODO change name
313
396
SAssetBundle getAsset (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params)
314
397
{
0 commit comments