Nebula
Loading...
Searching...
No Matches
resourceserver.h
Go to the documentation of this file.
1#pragma once
2//------------------------------------------------------------------------------
11//------------------------------------------------------------------------------
12#include <functional>
13#include "core/refcounted.h"
14#include "ids/id.h"
15#include "core/singleton.h"
16#include "resourceid.h"
17#include "resourceloader.h"
19namespace Resources
20{
22{
25public:
29 virtual ~ResourceServer();
30
32 void Open();
34 void Close();
35
37 void Update(IndexT frameIndex);
38
40 Resources::ResourceId CreateResource(const ResourceName& res, std::function<void(const Resources::ResourceId)> success = nullptr, std::function<void(const Resources::ResourceId)> failed = nullptr, bool immediate = false, bool stream = true);
42 Resources::ResourceId CreateResource(const ResourceName& res, const Util::StringAtom& tag, std::function<void(const Resources::ResourceId)> success = nullptr, std::function<void(const Resources::ResourceId)> failed = nullptr, bool immediate = false, bool stream = true);
44 template<class METADATA> Resources::ResourceId CreateResource(const ResourceName& res, const METADATA& metaData, std::function<void(const Resources::ResourceId)> success = nullptr, std::function<void(const Resources::ResourceId)> failed = nullptr, bool immediate = false, bool stream = true);
46 template<class METADATA> Resources::ResourceId CreateResource(const ResourceName& res, const METADATA& metaData, const Util::StringAtom& tag, std::function<void(const Resources::ResourceId)> success = nullptr, std::function<void(const Resources::ResourceId)> failed = nullptr, bool immediate = false, bool stream = true);
48 void DiscardResource(const Resources::ResourceId res);
50 void DiscardResources(const Util::StringAtom& tag);
54 void ReloadResource(const ResourceName& res, std::function<void(const Resources::ResourceId)> success = nullptr, std::function<void(const Resources::ResourceId)> failed = nullptr);
56 void SetMinLod(const ResourceId& id, float lod, bool immediate);
58 void CreateResourceListener(const ResourceId& id, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed = nullptr);
59
61 Core::Rtti* GetType(const Resources::ResourceId id);
62
64 const Resources::ResourceName GetName(const Resources::ResourceId id) const;
66 const Util::StringAtom GetTag(const Resources::ResourceId id) const;
68 const Resource::State GetState(const Resources::ResourceId id) const;
70 const SizeT GetUsage(const Resources::ResourceId id) const;
72 bool HasResource(const Resources::ResourceId id) const;
74 const Resources::ResourceId GetId(const Resources::ResourceName& name) const;
75
77 void RegisterStreamLoader(const Util::StringAtom& ext, const Core::Rtti& loaderClass);
79 void DeregisterStreamLoader(const Util::StringAtom& ext, const Core::Rtti& loaderClass);
81 template <class POOL_TYPE> POOL_TYPE* GetStreamLoader() const;
82
85
88private:
89 friend class ResourceLoader;
90
91 bool open;
95
96 static int32_t UniquePoolCounter;
97};
98
99//------------------------------------------------------------------------------
104inline Resources::ResourceId
106 const ResourceName& id
107 , std::function<void(const Resources::ResourceId)> success
108 , std::function<void(const Resources::ResourceId)> failed
109 , bool immediate
110 , bool stream
111)
112{
113 return this->CreateResource(id, "", success, failed, immediate, stream);
114}
115
116//------------------------------------------------------------------------------
121inline Resources::ResourceId
123 const ResourceName& res
124 , const Util::StringAtom& tag
125 , std::function<void(const Resources::ResourceId)> success
126 , std::function<void(const Resources::ResourceId)> failed
127 , bool immediate
128 , bool stream
129)
130{
131 // get resource loader by extension
133 IndexT i = this->extensionMap.FindIndex(ext);
134 n_assert_fmt(i != InvalidIndex, "No resource loader is associated with file extension '%s'", ext.AsCharPtr());
135 const Ptr<ResourceLoader>& loader = this->loaders[this->extensionMap.ValueAtIndex(i)].downcast<ResourceLoader>();
136
137 // create container and cast to actual resource type
138 Resources::ResourceId id = loader->CreateResource(res, nullptr, 0, tag, success, failed, immediate, stream);
139 return id;
140}
141
142//------------------------------------------------------------------------------
145template<class METADATA>
146inline Resources::ResourceId
148 const ResourceName& res
149 , const METADATA& metaData
150 , std::function<void(const Resources::ResourceId)> success
151 , std::function<void(const Resources::ResourceId)> failed
152 , bool immediate
153 , bool stream
154)
155{
156 return this->CreateResource(res, metaData, "", success, failed, immediate, stream);
157}
158
159//------------------------------------------------------------------------------
162template<class METADATA>
163inline Resources::ResourceId
165 const ResourceName& res
166 , const METADATA& metaData
167 , const Util::StringAtom& tag
168 , std::function<void(const Resources::ResourceId)> success
169 , std::function<void(const Resources::ResourceId)> failed
170 , bool immediate
171 , bool stream
172)
173{
174 // get resource loader by extension
176 IndexT i = this->extensionMap.FindIndex(ext);
177 n_assert_fmt(i != InvalidIndex, "No resource loader is associated with file extension '%s'", ext.AsCharPtr());
178 const Ptr<ResourceLoader>& loader = this->loaders[this->extensionMap.ValueAtIndex(i)].downcast<ResourceLoader>();
179
180 // create container and cast to actual resource type
181 Resources::ResourceId id = loader->CreateResource(res, &metaData, sizeof(METADATA), tag, success, failed, immediate, stream);
182 return id;
183}
184
185//------------------------------------------------------------------------------
188inline void
189ResourceServer::ReloadResource(const ResourceName& res, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed)
190{
191 // get resource loader by extension
193 IndexT i = this->extensionMap.FindIndex(ext);
194 n_assert_fmt(i != InvalidIndex, "No resource loader is associated with file extension '%s'", ext.AsCharPtr());
195 const Ptr<ResourceLoader>& loader = this->loaders[this->extensionMap.ValueAtIndex(i)].downcast<ResourceLoader>();
196
197 // create container and cast to actual resource type
198 loader->ReloadResource(res, success, failed);
199}
200
201//------------------------------------------------------------------------------
204inline void
205ResourceServer::SetMinLod(const ResourceId& id, float lod, bool immediate)
206{
207 // get id of loader
208 const Ids::Id8 loaderid = id.loaderIndex;
209
210 // get resource loader by extension
211 n_assert(this->loaders.Size() > loaderid);
212 const Ptr<ResourceLoader>& loader = this->loaders[loaderid].downcast<ResourceLoader>();
213
214 // update LOD
215 loader->SetMinLod(id, lod, immediate);
216}
217
218//------------------------------------------------------------------------------
221inline void
223 const ResourceId& id,
224 std::function<void(const Resources::ResourceId)> success,
225 std::function<void(const Resources::ResourceId)> failed
226)
227{
228 // get id of loader
229 const Ids::Id8 loaderid = id.loaderIndex;
230
231 // get resource loader by extension
232 n_assert(this->loaders.Size() > loaderid);
233 const Ptr<ResourceLoader>& loader = this->loaders[loaderid].downcast<ResourceLoader>();
234
235 loader->CreateListener(id, success, failed);
236}
237
238//------------------------------------------------------------------------------
242inline void
243ResourceServer::DiscardResource(const Resources::ResourceId id)
244{
245 // get id of loader
246 const Ids::Id8 loaderid = id.loaderIndex;
247
248 // get resource loader by extension
249 n_assert(this->loaders.Size() > loaderid);
250 const Ptr<ResourceLoader>& loader = this->loaders[loaderid].downcast<ResourceLoader>();
251
252 // discard container
253 loader->DiscardResource(id);
254}
255
256//------------------------------------------------------------------------------
259inline const Resources::ResourceName
260ResourceServer::GetName(const Resources::ResourceId id) const
261{
262 // get resource loader by extension
263 n_assert(this->loaders.Size() > id.loaderIndex);
264 const Ptr<ResourceLoader>& loader = this->loaders[id.loaderIndex];
265 return loader->GetName(id.resourceId);
266}
267
268//------------------------------------------------------------------------------
271inline const Util::StringAtom
272ResourceServer::GetTag(const Resources::ResourceId id) const
273{
274 // get resource loader by extension
275 n_assert(this->loaders.Size() > id.loaderIndex);
276 const Ptr<ResourceLoader>& loader = this->loaders[id.loaderIndex];
277 return loader->GetTag(id.resourceId);
278}
279
280//------------------------------------------------------------------------------
284ResourceServer::GetState(const Resources::ResourceId id) const
285{
286 // get resource loader by extension
287 n_assert(this->loaders.Size() > id.loaderIndex);
288 const Ptr<ResourceLoader>& loader = this->loaders[id.loaderIndex];
289 return loader->GetState(id.resourceId);
290}
291
292//------------------------------------------------------------------------------
295inline const SizeT
296ResourceServer::GetUsage(const Resources::ResourceId id) const
297{
298 // get resource loader by extension
299 n_assert(this->loaders.Size() > id.loaderIndex);
300 const Ptr<ResourceLoader>& loader = this->loaders[id.loaderIndex];
301 return loader->GetUsage(id.resourceId);
302}
303
304//------------------------------------------------------------------------------
307inline bool
308ResourceServer::HasResource(const Resources::ResourceId id) const
309{
310 if (this->loaders.Size() <= id.loaderIndex) return false;
311 {
312 const Ptr<ResourceLoader>& loader = this->loaders[id.loaderIndex];
313 if (loader->HasResource(id)) return true;
314 return false;
315 }
316}
317
318//------------------------------------------------------------------------------
321inline const Resources::ResourceId
323{
324 IndexT i;
325 for (i = 0; i < this->loaders.Size(); i++)
326 {
327 Resources::ResourceId id = this->loaders[i]->GetId(name);
328 if (id != Resources::ResourceId::Invalid()) return id;
329 }
330 return Resources::ResourceId::Invalid();
331}
332
333//------------------------------------------------------------------------------
336template <class POOL_TYPE>
337inline POOL_TYPE*
339{
340 static_assert(std::is_base_of<ResourceLoader, POOL_TYPE>::value, "Type requested is not a stream pool");
341 IndexT i = this->typeMap.FindIndex(&POOL_TYPE::RTTI);
342 if (i != InvalidIndex)
343 {
344 return static_cast<POOL_TYPE*>(this->loaders[this->typeMap.ValueAtIndex(i)].get());
345 }
346
347 n_error("No loader registered for this type");
348 return nullptr;
349}
350
351//------------------------------------------------------------------------------
354inline Resources::ResourceId
356 const ResourceName& res
357 , const Util::StringAtom& tag
358 , std::function<void(const Resources::ResourceId)> success = nullptr
359 , std::function<void(const Resources::ResourceId)> failed = nullptr
360 , bool immediate = false
361 , bool stream = true
362)
363{
364 return ResourceServer::Instance()->CreateResource(res, tag, success, failed, immediate, stream);
365}
366
367//------------------------------------------------------------------------------
370template <class METADATA>
371inline Resources::ResourceId
373 const ResourceName& res
374 , const METADATA& metaData
375 , const Util::StringAtom& tag
376 , std::function<void(const Resources::ResourceId)> success = nullptr
377 , std::function<void(const Resources::ResourceId)> failed = nullptr
378 , bool immediate = false
379 , bool stream = true
380)
381{
382 return ResourceServer::Instance()->CreateResource(res, metaData, tag, success, failed, immediate, stream);
383}
384
385//------------------------------------------------------------------------------
388inline void
390 const ResourceId& id
391 , std::function<void(const Resources::ResourceId)> success
392 , std::function<void(const Resources::ResourceId)> failed = nullptr
393)
394{
395 return ResourceServer::Instance()->CreateResourceListener(id, success, failed);
396}
397
398//------------------------------------------------------------------------------
401inline void
402SetMinLod(const ResourceId& id, float lod, bool immediate)
403{
404 return ResourceServer::Instance()->SetMinLod(id, lod, immediate);
405}
406
407//------------------------------------------------------------------------------
410inline void
411DiscardResource(const Resources::ResourceId id)
412{
413 ResourceServer::Instance()->DiscardResource(id);
414}
415
416//------------------------------------------------------------------------------
419inline void
421{
422 return ResourceServer::Instance()->ReloadResource(res);
423}
424
425//------------------------------------------------------------------------------
428inline void
430{
431 ResourceServer::Instance()->WaitForLoaderThread();
432}
433
434//------------------------------------------------------------------------------
437template <class POOL_TYPE>
438inline POOL_TYPE*
440{
441 static_assert(std::is_base_of<ResourceLoader, POOL_TYPE>::value, "Template argument is not a ResourceCache type!");
442 return ResourceServer::Instance()->GetStreamLoader<POOL_TYPE>();
443}
444
445} // namespace Resources
The common base class of Nebula.
Definition refcounted.h:38
Nebula's runtime type information for one class.
Definition rtti.h:27
Nebula's smart pointer class which manages the life time of RefCounted objects.
Definition ptr.h:38
State
Definition resource.h:26
void SetMinLod(const ResourceId &id, float lod, bool immediate)
stream in a new LOD
Definition resourceserver.h:205
__DeclareClass(ResourceServer)
void Close()
close manager
Definition resourceserver.cc:53
__DeclareInterfaceSingleton(ResourceServer)
void CreateResourceListener(const ResourceId &id, std::function< void(const Resources::ResourceId)> success, std::function< void(const Resources::ResourceId)> failed=nullptr)
Create single-fire listener for resource. When resource is loaded, the callbacks will be invoked and ...
Definition resourceserver.h:222
void Open()
open manager
Definition resourceserver.cc:41
Resources::ResourceId CreateResource(const ResourceName &res, std::function< void(const Resources::ResourceId)> success=nullptr, std::function< void(const Resources::ResourceId)> failed=nullptr, bool immediate=false, bool stream=true)
create a new resource (stream-managed), which will be loaded at some later point, if not already load...
Definition resourceserver.h:105
ResourceServer()
constructor
Definition resourceserver.cc:22
Util::Dictionary< Util::StringAtom, IndexT > extensionMap
Definition resourceserver.h:92
Util::Dictionary< const Core::Rtti *, IndexT > typeMap
Definition resourceserver.h:93
const Resources::ResourceId GetId(const Resources::ResourceName &name) const
get id from name
Definition resourceserver.h:322
friend class ResourceLoader
Definition resourceserver.h:89
void DiscardResources(const Util::StringAtom &tag)
discard all resources by tag (stream-managed)
Definition resourceserver.cc:175
bool HasResource(const Resources::ResourceId id) const
check if resource id is valid
Definition resourceserver.h:308
void RegisterStreamLoader(const Util::StringAtom &ext, const Core::Rtti &loaderClass)
register a stream pool, which takes an extension and the RTTI of the resource type to create
Definition resourceserver.cc:97
void DiscardResource(const Resources::ResourceId res)
discard resource (stream-managed)
Definition resourceserver.h:243
void DeregisterStreamLoader(const Util::StringAtom &ext, const Core::Rtti &loaderClass)
deregisters a stream pool
Definition resourceserver.cc:114
virtual ~ResourceServer()
destructor
Definition resourceserver.cc:31
Core::Rtti * GetType(const Resources::ResourceId id)
get type of resource pool this resource was allocated with
Definition resourceserver.cc:209
void ReloadResource(const ResourceName &res, std::function< void(const Resources::ResourceId)> success=nullptr, std::function< void(const Resources::ResourceId)> failed=nullptr)
reload resource
Definition resourceserver.h:189
const Resources::ResourceName GetName(const Resources::ResourceId id) const
get resource name
Definition resourceserver.h:260
Util::Array< Ptr< ResourceLoader > > loaders
Definition resourceserver.h:94
const Resource::State GetState(const Resources::ResourceId id) const
get resource state
Definition resourceserver.h:284
static int32_t UniquePoolCounter
Definition resourceserver.h:96
const SizeT GetUsage(const Resources::ResourceId id) const
get usage
Definition resourceserver.h:296
bool HasPendingResources()
returns true if there are pending resources in-flight
Definition resourceserver.cc:189
const Util::StringAtom GetTag(const Resources::ResourceId id) const
get tag resource was first registered with
Definition resourceserver.h:272
void LoadDefaultResources()
goes through all pools and sets up their default resources
Definition resourceserver.cc:146
POOL_TYPE * GetStreamLoader() const
get stream pool for later use
Definition resourceserver.h:338
bool open
Definition resourceserver.h:91
void WaitForLoaderThread()
Wait for all loader threads.
Definition resourceserver.cc:224
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
A StringAtom.
Definition stringatom.h:22
String AsString() const
get containted string as string object (SLOW!!!)
Definition stringatom.h:372
void __cdecl n_error(const char *msg,...)
This function is called when a serious situation is encountered which requires abortion of the applic...
Definition debug.cc:138
#define n_assert_fmt(exp, msg,...)
Definition debug.h:53
#define n_assert(exp)
Definition debug.h:50
uint8_t Id8
Definition id.h:141
A resource is a container for some type of file which is loaded.
Definition resource.cc:9
Resources::ResourceId CreateResource(const ResourceName &res, const Util::StringAtom &tag, std::function< void(const Resources::ResourceId)> success=nullptr, std::function< void(const Resources::ResourceId)> failed=nullptr, bool immediate=false, bool stream=true)
Definition resourceserver.h:355
POOL_TYPE * GetStreamLoader()
Definition resourceserver.h:439
void DiscardResource(const Resources::ResourceId id)
Definition resourceserver.h:411
@ Update
Definition resourceloader.h:53
void WaitForLoaderThread()
Definition resourceserver.h:429
void ReloadResource(const ResourceName &res)
Definition resourceserver.h:420
Util::StringAtom ResourceName
Definition resourceid.h:33
void SetMinLod(const ResourceId &id, float lod, bool immediate)
Definition resourceserver.h:402
void CreateResourceListener(const ResourceId &id, std::function< void(const Resources::ResourceId)> success, std::function< void(const Resources::ResourceId)> failed=nullptr)
Definition resourceserver.h:389
id
Definition resourceid.h:37
Nebula's universal string class.
Definition String.cs:8
String GetFileExtension() const
get filename extension without dot
Definition string.cc:985
const char * AsCharPtr() const
return contents as character pointer
Definition string.h:542
static const int InvalidIndex
Definition types.h:54
int SizeT
Definition types.h:49
int IndexT
Definition types.h:48