Changed the cached material api a bit to be more efficient.

This commit is contained in:
Relintai 2021-08-01 18:22:13 +02:00
parent ac786ab720
commit 40c0b2373e
2 changed files with 78 additions and 26 deletions

View File

@ -22,6 +22,8 @@ SOFTWARE.
#include "terraman_library.h"
#include "../world/terra_chunk.h"
#ifdef PROPS_PRESENT
#include "../../props/props/prop_data.h"
#endif
@ -65,11 +67,19 @@ Ref<Material> TerramanLibrary::material_lod_get(const int index) {
return _materials[index];
}
Ref<Material> TerramanLibrary::material_lod_cached_get(const int index, const PoolIntArray &surfaces) {
return call("_material_lod_cached_get", index, surfaces);
Variant TerramanLibrary::material_cached_get_key(const Ref<TerraChunk> &chunk) {
return call("_material_cached_get_key", chunk);
}
Ref<Material> TerramanLibrary::_material_lod_cached_get(const int index, const PoolIntArray &surfaces) {
Variant TerramanLibrary::_material_cached_get_key(Ref<TerraChunk> chunk) {
return 0;
}
Ref<Material> TerramanLibrary::material_lod_cached_get(const int index, const Variant &key) {
return call("_material_lod_cached_get", index, key);
}
Ref<Material> TerramanLibrary::_material_lod_cached_get(const int index, const Variant &key) {
ERR_FAIL_V_MSG(material_lod_get(index), "This TerramanLibrary doesn't support cached materials!");
}
@ -132,15 +142,22 @@ Ref<Material> TerramanLibrary::liquid_material_lod_get(const int index) {
return _liquid_materials[index];
}
Ref<Material> TerramanLibrary::liquid_material_lod_cached_get(const int index, const PoolIntArray &surfaces) {
return call("_liquid_material_lod_cached_get", index, surfaces);
Variant TerramanLibrary::liquid_material_cached_get_key(const Ref<TerraChunk> &chunk) {
return call("_liquid_material_cached_get_key", chunk);
}
Ref<Material> TerramanLibrary::_liquid_material_lod_cached_get(const int index, const PoolIntArray &surfaces) {
Variant TerramanLibrary::_liquid_material_cached_get_key(Ref<TerraChunk> chunk) {
return 0;
}
Ref<Material> TerramanLibrary::liquid_material_lod_cached_get(const int index, const Variant &key) {
return call("_liquid_material_lod_cached_get", index, key);
}
Ref<Material> TerramanLibrary::_liquid_material_lod_cached_get(const int index, const Variant &key) {
ERR_FAIL_V_MSG(liquid_material_lod_get(index), "This TerramanLibrary doesn't support cached liquid materials!");
}
void TerramanLibrary::liquid_material_add(const Ref<Material> &value) {
ERR_FAIL_COND(!value.is_valid());
@ -200,15 +217,22 @@ Ref<Material> TerramanLibrary::prop_material_lod_get(const int index) {
return _prop_materials[index];
}
Ref<Material> TerramanLibrary::prop_material_lod_cached_get(const int index, const PoolIntArray &surfaces) {
return call("_prop_material_lod_cached_get", index, surfaces);
Variant TerramanLibrary::prop_material_cached_get_key(const Ref<TerraChunk> &chunk) {
return call("_prop_material_cached_get_key", chunk);
}
Ref<Material> TerramanLibrary::_prop_material_lod_cached_get(const int index, const PoolIntArray &surfaces) {
Variant TerramanLibrary::_prop_material_cached_get_key(Ref<TerraChunk> chunk) {
return 0;
}
Ref<Material> TerramanLibrary::prop_material_lod_cached_get(const int index, const Variant &key) {
return call("_prop_material_lod_cached_get", index, key);
}
Ref<Material> TerramanLibrary::_prop_material_lod_cached_get(const int index, const Variant &key) {
ERR_FAIL_V_MSG(prop_material_lod_get(index), "This TerramanLibrary doesn't support cached prop materials!");
}
void TerramanLibrary::prop_material_add(const Ref<Material> &value) {
ERR_FAIL_COND(!value.is_valid());
@ -323,12 +347,17 @@ void TerramanLibrary::_bind_methods() {
BIND_VMETHOD(MethodInfo("_setup_material_albedo", PropertyInfo(Variant::INT, "material_index"), PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture")));
BIND_VMETHOD(MethodInfo("_material_lod_cached_get", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::POOL_INT_ARRAY, "surfaces")));
BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::NIL, "ret"), "_material_cached_get_key"));
BIND_VMETHOD(MethodInfo("_material_lod_cached_get", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::NIL, "key")));
ClassDB::bind_method(D_METHOD("material_get", "index"), &TerramanLibrary::material_get);
ClassDB::bind_method(D_METHOD("material_lod_get", "index"), &TerramanLibrary::material_lod_get);
ClassDB::bind_method(D_METHOD("material_lod_cached_get", "index", "surfaces"), &TerramanLibrary::material_lod_cached_get);
ClassDB::bind_method(D_METHOD("_material_lod_cached_get", "index", "surfaces"), &TerramanLibrary::_material_lod_cached_get);
ClassDB::bind_method(D_METHOD("material_cached_get_key", "chunk"), &TerramanLibrary::material_cached_get_key);
ClassDB::bind_method(D_METHOD("_material_cached_get_key", "chunk"), &TerramanLibrary::_material_cached_get_key);
ClassDB::bind_method(D_METHOD("material_lod_cached_get", "index", "key"), &TerramanLibrary::material_lod_cached_get);
ClassDB::bind_method(D_METHOD("_material_lod_cached_get", "index", "key"), &TerramanLibrary::_material_lod_cached_get);
ClassDB::bind_method(D_METHOD("material_add", "value"), &TerramanLibrary::material_add);
ClassDB::bind_method(D_METHOD("material_set", "index", "value"), &TerramanLibrary::material_set);
ClassDB::bind_method(D_METHOD("material_remove", "index"), &TerramanLibrary::material_remove);
@ -339,12 +368,17 @@ void TerramanLibrary::_bind_methods() {
ClassDB::bind_method(D_METHOD("materials_set"), &TerramanLibrary::materials_set);
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "materials", PROPERTY_HINT_NONE, "17/17:Material", PROPERTY_USAGE_DEFAULT, "Material"), "materials_set", "materials_get");
BIND_VMETHOD(MethodInfo("_liquid_material_lod_cached_get", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::POOL_INT_ARRAY, "surfaces")));
BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::NIL, "ret"), "_liquid_material_cached_get_key"));
BIND_VMETHOD(MethodInfo("_liquid_material_lod_cached_get", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::NIL, "key")));
ClassDB::bind_method(D_METHOD("liquid_material_get", "index"), &TerramanLibrary::liquid_material_get);
ClassDB::bind_method(D_METHOD("liquid_material_lod_get", "index"), &TerramanLibrary::liquid_material_lod_get);
ClassDB::bind_method(D_METHOD("liquid_material_lod_cached_get", "index", "surfaces"), &TerramanLibrary::liquid_material_lod_cached_get);
ClassDB::bind_method(D_METHOD("_liquid_material_lod_cached_get", "index", "surfaces"), &TerramanLibrary::_liquid_material_lod_cached_get);
ClassDB::bind_method(D_METHOD("liquid_material_cached_get_key", "chunk"), &TerramanLibrary::liquid_material_cached_get_key);
ClassDB::bind_method(D_METHOD("_liquid_material_cached_get_key", "chunk"), &TerramanLibrary::_liquid_material_cached_get_key);
ClassDB::bind_method(D_METHOD("liquid_material_lod_cached_get", "index", "key"), &TerramanLibrary::liquid_material_lod_cached_get);
ClassDB::bind_method(D_METHOD("_liquid_material_lod_cached_get", "index", "key"), &TerramanLibrary::_liquid_material_lod_cached_get);
ClassDB::bind_method(D_METHOD("liquid_material_add", "value"), &TerramanLibrary::liquid_material_add);
ClassDB::bind_method(D_METHOD("liquid_material_set", "index", "value"), &TerramanLibrary::liquid_material_set);
ClassDB::bind_method(D_METHOD("liquid_material_remove", "index"), &TerramanLibrary::liquid_material_remove);
@ -355,12 +389,17 @@ void TerramanLibrary::_bind_methods() {
ClassDB::bind_method(D_METHOD("liquid_materials_set"), &TerramanLibrary::liquid_materials_set);
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "liquid_materials", PROPERTY_HINT_NONE, "17/17:Material", PROPERTY_USAGE_DEFAULT, "Material"), "liquid_materials_set", "liquid_materials_get");
BIND_VMETHOD(MethodInfo("_material_lod_cached_get", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::POOL_INT_ARRAY, "surfaces")));
BIND_VMETHOD(MethodInfo(PropertyInfo(Variant::NIL, "ret"), "_prop_material_cached_get_key"));
BIND_VMETHOD(MethodInfo("_prop_material_lod_cached_get", PropertyInfo(Variant::INT, "index"), PropertyInfo(Variant::NIL, "key")));
ClassDB::bind_method(D_METHOD("prop_material_get", "index"), &TerramanLibrary::prop_material_get);
ClassDB::bind_method(D_METHOD("prop_material_lod_get", "index"), &TerramanLibrary::prop_material_lod_get);
ClassDB::bind_method(D_METHOD("prop_material_lod_cached_get", "index", "surfaces"), &TerramanLibrary::prop_material_lod_cached_get);
ClassDB::bind_method(D_METHOD("_prop_material_lod_cached_get", "index", "surfaces"), &TerramanLibrary::_prop_material_lod_cached_get);
ClassDB::bind_method(D_METHOD("prop_material_cached_get_key", "chunk"), &TerramanLibrary::prop_material_cached_get_key);
ClassDB::bind_method(D_METHOD("_prop_material_cached_get_key", "chunk"), &TerramanLibrary::_prop_material_cached_get_key);
ClassDB::bind_method(D_METHOD("prop_material_lod_cached_get", "index", "key"), &TerramanLibrary::prop_material_lod_cached_get);
ClassDB::bind_method(D_METHOD("_prop_material_lod_cached_get", "index", "key"), &TerramanLibrary::_prop_material_lod_cached_get);
ClassDB::bind_method(D_METHOD("prop_material_add", "value"), &TerramanLibrary::prop_material_add);
ClassDB::bind_method(D_METHOD("prop_material_set", "index", "value"), &TerramanLibrary::prop_material_set);
ClassDB::bind_method(D_METHOD("prop_material_remove", "index"), &TerramanLibrary::prop_material_remove);

View File

@ -46,6 +46,7 @@ SOFTWARE.
class TerraSurface;
class TerraMesher;
class PackedScene;
class TerraChunk;
#ifdef PROPS_PRESENT
class PropData;
#endif
@ -69,8 +70,12 @@ public:
Ref<Material> material_get(const int index);
Ref<Material> material_lod_get(const int index);
Ref<Material> material_lod_cached_get(const int index, const PoolIntArray &surfaces);
virtual Ref<Material> _material_lod_cached_get(const int index, const PoolIntArray &surfaces);
Variant material_cached_get_key(const Ref<TerraChunk> &chunk);
virtual Variant _material_cached_get_key(Ref<TerraChunk> chunk);
Ref<Material> material_lod_cached_get(const int index, const Variant &key);
virtual Ref<Material> _material_lod_cached_get(const int index, const Variant &key);
void material_add(const Ref<Material> &value);
void material_set(const int index, const Ref<Material> &value);
void material_remove(const int index);
@ -82,8 +87,12 @@ public:
Ref<Material> liquid_material_get(const int index);
Ref<Material> liquid_material_lod_get(const int index);
Ref<Material> liquid_material_lod_cached_get(const int index, const PoolIntArray &surfaces);
virtual Ref<Material> _liquid_material_lod_cached_get(const int index, const PoolIntArray &surfaces);
Variant liquid_material_cached_get_key(const Ref<TerraChunk> &chunk);
virtual Variant _liquid_material_cached_get_key(Ref<TerraChunk> chunk);
Ref<Material> liquid_material_lod_cached_get(const int index, const Variant &key);
virtual Ref<Material> _liquid_material_lod_cached_get(const int index, const Variant &key);
void liquid_material_add(const Ref<Material> &value);
void liquid_material_set(const int index, const Ref<Material> &value);
void liquid_material_remove(const int index);
@ -95,8 +104,12 @@ public:
Ref<Material> prop_material_get(const int index);
Ref<Material> prop_material_lod_get(const int index);
Ref<Material> prop_material_lod_cached_get(const int index, const PoolIntArray &surfaces);
virtual Ref<Material> _prop_material_lod_cached_get(const int index, const PoolIntArray &surfaces);
Variant prop_material_cached_get_key(const Ref<TerraChunk> &chunk);
virtual Variant _prop_material_cached_get_key(Ref<TerraChunk> chunk);
Ref<Material> prop_material_lod_cached_get(const int index, const Variant &key);
virtual Ref<Material> _prop_material_lod_cached_get(const int index, const Variant &key);
void prop_material_add(const Ref<Material> &value);
void prop_material_set(const int index, const Ref<Material> &value);
void prop_material_remove(const int index);