22#include "db/database.h"
45 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);
47 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);
49 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);
51 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);
54 Resources::ResourceId
CreateResource(
const IO::URN& res, std::function<
void(
const Resources::ResourceId)> success =
nullptr, std::function<
void(
const Resources::ResourceId)> failed =
nullptr,
bool immediate =
false,
bool stream =
true);
56 Resources::ResourceId
CreateResource(
const IO::URN& 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);
58 template<
class METADATA> Resources::ResourceId
CreateResource(
const IO::URN& 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);
60 template<
class METADATA> Resources::ResourceId
CreateResource(
const IO::URN& 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);
69 void ReloadResource(
const ResourceName& res, std::function<
void(
const Resources::ResourceId)> success =
nullptr, std::function<
void(
const Resources::ResourceId)> failed =
nullptr);
71 void SetMinLod(
const ResourceId&
id,
float lod,
bool immediate);
73 void CreateResourceListener(
const ResourceId&
id, std::function<
void(
const Resources::ResourceId)> success, std::function<
void(
const Resources::ResourceId)> failed =
nullptr);
87 bool HasResource(
const Resources::ResourceId
id)
const;
124inline Resources::ResourceId
127 , std::function<
void(
const Resources::ResourceId)> success
128 , std::function<
void(
const Resources::ResourceId)> failed
133 return this->
CreateResource(
id,
"", success, failed, immediate, stream);
141inline Resources::ResourceId
145 , std::function<
void(
const Resources::ResourceId)> success
146 , std::function<
void(
const Resources::ResourceId)> failed
156 return Resources::InvalidResourceId;
160 Resources::ResourceId
id = loader->CreateResource(
IO::URI(res.
AsString()),
nullptr, 0, tag, success, failed, immediate, stream);
167inline Resources::ResourceId
170 , std::function<
void(
const Resources::ResourceId)> success
171 , std::function<
void(
const Resources::ResourceId)> failed
176 return CreateResource(res,
"", success, failed, immediate, stream);
182inline Resources::ResourceId
186 , std::function<
void(
const Resources::ResourceId)> success
187 , std::function<
void(
const Resources::ResourceId)> failed
198 Resources::ResourceId
id = loader->CreateResource(res,
nullptr, 0, tag, success, failed, immediate, stream);
205template<
class METADATA>
206inline Resources::ResourceId
209 ,
const METADATA& metaData
210 , std::function<
void(
const Resources::ResourceId)> success
211 , std::function<
void(
const Resources::ResourceId)> failed
216 return this->
CreateResource(res, metaData,
"", success, failed, immediate, stream);
222template<
class METADATA>
223inline Resources::ResourceId
226 ,
const METADATA& metaData
228 , std::function<
void(
const Resources::ResourceId)> success
229 , std::function<
void(
const Resources::ResourceId)> failed
239 return Resources::InvalidResourceId;
243 Resources::ResourceId
id = loader->CreateResource(
IO::URI(res.
Value()), &metaData,
sizeof(METADATA), tag, success, failed, immediate, stream);
250template<
class METADATA>
253 ,
const METADATA& metaData
254 , std::function<
void(
const Resources::ResourceId)> success
255 , std::function<
void(
const Resources::ResourceId)> failed
260 return CreateResource(res, metaData,
"", success, failed, immediate, stream);
266template<
class METADATA>
269 ,
const METADATA& metaData
271 , std::function<
void(
const Resources::ResourceId)> success
272 , std::function<
void(
const Resources::ResourceId)> failed
283 Resources::ResourceId
id = loader->CreateResource(res, &metaData,
sizeof(METADATA), tag, success, failed, immediate, stream);
302 loader->ReloadResource(res, success, failed);
332 const Ids::Id8 loaderid =
id.loaderIndex;
339 loader->SetMinLod(
id, lod, immediate);
347 const ResourceId&
id,
348 std::function<
void(
const Resources::ResourceId)> success,
349 std::function<
void(
const Resources::ResourceId)> failed
353 const Ids::Id8 loaderid =
id.loaderIndex;
359 loader->CreateListener(
id, success, failed);
370 const Ids::Id8 loaderid =
id.loaderIndex;
377 loader->DiscardResource(
id);
389 return loader->GetName(
id.resourceId);
401 return loader->GetTag(
id.resourceId);
413 return loader->GetState(
id.resourceId);
425 return loader->GetUsage(
id.resourceId);
434 if (this->
loaders.Size() <=
id.loaderIndex)
return false;
437 if (loader->HasResource(
id))
return true;
445inline const Resources::ResourceId
449 for (i = 0; i < this->
loaders.Size(); i++)
451 Resources::ResourceId
id = this->
loaders[i]->GetId(name);
452 if (
id != Resources::ResourceId::Invalid())
return id;
454 return Resources::ResourceId::Invalid();
460template <
class POOL_TYPE>
464 static_assert(std::is_base_of<ResourceLoader, POOL_TYPE>::value,
"Type requested is not a stream pool");
468 return static_cast<POOL_TYPE*
>(this->
loaders[this->
typeMap.ValueAtIndex(i)].get());
471 n_error(
"No loader registered for this type");
479inline Resources::ResourceId
483 , std::function<
void(
const Resources::ResourceId)> success =
nullptr
484 , std::function<
void(
const Resources::ResourceId)> failed =
nullptr
485 ,
bool immediate =
false
489 return ResourceServer::Instance()->CreateResource(res, tag, success, failed, immediate, stream);
496template <
class METADATA>
497inline Resources::ResourceId
500 ,
const METADATA& metaData
502 , std::function<
void(
const Resources::ResourceId)> success =
nullptr
503 , std::function<
void(
const Resources::ResourceId)> failed =
nullptr
504 ,
bool immediate =
false
508 return ResourceServer::Instance()->CreateResource(res, metaData, tag, success, failed, immediate, stream);
515inline Resources::ResourceId
519 , std::function<
void(
const Resources::ResourceId)> success =
nullptr
520 , std::function<
void(
const Resources::ResourceId)> failed =
nullptr
521 ,
bool immediate =
false
525 return ResourceServer::Instance()->CreateResource(res, tag, success, failed, immediate, stream);
532template <
class METADATA>
533inline Resources::ResourceId
536 ,
const METADATA& metaData
538 , std::function<
void(
const Resources::ResourceId)> success =
nullptr
539 , std::function<
void(
const Resources::ResourceId)> failed =
nullptr
540 ,
bool immediate =
false
544 return ResourceServer::Instance()->CreateResource(res, metaData, tag, success, failed, immediate, stream);
554 , std::function<
void(
const Resources::ResourceId)> success
555 , std::function<
void(
const Resources::ResourceId)> failed =
nullptr
558 return ResourceServer::Instance()->CreateResourceListener(
id, success, failed);
565SetMinLod(
const ResourceId&
id,
float lod,
bool immediate)
567 return ResourceServer::Instance()->SetMinLod(
id, lod, immediate);
576 ResourceServer::Instance()->DiscardResource(
id);
585 return ResourceServer::Instance()->ReloadResource(res);
594 ResourceServer::Instance()->WaitForLoaderThread();
600template <
class POOL_TYPE>
604 static_assert(std::is_base_of<ResourceLoader, POOL_TYPE>::value,
"Template argument is not a ResourceCache type!");
605 return ResourceServer::Instance()->GetStreamLoader<POOL_TYPE>();
The common base class of Nebula.
Definition refcounted.h:38
Nebula's runtime type information for one class.
Definition rtti.h:27
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
const Util::String & GetNamespace() const
get Namespace component
Definition urn.h:288
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:329
__DeclareClass(ResourceServer)
void Close()
close manager
Definition resourceserver.cc:57
__DeclareInterfaceSingleton(ResourceServer)
bool HasStreamLoader(const Util::StringAtom &ext) const
query if a stream loader is registered for a given extension
Definition resourceserver.h:309
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:346
void Open()
open manager
Definition resourceserver.cc:45
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:125
ResourceServer()
constructor
Definition resourceserver.cc:26
Util::Dictionary< Util::StringAtom, IndexT > extensionMap
Definition resourceserver.h:111
Util::Dictionary< const Core::Rtti *, IndexT > typeMap
Definition resourceserver.h:113
const Resources::ResourceId GetId(const Resources::ResourceName &name) const
get id from name
Definition resourceserver.h:446
friend class ResourceLoader
Definition resourceserver.h:108
void DiscardResources(const Util::StringAtom &tag)
discard all resources by tag (stream-managed)
Definition resourceserver.cc:184
bool HasResource(const Resources::ResourceId id) const
check if resource id is valid
Definition resourceserver.h:432
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:101
void DiscardResource(const Resources::ResourceId res)
discard resource (stream-managed)
Definition resourceserver.h:367
void DeregisterStreamLoader(const Util::StringAtom &ext, const Core::Rtti &loaderClass)
deregisters a stream pool
Definition resourceserver.cc:118
virtual ~ResourceServer()
destructor
Definition resourceserver.cc:35
Core::Rtti * GetType(const Resources::ResourceId id)
get type of resource pool this resource was allocated with
Definition resourceserver.cc:218
Util::Dictionary< Util::StringAtom, IndexT > loaderMap
Definition resourceserver.h:112
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:291
const Resources::ResourceName GetName(const Resources::ResourceId id) const
get resource name
Definition resourceserver.h:384
Util::Array< Ptr< ResourceLoader > > loaders
Definition resourceserver.h:114
const Resource::State GetState(const Resources::ResourceId id) const
get resource state
Definition resourceserver.h:408
static int32_t UniquePoolCounter
Definition resourceserver.h:116
const SizeT GetUsage(const Resources::ResourceId id) const
get usage
Definition resourceserver.h:420
bool HasPendingResources()
returns true if there are pending resources in-flight
Definition resourceserver.cc:198
const Util::StringAtom GetTag(const Resources::ResourceId id) const
get tag resource was first registered with
Definition resourceserver.h:396
void LoadDefaultResources()
goes through all pools and sets up their default resources
Definition resourceserver.cc:155
POOL_TYPE * GetStreamLoader() const
get stream pool for later use
Definition resourceserver.h:462
bool open
Definition resourceserver.h:110
void WaitForLoaderThread()
Wait for all loader threads.
Definition resourceserver.cc:233
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
A StringAtom.
Definition stringatom.h:22
const char * Value() const
get contained string as char ptr (fast)
Definition stringatom.h:362
String AsString() const
get containted string as string object (SLOW!!!)
Definition stringatom.h:372
Nebula's universal string class.
Definition string.h:50
const char * AsCharPtr() const
return contents as character pointer
Definition string.h:577
String GetFileExtension() const
get filename extension without dot
Definition string.cc:1003
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:61
#define n_warn_fmt(exp, msg,...)
Definition debug.h:64
#define n_assert(exp)
Definition debug.h:58
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)
TODO: Make templated with success and failed and use a custom allocator to capture the closure.
Definition resourceserver.h:480
POOL_TYPE * GetStreamLoader()
Definition resourceserver.h:602
void DiscardResource(const Resources::ResourceId id)
Definition resourceserver.h:574
@ Update
Definition resourceloader.h:54
void WaitForLoaderThread()
Definition resourceserver.h:592
void ReloadResource(const ResourceName &res)
Definition resourceserver.h:583
Util::StringAtom ResourceName
Definition resourceid.h:33
void SetMinLod(const ResourceId &id, float lod, bool immediate)
Definition resourceserver.h:565
void CreateResourceListener(const ResourceId &id, std::function< void(const Resources::ResourceId)> success, std::function< void(const Resources::ResourceId)> failed=nullptr)
TODO: Make templated with success and failed and use a custom allocator to capture the closure.
Definition resourceserver.h:552
id
Definition resourceid.h:37
static const int InvalidIndex
Definition types.h:47
int SizeT
Definition types.h:42
int IndexT
Definition types.h:41