diff --git a/spine-godot/example/assets/spineboy/spinebody-data-res.tres b/spine-godot/example/assets/spineboy/spinebody-data-res.tres index 94fb261c5..43d89158d 100644 --- a/spine-godot/example/assets/spineboy/spinebody-data-res.tres +++ b/spine-godot/example/assets/spineboy/spinebody-data-res.tres @@ -1,22 +1,9 @@ -[gd_resource type="SpineSkeletonDataResource" load_steps=5 format=2] +[gd_resource type="SpineSkeletonDataResource" load_steps=16 format=2] [ext_resource path="res://assets/spineboy/spineboy.atlas" type="SpineAtlasResource" id=1] [ext_resource path="res://assets/spineboy/spineboy-pro.json" type="SpineSkeletonFileResource" id=2] -[sub_resource type="SpineAnimationMix" id=1] -from = "run" -to = "idle" -mix = 1.0 - -[sub_resource type="SpineAnimationMix" id=2] -from = "idle" -to = "run" -mix = 1.0 - [resource] atlas_res = ExtResource( 1 ) skeleton_file_res = ExtResource( 2 ) default_mix = 0.2 -animation_mixes = [ SubResource( 1 ), SubResource( 2 ), null, null ] -animations = null -skins = null diff --git a/spine-godot/spine_godot/SpineEditorPlugin.cpp b/spine-godot/spine_godot/SpineEditorPlugin.cpp index ceba20826..8649ba672 100644 --- a/spine-godot/spine_godot/SpineEditorPlugin.cpp +++ b/spine-godot/spine_godot/SpineEditorPlugin.cpp @@ -86,30 +86,75 @@ bool SpineEditorPlugin::handles(Object *object) const { return object->is_class("SpineSprite") || object->is_class("SpineSkeletonDataResource"); } -SpineAnimationMixesInspectorPlugin::SpineAnimationMixesInspectorPlugin(): add_mix_button(nullptr) { - add_mix_button = memnew(Button); - add_mix_button->set_text("Add mix"); -} - -SpineAnimationMixesInspectorPlugin::~SpineAnimationMixesInspectorPlugin() { - -} - bool SpineAnimationMixesInspectorPlugin::can_handle(Object *object) { return object->is_class("SpineSkeletonDataResource"); } -void SpineAnimationMixesInspectorPlugin::parse_begin(Object *object) { - sprite = object->cast_to(object); -} - bool SpineAnimationMixesInspectorPlugin::parse_property(Object *object, Variant::Type type, const String &path, PropertyHint hint, const String &hint_text, int usage) { - if (path == "animation_mixes") { - add_custom_control(add_mix_button); + if (path == "animation_mixes" && object) { + auto mixes_property = memnew(SpineEditorPropertyAnimationMixes); + mixes_property->setup(Object::cast_to(object)); + add_property_editor(path, mixes_property); return true; } return false; } +SpineEditorPropertyAnimationMixes::SpineEditorPropertyAnimationMixes() { + container = memnew(VBoxContainer); + add_child(container); + set_bottom_editor(container); +} + +void SpineEditorPropertyAnimationMixes::_bind_methods() { + ClassDB::bind_method(D_METHOD("add_mix"), &SpineEditorPropertyAnimationMixes::add_mix); +} + + +void SpineEditorPropertyAnimationMixes::add_mix() { + if (!skeleton_data.is_valid() || !skeleton_data->is_skeleton_data_loaded() || updating) return; + + Ref mix = Ref(memnew(SpineAnimationMix)); + Array mixes = skeleton_data->get_animation_mixes().duplicate(); + mixes.push_back(mix); + skeleton_data->set_animation_mixes(mixes); + emit_changed(get_edited_property(), mixes); +} + +void SpineEditorPropertyAnimationMixes::update_property() { + if (updating) return; + updating = true; + + for (int i = 0; container->get_child_count() != 0; i++) { + auto child = container->get_child(i); + child->queue_delete(); + container->remove_child(child); + } + + Array mixes = skeleton_data->get_animation_mixes(); + for (int i = 0; i < mixes.size(); i++) { + auto hbox = memnew(HBoxContainer); + + auto from_label = memnew(Label); + from_label->set_text("From:" ); + hbox->add_child(from_label); + + auto to_label = memnew(Label); + to_label->set_text("To: "); + hbox->add_child(to_label); + + container->add_child(hbox); + } + + add_mix_button = memnew(Button); + add_mix_button->set_text("Add mix"); + add_mix_button->set_h_size_flags(SIZE_EXPAND_FILL); + add_mix_button->connect("pressed", this, "add_mix"); + container->add_child(add_mix_button); + + updating = false; +} + + #endif diff --git a/spine-godot/spine_godot/SpineEditorPlugin.h b/spine-godot/spine_godot/SpineEditorPlugin.h index 761264092..7ad5378d4 100644 --- a/spine-godot/spine_godot/SpineEditorPlugin.h +++ b/spine-godot/spine_godot/SpineEditorPlugin.h @@ -29,6 +29,7 @@ #ifndef GODOT_SPINEEDITORPLUGIN_H #define GODOT_SPINEEDITORPLUGIN_H +#include "editor/editor_properties_array_dict.h" #ifdef TOOLS_ENABLED #include "editor/editor_node.h" @@ -127,37 +128,31 @@ public: class SpineAnimationMixesInspectorPlugin: public EditorInspectorPlugin { GDCLASS(SpineAnimationMixesInspectorPlugin, EditorInspectorPlugin) - SpineSprite *sprite; - - Button *add_mix_button; - Vector