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;
83 bool HasStreamLoader(const Util::StringAtom& ext) const;
84
87
90private:
91 friend class ResourceLoader;
92
93 bool open;
97
98 static int32_t UniquePoolCounter;
99};
100
101//------------------------------------------------------------------------------
106inline Resources::ResourceId
108 const ResourceName& id
109 , std::function<void(const Resources::ResourceId)> success
110 , std::function<void(const Resources::ResourceId)> failed
111 , bool immediate
112 , bool stream
113)
114{
115 return this->CreateResource(id, "", success, failed, immediate, stream);
116}
117
118//------------------------------------------------------------------------------
123inline Resources::ResourceId
125 const ResourceName& res
126 , const Util::StringAtom& tag
127 , std::function<void(const Resources::ResourceId)> success
128 , std::function<void(const Resources::ResourceId)> failed
129 , bool immediate
130 , bool stream
131)
132{
133 // get resource loader by extension
135 IndexT i = this->extensionMap.FindIndex(ext);
136 n_assert_fmt(i != InvalidIndex, "No resource loader is associated with file extension '%s'", ext.AsCharPtr());
137 const Ptr<ResourceLoader>& loader = this->loaders[this->extensionMap.ValueAtIndex(i)].downcast<ResourceLoader>();
138
139 // create container and cast to actual resource type
140 Resources::ResourceId id = loader->CreateResource(res, nullptr, 0, tag, success, failed, immediate, stream);
141 return id;
142}
143
144//------------------------------------------------------------------------------
147template<class METADATA>
148inline Resources::ResourceId
150 const ResourceName& res
151 , const METADATA& metaData
152 , std::function<void(const Resources::ResourceId)> success
153 , std::function<void(const Resources::ResourceId)> failed
154 , bool immediate
155 , bool stream
156)
157{
158 return this->CreateResource(res, metaData, "", success, failed, immediate, stream);
159}
160
161//------------------------------------------------------------------------------
164template<class METADATA>
165inline Resources::ResourceId
167 const ResourceName& res
168 , const METADATA& metaData
169 , const Util::StringAtom& tag
170 , std::function<void(const Resources::ResourceId)> success
171 , std::function<void(const Resources::ResourceId)> failed
172 , bool immediate
173 , bool stream
174)
175{
176 // get resource loader by extension
178 IndexT i = this->extensionMap.FindIndex(ext);
179 n_assert_fmt(i != InvalidIndex, "No resource loader is associated with file extension '%s'", ext.AsCharPtr());
180 const Ptr<ResourceLoader>& loader = this->loaders[this->extensionMap.ValueAtIndex(i)].downcast<ResourceLoader>();
181
182 // create container and cast to actual resource type
183 Resources::ResourceId id = loader->CreateResource(res, &metaData, sizeof(METADATA), tag, success, failed, immediate, stream);
184 return id;
185}
186
187//------------------------------------------------------------------------------
190inline void
191ResourceServer::ReloadResource(const ResourceName& res, std::function<void(const Resources::ResourceId)> success, std::function<void(const Resources::ResourceId)> failed)
192{
193 // get resource loader by extension
195 IndexT i = this->extensionMap.FindIndex(ext);
196 n_assert_fmt(i != InvalidIndex, "No resource loader is associated with file extension '%s'", ext.AsCharPtr());
197 const Ptr<ResourceLoader>& loader = this->loaders[this->extensionMap.ValueAtIndex(i)].downcast<ResourceLoader>();
198
199 // create container and cast to actual resource type
200 loader->ReloadResource(res, success, failed);
201}
202
203
204//------------------------------------------------------------------------------
207inline bool
209{
210 IndexT i = this->extensionMap.FindIndex(ext);
211 return i != InvalidIndex;
212}
213
214//------------------------------------------------------------------------------
217inline void
218ResourceServer::SetMinLod(const ResourceId& id, float lod, bool immediate)
219{
220 // get id of loader
221 const Ids::Id8 loaderid = id.loaderIndex;
222
223 // get resource loader by extension
224 n_assert(this->loaders.Size() > loaderid);
225 const Ptr<ResourceLoader>& loader = this->loaders[loaderid].downcast<ResourceLoader>();
226
227 // update LOD
228 loader->SetMinLod(id, lod, immediate);
229}
230
231//------------------------------------------------------------------------------
234inline void
236 const ResourceId& id,
237 std::function<void(const Resources::ResourceId)> success,
238 std::function<void(const Resources::ResourceId)> failed
239)
240{
241 // get id of loader
242 const Ids::Id8 loaderid = id.loaderIndex;
243
244 // get resource loader by extension
245 n_assert(this->loaders.Size() > loaderid);
246 const Ptr<ResourceLoader>& loader = this->loaders[loaderid].downcast<ResourceLoader>();
247
248 loader->CreateListener(id, success, failed);
249}
250
251//------------------------------------------------------------------------------
255inline void
256ResourceServer::DiscardResource(const Resources::ResourceId id)
257{
258 // get id of loader
259 const Ids::Id8 loaderid = id.loaderIndex;
260
261 // get resource loader by extension
262 n_assert(this->loaders.Size() > loaderid);
263 const Ptr<ResourceLoader>& loader = this->loaders[loaderid].downcast<ResourceLoader>();
264
265 // discard container
266 loader->DiscardResource(id);
267}
268
269//------------------------------------------------------------------------------
272inline const Resources::ResourceName
273ResourceServer::GetName(const Resources::ResourceId id) const
274{
275 // get resource loader by extension
276 n_assert(this->loaders.Size() > id.loaderIndex);
277 const Ptr<ResourceLoader>& loader = this->loaders[id.loaderIndex];
278 return loader->GetName(id.resourceId);
279}
280
281//------------------------------------------------------------------------------
284inline const Util::StringAtom
285ResourceServer::GetTag(const Resources::ResourceId id) const
286{
287 // get resource loader by extension
288 n_assert(this->loaders.Size() > id.loaderIndex);
289 const Ptr<ResourceLoader>& loader = this->loaders[id.loaderIndex];
290 return loader->GetTag(id.resourceId);
291}
292
293//------------------------------------------------------------------------------
297ResourceServer::GetState(const Resources::ResourceId id) const
298{
299 // get resource loader by extension
300 n_assert(this->loaders.Size() > id.loaderIndex);
301 const Ptr<ResourceLoader>& loader = this->loaders[id.loaderIndex];
302 return loader->GetState(id.resourceId);
303}
304
305//------------------------------------------------------------------------------
308inline const SizeT
309ResourceServer::GetUsage(const Resources::ResourceId id) const
310{
311 // get resource loader by extension
312 n_assert(this->loaders.Size() > id.loaderIndex);
313 const Ptr<ResourceLoader>& loader = this->loaders[id.loaderIndex];
314 return loader->GetUsage(id.resourceId);
315}
316
317//------------------------------------------------------------------------------
320inline bool
321ResourceServer::HasResource(const Resources::ResourceId id) const
322{
323 if (this->loaders.Size() <= id.loaderIndex) return false;
324 {
325 const Ptr<ResourceLoader>& loader = this->loaders[id.loaderIndex];
326 if (loader->HasResource(id)) return true;
327 return false;
328 }
329}
330
331//------------------------------------------------------------------------------
334inline const Resources::ResourceId
336{
337 IndexT i;
338 for (i = 0; i < this->loaders.Size(); i++)
339 {
340 Resources::ResourceId id = this->loaders[i]->GetId(name);
341 if (id != Resources::ResourceId::Invalid()) return id;
342 }
343 return Resources::ResourceId::Invalid();
344}
345
346//------------------------------------------------------------------------------
349template <class POOL_TYPE>
350inline POOL_TYPE*
352{
353 static_assert(std::is_base_of<ResourceLoader, POOL_TYPE>::value, "Type requested is not a stream pool");
354 IndexT i = this->typeMap.FindIndex(&POOL_TYPE::RTTI);
355 if (i != InvalidIndex)
356 {
357 return static_cast<POOL_TYPE*>(this->loaders[this->typeMap.ValueAtIndex(i)].get());
358 }
359
360 n_error("No loader registered for this type");
361 return nullptr;
362}
363
364//------------------------------------------------------------------------------
367inline Resources::ResourceId
369 const ResourceName& res
370 , const Util::StringAtom& tag
371 , std::function<void(const Resources::ResourceId)> success = nullptr
372 , std::function<void(const Resources::ResourceId)> failed = nullptr
373 , bool immediate = false
374 , bool stream = true
375)
376{
377 return ResourceServer::Instance()->CreateResource(res, tag, success, failed, immediate, stream);
378}
379
380//------------------------------------------------------------------------------
383template <class METADATA>
384inline Resources::ResourceId
386 const ResourceName& res
387 , const METADATA& metaData
388 , const Util::StringAtom& tag
389 , std::function<void(const Resources::ResourceId)> success = nullptr
390 , std::function<void(const Resources::ResourceId)> failed = nullptr
391 , bool immediate = false
392 , bool stream = true
393)
394{
395 return ResourceServer::Instance()->CreateResource(res, metaData, tag, success, failed, immediate, stream);
396}
397
398//------------------------------------------------------------------------------
401inline void
403 const ResourceId& id
404 , std::function<void(const Resources::ResourceId)> success
405 , std::function<void(const Resources::ResourceId)> failed = nullptr
406)
407{
408 return ResourceServer::Instance()->CreateResourceListener(id, success, failed);
409}
410
411//------------------------------------------------------------------------------
414inline void
415SetMinLod(const ResourceId& id, float lod, bool immediate)
416{
417 return ResourceServer::Instance()->SetMinLod(id, lod, immediate);
418}
419
420//------------------------------------------------------------------------------
423inline void
424DiscardResource(const Resources::ResourceId id)
425{
426 ResourceServer::Instance()->DiscardResource(id);
427}
428
429//------------------------------------------------------------------------------
432inline void
434{
435 return ResourceServer::Instance()->ReloadResource(res);
436}
437
438//------------------------------------------------------------------------------
441inline void
443{
444 ResourceServer::Instance()->WaitForLoaderThread();
445}
446
447//------------------------------------------------------------------------------
450template <class POOL_TYPE>
451inline POOL_TYPE*
453{
454 static_assert(std::is_base_of<ResourceLoader, POOL_TYPE>::value, "Template argument is not a ResourceCache type!");
455 return ResourceServer::Instance()->GetStreamLoader<POOL_TYPE>();
456}
457
458} // 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:218
__DeclareClass(ResourceServer)
void Close()
close manager
Definition resourceserver.cc:53
__DeclareInterfaceSingleton(ResourceServer)
bool HasStreamLoader(const Util::StringAtom &ext) const
query if a stream loader is registered for a given extension
Definition resourceserver.h:208
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:235
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:107
ResourceServer()
constructor
Definition resourceserver.cc:22
Util::Dictionary< Util::StringAtom, IndexT > extensionMap
Definition resourceserver.h:94
Util::Dictionary< const Core::Rtti *, IndexT > typeMap
Definition resourceserver.h:95
const Resources::ResourceId GetId(const Resources::ResourceName &name) const
get id from name
Definition resourceserver.h:335
friend class ResourceLoader
Definition resourceserver.h:91
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:321
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:256
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:191
const Resources::ResourceName GetName(const Resources::ResourceId id) const
get resource name
Definition resourceserver.h:273
Util::Array< Ptr< ResourceLoader > > loaders
Definition resourceserver.h:96
const Resource::State GetState(const Resources::ResourceId id) const
get resource state
Definition resourceserver.h:297
static int32_t UniquePoolCounter
Definition resourceserver.h:98
const SizeT GetUsage(const Resources::ResourceId id) const
get usage
Definition resourceserver.h:309
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:285
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:351
bool open
Definition resourceserver.h:93
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:368
POOL_TYPE * GetStreamLoader()
Definition resourceserver.h:452
void DiscardResource(const Resources::ResourceId id)
Definition resourceserver.h:424
@ Update
Definition resourceloader.h:53
void WaitForLoaderThread()
Definition resourceserver.h:442
void ReloadResource(const ResourceName &res)
Definition resourceserver.h:433
Util::StringAtom ResourceName
Definition resourceid.h:33
void SetMinLod(const ResourceId &id, float lod, bool immediate)
Definition resourceserver.h:415
void CreateResourceListener(const ResourceId &id, std::function< void(const Resources::ResourceId)> success, std::function< void(const Resources::ResourceId)> failed=nullptr)
Definition resourceserver.h:402
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:975
const char * AsCharPtr() const
return contents as character pointer
Definition string.h:546
static const int InvalidIndex
Definition types.h:47
int SizeT
Definition types.h:42
int IndexT
Definition types.h:41