diff --git a/spine-godot/spine_godot/SpineSprite.cpp b/spine-godot/spine_godot/SpineSprite.cpp index 615df18e7..0826b7800 100644 --- a/spine-godot/spine_godot/SpineSprite.cpp +++ b/spine-godot/spine_godot/SpineSprite.cpp @@ -148,7 +148,7 @@ void SpineSprite::_bind_methods() { // Filled in in _get_property_list() } -SpineSprite::SpineSprite() : update_mode(SpineConstant::UpdateMode_Process), preview_animation("-- Empty --"), preview_frame(false), preview_time(0), skeleton_clipper(nullptr), modified_bones(false) { +SpineSprite::SpineSprite() : update_mode(SpineConstant::UpdateMode_Process), preview_skin("Default"), preview_animation("-- Empty --"), preview_frame(false), preview_time(0), skeleton_clipper(nullptr), modified_bones(false) { skeleton_clipper = new spine::SkeletonClipping(); // One material per blend mode, shared across all sprites. @@ -346,9 +346,19 @@ void SpineSprite::_notification(int what) { void SpineSprite::_get_property_list(List *list) const { if (!skeleton_data_res.is_valid() || !skeleton_data_res->is_skeleton_data_loaded()) return; Vector animation_names; + Vector skin_names; skeleton_data_res->get_animation_names(animation_names); + skeleton_data_res->get_skin_names(skin_names); animation_names.insert(0, "-- Empty --"); + PropertyInfo preview_skin_property; + preview_skin_property.name = "preview_skin"; + preview_skin_property.type = Variant::STRING; + preview_skin_property.usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_STORAGE; + preview_skin_property.hint_string = String(",").join(skin_names); + preview_skin_property.hint = PROPERTY_HINT_ENUM; + list->push_back(preview_skin_property); + PropertyInfo preview_anim_property; preview_anim_property.name = "preview_animation"; preview_anim_property.type = Variant::STRING; @@ -378,6 +388,11 @@ void SpineSprite::_get_property_list(List *list) const { } bool SpineSprite::_get(const StringName &property, Variant &value) const { + if (property == "preview_skin") { + value = preview_skin; + return true; + } + if (property == "preview_animation") { value = preview_animation; return true; @@ -395,8 +410,14 @@ bool SpineSprite::_get(const StringName &property, Variant &value) const { return false; } -static void update_preview_animation(SpineSprite *sprite, const String &animation, bool frame, float time) { +static void update_preview_animation(SpineSprite *sprite, const String &skin, const String &animation, bool frame, float time) { if (!sprite->get_skeleton().is_valid()) return; + + if (EMPTY(skin) || skin == "Default") { + sprite->get_skeleton()->set_skin(nullptr); + } else { + sprite->get_skeleton()->set_skin_by_name(skin); + } sprite->get_skeleton()->set_to_setup_pose(); if (EMPTY(animation) || animation == "-- Empty --") { sprite->get_animation_state()->set_empty_animation(0, 0); @@ -412,22 +433,29 @@ static void update_preview_animation(SpineSprite *sprite, const String &animatio } bool SpineSprite::_set(const StringName &property, const Variant &value) { + if (property == "preview_skin") { + preview_skin = value; + update_preview_animation(this, preview_skin, preview_animation, preview_frame, preview_time); + NOTIFY_PROPERTY_LIST_CHANGED(); + return true; + } + if (property == "preview_animation") { preview_animation = value; - update_preview_animation(this, preview_animation, preview_frame, preview_time); + update_preview_animation(this, preview_skin, preview_animation, preview_frame, preview_time); NOTIFY_PROPERTY_LIST_CHANGED(); return true; } if (property == "preview_frame") { preview_frame = value; - update_preview_animation(this, preview_animation, preview_frame, preview_time); + update_preview_animation(this, preview_skin, preview_animation, preview_frame, preview_time); return true; } if (property == "preview_time") { preview_time = value; - update_preview_animation(this, preview_animation, preview_frame, preview_time); + update_preview_animation(this, preview_skin, preview_animation, preview_frame, preview_time); return true; } diff --git a/spine-godot/spine_godot/SpineSprite.h b/spine-godot/spine_godot/SpineSprite.h index 38ca4108d..189bfbeb7 100644 --- a/spine-godot/spine_godot/SpineSprite.h +++ b/spine-godot/spine_godot/SpineSprite.h @@ -47,6 +47,7 @@ protected: Ref animation_state; SpineConstant::UpdateMode update_mode; + String preview_skin; String preview_animation; bool preview_frame; float preview_time;