Nebula
Loading...
Searching...
No Matches
resourceloader.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
34//------------------------------------------------------------------------------
35#include "ids/id.h"
36#include "util/stringatom.h"
37#include "io/stream.h"
38#include "io/urn.h"
39#include "io/path.h"
40#include "resource.h"
41#include "threading/threadid.h"
42#include "threading/safequeue.h"
43#include "ids/idpool.h"
44#include <functional>
45
46namespace Resources
47{
48
50{
51 None = 0x0,
52 Create = 0x1,
53 Update = 0x2,
54 Reload = 0x4
55};
57
58class Resource;
61{
63
64public:
68 virtual ~ResourceLoader();
69
71 virtual void Setup();
73 virtual void Discard();
74
76 virtual void LoadFallbackResources();
77
80
82 Resources::ResourceId CreateResource(const IO::URI& res, const void* loadInfo, SizeT loadInfoSize, const Util::StringAtom& tag, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed, bool immediate, bool stream);
84 Resources::ResourceId CreateResource(const IO::URN& res, const void* loadInfo, SizeT loadInfoSize, const Util::StringAtom& tag, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed, bool immediate, bool stream);
86 Resources::ResourceId CreateResource(const IO::Path& res, const void* loadInfo, SizeT loadInfoSize, const Util::StringAtom& tag, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed, bool immediate, bool stream);
88 void DiscardResource(const Resources::ResourceId id);
90 void DiscardByTag(const Util::StringAtom& tag);
92 void CreateListener(const Resources::ResourceId res, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed);
93
95 const Resources::ResourceName& GetName(const Resources::ResourceId id) const;
97 const uint32_t GetUsage(const Resources::ResourceId id) const;
99 const Util::StringAtom GetTag(const Resources::ResourceId id) const;
101 const Resource::State GetState(const Resources::ResourceId id) const;
103 const Resources::ResourceId GetId(const Resources::ResourceName& name) const;
107 const bool HasResource(const Resources::ResourceId id) const;
108
110 const int32_t& GetUniqueId() const;
111
113 void ReloadResource(const Resources::ResourceName& res, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed);
115 void ReloadResource(const Resources::ResourceId& id, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed);
116
118 void SetMinLod(const Resources::ResourceId& id, const float lod, bool immediate);
119
134
136 {
137 void* data;
139 };
140
142 {
144 void* data;
145
147 : stream(nullptr)
148 , data(nullptr)
149 {}
150
152 : stream(stream)
153 , data(data)
154 {}
155 };
156
158 {
161
163 : id(InvalidResourceUnknownId)
164 {
165 }
166 };
167
173
180
182 {
186 ResourceId id;
191 float lod;
194
196 {
197 ResourceLoadJob job;
198 job.name = loader->names[load.entry].Value();
199 job.state = loader->states[load.entry];
200 job.id = loader->resources[load.entry];
201 job.loadState = loader->loadStates[load.entry];
202 job.streamData = loader->streamDatas[load.entry];
203 job.metadata = loader->metaData[load.entry];
204 job.tag = load.tag.Value();
205 job.immediate = load.immediate;
206 job.lod = load.lod;
208 job.flags = load.flags;
209 return job;
210 };
211 };
212
214 {
218 ResourceId id;
221
223 {
224 loader->streamDatas[id.loaderInstanceId] = this->streamData;
225 loader->loadStates[id.loaderInstanceId] = this->loadState;
226 loader->states[id.loaderInstanceId] = this->state;
227 loader->resources[id.loaderInstanceId] = this->id;
228 }
229 };
230
231
232protected:
233 friend class ResourceServer;
234
235 friend void ApplyLoadOutput(ResourceLoader* loader, const ResourceLoader::ResourceLoadOutput& output);
236 friend void DispatchJob(ResourceLoader* loader, const ResourceLoader::ResourceLoadJob& job);
238
240 virtual void UpdateLoaderSyncState();
241
244 {
245 Resources::ResourceId id;
246 float lod;
248
249 _PendingStreamLod() : id(ResourceId::Invalid()) {};
250 };
251
253 {
254 Resources::ResourceId resourceId;
255 };
256
259 {
260 std::function<void(const Resources::ResourceId)> success;
261 std::function<void(const Resources::ResourceId)> failed;
262 };
263
264
265 static const uint32_t ResourceIndexGrow = 512;
266 static int32_t UniquePoolCounter;
267
274
276 virtual uint LodMask(const _StreamData& stream, float lod, bool async) const;
278 virtual void RequestLOD(const Ids::Id32 entry, float lod) const;
279
281 void AddReloadListener(const std::function<void(Resources::ResourceId)>& callback);
282
284 virtual void Unload(const Resources::ResourceId id) = 0;
286 virtual void Update(IndexT frameIndex);
287
289 void SetupIdFromEntry(const Ids::Id32 entry, ResourceId& cacheEntry);
290
292 void RunCallbacks(Resource::State status, const Resources::ResourceId id);
293
295 void EnqueueJob(const std::function<void()>& func);
296
298 {
300 Resources::ResourceId placeholderId;
301 };
303
305 Resources::ResourceId GetPlaceholder(const Resources::ResourceName& name);
306
310
311 Resources::ResourceId placeholderResourceId;
312 Resources::ResourceId failResourceId;
314 bool async;
315
317 std::function<void()> preJobFunc;
318 std::function<void()> postJobFunc;
320
325
326 Util::Array<std::function<void(Resources::ResourceId)>> reloadListeners;
327
330
333
345
347 int32_t uniqueId;
348
350 Threading::CriticalSection asyncSection;
352};
353
354
355//------------------------------------------------------------------------------
358inline const Resources::ResourceName&
359ResourceLoader::GetName(const Resources::ResourceId id) const
360{
361 return this->names[id.loaderInstanceId];
362}
363
364//------------------------------------------------------------------------------
367inline const uint32_t
368ResourceLoader::GetUsage(const Resources::ResourceId id) const
369{
370 return this->usage[id.loaderInstanceId];
371}
372
373//------------------------------------------------------------------------------
376inline const Util::StringAtom
377ResourceLoader::GetTag(const Resources::ResourceId id) const
378{
379 return this->tags[id.loaderInstanceId];
380}
381
382//------------------------------------------------------------------------------
386ResourceLoader::GetState(const Resources::ResourceId id) const
387{
388 return this->states[id.loaderInstanceId];
389}
390
391//------------------------------------------------------------------------------
394inline const Resources::ResourceId
396{
397 IndexT i = this->ids.FindIndex(name);
398 if (i == InvalidIndex) return Resources::ResourceId::Invalid();
399 else return this->resources[this->ids.ValueAtIndex(i)];
400}
401
402//------------------------------------------------------------------------------
407{
408 return this->ids;
409}
410
411//------------------------------------------------------------------------------
414inline const bool
415ResourceLoader::HasResource(const Resources::ResourceId id) const
416{
417 return this->names.Size() > (SizeT)id.loaderInstanceId;
418}
419
420//------------------------------------------------------------------------------
423inline const int32_t&
425{
426 return this->uniqueId;
427}
428
429} // namespace Resources
The common base class of Nebula.
Definition refcounted.h:38
A path is an abstraction around file paths.
Definition path.h:26
An URI object can split a Uniform Resource Identifier string into its components or build a string fr...
Definition uri.h:67
A URN (Uniform Resource Name) is a URI (Uniform Resource Identifier) that uses the "urn" scheme.
Definition urn.h:24
Definition idpool.h:29
Nebula's smart pointer class which manages the life time of RefCounted objects.
Definition ptr.h:38
Definition resource.h:22
State
Definition resource.h:26
Ptr< ResourceLoaderThread > streamerThread
Definition resourceloader.h:316
Util::FixedArray< ResourceId > resources
Definition resourceloader.h:339
Util::FixedArray< Resources::ResourceName > names
Definition resourceloader.h:334
void EnqueueJob(const std::function< void()> &func)
Issue async job.
Definition resourceloader.cc:357
Util::Array< _PendingResourceUnload > pendingUnloads
Definition resourceloader.h:322
Util::Dictionary< Resources::ResourceName, uint32_t > ids
Definition resourceloader.h:331
__DeclareAbstractClass(ResourceLoader)
Util::FixedArray< Util::StringAtom > tags
Definition resourceloader.h:336
friend ResourceLoadOutput _LoadInternal(ResourceLoader *loader, ResourceLoadJob res)
Definition resourceloader.cc:376
virtual void Update(IndexT frameIndex)
update the resource loader, this is done every frame
Definition resourceloader.cc:233
std::function< void()> postJobFunc
Definition resourceloader.h:318
virtual void Setup()
setup resource loader, initiates the placeholder and error resources if valid, so don't forget to run...
Definition resourceloader.cc:43
Resources::ResourceId placeholderResourceId
Definition resourceloader.h:311
Util::StringAtom streamerThreadName
Definition resourceloader.h:319
void DiscardByTag(const Util::StringAtom &tag)
discard all resources associated with a tag
Definition resourceloader.cc:764
void DiscardResource(const Resources::ResourceId id)
discard container
Definition resourceloader.cc:727
Util::FixedArray< _StreamData > streamDatas
Definition resourceloader.h:343
void RunCallbacks(Resource::State status, const Resources::ResourceId id)
run callbacks
Definition resourceloader.cc:338
Util::Array< ResourceLoadJob > dependentJobs
Definition resourceloader.h:329
uint32_t uniqueResourceId
Definition resourceloader.h:344
Threading::SafeQueue< _PendingStreamLod > pendingStreamQueue
Definition resourceloader.h:324
IO::Path failResourceName
Definition resourceloader.h:309
Resources::ResourceId CreateResource(const IO::URI &res, const void *loadInfo, SizeT loadInfoSize, const Util::StringAtom &tag, std::function< void(const Resources::ResourceId)> success, std::function< void(const Resources::ResourceId)> failed, bool immediate, bool stream)
Create a resource from URI, returns project placeholder resource unless immediate.
Definition resourceloader.cc:478
const Util::StringAtom GetTag(const Resources::ResourceId id) const
get resource tag was first registered with
Definition resourceloader.h:377
bool async
Definition resourceloader.h:314
int32_t uniqueId
id in resource manager
Definition resourceloader.h:347
ResourceLoader()
constructor
Definition resourceloader.cc:20
Util::FixedArray< Resource::State > states
Definition resourceloader.h:337
static const uint32_t ResourceIndexGrow
Definition resourceloader.h:265
const Util::Dictionary< Resources::ResourceName, Ids::Id32 > & GetResources() const
get the dictionary of all resource-id pairs
Definition resourceloader.h:406
virtual void RequestLOD(const Ids::Id32 entry, float lod) const
Set lod factor for resource.
Definition resourceloader.cc:142
Threading::SafeQueue< ResourceLoadOutput > loadOutputs
Definition resourceloader.h:328
Resources::ResourceId GetPlaceholder(const Resources::ResourceName &name)
get placeholder based on resource name
Definition resourceloader.cc:366
void CreateListener(const Resources::ResourceId res, std::function< void(const Resources::ResourceId)> success, std::function< void(const Resources::ResourceId)> failed)
Create new listener on resource.
Definition resourceloader.cc:789
Util::Array< IndexT > pendingLoads
Definition resourceloader.h:321
Util::FixedArray< LoadState > loadStates
Definition resourceloader.h:338
const int32_t & GetUniqueId() const
get the global identifier for this pool
Definition resourceloader.h:424
Threading::ThreadId creatorThread
Definition resourceloader.h:351
friend class ResourceServer
Definition resourceloader.h:233
Resources::ResourceId failResourceId
Definition resourceloader.h:312
virtual ResourceInitOutput InitializeResource(const ResourceLoadJob &job, const Ptr< IO::Stream > &stream)=0
Initialize and create the resource, optionally load if no subresource management is necessary.
virtual void UpdateLoaderSyncState()
Update loader internal state.
Definition resourceloader.cc:100
friend void DispatchJob(ResourceLoader *loader, const ResourceLoader::ResourceLoadJob &job)
Definition resourceloader.cc:182
virtual void LoadFallbackResources()
load placeholder and error resources
Definition resourceloader.cc:72
void ClearPendingUnloads()
clear pending unloads
Definition resourceloader.cc:206
Util::FixedArray< _PendingResourceLoad > loads
Definition resourceloader.h:341
void SetMinLod(const Resources::ResourceId &id, const float lod, bool immediate)
begin updating a resources lod
Definition resourceloader.cc:879
const Resources::ResourceId GetId(const Resources::ResourceName &name) const
get resource id by name, use with care
Definition resourceloader.h:395
virtual ResourceInitOutput ReinitializeResource(const ResourceLoadJob &job, const Ptr< IO::Stream > &stream)
perform a reload
Definition resourceloader.cc:119
void SetupIdFromEntry(const Ids::Id32 entry, ResourceId &cacheEntry)
Construct resource ID based on loader entry.
Definition resourceloader.cc:312
Util::Array< _PendingStreamLod > pendingStreamLods
Definition resourceloader.h:323
static int32_t UniquePoolCounter
Definition resourceloader.h:266
virtual ResourceStreamOutput StreamResource(const ResourceLoadJob &job)
Stream resource.
Definition resourceloader.cc:109
const bool HasResource(const Resources::ResourceId id) const
returns true if pool has resource
Definition resourceloader.h:415
virtual void Discard()
discard resource loader
Definition resourceloader.cc:62
Util::FixedArray< _PlaceholderResource > placeholders
Definition resourceloader.h:302
const Resources::ResourceName & GetName(const Resources::ResourceId id) const
get resource name
Definition resourceloader.h:359
virtual uint LodMask(const _StreamData &stream, float lod, bool async) const
Create load mask based on LOD. This will be used to determine if the resoure is fully loaded.
Definition resourceloader.cc:133
Util::FixedArray< uint32_t > usage
Definition resourceloader.h:335
Util::StringAtom loaderExtension
Definition resourceloader.h:313
void ReloadResource(const Resources::ResourceName &res, std::function< void(const Resources::ResourceId)> success, std::function< void(const Resources::ResourceId)> failed)
reload resource using resource name
Definition resourceloader.cc:820
Util::Array< std::function< void(Resources::ResourceId)> > reloadListeners
Definition resourceloader.h:326
Ids::IdPool resourceInstanceIndexPool
Definition resourceloader.h:332
Util::FixedArray< Util::Array< _Callbacks > > callbacks
Definition resourceloader.h:340
const Resource::State GetState(const Resources::ResourceId id) const
get resource state
Definition resourceloader.h:386
Util::FixedArray< _LoadMetaData > metaData
Definition resourceloader.h:342
virtual void Unload(const Resources::ResourceId id)=0
unload resource (overload to implement resource deallocation)
Resources::ResourceId CreateResource(const IO::URN &res, const void *loadInfo, SizeT loadInfoSize, const Util::StringAtom &tag, std::function< void(const Resources::ResourceId)> success, std::function< void(const Resources::ResourceId)> failed, bool immediate, bool stream)
Create a resoujrce using URN, the loader itself decides how to resolve the path.
Threading::CriticalSection asyncSection
async section to sync callbacks and pending list with thread
Definition resourceloader.h:350
std::function< void()> preJobFunc
Definition resourceloader.h:317
const uint32_t GetUsage(const Resources::ResourceId id) const
get resource usage from resource id
Definition resourceloader.h:368
void AddReloadListener(const std::function< void(Resources::ResourceId)> &callback)
Register a reload listener callback.
Definition resourceloader.cc:151
friend void ApplyLoadOutput(ResourceLoader *loader, const ResourceLoader::ResourceLoadOutput &output)
Definition resourceloader.cc:160
IO::Path placeholderResourceName
these types need to be properly initiated in a subclass Setup function
Definition resourceloader.h:308
Definition resourceloaderthread.h:23
Thread-safe version of Util::Queue.
Definition safequeue.h:27
Nebula's dynamic array class.
Definition array.h:61
A collection of key/value pairs with quick value retrieval by key at roughly O(log n).
Definition dictionary.h:35
Implements a fixed size one-dimensional array.
Definition fixedarray.h:20
A StringAtom.
Definition stringatom.h:22
const char * Value() const
get contained string as char ptr (fast)
Definition stringatom.h:362
Nebula's universal string class.
Definition string.h:50
uint32_t Id32
Definition id.h:138
A resource is a container for some type of file which is loaded.
Definition resource.cc:9
__ImplementEnumBitOperators(LoadFlags)
LoadFlags
Definition resourceloader.h:50
@ Update
Definition resourceloader.h:53
@ None
Definition resourceloader.h:51
@ Reload
Definition resourceloader.h:54
@ Create
Definition resourceloader.h:52
Util::StringAtom ResourceName
Definition resourceid.h:33
pthread_t ThreadId
Definition linuxthreadid.h:15
callback functions to run when an associated resource is loaded (can be stacked)
Definition resourceloader.h:259
std::function< void(const Resources::ResourceId)> success
Definition resourceloader.h:260
std::function< void(const Resources::ResourceId)> failed
Definition resourceloader.h:261
Definition resourceloader.h:136
void * data
Definition resourceloader.h:137
SizeT size
Definition resourceloader.h:138
struct for pending resources which are about to be loaded
Definition resourceloader.h:122
Ids::Id32 entry
Definition resourceloader.h:123
bool inflight
Definition resourceloader.h:125
IndexT frame
Definition resourceloader.h:128
bool reload
Definition resourceloader.h:127
bool immediate
Definition resourceloader.h:126
float lod
Definition resourceloader.h:129
_PendingResourceLoad()
Definition resourceloader.h:132
LoadFlags flags
Definition resourceloader.h:130
Util::StringAtom tag
Definition resourceloader.h:124
Resources::ResourceId resourceId
Definition resourceloader.h:254
_PendingStreamLod()
Definition resourceloader.h:249
bool immediate
Definition resourceloader.h:247
Resources::ResourceId id
Definition resourceloader.h:245
float lod
Definition resourceloader.h:246
Resources::ResourceId placeholderId
Definition resourceloader.h:300
IO::Path placeholderName
Definition resourceloader.h:299
Definition resourceloader.h:142
_StreamData()
Definition resourceloader.h:146
Ptr< IO::Stream > stream
Definition resourceloader.h:143
_StreamData(const Ptr< IO::Stream > &stream, void *data)
Definition resourceloader.h:151
void * data
Definition resourceloader.h:144
Definition resourceloader.h:175
uint loadedBits
Definition resourceloader.h:178
uint requestedBits
Definition resourceloader.h:176
uint pendingBits
Definition resourceloader.h:177
Definition resourceloader.h:158
ResourceInitOutput()
Definition resourceloader.h:162
ResourceUnknownId id
Definition resourceloader.h:159
_StreamData loaderStreamData
Definition resourceloader.h:160
Definition resourceloader.h:182
LoadState loadState
Definition resourceloader.h:187
float lod
Definition resourceloader.h:191
_StreamData streamData
Definition resourceloader.h:188
bool immediate
Definition resourceloader.h:190
static ResourceLoadJob FromPending(ResourceLoader *loader, IndexT frameIndex, const _PendingResourceLoad &load)
Definition resourceloader.h:195
IndexT frameIndex
Definition resourceloader.h:192
LoadFlags flags
Definition resourceloader.h:193
Util::String name
Definition resourceloader.h:183
Resource::State state
Definition resourceloader.h:185
Util::String tag
Definition resourceloader.h:184
_LoadMetaData metadata
Definition resourceloader.h:189
ResourceId id
Definition resourceloader.h:186
Definition resourceloader.h:214
LoadState loadState
Definition resourceloader.h:216
void UpdateLoaderState(ResourceLoader *loader) const
Definition resourceloader.h:222
ResourceId id
Definition resourceloader.h:218
Resource::State state
Definition resourceloader.h:217
LoadFlags flags
Definition resourceloader.h:219
ResourceLoadJob remainderJob
Definition resourceloader.h:220
_StreamData streamData
Definition resourceloader.h:215
uint loadedBits
Definition resourceloader.h:170
uint pendingBits
Definition resourceloader.h:171
Definition resourceid.h:37
int SizeT
Definition types.h:42
unsigned int uint
Definition types.h:33
int IndexT
Definition types.h:41