mirror of
https://github.com/Relintai/props.git
synced 2024-11-14 10:17:30 +01:00
Added an api to get MaterialCaches from the PropCache singleton. Also changed toe default_prop_material_cache_class property's type to stringname.
This commit is contained in:
parent
e0db2189be
commit
b15ac01225
@ -45,19 +45,94 @@ SOFTWARE.
|
|||||||
#include "../../texture_packer/texture_packer.h"
|
#include "../../texture_packer/texture_packer.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "../material_cache/prop_material_cache.h"
|
||||||
|
|
||||||
|
#include "core/hashfuncs.h"
|
||||||
|
|
||||||
PropCache *PropCache::_instance;
|
PropCache *PropCache::_instance;
|
||||||
|
|
||||||
PropCache *PropCache::get_singleton() {
|
PropCache *PropCache::get_singleton() {
|
||||||
return _instance;
|
return _instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
String PropCache::get_default_prop_material_cache_class() {
|
StringName PropCache::get_default_prop_material_cache_class() {
|
||||||
return _default_prop_material_cache_class;
|
return _default_prop_material_cache_class;
|
||||||
}
|
}
|
||||||
void PropCache::set_default_prop_material_cache_class(const String &cls_name) {
|
void PropCache::set_default_prop_material_cache_class(const StringName &cls_name) {
|
||||||
_default_prop_material_cache_class = cls_name;
|
_default_prop_material_cache_class = cls_name;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Ref<PropMaterialCache> PropCache::material_cache_get(const Ref<PropData> &prop) {
|
||||||
|
ERR_FAIL_COND_V(!prop.is_valid(), Ref<PropMaterialCache>());
|
||||||
|
|
||||||
|
//get pointer's value as uint64
|
||||||
|
uint64_t k = make_uint64_t<const PropData *>(*prop);
|
||||||
|
|
||||||
|
_material_cache_mutex.lock();
|
||||||
|
|
||||||
|
if (_material_cache.has(k)) {
|
||||||
|
Ref<PropMaterialCache> m = _material_cache[k];
|
||||||
|
|
||||||
|
m->inc_ref_count();
|
||||||
|
|
||||||
|
_material_cache_mutex.unlock();
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
PropMaterialCache *p = Object::cast_to<PropMaterialCache>(ClassDB::instance(_default_prop_material_cache_class));
|
||||||
|
|
||||||
|
if (!p) {
|
||||||
|
ERR_PRINT("Can't instance the given PropMaterialCache! class_name: " + String(_default_prop_material_cache_class));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ref<PropMaterialCache> m(p);
|
||||||
|
|
||||||
|
_material_cache[k] = m;
|
||||||
|
|
||||||
|
_material_cache_mutex.unlock();
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
void PropCache::material_cache_unref(const Ref<PropData> &prop) {
|
||||||
|
_material_cache_mutex.lock();
|
||||||
|
|
||||||
|
_material_cache_mutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
|
Ref<PropMaterialCache> PropCache::material_cache_custom_key_get(const uint64_t key) {
|
||||||
|
_custom_keyed_material_cache_mutex.lock();
|
||||||
|
|
||||||
|
if (_custom_keyed_material_cache.has(key)) {
|
||||||
|
Ref<PropMaterialCache> m = _custom_keyed_material_cache[key];
|
||||||
|
|
||||||
|
m->inc_ref_count();
|
||||||
|
|
||||||
|
_custom_keyed_material_cache_mutex.unlock();
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
|
||||||
|
PropMaterialCache *p = Object::cast_to<PropMaterialCache>(ClassDB::instance(_default_prop_material_cache_class));
|
||||||
|
|
||||||
|
if (!p) {
|
||||||
|
ERR_PRINT("Can't instance the given PropMaterialCache! class_name: " + String(_default_prop_material_cache_class));
|
||||||
|
}
|
||||||
|
|
||||||
|
Ref<PropMaterialCache> m(p);
|
||||||
|
|
||||||
|
_custom_keyed_material_cache[key] = m;
|
||||||
|
|
||||||
|
_custom_keyed_material_cache_mutex.unlock();
|
||||||
|
|
||||||
|
return m;
|
||||||
|
}
|
||||||
|
void PropCache::material_cache_custom_key_unref(const uint64_t key) {
|
||||||
|
_custom_keyed_material_cache_mutex.lock();
|
||||||
|
|
||||||
|
_custom_keyed_material_cache_mutex.unlock();
|
||||||
|
}
|
||||||
|
|
||||||
#if TEXTURE_PACKER_PRESENT
|
#if TEXTURE_PACKER_PRESENT
|
||||||
bool PropCache::has_texture(const Ref<PropData> &prop) {
|
bool PropCache::has_texture(const Ref<PropData> &prop) {
|
||||||
for (int i = 0; i < _entries.size(); ++i) {
|
for (int i = 0; i < _entries.size(); ++i) {
|
||||||
|
@ -37,12 +37,16 @@ SOFTWARE.
|
|||||||
#include "core/vector.h"
|
#include "core/vector.h"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include "core/os/mutex.h"
|
||||||
|
|
||||||
#include "../props/prop_data.h"
|
#include "../props/prop_data.h"
|
||||||
|
|
||||||
#if TEXTURE_PACKER_PRESENT
|
#if TEXTURE_PACKER_PRESENT
|
||||||
class TexturePacker;
|
class TexturePacker;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
class PropMaterialCache;
|
||||||
|
|
||||||
class PropCache : public Object {
|
class PropCache : public Object {
|
||||||
GDCLASS(PropCache, Object);
|
GDCLASS(PropCache, Object);
|
||||||
|
|
||||||
@ -57,8 +61,14 @@ public:
|
|||||||
public:
|
public:
|
||||||
static PropCache *get_singleton();
|
static PropCache *get_singleton();
|
||||||
|
|
||||||
String get_default_prop_material_cache_class();
|
StringName get_default_prop_material_cache_class();
|
||||||
void set_default_prop_material_cache_class(const String& cls_name);
|
void set_default_prop_material_cache_class(const StringName &cls_name);
|
||||||
|
|
||||||
|
Ref<PropMaterialCache> material_cache_get(const Ref<PropData> &prop);
|
||||||
|
void material_cache_unref(const Ref<PropData> &prop);
|
||||||
|
|
||||||
|
Ref<PropMaterialCache> material_cache_custom_key_get(const uint64_t key);
|
||||||
|
void material_cache_custom_key_unref(const uint64_t key);
|
||||||
|
|
||||||
bool has_texture(const Ref<PropData> &prop);
|
bool has_texture(const Ref<PropData> &prop);
|
||||||
void set_texture(const Ref<PropData> &prop, const Ref<TexturePacker> &merger);
|
void set_texture(const Ref<PropData> &prop, const Ref<TexturePacker> &merger);
|
||||||
@ -86,7 +96,13 @@ public:
|
|||||||
protected:
|
protected:
|
||||||
static void _bind_methods();
|
static void _bind_methods();
|
||||||
|
|
||||||
String _default_prop_material_cache_class;
|
StringName _default_prop_material_cache_class;
|
||||||
|
|
||||||
|
Map<uint64_t, Ref<PropMaterialCache>> _material_cache;
|
||||||
|
Map<uint64_t, Ref<PropMaterialCache>> _custom_keyed_material_cache;
|
||||||
|
|
||||||
|
Mutex _material_cache_mutex;
|
||||||
|
Mutex _custom_keyed_material_cache_mutex;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
Loading…
Reference in New Issue
Block a user