From ab5c1ffb242704440716803bd1772422e1c55a9b Mon Sep 17 00:00:00 2001 From: Relintai Date: Sun, 8 Aug 2021 11:42:24 +0200 Subject: [PATCH] Improved the additional textures api a bit in MaterialCache. Also added helper methods for adding textures from props. --- library/terra_material_cache.cpp | 89 +++++++++++++++++++++++++++++--- library/terra_material_cache.h | 12 +++-- 2 files changed, 90 insertions(+), 11 deletions(-) diff --git a/library/terra_material_cache.cpp b/library/terra_material_cache.cpp index a2ca852..88b9c7e 100644 --- a/library/terra_material_cache.cpp +++ b/library/terra_material_cache.cpp @@ -22,6 +22,15 @@ SOFTWARE. #include "terra_material_cache.h" +#ifdef PROPS_PRESENT +#include "../../props/props/prop_data.h" +#include "../../props/props/prop_data_prop.h" + +#if MESH_DATA_RESOURCE_PRESENT +#include "../../mesh_data_resource/props/prop_data_mesh_data.h" +#endif +#endif + bool TerraMaterialCache::get_initialized() { return _initialized; } @@ -146,12 +155,12 @@ void TerraMaterialCache::surfaces_clear() { _surfaces.clear(); } -void TerraMaterialCache::additional_texture_add(const Ref &tex) { - _additional_textures.push_back(tex); +void TerraMaterialCache::additional_texture_add(const Ref &texture) { + _additional_textures.push_back(texture); } -void TerraMaterialCache::additional_texture_remove(const Ref &tex) { +void TerraMaterialCache::additional_texture_remove(const Ref &texture) { for (int i = 0; i < _additional_textures.size(); ++i) { - if (_additional_textures[i] == tex) { + if (_additional_textures[i] == texture) { _additional_textures.remove(i); return; } @@ -176,12 +185,70 @@ Ref TerraMaterialCache::additional_texture_get(const int index) { Ref TerraMaterialCache::additional_texture_get_atlas(const int index) { ERR_FAIL_INDEX_V(index, _additional_textures.size(), Ref()); + return additional_texture_get_atlas_tex(_additional_textures[index]); +} +Ref TerraMaterialCache::additional_texture_get_atlas_tex(const Ref &texture) { return Ref(); } -Rect2 TerraMaterialCache::additional_texture_get_uv_rect(const Ref &tex) { +Rect2 TerraMaterialCache::additional_texture_get_uv_rect(const Ref &texture) { return Rect2(0, 0, 1, 1); } +#ifdef PROPS_PRESENT +void TerraMaterialCache::prop_add_textures(const Ref &prop) { + if (!prop.is_valid()) { + return; + } + + for (int i = 0; i < prop->get_prop_count(); ++i) { +#if MESH_DATA_RESOURCE_PRESENT + Ref pdm = prop->get_prop(i); + + if (pdm.is_valid()) { + Ref tex = pdm->get_texture(); + + if (!tex.is_valid()) + continue; + + additional_texture_add(tex); + } +#endif + + Ref pdp = prop->get_prop(i); + + if (pdp.is_valid()) { + prop_add_textures(pdp); + } + } +} +void TerraMaterialCache::prop_remove_textures(const Ref &prop) { + if (!prop.is_valid()) { + return; + } + + for (int i = 0; i < prop->get_prop_count(); ++i) { +#if MESH_DATA_RESOURCE_PRESENT + Ref pdm = prop->get_prop(i); + + if (pdm.is_valid()) { + Ref tex = pdm->get_texture(); + + if (!tex.is_valid()) + continue; + + additional_texture_remove(tex); + } +#endif + + Ref pdp = prop->get_prop(i); + + if (pdp.is_valid()) { + prop_remove_textures(pdp); + } + } +} +#endif + void TerraMaterialCache::refresh_rects() { _initialized = true; } @@ -235,14 +302,20 @@ void TerraMaterialCache::_bind_methods() { ClassDB::bind_method(D_METHOD("surface_get_num"), &TerraMaterialCache::surface_get_num); ClassDB::bind_method(D_METHOD("surfaces_clear"), &TerraMaterialCache::surfaces_clear); - ClassDB::bind_method(D_METHOD("additional_texture_add", "tex"), &TerraMaterialCache::additional_texture_add); - ClassDB::bind_method(D_METHOD("additional_texture_remove", "tex"), &TerraMaterialCache::additional_texture_remove); + ClassDB::bind_method(D_METHOD("additional_texture_add", "texture"), &TerraMaterialCache::additional_texture_add); + ClassDB::bind_method(D_METHOD("additional_texture_remove", "texture"), &TerraMaterialCache::additional_texture_remove); ClassDB::bind_method(D_METHOD("additional_texture_remove_index", "index"), &TerraMaterialCache::additional_texture_remove_index); ClassDB::bind_method(D_METHOD("additional_textures_clear"), &TerraMaterialCache::additional_textures_clear); ClassDB::bind_method(D_METHOD("additional_texture_count"), &TerraMaterialCache::additional_texture_count); ClassDB::bind_method(D_METHOD("additional_texture_get", "index"), &TerraMaterialCache::additional_texture_get); ClassDB::bind_method(D_METHOD("additional_texture_get_atlas", "index"), &TerraMaterialCache::additional_texture_get_atlas); - ClassDB::bind_method(D_METHOD("additional_texture_get_uv_rect", "tex"), &TerraMaterialCache::additional_texture_get_uv_rect); + ClassDB::bind_method(D_METHOD("additional_texture_get_atlas_tex", "index"), &TerraMaterialCache::additional_texture_get_atlas_tex); + ClassDB::bind_method(D_METHOD("additional_texture_get_uv_rect", "texture"), &TerraMaterialCache::additional_texture_get_uv_rect); + +#ifdef PROPS_PRESENT + ClassDB::bind_method(D_METHOD("prop_add_textures", "prop"), &TerraMaterialCache::prop_add_textures); + ClassDB::bind_method(D_METHOD("prop_remove_textures", "prop"), &TerraMaterialCache::prop_remove_textures); +#endif ClassDB::bind_method(D_METHOD("refresh_rects"), &TerraMaterialCache::refresh_rects); diff --git a/library/terra_material_cache.h b/library/terra_material_cache.h index cc55970..712eca2 100644 --- a/library/terra_material_cache.h +++ b/library/terra_material_cache.h @@ -75,14 +75,20 @@ public: virtual int surface_get_num() const; virtual void surfaces_clear(); - virtual void additional_texture_add(const Ref &tex); - virtual void additional_texture_remove(const Ref &tex); + virtual void additional_texture_add(const Ref &texture); + virtual void additional_texture_remove(const Ref &texture); virtual void additional_texture_remove_index(const int index); virtual void additional_textures_clear(); virtual int additional_texture_count(); virtual Ref additional_texture_get(const int index); virtual Ref additional_texture_get_atlas(const int index); - virtual Rect2 additional_texture_get_uv_rect(const Ref &tex); + virtual Ref additional_texture_get_atlas_tex(const Ref &texture); + virtual Rect2 additional_texture_get_uv_rect(const Ref &texture); + +#ifdef PROPS_PRESENT + void prop_add_textures(const Ref &prop); + void prop_remove_textures(const Ref &prop); +#endif virtual void refresh_rects();