Reworked ModelVisual (now it only contains an array), and added a the new customizable enum values to ModelVisualEntry.

This commit is contained in:
Relintai 2020-05-20 22:13:29 +02:00
parent 18f3095832
commit 65450f5794
5 changed files with 133 additions and 49 deletions

View File

@ -29,15 +29,49 @@ void ModelVisual::set_layer(ItemEnums::EntityTextureLayers layer) {
_layer = layer; _layer = layer;
} }
Ref<ModelVisualEntry> ModelVisual::get_visual(int index) { //ModelVisualEntries
ERR_FAIL_INDEX_V(index, EntityEnums::SKELETON_POINTS_MAX, Ref<ModelVisualEntry>());
return _entries[index]; Ref<ModelVisualEntry> ModelVisual::get_visual_entry(const int index) const {
ERR_FAIL_INDEX_V(index, _visual_entries.size(), Ref<ModelVisualEntry>());
return _visual_entries.get(index);
} }
void ModelVisual::set_visual(int index, Ref<ModelVisualEntry> entry) { void ModelVisual::set_visual_entry(const int index, const Ref<ModelVisualEntry> visual_entry) {
ERR_FAIL_INDEX(index, EntityEnums::SKELETON_POINTS_MAX); ERR_FAIL_INDEX(index, _visual_entries.size());
_entries[index] = entry; _visual_entries.set(index, visual_entry);
}
void ModelVisual::add_visual_entry(const Ref<ModelVisualEntry> 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<Variant> ModelVisual::get_visual_entries() {
Vector<Variant> 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<Variant> &visual_entries) {
_visual_entries.clear();
for (int i = 0; i < visual_entries.size(); i++) {
Ref<ModelVisualEntry> visual_entry = Ref<ModelVisualEntry>(visual_entries[i]);
_visual_entries.push_back(visual_entry);
}
} }
ModelVisual::ModelVisual() { ModelVisual::ModelVisual() {
@ -45,9 +79,7 @@ ModelVisual::ModelVisual() {
} }
ModelVisual::~ModelVisual() { ModelVisual::~ModelVisual() {
for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { _visual_entries.clear();
_entries[i].unref();
}
} }
void ModelVisual::_bind_methods() { void ModelVisual::_bind_methods() {
@ -55,41 +87,15 @@ void ModelVisual::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_layer", "layer"), &ModelVisual::set_layer); 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"); 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); //ModelVisualEntry
ClassDB::bind_method(D_METHOD("set_visual", "index", "entry"), &ModelVisual::set_visual); 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_"); ClassDB::bind_method(D_METHOD("get_visual_entry_count"), &ModelVisual::get_visual_entry_count);
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);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_clavicle", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_CLAVICLE); ClassDB::bind_method(D_METHOD("get_visual_entries"), &ModelVisual::get_visual_entries);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_upper_arm", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_UPPER_ARM); ClassDB::bind_method(D_METHOD("set_visual_entries", "visual_entrys"), &ModelVisual::set_visual_entries);
ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_forearm", PROPERTY_HINT_RESOURCE_TYPE, "ModelVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FOREARM); ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "get_visual_entries", PROPERTY_HINT_NONE, "17/17:ModelVisualEntry", PROPERTY_USAGE_DEFAULT, "ModelVisualEntry"), "set_visual_entries", "get_visual_entries");
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);
} }

View File

@ -35,8 +35,16 @@ public:
ItemEnums::EntityTextureLayers get_layer(); ItemEnums::EntityTextureLayers get_layer();
void set_layer(ItemEnums::EntityTextureLayers layer); void set_layer(ItemEnums::EntityTextureLayers layer);
Ref<ModelVisualEntry> get_visual(int index); //ModelVisualEntry
void set_visual(int index, Ref<ModelVisualEntry> entry); Ref<ModelVisualEntry> get_visual_entry(const int index) const;
void set_visual_entry(const int index, const Ref<ModelVisualEntry> visual_entry);
void add_visual_entry(const Ref<ModelVisualEntry> visual_entry);
void remove_visual_entry(const int index);
int get_visual_entry_count() const;
Vector<Variant> get_visual_entries();
void set_visual_entries(const Vector<Variant> &visual_entries);
ModelVisual(); ModelVisual();
~ModelVisual(); ~ModelVisual();
@ -46,7 +54,8 @@ protected:
private: private:
ItemEnums::EntityTextureLayers _layer; ItemEnums::EntityTextureLayers _layer;
Ref<ModelVisualEntry> _entries[EntityEnums::SKELETON_POINTS_MAX];
Vector<Ref<ModelVisualEntry> > _visual_entries;
}; };
#endif #endif

View File

@ -22,6 +22,8 @@ SOFTWARE.
#include "model_visual_entry.h" #include "model_visual_entry.h"
#include "../../singletons/ess.h"
ItemEnums::EntityTextureLayers ModelVisualEntry::get_override_layer() { ItemEnums::EntityTextureLayers ModelVisualEntry::get_override_layer() {
return _override_layer; return _override_layer;
} }
@ -29,6 +31,27 @@ void ModelVisualEntry::set_override_layer(ItemEnums::EntityTextureLayers layer)
_override_layer = 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 #ifdef MESH_DATA_RESOURCE_PRESENT
Ref<MeshDataResource> ModelVisualEntry::get_mesh(int index) { Ref<MeshDataResource> ModelVisualEntry::get_mesh(int index) {
return _mesh[index]; return _mesh[index];
@ -70,6 +93,10 @@ ModelVisualEntry::ModelVisualEntry() {
_override_layer = ItemEnums::ENTITY_TEXTURE_LAYER_NONE; _override_layer = ItemEnums::ENTITY_TEXTURE_LAYER_NONE;
_color = Color(1, 1, 1, 1); _color = Color(1, 1, 1, 1);
_entity_type = 0;
_bone = 0;
_group = 0;
} }
ModelVisualEntry::~ModelVisualEntry() { ModelVisualEntry::~ModelVisualEntry() {
@ -84,11 +111,39 @@ ModelVisualEntry::~ModelVisualEntry() {
_effect.unref(); _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() { void ModelVisualEntry::_bind_methods() {
ClassDB::bind_method(D_METHOD("get_override_layer"), &ModelVisualEntry::get_override_layer); 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); 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"); 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 #ifdef MESH_DATA_RESOURCE_PRESENT
ClassDB::bind_method(D_METHOD("get_mesh", "index"), &ModelVisualEntry::get_mesh); ClassDB::bind_method(D_METHOD("get_mesh", "index"), &ModelVisualEntry::get_mesh);
ClassDB::bind_method(D_METHOD("set_mesh", "index", "value"), &ModelVisualEntry::set_mesh); ClassDB::bind_method(D_METHOD("set_mesh", "index", "value"), &ModelVisualEntry::set_mesh);

View File

@ -45,6 +45,15 @@ public:
ItemEnums::EntityTextureLayers get_override_layer(); ItemEnums::EntityTextureLayers get_override_layer();
void set_override_layer(ItemEnums::EntityTextureLayers 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 #ifdef MESH_DATA_RESOURCE_PRESENT
Ref<MeshDataResource> get_mesh(int index); Ref<MeshDataResource> get_mesh(int index);
void set_mesh(int index, Ref<MeshDataResource> mesh); void set_mesh(int index, Ref<MeshDataResource> mesh);
@ -66,11 +75,16 @@ public:
~ModelVisualEntry(); ~ModelVisualEntry();
protected: protected:
void _validate_property(PropertyInfo &property) const;
static void _bind_methods(); static void _bind_methods();
private: private:
ItemEnums::EntityTextureLayers _override_layer; ItemEnums::EntityTextureLayers _override_layer;
int _entity_type;
int _bone;
int _group;
#ifdef MESH_DATA_RESOURCE_PRESENT #ifdef MESH_DATA_RESOURCE_PRESENT
Ref<MeshDataResource> _mesh[1]; Ref<MeshDataResource> _mesh[1];
#endif #endif

View File

@ -123,7 +123,7 @@ void CharacterSkeleton3D::add_model_visual(Ref<ModelVisual> vis) {
ERR_FAIL_COND(!vis.is_valid()); ERR_FAIL_COND(!vis.is_valid());
for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) {
Ref<ModelVisualEntry> e = vis->get_visual(i); Ref<ModelVisualEntry> e = vis->get_visual_entry(i);
if (e.is_valid()) if (e.is_valid())
add_model_visual_entry(vis, e, i); add_model_visual_entry(vis, e, i);
@ -143,7 +143,7 @@ void CharacterSkeleton3D::remove_model_visual(Ref<ModelVisual> vis) {
return; return;
for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) {
Ref<ModelVisualEntry> e = vis->get_visual(i); Ref<ModelVisualEntry> e = vis->get_visual_entry(i);
if (e.is_valid()) if (e.is_valid())
remove_model_visual_entry(vis, e, i); remove_model_visual_entry(vis, e, i);