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 "util/set.h"
39#include "resource.h"
40#include "threading/safequeue.h"
41#include "threading/threadid.h"
42#include "ids/idpool.h"
43#include <tuple>
44#include <functional>
45
46namespace Resources
47{
48
54
55class Resource;
58{
60
61public:
65 virtual ~ResourceLoader();
66
68 virtual void Setup();
70 virtual void Discard();
71
73 virtual void LoadFallbackResources();
74
76 Resources::ResourceId CreateResource(const Resources::ResourceName& 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);
78 void DiscardResource(const Resources::ResourceId id);
80 void DiscardByTag(const Util::StringAtom& tag);
82 void CreateListener(const Resources::ResourceId res, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed);
83
85 const Resources::ResourceName& GetName(const Resources::ResourceId id) const;
87 const uint32_t GetUsage(const Resources::ResourceId id) const;
89 const Util::StringAtom GetTag(const Resources::ResourceId id) const;
91 const Resource::State GetState(const Resources::ResourceId id) const;
93 const Resources::ResourceId GetId(const Resources::ResourceName& name) const;
97 const bool HasResource(const Resources::ResourceId id) const;
98
100 const int32_t& GetUniqueId() const;
101
103 void ReloadResource(const Resources::ResourceName& res, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed);
105 void ReloadResource(const Resources::ResourceId& id, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed);
106
108 void SetMinLod(const Resources::ResourceId& id, const float lod, bool immediate);
109
110protected:
111 friend class ResourceServer;
112
134
137 {
138 Resources::ResourceId id;
139 float lod;
141
142 _PendingStreamLod() : id(ResourceId::Invalid()) {};
143 };
144
146 {
147 Resources::ResourceId resourceId;
148 };
149
152 {
153 Resources::ResourceId id;
154 std::function<void(const Resources::ResourceId)> success;
155 std::function<void(const Resources::ResourceId)> failed;
156 };
157
159 {
160 void* data;
162 };
163
165 {
166 Full, // All requested subresources were loaded
167 Partial, // Some of the requested subresources could be loaded, but not all
168 Rejected // None of the requested subresources were loaded, loader out of budget
169 };
170
171 static const uint32_t ResourceIndexGrow = 512;
172
174 virtual ResourceUnknownId InitializeResource(const Ids::Id32 entry, const Util::StringAtom& tag, const Ptr<IO::Stream>& stream, bool immediate = false) = 0;
176 virtual uint StreamResource(const ResourceId entry, IndexT frameIndex, uint requestedBits);
178 virtual Resource::State ReloadFromStream(const Resources::ResourceId id, const Ptr<IO::Stream>& stream);
180 virtual SubresourceLoadStatus StreamMaxLOD(const Resources::ResourceId& id, const float lod, bool immediate);
181
183 virtual uint LodMask(const Ids::Id32 entry, float lod, bool stream) const;
185 virtual void RequestLOD(const Ids::Id32 entry, float lod) const;
186
188 virtual void Unload(const Resources::ResourceId id) = 0;
190 virtual void Update(IndexT frameIndex);
191
193 void SetupIdFromEntry(const Ids::Id32 entry, ResourceId& cacheEntry);
194
200 void RunCallbacks(Resource::State status, const Resources::ResourceId id);
201
203
210
212 Resources::ResourceId GetPlaceholder(const Resources::ResourceName& name);
213
217
218 Resources::ResourceId placeholderResourceId;
219 Resources::ResourceId failResourceId;
220
222 {
223 void* data;
225 };
226
227 bool async;
228
231
236
239
252
254 int32_t uniqueId;
255
259};
260
261//------------------------------------------------------------------------------
264inline const Resources::ResourceName&
265ResourceLoader::GetName(const Resources::ResourceId id) const
266{
267 return this->names[id.loaderInstanceId];
268}
269
270//------------------------------------------------------------------------------
273inline const uint32_t
274ResourceLoader::GetUsage(const Resources::ResourceId id) const
275{
276 return this->usage[id.loaderInstanceId];
277}
278
279//------------------------------------------------------------------------------
282inline const Util::StringAtom
283ResourceLoader::GetTag(const Resources::ResourceId id) const
284{
285 return this->tags[id.loaderInstanceId];
286}
287
288//------------------------------------------------------------------------------
292ResourceLoader::GetState(const Resources::ResourceId id) const
293{
294 return this->states[id.loaderInstanceId];
295}
296
297//------------------------------------------------------------------------------
300inline const Resources::ResourceId
302{
303 IndexT i = this->ids.FindIndex(name);
304 if (i == InvalidIndex) return Resources::ResourceId::Invalid();
305 else return this->resources[this->ids.ValueAtIndex(i)];
306}
307
308//------------------------------------------------------------------------------
313{
314 return this->ids;
315}
316
317//------------------------------------------------------------------------------
320inline const bool
321ResourceLoader::HasResource(const Resources::ResourceId id) const
322{
323 return this->names.Size() > (SizeT)id.loaderInstanceId;
324}
325
326//------------------------------------------------------------------------------
329inline const int32_t&
331{
332 return this->uniqueId;
333}
334
335} // namespace Resources
The common base class of Nebula.
Definition refcounted.h:38
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
Definition resourceloader.h:58
Ptr< ResourceLoaderThread > streamerThread
Definition resourceloader.h:229
Util::FixedArray< ResourceId > resources
Definition resourceloader.h:246
SubresourceLoadStatus
Definition resourceloader.h:165
@ Full
Definition resourceloader.h:166
@ Rejected
Definition resourceloader.h:168
@ Partial
Definition resourceloader.h:167
Util::FixedArray< Resources::ResourceName > names
Definition resourceloader.h:240
Util::Array< _PendingResourceUnload > pendingUnloads
Definition resourceloader.h:233
Resource::State LoadImmediate(_PendingResourceLoad &res)
Load immediately.
Definition resourceloader.cc:375
Util::Dictionary< Resources::ResourceName, uint32_t > ids
Definition resourceloader.h:237
__DeclareAbstractClass(ResourceLoader)
Util::FixedArray< Util::StringAtom > tags
Definition resourceloader.h:242
virtual void Update(IndexT frameIndex)
update the resource loader, this is done every frame
Definition resourceloader.cc:145
virtual void Setup()
setup resource loader, initiates the placeholder and error resources if valid, so don't forget to run...
Definition resourceloader.cc:42
Resources::ResourceId placeholderResourceId
Definition resourceloader.h:218
Util::StringAtom placeholderResourceName
these types need to be properly initiated in a subclass Setup function
Definition resourceloader.h:215
virtual Resource::State ReloadFromStream(const Resources::ResourceId id, const Ptr< IO::Stream > &stream)
perform a reload
Definition resourceloader.cc:108
Util::StringAtom streamerThreadName
Definition resourceloader.h:230
void DiscardByTag(const Util::StringAtom &tag)
discard all resources associated with a tag
Definition resourceloader.cc:634
void DiscardResource(const Resources::ResourceId id)
discard container
Definition resourceloader.cc:600
void RunCallbacks(Resource::State status, const Resources::ResourceId id)
run callbacks
Definition resourceloader.cc:238
uint32_t uniqueResourceId
Definition resourceloader.h:251
Threading::SafeQueue< _PendingStreamLod > pendingStreamQueue
Definition resourceloader.h:235
const Util::StringAtom GetTag(const Resources::ResourceId id) const
get resource tag was first registered with
Definition resourceloader.h:283
bool async
Definition resourceloader.h:227
int32_t uniqueId
id in resource manager
Definition resourceloader.h:254
ResourceLoader()
constructor
Definition resourceloader.cc:19
Util::FixedArray< Resource::State > states
Definition resourceloader.h:243
static const uint32_t ResourceIndexGrow
Definition resourceloader.h:171
const Util::Dictionary< Resources::ResourceName, Ids::Id32 > & GetResources() const
get the dictionary of all resource-id pairs
Definition resourceloader.h:312
friend Resource::State _LoadInternal(ResourceLoader *loader, const _PendingResourceLoad res)
Definition resourceloader.cc:268
virtual void RequestLOD(const Ids::Id32 entry, float lod) const
Set lod factor for resource.
Definition resourceloader.cc:136
Resources::ResourceId GetPlaceholder(const Resources::ResourceName &name)
get placeholder based on resource name
Definition resourceloader.cc:258
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:653
Util::FixedArray< uint > loadedBits
Definition resourceloader.h:245
virtual ResourceUnknownId InitializeResource(const Ids::Id32 entry, const Util::StringAtom &tag, const Ptr< IO::Stream > &stream, bool immediate=false)=0
Initialize and create the resource, optionally load if no subresource management is necessary.
Util::Array< IndexT > pendingLoads
Definition resourceloader.h:232
const int32_t & GetUniqueId() const
get the global identifier for this pool
Definition resourceloader.h:330
Util::FixedArray< StreamData > streams
Definition resourceloader.h:250
Threading::ThreadId creatorThread
Definition resourceloader.h:258
Resources::ResourceId failResourceId
Definition resourceloader.h:219
virtual uint StreamResource(const ResourceId entry, IndexT frameIndex, uint requestedBits)
Stream resource.
Definition resourceloader.cc:98
virtual void LoadFallbackResources()
load placeholder and error resources
Definition resourceloader.cc:70
Util::FixedArray< _PendingResourceLoad > loads
Definition resourceloader.h:248
void SetMinLod(const Resources::ResourceId &id, const float lod, bool immediate)
begin updating a resources lod
Definition resourceloader.cc:745
const Resources::ResourceId GetId(const Resources::ResourceName &name) const
get resource id by name, use with care
Definition resourceloader.h:301
Resources::ResourceId CreateResource(const Resources::ResourceName &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 container with a tag associated with it, if no tag is provided, the resource will be untagge...
Definition resourceloader.cc:410
void SetupIdFromEntry(const Ids::Id32 entry, ResourceId &cacheEntry)
Construct resource ID based on loader entry.
Definition resourceloader.cc:212
Util::Array< _PendingStreamLod > pendingStreamLods
Definition resourceloader.h:234
const bool HasResource(const Resources::ResourceId id) const
returns true if pool has resource
Definition resourceloader.h:321
virtual void Discard()
discard resource loader
Definition resourceloader.cc:60
void LoadAsync(_PendingResourceLoad res)
Load async.
Definition resourceloader.cc:388
Util::FixedArray< _PlaceholderResource > placeholders
Definition resourceloader.h:209
virtual ~ResourceLoader()
destructor
Definition resourceloader.cc:32
const Resources::ResourceName & GetName(const Resources::ResourceId id) const
get resource name
Definition resourceloader.h:265
virtual uint LodMask(const Ids::Id32 entry, float lod, bool stream) const
Create load mask based on LOD.
Definition resourceloader.cc:127
Util::FixedArray< uint32_t > usage
Definition resourceloader.h:241
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:686
Ids::IdPool resourceInstanceIndexPool
Definition resourceloader.h:238
Util::FixedArray< Util::Array< _Callbacks > > callbacks
Definition resourceloader.h:247
Util::FixedArray< uint > requestedBits
Definition resourceloader.h:244
const Resource::State GetState(const Resources::ResourceId id) const
get resource state
Definition resourceloader.h:292
Util::FixedArray< _LoadMetaData > metaData
Definition resourceloader.h:249
virtual void Unload(const Resources::ResourceId id)=0
unload resource (overload to implement resource deallocation)
virtual SubresourceLoadStatus StreamMaxLOD(const Resources::ResourceId &id, const float lod, bool immediate)
perform a lod update
Definition resourceloader.cc:118
Threading::CriticalSection asyncSection
async section to sync callbacks and pending list with thread
Definition resourceloader.h:257
Util::StringAtom failResourceName
Definition resourceloader.h:216
const uint32_t GetUsage(const Resources::ResourceId id) const
get resource usage from resource id
Definition resourceloader.h:274
Definition resourceloaderthread.h:23
Definition resourceserver.h:22
Critical section objects are used to protect a portion of code from parallel execution.
Thread-safe version of Util::Queue.
Definition safequeue.h:27
Nebula's dynamic array class.
Definition array.h:60
A collection of key/value pairs with quick value retrieval by key at roughly O(log n).
Definition dictionary.h:34
SizeT Size() const
return number of key/value pairs in the dictionary
Definition dictionary.h:193
Implements a fixed size one-dimensional array.
Definition fixedarray.h:20
IndexT FindIndex(const TYPE &val) const
find index of identical element in unsorted array (slow)
Definition fixedarray.h:511
A StringAtom.
Definition stringatom.h:22
uint32_t Id32
Definition id.h:138
A resource is a container for some type of file which is loaded.
Definition resource.cc:9
pthread_t ThreadId
Definition linuxthreadid.h:15
Definition resourceloader.h:50
uint64 submissionId
Definition resourceloader.h:52
uint bits
Definition resourceloader.h:51
callback functions to run when an associated resource is loaded (can be stacked)
Definition resourceloader.h:152
Resources::ResourceId id
Definition resourceloader.h:153
std::function< void(const Resources::ResourceId)> success
Definition resourceloader.h:154
std::function< void(const Resources::ResourceId)> failed
Definition resourceloader.h:155
Definition resourceloader.h:159
void * data
Definition resourceloader.h:160
SizeT size
Definition resourceloader.h:161
struct for pending resources which are about to be loaded
Definition resourceloader.h:115
Ids::Id32 entry
Definition resourceloader.h:116
bool inflight
Definition resourceloader.h:118
IndexT frame
Definition resourceloader.h:121
uint mode
Definition resourceloader.h:130
bool reload
Definition resourceloader.h:120
bool immediate
Definition resourceloader.h:119
float lod
Definition resourceloader.h:122
_PendingResourceLoad()
Definition resourceloader.h:132
Util::StringAtom tag
Definition resourceloader.h:117
@ Create
Definition resourceloader.h:127
@ None
Definition resourceloader.h:126
@ Update
Definition resourceloader.h:128
Resources::ResourceId resourceId
Definition resourceloader.h:147
struct for pending stream
Definition resourceloader.h:137
_PendingStreamLod()
Definition resourceloader.h:142
bool immediate
Definition resourceloader.h:140
Resources::ResourceId id
Definition resourceloader.h:138
float lod
Definition resourceloader.h:139
Resources::ResourceName placeholderName
Definition resourceloader.h:206
Resources::ResourceId placeholderId
Definition resourceloader.h:207
Definition resourceloader.h:222
void * data
Definition resourceloader.h:223
Ptr< IO::Stream > stream
Definition resourceloader.h:224
Definition resourceid.h:37
static const int InvalidIndex
Definition types.h:54
int SizeT
Definition types.h:49
unsigned int uint
Definition types.h:31
uint64_t uint64
Definition types.h:36
int IndexT
Definition types.h:48