From c09a7a18bfc349cd567c33d4202c2cea360f0e5f Mon Sep 17 00:00:00 2001 From: Relintai Date: Fri, 23 Aug 2019 20:23:48 +0200 Subject: [PATCH] Cleaned up the skeleton a bit. --- skeleton/character_skeleton.cpp | 83 +-------------- skeleton/character_skeleton.h | 14 --- skeleton/character_skeleton_3d.cpp | 161 +++++++++++++++++++++++++++++ skeleton/character_skeleton_3d.h | 72 +++++++++++++ 4 files changed, 234 insertions(+), 96 deletions(-) create mode 100644 skeleton/character_skeleton_3d.cpp create mode 100644 skeleton/character_skeleton_3d.h diff --git a/skeleton/character_skeleton.cpp b/skeleton/character_skeleton.cpp index 6202823..0a1ae66 100644 --- a/skeleton/character_skeleton.cpp +++ b/skeleton/character_skeleton.cpp @@ -1,34 +1,6 @@ #include "character_skeleton.h" -NodePath CharacterSkeleton::get_bone_path(int index) { - ERR_FAIL_INDEX_V(index, EntityEnums::SKELETON_POINTS_MAX, NodePath()); - - return _bone_paths[index]; -} -void CharacterSkeleton::set_bone_path(int index, NodePath path) { - ERR_FAIL_INDEX(index, EntityEnums::SKELETON_POINTS_MAX); - - _bone_paths[index] = path; - - _bone_nodes[index] = get_node_or_null(path); -} - -Ref CharacterSkeleton::get_visual(int index) { - ERR_FAIL_INDEX_V(index, EntityEnums::SKELETON_POINTS_MAX, Ref()); - - return _visuals[index]; -} -void CharacterSkeleton::set_visual(int index, Ref entry) { - ERR_FAIL_INDEX(index, EntityEnums::SKELETON_POINTS_MAX); - - _visuals[index] = entry; -} - -Node *CharacterSkeleton::get_bone_node(EntityEnums::CharacterSkeletonPoints node_id) { - return _bone_nodes[node_id]; -} - NodePath CharacterSkeleton::get_animation_player_path() { return _animation_player_path; } @@ -70,20 +42,13 @@ AnimationTree *CharacterSkeleton::get_animation_tree() { } void CharacterSkeleton::update_nodes() { - for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { - _bone_nodes[i] = get_node_or_null(_bone_paths[i]); - } - set_animation_player_path(_animation_player_path); set_animation_tree_path(_animation_tree_path); } CharacterSkeleton::CharacterSkeleton() { - for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { - _bone_nodes[i] = NULL; - } - _animation_player = NULL; + _animation_tree = NULL; } void CharacterSkeleton::_notification(int p_what) { @@ -100,52 +65,6 @@ void CharacterSkeleton::_notification(int p_what) { } void CharacterSkeleton::_bind_methods() { - ClassDB::bind_method(D_METHOD("get_bone_path", "index"), &CharacterSkeleton::get_bone_path); - ClassDB::bind_method(D_METHOD("set_bone_path", "index", "path"), &CharacterSkeleton::set_bone_path); - - ClassDB::bind_method(D_METHOD("get_visual", "index"), &CharacterSkeleton::get_visual); - ClassDB::bind_method(D_METHOD("set_visual", "index", "entry"), &CharacterSkeleton::set_visual); - - ADD_GROUP("Visuals", "visual_"); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_root", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_ROOT); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_pelvis", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_PELVIS); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_spine", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_SPINE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_spine_1", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_SPINE_1); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_spine_2", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_SPINE_2); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_neck", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_NECK); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_head", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_HEAD); - - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_clavicle", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_CLAVICLE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_upper_arm", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_UPPER_ARM); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_forearm", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FOREARM); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_hand", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_HAND); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_thumb_base", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_THUMB_BASE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_thumb_end", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_THUMB_END); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_fingers_base", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FINGERS_BASE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_fingers_end", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FINGERS_END); - - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_clavicle", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_CLAVICLE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_upper_arm", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_UPPER_ARM); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_forearm", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FOREARM); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_hand", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_HAND); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_thumb_base", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_THUMB_BASE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_thumb_end", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_THUMB_END); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_fingers_base", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FINGERS_BASE); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_fingers_end", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FINGERS_END); - - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_thigh", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_THIGH); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_calf", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_CALF); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_foot", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FOOT); - - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_thigh", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_THIGH); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_calf", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_CALF); - ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_foot", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FOOT); - - ADD_GROUP("Bone Paths", "bone_path_"); - ADD_PROPERTYI(PropertyInfo(Variant::NODE_PATH, "bone_path_root"), "set_bone_path", "get_bone_path", EntityEnums::SKELETON_POINT_ROOT); - - ClassDB::bind_method(D_METHOD("get_bone_node", "bone_idx"), &CharacterSkeleton::get_bone_node); - ClassDB::bind_method(D_METHOD("get_animation_player_path"), &CharacterSkeleton::get_animation_player_path); ClassDB::bind_method(D_METHOD("set_animation_player_path", "path"), &CharacterSkeleton::set_animation_player_path); ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "animation_player_path"), "set_animation_player_path", "get_animation_player_path"); diff --git a/skeleton/character_skeleton.h b/skeleton/character_skeleton.h index 681e9be..597bb0c 100644 --- a/skeleton/character_skeleton.h +++ b/skeleton/character_skeleton.h @@ -28,14 +28,6 @@ class CharacterSkeleton : public Spatial { #endif public: - NodePath get_bone_path(int index); - void set_bone_path(int index, NodePath path); - - Ref get_visual(int index); - void set_visual(int index, Ref entry); - - Node *get_bone_node(EntityEnums::CharacterSkeletonPoints node_id); - NodePath get_animation_player_path(); void set_animation_player_path(NodePath path); @@ -58,14 +50,8 @@ private: NodePath _animation_player_path; NodePath _animation_tree_path; - NodePath _bone_paths[EntityEnums::SKELETON_POINTS_MAX]; - AnimationPlayer *_animation_player; AnimationTree *_animation_tree; - - Node *_bone_nodes[EntityEnums::SKELETON_POINTS_MAX]; - - Ref _visuals[EntityEnums::SKELETON_POINTS_MAX]; }; diff --git a/skeleton/character_skeleton_3d.cpp b/skeleton/character_skeleton_3d.cpp new file mode 100644 index 0000000..6202823 --- /dev/null +++ b/skeleton/character_skeleton_3d.cpp @@ -0,0 +1,161 @@ +#include "character_skeleton.h" + + +NodePath CharacterSkeleton::get_bone_path(int index) { + ERR_FAIL_INDEX_V(index, EntityEnums::SKELETON_POINTS_MAX, NodePath()); + + return _bone_paths[index]; +} +void CharacterSkeleton::set_bone_path(int index, NodePath path) { + ERR_FAIL_INDEX(index, EntityEnums::SKELETON_POINTS_MAX); + + _bone_paths[index] = path; + + _bone_nodes[index] = get_node_or_null(path); +} + +Ref CharacterSkeleton::get_visual(int index) { + ERR_FAIL_INDEX_V(index, EntityEnums::SKELETON_POINTS_MAX, Ref()); + + return _visuals[index]; +} +void CharacterSkeleton::set_visual(int index, Ref entry) { + ERR_FAIL_INDEX(index, EntityEnums::SKELETON_POINTS_MAX); + + _visuals[index] = entry; +} + +Node *CharacterSkeleton::get_bone_node(EntityEnums::CharacterSkeletonPoints node_id) { + return _bone_nodes[node_id]; +} + +NodePath CharacterSkeleton::get_animation_player_path() { + return _animation_player_path; +} + +void CharacterSkeleton::set_animation_player_path(NodePath path) { + _animation_player_path = path; + + Node *node = get_node_or_null(_animation_player_path); + + if (node != NULL) { + _animation_player = Object::cast_to(node); + } else { + _animation_player = NULL; + } +} + +AnimationPlayer *CharacterSkeleton::get_animation_player() { + return _animation_player; +} + +NodePath CharacterSkeleton::get_animation_tree_path() { + return _animation_tree_path; +} + +void CharacterSkeleton::set_animation_tree_path(NodePath path) { + _animation_tree_path = path; + + Node *node = get_node_or_null(_animation_tree_path); + + if (node != NULL) { + _animation_tree = Object::cast_to(node); + } else { + _animation_tree = NULL; + } +} + +AnimationTree *CharacterSkeleton::get_animation_tree() { + return _animation_tree; +} + +void CharacterSkeleton::update_nodes() { + for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { + _bone_nodes[i] = get_node_or_null(_bone_paths[i]); + } + + set_animation_player_path(_animation_player_path); + set_animation_tree_path(_animation_tree_path); +} + +CharacterSkeleton::CharacterSkeleton() { + for (int i = 0; i < EntityEnums::SKELETON_POINTS_MAX; ++i) { + _bone_nodes[i] = NULL; + } + + _animation_player = NULL; +} + +void CharacterSkeleton::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: { + update_nodes(); + } break; + case NOTIFICATION_PROCESS: { + } break; + case NOTIFICATION_EXIT_TREE: { + + } break; + } +} + +void CharacterSkeleton::_bind_methods() { + ClassDB::bind_method(D_METHOD("get_bone_path", "index"), &CharacterSkeleton::get_bone_path); + ClassDB::bind_method(D_METHOD("set_bone_path", "index", "path"), &CharacterSkeleton::set_bone_path); + + ClassDB::bind_method(D_METHOD("get_visual", "index"), &CharacterSkeleton::get_visual); + ClassDB::bind_method(D_METHOD("set_visual", "index", "entry"), &CharacterSkeleton::set_visual); + + ADD_GROUP("Visuals", "visual_"); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_root", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_ROOT); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_pelvis", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_PELVIS); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_spine", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_SPINE); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_spine_1", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_SPINE_1); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_spine_2", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_SPINE_2); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_neck", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_NECK); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_head", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_HEAD); + + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_clavicle", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_CLAVICLE); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_upper_arm", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_UPPER_ARM); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_forearm", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FOREARM); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_hand", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_HAND); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_thumb_base", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_THUMB_BASE); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_thumb_end", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_THUMB_END); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_fingers_base", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FINGERS_BASE); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_fingers_end", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FINGERS_END); + + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_clavicle", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_CLAVICLE); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_upper_arm", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_UPPER_ARM); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_forearm", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FOREARM); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_hand", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_HAND); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_thumb_base", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_THUMB_BASE); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_thumb_end", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_THUMB_END); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_fingers_base", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FINGERS_BASE); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_fingers_end", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FINGERS_END); + + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_thigh", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_THIGH); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_calf", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_CALF); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_left_foot", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_LEFT_FOOT); + + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_thigh", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_THIGH); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_calf", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_CALF); + ADD_PROPERTYI(PropertyInfo(Variant::OBJECT, "visual_right_foot", PROPERTY_HINT_RESOURCE_TYPE, "CharacterSkeletonVisualEntry"), "set_visual", "get_visual", EntityEnums::SKELETON_POINT_RIGHT_FOOT); + + ADD_GROUP("Bone Paths", "bone_path_"); + ADD_PROPERTYI(PropertyInfo(Variant::NODE_PATH, "bone_path_root"), "set_bone_path", "get_bone_path", EntityEnums::SKELETON_POINT_ROOT); + + ClassDB::bind_method(D_METHOD("get_bone_node", "bone_idx"), &CharacterSkeleton::get_bone_node); + + ClassDB::bind_method(D_METHOD("get_animation_player_path"), &CharacterSkeleton::get_animation_player_path); + ClassDB::bind_method(D_METHOD("set_animation_player_path", "path"), &CharacterSkeleton::set_animation_player_path); + ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "animation_player_path"), "set_animation_player_path", "get_animation_player_path"); + + ClassDB::bind_method(D_METHOD("get_animation_tree_path"), &CharacterSkeleton::get_animation_tree_path); + ClassDB::bind_method(D_METHOD("set_animation_tree_path", "path"), &CharacterSkeleton::set_animation_tree_path); + ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "animation_tree_path"), "set_animation_tree_path", "get_animation_tree_path"); + + ClassDB::bind_method(D_METHOD("get_animation_player"), &CharacterSkeleton::get_animation_player); + ClassDB::bind_method(D_METHOD("get_animation_tree"), &CharacterSkeleton::get_animation_tree); + + ClassDB::bind_method(D_METHOD("update_nodes"), &CharacterSkeleton::update_nodes); +} diff --git a/skeleton/character_skeleton_3d.h b/skeleton/character_skeleton_3d.h new file mode 100644 index 0000000..681e9be --- /dev/null +++ b/skeleton/character_skeleton_3d.h @@ -0,0 +1,72 @@ +#ifndef CHARACTER_SKELETON_H +#define CHARACTER_SKELETON_H + +#ifdef ENTITIES_2D +#include "scene/2d/node_2d.h" +#else +#include "scene/3d/spatial.h" +#endif + +#include "core/node_path.h" +#include "core/ustring.h" +#include "scene/animation/animation_player.h" +#include "scene/animation/animation_tree.h" + +#include "../data/character_skeleton_visual_entry.h" +#include "../entity_enums.h" + +#ifdef ENTITIES_2D + +class CharacterSkeleton : public Node2D { + GDCLASS(CharacterSkeleton, Node2D); + +#else + +class CharacterSkeleton : public Spatial { + GDCLASS(CharacterSkeleton, Spatial); + +#endif + +public: + NodePath get_bone_path(int index); + void set_bone_path(int index, NodePath path); + + Ref get_visual(int index); + void set_visual(int index, Ref entry); + + Node *get_bone_node(EntityEnums::CharacterSkeletonPoints node_id); + + NodePath get_animation_player_path(); + void set_animation_player_path(NodePath path); + + AnimationPlayer *get_animation_player(); + + NodePath get_animation_tree_path(); + void set_animation_tree_path(NodePath path); + + AnimationTree *get_animation_tree(); + + void update_nodes(); + + CharacterSkeleton(); + +protected: + static void _bind_methods(); + virtual void _notification(int p_notification); + +private: + NodePath _animation_player_path; + NodePath _animation_tree_path; + + NodePath _bone_paths[EntityEnums::SKELETON_POINTS_MAX]; + + AnimationPlayer *_animation_player; + AnimationTree *_animation_tree; + + Node *_bone_nodes[EntityEnums::SKELETON_POINTS_MAX]; + + Ref _visuals[EntityEnums::SKELETON_POINTS_MAX]; +}; + + +#endif