From 2d5d4c0a9712e15a769127870309989a680e73a5 Mon Sep 17 00:00:00 2001 From: Relintai Date: Thu, 21 May 2020 15:40:59 +0200 Subject: [PATCH] Refactored/cleaned up ModelVisualEntry. --- data/items/model_visual_entry.cpp | 197 ++++++++++++++++++++++------- data/items/model_visual_entry.h | 76 +++++++---- skeleton/character_skeleton_3d.cpp | 2 +- 3 files changed, 202 insertions(+), 73 deletions(-) diff --git a/data/items/model_visual_entry.cpp b/data/items/model_visual_entry.cpp index 2d5c2f1..30a1c3a 100644 --- a/data/items/model_visual_entry.cpp +++ b/data/items/model_visual_entry.cpp @@ -24,91 +24,199 @@ SOFTWARE. #include "../../singletons/ess.h" -ItemEnums::EntityTextureLayers ModelVisualEntry::get_override_layer() { +ItemEnums::EntityTextureLayers ModelVisualEntry::get_override_layer() const { return _override_layer; } -void ModelVisualEntry::set_override_layer(ItemEnums::EntityTextureLayers layer) { +void ModelVisualEntry::set_override_layer(const ItemEnums::EntityTextureLayers layer) { _override_layer = layer; } -int ModelVisualEntry::get_entity_type() { +int ModelVisualEntry::get_entity_type() const { return _entity_type; } -void ModelVisualEntry::set_entity_type(int value) { +void ModelVisualEntry::set_entity_type(const int value) { _entity_type = value; } -int ModelVisualEntry::get_bone() { +int ModelVisualEntry::get_bone() const { return _bone; } -void ModelVisualEntry::set_bone(int value) { +void ModelVisualEntry::set_bone(const int value) { _bone = value; } -int ModelVisualEntry::get_group() { +int ModelVisualEntry::get_group() const { return _group; } -void ModelVisualEntry::set_group(int value) { +void ModelVisualEntry::set_group(const int value) { _group = value; } #ifdef MESH_DATA_RESOURCE_PRESENT -Ref ModelVisualEntry::get_mesh(int index) { - return _mesh[index]; +Ref ModelVisualEntry::get_mesh(const int index) { + ERR_FAIL_INDEX_V(index, _entries.size(), Ref()); + + return _entries[index].mesh; } -void ModelVisualEntry::set_mesh(int index, Ref mesh) { - _mesh[index] = mesh; +void ModelVisualEntry::set_mesh(const int index, const Ref &mesh) { + ERR_FAIL_INDEX(index, _entries.size()); + + _entries.write[index].mesh = mesh; } #endif -Ref ModelVisualEntry::get_texture(int index) { - return _texture[index]; +Ref ModelVisualEntry::get_texture(const int index) { + ERR_FAIL_INDEX_V(index, _entries.size(), Ref()); + + return _entries[index].texture; } -void ModelVisualEntry::set_texture(int index, Ref texture) { - _texture[index] = texture; +void ModelVisualEntry::set_texture(const int index, const Ref &texture) { + ERR_FAIL_INDEX(index, _entries.size()); + + _entries.write[index].texture = texture; } -Color ModelVisualEntry::get_color() { - return _color; +Color ModelVisualEntry::get_color(const int index) const { + ERR_FAIL_INDEX_V(index, _entries.size(), Color()); + + return _entries[index].color; } -void ModelVisualEntry::set_color(Color color) { - _color = color; +void ModelVisualEntry::set_color(const int index, const Color &color) { + ERR_FAIL_INDEX(index, _entries.size()); + + _entries.write[index].color = color; } -Ref ModelVisualEntry::get_effect() { - return _effect; +Ref ModelVisualEntry::get_attachment(const int index) { + ERR_FAIL_INDEX_V(index, _entries.size(), Ref()); + + return _entries[index].attachment; } -void ModelVisualEntry::set_effect(Ref effect) { - _effect = effect; +void ModelVisualEntry::set_attachment(const int index, const Ref &attachment) { + ERR_FAIL_INDEX(index, _entries.size()); + _entries.write[index].attachment = attachment; } -Vector3 ModelVisualEntry::get_effect_offset(int index) { - return _effect_offset[index]; +Transform ModelVisualEntry::get_transform(const int index) const { + ERR_FAIL_INDEX_V(index, _entries.size(), Transform()); + + return _entries[index].transform; } -void ModelVisualEntry::set_effect_offset(int index, Vector3 offset) { - _effect_offset[index] = offset; +void ModelVisualEntry::set_transform(const int index, const Transform &transform) { + ERR_FAIL_INDEX(index, _entries.size()); + + _entries.write[index].transform = transform; +} + +int ModelVisualEntry::get_size() const { + return _entries.size(); +} +void ModelVisualEntry::set_size(const int value) { + _entries.resize(value); } ModelVisualEntry::ModelVisualEntry() { _override_layer = ItemEnums::ENTITY_TEXTURE_LAYER_NONE; - _color = Color(1, 1, 1, 1); - _entity_type = 0; _bone = 0; _group = 0; + + _entries.resize(1); } ModelVisualEntry::~ModelVisualEntry() { - for (int i = 0; i < 1; ++i) { -#ifdef MESH_DATA_RESOURCE_PRESENT - _mesh[i].unref(); -#endif + _entries.clear(); +} - _texture[i].unref(); +bool ModelVisualEntry::_set(const StringName &p_name, const Variant &p_value) { + String name = p_name; + + if (name.begins_with("entry_")) { + int index = name.get_slicec('_', 1).to_int(); + + if (index >= _entries.size()) { + _entries.resize(index + 1); + } + + StringName p = name.get_slicec('/', 1); + + if (p == "texture") { + _entries.write[index].texture = p_value; + + return true; +#ifdef MESH_DATA_RESOURCE_PRESENT + } else if (p == "mesh") { + _entries.write[index].mesh = p_value; + + return true; +#endif + } else if (p == "color") { + _entries.write[index].color = p_value; + + return true; + } else if (p == "attachment") { + _entries.write[index].attachment = p_value; + + return true; + } else if (p == "transform") { + _entries.write[index].transform = p_value; + + return true; + } } - _effect.unref(); + return false; +} +bool ModelVisualEntry::_get(const StringName &p_name, Variant &r_ret) const { + String name = p_name; + + if (name.begins_with("entry_")) { + int index = name.get_slicec('_', 1).to_int(); + + if (index >= _entries.size()) { + return false; + } + + StringName p = name.get_slicec('/', 1); + + if (p == "texture") { + r_ret = _entries[index].texture; + + return true; +#ifdef MESH_DATA_RESOURCE_PRESENT + } else if (p == "mesh") { + r_ret = _entries[index].mesh; + + return true; +#endif + } else if (p == "color") { + r_ret = _entries[index].color; + + return true; + } else if (p == "attachment") { + r_ret = _entries[index].attachment; + + return true; + } else if (p == "transform") { + r_ret = _entries[index].transform; + + return true; + } + } + + return false; +} +void ModelVisualEntry::_get_property_list(List *p_list) const { + for (int i = 0; i < _entries.size(); ++i) { +#ifdef MESH_DATA_RESOURCE_PRESENT + p_list->push_back(PropertyInfo(Variant::OBJECT, "entry_" + itos(i) + "/mesh", PROPERTY_HINT_RESOURCE_TYPE, "MeshDataResource")); +#endif + p_list->push_back(PropertyInfo(Variant::OBJECT, "entry_" + itos(i) + "/texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture")); + p_list->push_back(PropertyInfo(Variant::COLOR, "entry_" + itos(i) + "/color")); + p_list->push_back(PropertyInfo(Variant::OBJECT, "entry_" + itos(i) + "/attachment", PROPERTY_HINT_RESOURCE_TYPE, "PackedScene")); + p_list->push_back(PropertyInfo(Variant::TRANSFORM, "entry_" + itos(i) + "/transform")); + } } void ModelVisualEntry::_validate_property(PropertyInfo &property) const { @@ -147,22 +255,21 @@ void ModelVisualEntry::_bind_methods() { #ifdef MESH_DATA_RESOURCE_PRESENT ClassDB::bind_method(D_METHOD("get_mesh", "index"), &ModelVisualEntry::get_mesh); ClassDB::bind_method(D_METHOD("set_mesh", "index", "value"), &ModelVisualEntry::set_mesh); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "mesh", PROPERTY_HINT_RESOURCE_TYPE, "MeshDataResource"), "set_mesh", "get_mesh", 0); #endif ClassDB::bind_method(D_METHOD("get_texture", "index"), &ModelVisualEntry::get_texture); ClassDB::bind_method(D_METHOD("set_texture", "index", "value"), &ModelVisualEntry::set_texture); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture"), "set_texture", "get_texture", 0); ClassDB::bind_method(D_METHOD("get_color"), &ModelVisualEntry::get_color); ClassDB::bind_method(D_METHOD("set_color", "value"), &ModelVisualEntry::set_color); - ADD_PROPERTY(PropertyInfo(Variant::COLOR, "color"), "set_color", "get_color"); - ClassDB::bind_method(D_METHOD("get_effect"), &ModelVisualEntry::get_effect); - ClassDB::bind_method(D_METHOD("set_effect", "value"), &ModelVisualEntry::set_effect); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "effect", PROPERTY_HINT_RESOURCE_TYPE, "PackedScene"), "set_effect", "get_effect"); + ClassDB::bind_method(D_METHOD("get_attachment"), &ModelVisualEntry::get_attachment); + ClassDB::bind_method(D_METHOD("set_attachment", "value"), &ModelVisualEntry::set_attachment); - ClassDB::bind_method(D_METHOD("get_effect_offset", "index"), &ModelVisualEntry::get_effect_offset); - ClassDB::bind_method(D_METHOD("set_effect_offset", "index", "value"), &ModelVisualEntry::set_effect_offset); - ADD_PROPERTYI(PropertyInfo(Variant::VECTOR3, "effect_offset"), "set_effect_offset", "get_effect_offset", 0); + ClassDB::bind_method(D_METHOD("get_transform", "index"), &ModelVisualEntry::get_transform); + ClassDB::bind_method(D_METHOD("set_transform", "index", "value"), &ModelVisualEntry::set_transform); + + ClassDB::bind_method(D_METHOD("get_size"), &ModelVisualEntry::get_size); + ClassDB::bind_method(D_METHOD("set_size", "value"), &ModelVisualEntry::set_size); + ADD_PROPERTY(PropertyInfo(Variant::INT, "size", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "set_size", "get_size"); } diff --git a/data/items/model_visual_entry.h b/data/items/model_visual_entry.h index 7c3cba2..d7b35e1 100644 --- a/data/items/model_visual_entry.h +++ b/data/items/model_visual_entry.h @@ -42,39 +42,69 @@ class ModelVisualEntry : public Resource { GDCLASS(ModelVisualEntry, Resource); public: - ItemEnums::EntityTextureLayers get_override_layer(); - void set_override_layer(ItemEnums::EntityTextureLayers layer); + ItemEnums::EntityTextureLayers get_override_layer() const; + void set_override_layer(const ItemEnums::EntityTextureLayers layer); - int get_entity_type(); - void set_entity_type(int value); + int get_entity_type() const; + void set_entity_type(const int value); - int get_bone(); - void set_bone(int value); + int get_bone() const; + void set_bone(const int value); - int get_group(); - void set_group(int value); + int get_group() const; + void set_group(const int value); #ifdef MESH_DATA_RESOURCE_PRESENT - Ref get_mesh(int index); - void set_mesh(int index, Ref mesh); + Ref get_mesh(const int index); + void set_mesh(const int index, const Ref &mesh); #endif - Ref get_texture(int index); - void set_texture(int index, Ref texture); + Ref get_texture(const int index); + void set_texture(const int index, const Ref &texture); - Color get_color(); - void set_color(Color color); + Color get_color(const int index) const; + void set_color(const int index, const Color &color); - Ref get_effect(); - void set_effect(Ref effect); + Ref get_attachment(const int index); + void set_attachment(const int index, const Ref &attachment); - Vector3 get_effect_offset(int index); - void set_effect_offset(int index, Vector3 offset); + Transform get_transform(const int index) const; + void set_transform(const int index, const Transform &transform); + + int get_size() const; + void set_size(const int value); ModelVisualEntry(); ~ModelVisualEntry(); protected: + struct MVEE { +#ifdef MESH_DATA_RESOURCE_PRESENT + Ref mesh; +#endif + Ref texture; + Color color; + + Ref attachment; + Transform transform; + + MVEE() { + color = Color(1, 1, 1, 1); + } + + ~MVEE() { +#ifdef MESH_DATA_RESOURCE_PRESENT + mesh.unref(); +#endif + texture.unref(); + attachment.unref(); + } + }; + +protected: + bool _set(const StringName &p_name, const Variant &p_value); + bool _get(const StringName &p_name, Variant &r_ret) const; + void _get_property_list(List *p_list) const; void _validate_property(PropertyInfo &property) const; static void _bind_methods(); @@ -85,15 +115,7 @@ private: int _bone; int _group; -#ifdef MESH_DATA_RESOURCE_PRESENT - Ref _mesh[1]; -#endif - - Ref _texture[1]; - Color _color; - - Ref _effect; - Vector3 _effect_offset[1]; + Vector _entries; }; #endif diff --git a/skeleton/character_skeleton_3d.cpp b/skeleton/character_skeleton_3d.cpp index 6dc4c86..7109f13 100644 --- a/skeleton/character_skeleton_3d.cpp +++ b/skeleton/character_skeleton_3d.cpp @@ -205,7 +205,7 @@ void CharacterSkeleton3D::add_model_visual_entry(Ref vis, Refset_priority(static_cast(vis->get_layer())); - e->set_color(ive->get_color()); + //e->set_color(ive->get_color()); e->set_entry(ive); entries.push_back(e);