From 65450f57940c60f23a012c513e148e313d1346d2 Mon Sep 17 00:00:00 2001 From: Relintai Date: Wed, 20 May 2020 22:13:29 +0200 Subject: [PATCH] Reworked ModelVisual (now it only contains an array), and added a the new customizable enum values to ModelVisualEntry. --- data/items/model_visual.cpp | 94 ++++++++++++++++-------------- data/items/model_visual.h | 15 ++++- data/items/model_visual_entry.cpp | 55 +++++++++++++++++ data/items/model_visual_entry.h | 14 +++++ skeleton/character_skeleton_3d.cpp | 4 +- 5 files changed, 133 insertions(+), 49 deletions(-) diff --git a/data/items/model_visual.cpp b/data/items/model_visual.cpp index f517e5b..b786f11 100644 --- a/data/items/model_visual.cpp +++ b/data/items/model_visual.cpp @@ -29,15 +29,49 @@ void ModelVisual::set_layer(ItemEnums::EntityTextureLayers layer) { _layer = layer; } -Ref ModelVisual::get_visual(int index) { - ERR_FAIL_INDEX_V(index, EntityEnums::SKELETON_POINTS_MAX, Ref()); +//ModelVisualEntries - return _entries[index]; +Ref ModelVisual::get_visual_entry(const int index) const { + ERR_FAIL_INDEX_V(index, _visual_entries.size(), Ref()); + + return _visual_entries.get(index); } -void ModelVisual::set_visual(int index, Ref entry) { - ERR_FAIL_INDEX(index, EntityEnums::SKELETON_POINTS_MAX); +void ModelVisual::set_visual_entry(const int index, const Ref visual_entry) { + ERR_FAIL_INDEX(index, _visual_entries.size()); - _entries[index] = entry; + _visual_entries.set(index, visual_entry); +} +void ModelVisual::add_visual_entry(const Ref visual_entry) { + _visual_entries.push_back(visual_entry); +} +void ModelVisual::remove_visual_entry(const int index) { + ERR_FAIL_INDEX(index, _visual_entries.size()); + + _visual_entries.remove(index); +} + +int ModelVisual::get_visual_entry_count() const { + return _visual_entries.size(); +} + +Vector ModelVisual::get_visual_entries() { + Vector r; + for (int i = 0; i < _visual_entries.size(); i++) { +#if VERSION_MAJOR < 4 + r.push_back(_visual_entries[i].get_ref_ptr()); +#else + r.push_back(_visual_entries[i]); +#endif + } + return r; +} +void ModelVisual::set_visual_entries(const Vector &visual_entries) { + _visual_entries.clear(); + for (int i = 0; i < visual_entries.size(); i++) { + Ref visual_entry = Ref(visual_entries[i]); + + _visual_entries.push_back(visual_entry); + } } ModelVisual::ModelVisual() { @@ -45,9 +79,7 @@ ModelVisual::ModelVisual() { } ModelVisual::~ModelVisual() { - for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { - _entries[i].unref(); - } + _visual_entries.clear(); } void ModelVisual::_bind_methods() { @@ -55,41 +87,15 @@ void ModelVisual::_bind_methods() { ClassDB::bind_method(D_METHOD("set_layer", "layer"), &ModelVisual::set_layer); ADD_PROPERTY(PropertyInfo(Variant::INT, "layer", PROPERTY_HINT_ENUM, ItemEnums::BINDING_STRING_ENTITY_TEXTURE_LAYERS), "set_layer", "get_layer"); - ClassDB::bind_method(D_METHOD("get_visual", "index"), &ModelVisual::get_visual); - ClassDB::bind_method(D_METHOD("set_visual", "index", "entry"), &ModelVisual::set_visual); + //ModelVisualEntry + ClassDB::bind_method(D_METHOD("get_visual_entry", "index"), &ModelVisual::get_visual_entry); + ClassDB::bind_method(D_METHOD("set_visual_entry", "index", "data"), &ModelVisual::set_visual_entry); + ClassDB::bind_method(D_METHOD("add_visual_entry", "visual_entry"), &ModelVisual::add_visual_entry); + ClassDB::bind_method(D_METHOD("remove_visual_entry", "index"), &ModelVisual::remove_visual_entry); - ADD_GROUP("Visuals", "visual_"); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_root", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_ROOT); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_pelvis", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_PELVIS); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_spine", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_SPINE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_spine_1", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_SPINE_1); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_spine_2", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_SPINE_2); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_neck", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_NECK); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_head", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_HEAD); + ClassDB::bind_method(D_METHOD("get_visual_entry_count"), &ModelVisual::get_visual_entry_count); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_clavicle", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_CLAVICLE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_upper_arm", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_UPPER_ARM); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_forearm", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FOREARM); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_hand", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_HAND); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_thumb_base", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_THUMB_BASE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_thumb_end", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_THUMB_END); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_fingers_base", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FINGERS_BASE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_fingers_end", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FINGERS_END); - - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_clavicle", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_CLAVICLE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_upper_arm", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_UPPER_ARM); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_forearm", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FOREARM); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_hand", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_HAND); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_thumb_base", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_THUMB_BASE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_thumb_end", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_THUMB_END); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_fingers_base", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FINGERS_BASE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_fingers_end", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FINGERS_END); - - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_thigh", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_THIGH); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_calf", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_CALF); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_foot", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FOOT); - - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_thigh", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_THIGH); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_calf", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_CALF); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_foot", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FOOT); + ClassDB::bind_method(D_METHOD("get_visual_entries"), &ModelVisual::get_visual_entries); + ClassDB::bind_method(D_METHOD("set_visual_entries", "visual_entrys"), &ModelVisual::set_visual_entries); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "get_visual_entries", PROPERTY_HINT_NONE, "17/17:ModelVisualEntry", PROPERTY_USAGE_DEFAULT, "ModelVisualEntry"), "set_visual_entries", "get_visual_entries"); } diff --git a/data/items/model_visual.h b/data/items/model_visual.h index 7b41b49..9306f7c 100644 --- a/data/items/model_visual.h +++ b/data/items/model_visual.h @@ -35,8 +35,16 @@ public: ItemEnums::EntityTextureLayers get_layer(); void set_layer(ItemEnums::EntityTextureLayers layer); - Ref get_visual(int index); - void set_visual(int index, Ref entry); + //ModelVisualEntry + Ref get_visual_entry(const int index) const; + void set_visual_entry(const int index, const Ref visual_entry); + void add_visual_entry(const Ref visual_entry); + void remove_visual_entry(const int index); + + int get_visual_entry_count() const; + + Vector get_visual_entries(); + void set_visual_entries(const Vector &visual_entries); ModelVisual(); ~ModelVisual(); @@ -46,7 +54,8 @@ protected: private: ItemEnums::EntityTextureLayers _layer; - Ref _entries[EntityEnums::SKELETON_POINTS_MAX]; + + Vector > _visual_entries; }; #endif diff --git a/data/items/model_visual_entry.cpp b/data/items/model_visual_entry.cpp index b6b18f3..2d5c2f1 100644 --- a/data/items/model_visual_entry.cpp +++ b/data/items/model_visual_entry.cpp @@ -22,6 +22,8 @@ SOFTWARE. #include "model_visual_entry.h" +#include "../../singletons/ess.h" + ItemEnums::EntityTextureLayers ModelVisualEntry::get_override_layer() { return _override_layer; } @@ -29,6 +31,27 @@ void ModelVisualEntry::set_override_layer(ItemEnums::EntityTextureLayers layer) _override_layer = layer; } +int ModelVisualEntry::get_entity_type() { + return _entity_type; +} +void ModelVisualEntry::set_entity_type(int value) { + _entity_type = value; +} + +int ModelVisualEntry::get_bone() { + return _bone; +} +void ModelVisualEntry::set_bone(int value) { + _bone = value; +} + +int ModelVisualEntry::get_group() { + return _group; +} +void ModelVisualEntry::set_group(int value) { + _group = value; +} + #ifdef MESH_DATA_RESOURCE_PRESENT Ref ModelVisualEntry::get_mesh(int index) { return _mesh[index]; @@ -70,6 +93,10 @@ ModelVisualEntry::ModelVisualEntry() { _override_layer = ItemEnums::ENTITY_TEXTURE_LAYER_NONE; _color = Color(1, 1, 1, 1); + + _entity_type = 0; + _bone = 0; + _group = 0; } ModelVisualEntry::~ModelVisualEntry() { @@ -84,11 +111,39 @@ ModelVisualEntry::~ModelVisualEntry() { _effect.unref(); } +void ModelVisualEntry::_validate_property(PropertyInfo &property) const { + String name = property.name; + + if (name == "group") { + property.hint_string = ESS::get_instance()->model_visual_groups_get(); + } else if (name == "bone") { + if (ESS::get_instance()->skeletons_bones_count() > _entity_type) { + property.hint_string = ESS::get_instance()->skeletons_bones_index_get(_entity_type); + } else { + property.hint_string = ""; + } + } else if (name == "entity_type") { + property.hint_string = ESS::get_instance()->entity_types_get(); + } +} + void ModelVisualEntry::_bind_methods() { ClassDB::bind_method(D_METHOD("get_override_layer"), &ModelVisualEntry::get_override_layer); ClassDB::bind_method(D_METHOD("set_override_layer", "value"), &ModelVisualEntry::set_override_layer); ADD_PROPERTY(PropertyInfo(Variant::INT, "override_layer", PROPERTY_HINT_ENUM, ItemEnums::BINDING_STRING_ENTITY_TEXTURE_LAYERS), "set_override_layer", "get_override_layer"); + ClassDB::bind_method(D_METHOD("get_entity_type"), &ModelVisualEntry::get_entity_type); + ClassDB::bind_method(D_METHOD("set_entity_type", "value"), &ModelVisualEntry::set_entity_type); + ADD_PROPERTY(PropertyInfo(Variant::INT, "entity_type", PROPERTY_HINT_ENUM, "", PROPERTY_USAGE_DEFAULT | PROPERTY_USAGE_UPDATE_ALL_IF_MODIFIED), "set_entity_type", "get_entity_type"); + + ClassDB::bind_method(D_METHOD("get_bone"), &ModelVisualEntry::get_bone); + ClassDB::bind_method(D_METHOD("set_bone", "value"), &ModelVisualEntry::set_bone); + ADD_PROPERTY(PropertyInfo(Variant::INT, "bone", PROPERTY_HINT_ENUM), "set_bone", "get_bone"); + + ClassDB::bind_method(D_METHOD("get_group"), &ModelVisualEntry::get_group); + ClassDB::bind_method(D_METHOD("set_group", "value"), &ModelVisualEntry::set_group); + ADD_PROPERTY(PropertyInfo(Variant::INT, "group", PROPERTY_HINT_ENUM), "set_group", "get_group"); + #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); diff --git a/data/items/model_visual_entry.h b/data/items/model_visual_entry.h index 4a1946f..7c3cba2 100644 --- a/data/items/model_visual_entry.h +++ b/data/items/model_visual_entry.h @@ -45,6 +45,15 @@ public: ItemEnums::EntityTextureLayers get_override_layer(); void set_override_layer(ItemEnums::EntityTextureLayers layer); + int get_entity_type(); + void set_entity_type(int value); + + int get_bone(); + void set_bone(int value); + + int get_group(); + void set_group(int value); + #ifdef MESH_DATA_RESOURCE_PRESENT Ref get_mesh(int index); void set_mesh(int index, Ref mesh); @@ -66,11 +75,16 @@ public: ~ModelVisualEntry(); protected: + void _validate_property(PropertyInfo &property) const; static void _bind_methods(); private: ItemEnums::EntityTextureLayers _override_layer; + int _entity_type; + int _bone; + int _group; + #ifdef MESH_DATA_RESOURCE_PRESENT Ref _mesh[1]; #endif diff --git a/skeleton/character_skeleton_3d.cpp b/skeleton/character_skeleton_3d.cpp index 4d50336..6dc4c86 100644 --- a/skeleton/character_skeleton_3d.cpp +++ b/skeleton/character_skeleton_3d.cpp @@ -123,7 +123,7 @@ void CharacterSkeleton3D::add_model_visual(Ref vis) { ERR_FAIL_COND(!vis.is_valid()); for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { - Ref e = vis->get_visual(i); + Ref e = vis->get_visual_entry(i); if (e.is_valid()) add_model_visual_entry(vis, e, i); @@ -143,7 +143,7 @@ void CharacterSkeleton3D::remove_model_visual(Ref vis) { return; for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { - Ref e = vis->get_visual(i); + Ref e = vis->get_visual_entry(i); if (e.is_valid()) remove_model_visual_entry(vis, e, i);