@@ -201,30 +201,40 @@ 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
{
209
212
params.meshManipulatorOverride = m_meshManipulator.get ();
210
213
}
214
+ if (restoreLevels)
215
+ {
216
+ using flags_t = std::underlying_type_t <IAssetLoader::E_CACHING_FLAGS>;
217
+ flags_t mask = ~static_cast <flags_t >(0 );
218
+ mask = core::bitfieldInsert<flags_t >(mask, IAssetLoader::ECF_DONT_CACHE_REFERENCES, 2u *_hierarchyLevel, 2u *restoreLevels);
219
+ params.cacheFlags = static_cast <IAssetLoader::E_CACHING_FLAGS>(params.cacheFlags & mask);
220
+ }
211
221
212
222
IAssetLoader::SAssetLoadContext ctx{params, _file};
213
223
214
224
std::string filename = _file ? _file->getFileName ().c_str () : _supposedFilename;
215
- io::IReadFile* file = _override->getLoadFile (_file, filename, ctx, _hierarchyLevel);
225
+ io::IReadFile* file = _override->getLoadFile (_file, filename, ctx, _hierarchyLevel); // WARNING: mem-leak possibility: _override should return smart_ptr<IReadFile> (TODO, inspect this)
216
226
filename = file ? file->getFileName ().c_str () : _supposedFilename;
217
227
218
228
const uint64_t levelFlags = params.cacheFlags >> ((uint64_t )_hierarchyLevel * 2ull );
219
229
220
- SAssetBundle asset ;
230
+ SAssetBundle bundle ;
221
231
if ((levelFlags & IAssetLoader::ECF_DUPLICATE_TOP_LEVEL) != IAssetLoader::ECF_DUPLICATE_TOP_LEVEL)
222
232
{
223
233
auto found = findAssets (filename);
224
234
if (found->size ())
225
235
return _override->chooseRelevantFromFound (found->begin (), found->end (), ctx, _hierarchyLevel);
226
- else if (!(asset = _override->handleSearchFail (filename, ctx, _hierarchyLevel)).getContents ().empty ())
227
- return asset ;
236
+ else if (!(bundle = _override->handleSearchFail (filename, ctx, _hierarchyLevel)).getContents ().empty ())
237
+ return bundle ;
228
238
}
229
239
230
240
// if at this point, and after looking for an asset in cache, file is still nullptr, then return nullptr
@@ -235,41 +245,86 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
235
245
// loaders associated with the file's extension tryout
236
246
for (auto & loader : capableLoadersRng)
237
247
{
238
- if (loader.second ->isALoadableFileFormat (file) && !(asset = loader.second ->loadAsset (file, params, _override, _hierarchyLevel)).getContents ().empty ())
248
+ if (loader.second ->isALoadableFileFormat (file) && !(bundle = loader.second ->loadAsset (file, params, _override, _hierarchyLevel)).getContents ().empty ())
239
249
break ;
240
250
}
241
- for (auto loaderItr = std::begin (m_loaders.vector ); asset .getContents ().empty () && loaderItr != std::end (m_loaders.vector ); ++loaderItr) // all loaders tryout
251
+ for (auto loaderItr = std::begin (m_loaders.vector ); bundle .getContents ().empty () && loaderItr != std::end (m_loaders.vector ); ++loaderItr) // all loaders tryout
242
252
{
243
- if ((*loaderItr)->isALoadableFileFormat (file) && !(asset = (*loaderItr)->loadAsset (file, params, _override, _hierarchyLevel)).getContents ().empty ())
253
+ if ((*loaderItr)->isALoadableFileFormat (file) && !(bundle = (*loaderItr)->loadAsset (file, params, _override, _hierarchyLevel)).getContents ().empty ())
244
254
break ;
245
255
}
246
256
247
- if (!asset .getContents ().empty () &&
257
+ if (!bundle .getContents ().empty () &&
248
258
((levelFlags & IAssetLoader::ECF_DONT_CACHE_TOP_LEVEL) != IAssetLoader::ECF_DONT_CACHE_TOP_LEVEL) &&
249
259
((levelFlags & IAssetLoader::ECF_DUPLICATE_TOP_LEVEL) != IAssetLoader::ECF_DUPLICATE_TOP_LEVEL))
250
260
{
251
- _override->insertAssetIntoCache (asset , filename, ctx, _hierarchyLevel);
261
+ _override->insertAssetIntoCache (bundle , filename, ctx, _hierarchyLevel);
252
262
}
253
- else if (asset .getContents ().empty ())
263
+ else if (bundle .getContents ().empty ())
254
264
{
255
265
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);
266
+ bundle = _override->handleLoadFail (addToCache, file, filename, filename, ctx, _hierarchyLevel);
267
+ if (!bundle.getContents ().empty () && addToCache)
268
+ _override->insertAssetIntoCache (bundle, filename, ctx, _hierarchyLevel);
269
+ }
270
+
271
+ auto whole_bundle_not_dummy = [restoreLevels](const SAssetBundle& _b) {
272
+ auto rng = _b.getContents ();
273
+ for (const auto & a : rng)
274
+ if (a->isAnyDependencyDummy (restoreLevels))
275
+ return false ;
276
+ return true ;
277
+ };
278
+ if (bundle.getContents ().empty () || whole_bundle_not_dummy (bundle))
279
+ return bundle;
280
+
281
+ if (restoreLevels)
282
+ {
283
+ auto reloadParams = _params;
284
+ {
285
+ using flags_t = std::underlying_type_t <IAssetLoader::E_CACHING_FLAGS>;
286
+ constexpr uint32_t bitdepth = sizeof (flags_t )*8u ;
287
+ const flags_t zeroOutMask = (~static_cast <flags_t >(0 )) >> (bitdepth - 2u *(restoreLevels + _hierarchyLevel));
288
+ flags_t reloadFlags = reloadParams.cacheFlags ;
289
+ reloadFlags &= zeroOutMask; // make sure we never pointlessy reload levels above (_restoreLevels+_hierLevel) in reload pass
290
+ // set flags for levels [_hierLevel,_hierLevel+_restoreLevels) to dont look into cache and dont put into cache
291
+ reloadFlags = core::bitfieldInsert<flags_t >(reloadFlags, IAssetLoader::ECF_DUPLICATE_REFERENCES, _hierarchyLevel*2u , restoreLevels*2u );
292
+ reloadParams.cacheFlags = static_cast <IAssetLoader::E_CACHING_FLAGS>(reloadFlags);
293
+
294
+ reloadParams.restoreLevels = 0u ; // make sure it wont turn into infinite recursion
295
+ reloadParams.reload = true ; // TODO (consider): alternative to this flag: another method in override just to let user choose asset for restore
296
+ }
297
+
298
+ auto reloadBundle = getAssetInHierarchy_impl<RestoreWholeBundle>(_file, _supposedFilename, reloadParams, _hierarchyLevel, _override);
299
+
300
+ if constexpr (RestoreWholeBundle)
301
+ {
302
+ IAssetLoader::SAssetLoadContext ctx (params, file);
303
+ auto asset = _override->chooseDefaultAsset (bundle, ctx);
304
+
305
+ // user responsible for checking if assets he wanted to be restored are in fact restored
306
+ _override->handleRestore (std::move (asset), bundle, reloadBundle, restoreLevels);
307
+ }
308
+ else
309
+ {
310
+ // user responsible for checking if assets he wanted to be restored are in fact restored
311
+ _override->handleRestore (bundle, reloadBundle, restoreLevels);
312
+ }
259
313
}
260
314
261
- return asset ;
315
+ return bundle ;
262
316
}
263
317
// TODO change name
264
- SAssetBundle getAssetInHierarchy (const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
318
+ template <bool RestoreWholeBundle>
319
+ SAssetBundle getAssetInHierarchy_impl (const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
265
320
{
266
321
IAssetLoader::SAssetLoadContext ctx (_params, nullptr );
267
322
268
323
std::string filePath = _filePath;
269
324
_override->getLoadFilename (filePath, ctx, _hierarchyLevel);
270
325
io::IReadFile* file = m_fileSystem->createAndOpenFile (filePath.c_str ());
271
326
272
- SAssetBundle asset = getAssetInHierarchy (file, _filePath, _params, _hierarchyLevel, _override);
327
+ SAssetBundle asset = getAssetInHierarchy_impl<RestoreWholeBundle> (file, _filePath, _params, _hierarchyLevel, _override);
273
328
274
329
if (file)
275
330
file->drop ();
@@ -278,15 +333,52 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
278
333
}
279
334
280
335
// TODO change name
281
- SAssetBundle getAssetInHierarchy (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
336
+ template <bool RestoreWholeBundle>
337
+ SAssetBundle getAssetInHierarchy_impl (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
282
338
{
283
- return getAssetInHierarchy (_file, _supposedFilename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
339
+ return getAssetInHierarchy_impl<RestoreWholeBundle> (_file, _supposedFilename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
284
340
}
285
341
286
342
// TODO change name
343
+ template <bool RestoreWholeBundle>
344
+ SAssetBundle getAssetInHierarchy_impl (const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
345
+ {
346
+ return getAssetInHierarchy_impl<RestoreWholeBundle>(_filename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
347
+ }
348
+
349
+
350
+ SAssetBundle getAssetInHierarchy (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
351
+ {
352
+ return getAssetInHierarchy_impl<false >(_file, _supposedFilename, _params, _hierarchyLevel, _override);
353
+ }
354
+ SAssetBundle getAssetInHierarchy (const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
355
+ {
356
+ return getAssetInHierarchy_impl<false >(_filePath, _params, _hierarchyLevel, _override);
357
+ }
358
+ SAssetBundle getAssetInHierarchy (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
359
+ {
360
+ return getAssetInHierarchy_impl<false >(_file, _supposedFilename, _params, _hierarchyLevel);
361
+ }
287
362
SAssetBundle getAssetInHierarchy (const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
288
363
{
289
- return getAssetInHierarchy (_filename, _params, _hierarchyLevel, &m_defaultLoaderOverride);
364
+ return getAssetInHierarchy_impl<false >(_filename, _params, _hierarchyLevel);
365
+ }
366
+
367
+ SAssetBundle getAssetInHierarchyWholeBundleRestore (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
368
+ {
369
+ return getAssetInHierarchy_impl<true >(_file, _supposedFilename, _params, _hierarchyLevel, _override);
370
+ }
371
+ SAssetBundle getAssetInHierarchyWholeBundleRestore (const std::string& _filePath, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel, IAssetLoader::IAssetLoaderOverride* _override)
372
+ {
373
+ return getAssetInHierarchy_impl<true >(_filePath, _params, _hierarchyLevel, _override);
374
+ }
375
+ SAssetBundle getAssetInHierarchyWholeBundleRestore (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
376
+ {
377
+ return getAssetInHierarchy_impl<true >(_file, _supposedFilename, _params, _hierarchyLevel);
378
+ }
379
+ SAssetBundle getAssetInHierarchyWholeBundleRestore (const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, uint32_t _hierarchyLevel)
380
+ {
381
+ return getAssetInHierarchy_impl<true >(_filename, _params, _hierarchyLevel);
290
382
}
291
383
292
384
public:
@@ -302,19 +394,37 @@ class IAssetManager : public core::IReferenceCounted, public core::QuitSignallin
302
394
{
303
395
return getAssetInHierarchy (_file, _supposedFilename, _params, 0u , _override);
304
396
}
305
-
306
397
// TODO change name
307
398
SAssetBundle getAsset (const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params)
308
399
{
309
400
return getAsset (_filename, _params, &m_defaultLoaderOverride);
310
401
}
311
-
312
402
// TODO change name
313
403
SAssetBundle getAsset (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params)
314
404
{
315
405
return getAsset (_file, _supposedFilename, _params, &m_defaultLoaderOverride);
316
406
}
317
407
408
+ SAssetBundle getAssetWholeBundleRestore (const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params, IAssetLoader::IAssetLoaderOverride* _override)
409
+ {
410
+ return getAssetInHierarchyWholeBundleRestore (_filename, _params, 0u , _override);
411
+ }
412
+ // TODO change name
413
+ SAssetBundle getAssetWholeBundleRestore (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params, IAssetLoader::IAssetLoaderOverride* _override)
414
+ {
415
+ return getAssetInHierarchyWholeBundleRestore (_file, _supposedFilename, _params, 0u , _override);
416
+ }
417
+ // TODO change name
418
+ SAssetBundle getAssetWholeBundleRestore (const std::string& _filename, const IAssetLoader::SAssetLoadParams& _params)
419
+ {
420
+ return getAssetWholeBundleRestore (_filename, _params, &m_defaultLoaderOverride);
421
+ }
422
+ // TODO change name
423
+ SAssetBundle getAssetWholeBundleRestore (io::IReadFile* _file, const std::string& _supposedFilename, const IAssetLoader::SAssetLoadParams& _params)
424
+ {
425
+ return getAssetWholeBundleRestore (_file, _supposedFilename, _params, &m_defaultLoaderOverride);
426
+ }
427
+
318
428
// TODO change name
319
429
// ! Check whether Assets exist in cache using a key and optionally their types
320
430
/*
0 commit comments