From 0dde81eaea3df090bd277c5914854923790f03c7 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Tue, 12 Apr 2022 20:33:56 +0200 Subject: [PATCH 1/7] [godot] Simplify setup.sh --- spine-godot/setup.sh | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/spine-godot/setup.sh b/spine-godot/setup.sh index 9a504c6e8..213b5e67f 100755 --- a/spine-godot/setup.sh +++ b/spine-godot/setup.sh @@ -6,6 +6,5 @@ cp -r .idea godot cp custom.py godot cp -r ../spine-cpp/spine-cpp spine_godot pushd godot -scons -Q compiledb custom_modules="../spine_godot" -scons target=debug custom_modules="../spine_godot" --jobs=8 +scons compiledb=yes custom_modules="../spine_godot" -j16 popd \ No newline at end of file From 0bd1fe7aac5fdc3a30ea0de39c2e77858f969e5d Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Tue, 12 Apr 2022 20:43:42 +0200 Subject: [PATCH 2/7] [godot] Fix compilation errors on Clang. --- spine-godot/spine_godot/SpineAnimation.h | 2 +- spine-godot/spine_godot/SpineAtlasResource.cpp | 6 +++--- spine-godot/spine_godot/SpineAtlasResource.h | 5 +---- spine-godot/spine_godot/SpineEvent.h | 2 ++ spine-godot/spine_godot/SpineIkConstraint.h | 1 + 5 files changed, 8 insertions(+), 8 deletions(-) diff --git a/spine-godot/spine_godot/SpineAnimation.h b/spine-godot/spine_godot/SpineAnimation.h index a6051b2ea..80c101ee3 100644 --- a/spine-godot/spine_godot/SpineAnimation.h +++ b/spine-godot/spine_godot/SpineAnimation.h @@ -32,7 +32,7 @@ #include "SpineConstant.h" #include "core/reference.h" -#include +#include class SpineEvent; class SpineSkeleton; diff --git a/spine-godot/spine_godot/SpineAtlasResource.cpp b/spine-godot/spine_godot/SpineAtlasResource.cpp index 37193461b..36c7f2537 100644 --- a/spine-godot/spine_godot/SpineAtlasResource.cpp +++ b/spine-godot/spine_godot/SpineAtlasResource.cpp @@ -70,8 +70,8 @@ public: if (error != OK) { ERR_PRINT(vformat("Can't load texture: \"%s\"", String(path.buffer()))); auto renderer_object = memnew(SpineRendererObject); - renderer_object->texture = nullptr; - renderer_object->normal_map = nullptr; + renderer_object->texture = Ref(nullptr); + renderer_object->normal_map = Ref(nullptr); page.setRendererObject((void *) renderer_object); return; } @@ -79,7 +79,7 @@ public: textures->append(texture); auto renderer_object = memnew(SpineRendererObject); renderer_object->texture = texture; - renderer_object->normal_map = nullptr; + renderer_object->normal_map = Ref(nullptr); String temp_path = fixed_path; String new_path = vformat("%s/%s_%s", temp_path.get_base_dir(), normal_map_prefix, temp_path.get_file()); diff --git a/spine-godot/spine_godot/SpineAtlasResource.h b/spine-godot/spine_godot/SpineAtlasResource.h index bff5c1e4f..abe0dd67f 100644 --- a/spine-godot/spine_godot/SpineAtlasResource.h +++ b/spine-godot/spine_godot/SpineAtlasResource.h @@ -30,14 +30,11 @@ #ifndef GODOT_SPINEATLASRESOURCE_H #define GODOT_SPINEATLASRESOURCE_H - -#include - #include "core/io/resource_loader.h" #include "core/io/resource_saver.h" #include "core/io/image_loader.h" +#include -class spine::Atlas; class GodotSpineTextureLoader; class SpineAtlasResource : public Resource { diff --git a/spine-godot/spine_godot/SpineEvent.h b/spine-godot/spine_godot/SpineEvent.h index 1223993e1..e976b20de 100644 --- a/spine-godot/spine_godot/SpineEvent.h +++ b/spine-godot/spine_godot/SpineEvent.h @@ -31,6 +31,8 @@ #define GODOT_SPINEEVENT_H #include "SpineEventData.h" +#include "core/reference.h" +#include class SpineEvent : public Reference { GDCLASS(SpineEvent, Reference) diff --git a/spine-godot/spine_godot/SpineIkConstraint.h b/spine-godot/spine_godot/SpineIkConstraint.h index 22b42a7ff..fe2d945e0 100644 --- a/spine-godot/spine_godot/SpineIkConstraint.h +++ b/spine-godot/spine_godot/SpineIkConstraint.h @@ -31,6 +31,7 @@ #define GODOT_SPINEIKCONSTRAINT_H #include "SpineIkConstraintData.h" +#include class SpineBone; From 5b9385e185a12f23c023e6c20739a98f3c956b35 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Tue, 12 Apr 2022 23:26:56 +0200 Subject: [PATCH 3/7] [godot] Beginnings of making animation mixes nicely inspector editable --- .../assets/spineboy/spinebody-data-res.tres | 14 ++- .../examples/helloworld/helloworld.tscn | 26 +----- .../helloworld/spineboy-helloworld.gd | 2 +- .../examples/simple-input/simple-input.tscn | 12 +++ .../simple-input/spineboy-simple-input.gd | 19 +++++ spine-godot/example/project.godot | 2 +- spine-godot/spine_godot/SpineEditorPlugin.cpp | 35 +++++++- spine-godot/spine_godot/SpineEditorPlugin.h | 62 +++++++++----- .../spine_godot/SpineSkeletonDataResource.cpp | 85 ++++++++++++++----- .../spine_godot/SpineSkeletonDataResource.h | 38 ++++++++- spine-godot/spine_godot/register_types.cpp | 3 +- 11 files changed, 226 insertions(+), 72 deletions(-) create mode 100644 spine-godot/example/examples/simple-input/simple-input.tscn create mode 100644 spine-godot/example/examples/simple-input/spineboy-simple-input.gd diff --git a/spine-godot/example/assets/spineboy/spinebody-data-res.tres b/spine-godot/example/assets/spineboy/spinebody-data-res.tres index bbf68fd09..94fb261c5 100644 --- a/spine-godot/example/assets/spineboy/spinebody-data-res.tres +++ b/spine-godot/example/assets/spineboy/spinebody-data-res.tres @@ -1,10 +1,22 @@ -[gd_resource type="SpineSkeletonDataResource" load_steps=3 format=2] +[gd_resource type="SpineSkeletonDataResource" load_steps=5 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/example/examples/helloworld/helloworld.tscn b/spine-godot/example/examples/helloworld/helloworld.tscn index 7d9c7da9c..65eb6e9cd 100644 --- a/spine-godot/example/examples/helloworld/helloworld.tscn +++ b/spine-godot/example/examples/helloworld/helloworld.tscn @@ -1,34 +1,12 @@ -[gd_scene load_steps=7 format=2] +[gd_scene load_steps=3 format=2] [ext_resource path="res://examples/helloworld/spineboy-helloworld.gd" type="Script" id=1] -[ext_resource path="res://examples/mix-and-match/mix-and-match.gd" type="Script" id=2] [ext_resource path="res://assets/spineboy/spinebody-data-res.tres" type="SpineSkeletonDataResource" id=3] -[ext_resource path="res://assets/mix-and-match/mix-and-match-data.tres" type="SpineSkeletonDataResource" id=4] -[ext_resource path="res://assets/raptor/raprot-data.tres" type="SpineSkeletonDataResource" id=5] - -[sub_resource type="GDScript" id=1] -script/source = "extends SpineSprite - -func _ready(): - get_animation_state().set_animation(\"walk\", true) -" [node name="Node2D" type="Node2D"] [node name="Spineboy" type="SpineSprite" parent="."] -position = Vector2( 137.107, 540.132 ) +position = Vector2( 496.207, 477.185 ) scale = Vector2( 0.466832, 0.466832 ) skeleton_data_res = ExtResource( 3 ) script = ExtResource( 1 ) - -[node name="MixAndMatch" type="SpineSprite" parent="."] -position = Vector2( 402.469, 534.677 ) -scale = Vector2( 0.366163, 0.366163 ) -skeleton_data_res = ExtResource( 4 ) -script = ExtResource( 2 ) - -[node name="Raptor" type="SpineSprite" parent="."] -position = Vector2( 793.667, 527.026 ) -scale = Vector2( 0.343143, 0.343143 ) -skeleton_data_res = ExtResource( 5 ) -script = SubResource( 1 ) diff --git a/spine-godot/example/examples/helloworld/spineboy-helloworld.gd b/spine-godot/example/examples/helloworld/spineboy-helloworld.gd index e140e27f1..1a4493c41 100644 --- a/spine-godot/example/examples/helloworld/spineboy-helloworld.gd +++ b/spine-godot/example/examples/helloworld/spineboy-helloworld.gd @@ -1,4 +1,4 @@ extends SpineSprite -func _ready(): +func _ready(): get_animation_state().set_animation("walk", true, 0) diff --git a/spine-godot/example/examples/simple-input/simple-input.tscn b/spine-godot/example/examples/simple-input/simple-input.tscn new file mode 100644 index 000000000..158909975 --- /dev/null +++ b/spine-godot/example/examples/simple-input/simple-input.tscn @@ -0,0 +1,12 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://assets/spineboy/spinebody-data-res.tres" type="SpineSkeletonDataResource" id=1] +[ext_resource path="res://examples/simple-input/spineboy-simple-input.gd" type="Script" id=2] + +[node name="Node2D" type="Node2D"] + +[node name="Spineboy" type="SpineSprite" parent="."] +position = Vector2( 501.503, 472.035 ) +scale = Vector2( 0.518624, 0.518624 ) +skeleton_data_res = ExtResource( 1 ) +script = ExtResource( 2 ) diff --git a/spine-godot/example/examples/simple-input/spineboy-simple-input.gd b/spine-godot/example/examples/simple-input/spineboy-simple-input.gd new file mode 100644 index 000000000..c871dc613 --- /dev/null +++ b/spine-godot/example/examples/simple-input/spineboy-simple-input.gd @@ -0,0 +1,19 @@ +extends SpineSprite + +func _ready(): + get_animation_state().set_animation("idle", true, 0) + +func _process(delta): + if Input.is_action_just_pressed("ui_left"): + get_animation_state().set_animation("run", true, 0) + get_skeleton().set_scale_x(-1) + + if Input.is_action_just_released("ui_left"): + get_animation_state().set_animation("idle", true, 0) + + if (Input.is_action_just_pressed("ui_right")): + get_animation_state().set_animation("run", true, 0) + get_skeleton().set_scale_x(1) + + if Input.is_action_just_released("ui_right"): + get_animation_state().set_animation("idle", true, 0) diff --git a/spine-godot/example/project.godot b/spine-godot/example/project.godot index b196fc59f..464c70e05 100644 --- a/spine-godot/example/project.godot +++ b/spine-godot/example/project.godot @@ -11,7 +11,7 @@ config_version=4 [application] config/name="spine-godot-examples" -run/main_scene="res://tests/batch-test.tscn" +run/main_scene="res://examples/simple-input/simple-input.tscn" run/low_processor_mode=true config/icon="res://icon.png" diff --git a/spine-godot/spine_godot/SpineEditorPlugin.cpp b/spine-godot/spine_godot/SpineEditorPlugin.cpp index 8fcd367d2..231202c05 100644 --- a/spine-godot/spine_godot/SpineEditorPlugin.cpp +++ b/spine-godot/spine_godot/SpineEditorPlugin.cpp @@ -76,13 +76,46 @@ SpineEditorPlugin::SpineEditorPlugin(EditorNode *node) { add_import_plugin(memnew(SpineAtlasResourceImportPlugin)); add_import_plugin(memnew(SpineJsonResourceImportPlugin)); add_import_plugin(memnew(SpineBinaryResourceImportPlugin)); + add_inspector_plugin(memnew(SpineAnimationMixesInspectorPlugin)); } SpineEditorPlugin::~SpineEditorPlugin() { } bool SpineEditorPlugin::handles(Object *object) const { - return object->is_class("SpineSprite"); + return object->is_class("SpineSprite") || object->is_class("SpineSkeletonDataResource"); +} + +SpineAnimationMixesInspectorPlugin::SpineAnimationMixesInspectorPlugin() { + +} + +SpineAnimationMixesInspectorPlugin::~SpineAnimationMixesInspectorPlugin() { + +} + +bool SpineAnimationMixesInspectorPlugin::can_handle(Object *object) { + return object->is_class("SpineSkeletonDataResource"); +} + +void SpineAnimationMixesInspectorPlugin::parse_begin(Object *object) { + EditorInspectorPlugin::parse_begin(object); +} + +void SpineAnimationMixesInspectorPlugin::parse_category(Object *object, const String &parse_category) { + EditorInspectorPlugin::parse_category(object, parse_category); + if (parse_category == "Animation mixes") { + + } +} + +bool SpineAnimationMixesInspectorPlugin::parse_property(Object *object, Variant::Type type, const String &path, + PropertyHint hint, const String &hint_text, int usage) { + return false; +} + +void SpineAnimationMixesInspectorPlugin::parse_end() { + EditorInspectorPlugin::parse_end(); } #endif diff --git a/spine-godot/spine_godot/SpineEditorPlugin.h b/spine-godot/spine_godot/SpineEditorPlugin.h index 0fae3e3ba..229eea6e7 100644 --- a/spine-godot/spine_godot/SpineEditorPlugin.h +++ b/spine-godot/spine_godot/SpineEditorPlugin.h @@ -38,23 +38,23 @@ class SpineAtlasResourceImportPlugin : public EditorImportPlugin { public: String get_importer_name() const override { return "spine.atlas"; } - + String get_visible_name() const override { return "Spine Runtime Atlas"; } - + void get_recognized_extensions(List *extensions) const override { extensions->push_back("atlas"); } - + String get_preset_name(int idx) const override { return idx == 0 ? "Default" : "Unknown"; } - + int get_preset_count() const override { return 1; } - + String get_save_extension() const override { return "spatlas"; } - + String get_resource_type() const override { return "SpineAtlasResource"; } - + void get_import_options(List *options, int preset) const override; - + bool get_option_visibility(const String &option, const Map &options) const override { return true; } - + Error import(const String &source_file, const String &save_path, const Map &options, List *platform_variants, List *gen_files, Variant *metadata) override; }; @@ -63,23 +63,23 @@ class SpineJsonResourceImportPlugin : public EditorImportPlugin { public: String get_importer_name() const override { return "spine.json"; } - + String get_visible_name() const override { return "Spine Skeleton Json"; } - + void get_recognized_extensions(List *extensions) const override { extensions->push_back("json"); } - + String get_preset_name(int idx) const override { return idx == 0 ? "Default" : "Unknown"; } - + int get_preset_count() const override { return 1; } - + String get_save_extension() const override { return "spjson"; } - + String get_resource_type() const override { return "SpineSkeletonFileResource"; } - + void get_import_options(List *options, int preset) const override {} - + bool get_option_visibility(const String &option, const Map &options) const override { return true; } - + Error import(const String &source_file, const String &save_path, const Map &options, List *platform_variants, List *gen_files, Variant *metadata) override; }; @@ -116,11 +116,33 @@ public: ~SpineEditorPlugin(); String get_name() const override { return "SpineEditorPlugin"; } - + bool has_main_screen() const { return false; } - + bool handles(Object *object) const override; }; + +class SpineAnimationMixesInspectorPlugin: public EditorInspectorPlugin { + GDCLASS(SpineAnimationMixesInspectorPlugin, EditorInspectorPlugin) + +public: + SpineAnimationMixesInspectorPlugin(); + ~SpineAnimationMixesInspectorPlugin() override; + + bool can_handle(Object *object) override; + void parse_begin(Object *object) override; + void parse_category(Object *object, const String &parse_category) override; + bool parse_property(Object *object, Variant::Type type, const String &path, PropertyHint hint, const String &hint_text, int usage) override; + void parse_end() override; +}; + +class SpineAnimationMixesProperty: public EditorProperty { + GDCLASS(SpineAnimationMixesProperty, EditorProperty) + +public: + SpineAnimationMixesProperty(); + ~SpineAnimationMixesProperty(); +}; #endif #endif//GODOT_SPINEEDITORPLUGIN_H diff --git a/spine-godot/spine_godot/SpineSkeletonDataResource.cpp b/spine-godot/spine_godot/SpineSkeletonDataResource.cpp index 939120744..47035f54f 100644 --- a/spine-godot/spine_godot/SpineSkeletonDataResource.cpp +++ b/spine-godot/spine_godot/SpineSkeletonDataResource.cpp @@ -29,10 +29,48 @@ #include "SpineSkeletonDataResource.h" -#ifdef TOOLS_ENABLED -#include "editor/editor_node.h" -#include "editor/editor_inspector.h" -#endif +void SpineAnimationMix::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_from", "from"), &SpineAnimationMix::set_from); + ClassDB::bind_method(D_METHOD("get_from"), &SpineAnimationMix::get_from); + ClassDB::bind_method(D_METHOD("set_to", "to"), &SpineAnimationMix::set_to); + ClassDB::bind_method(D_METHOD("get_to"), &SpineAnimationMix::get_to); + ClassDB::bind_method(D_METHOD("set_mix", "mix"), &SpineAnimationMix::set_mix); + ClassDB::bind_method(D_METHOD("get_mix"), &SpineAnimationMix::get_mix); + + ADD_PROPERTY(PropertyInfo(Variant::STRING, "from"), "set_from", "get_from"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "to"), "set_to", "get_to"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "mix"), "set_mix", "get_mix"); +} + +SpineAnimationMix::SpineAnimationMix() { +} + +SpineAnimationMix::~SpineAnimationMix() { +} + +void SpineAnimationMix::set_from(const StringName &from) { + this->from = from; +} + +String SpineAnimationMix::get_from() { + return from; +} + +void SpineAnimationMix::set_to(const StringName &to) { + this->to = to; +} + +String SpineAnimationMix::get_to() { + return to; +} + +void SpineAnimationMix::set_mix(float mix) { + this->mix = mix; +} + +float SpineAnimationMix::get_mix() { + return mix; +} void SpineSkeletonDataResource::_bind_methods() { ClassDB::bind_method(D_METHOD("is_skeleton_data_loaded"), &SpineSkeletonDataResource::is_skeleton_data_loaded); @@ -40,6 +78,10 @@ void SpineSkeletonDataResource::_bind_methods() { ClassDB::bind_method(D_METHOD("get_atlas_res"), &SpineSkeletonDataResource::get_atlas_res); ClassDB::bind_method(D_METHOD("set_skeleton_file_res", "skeleton_file_res"), &SpineSkeletonDataResource::set_skeleton_file_res); ClassDB::bind_method(D_METHOD("get_skeleton_file_res"), &SpineSkeletonDataResource::get_skeleton_file_res); + ClassDB::bind_method(D_METHOD("set_default_mix", "default_mix"), &SpineSkeletonDataResource::set_default_mix); + ClassDB::bind_method(D_METHOD("get_default_mix"), &SpineSkeletonDataResource::get_default_mix); + ClassDB::bind_method(D_METHOD("set_animation_mixes", "mixes"), &SpineSkeletonDataResource::set_animation_mixes); + ClassDB::bind_method(D_METHOD("get_animation_mixes"), &SpineSkeletonDataResource::get_animation_mixes); // Spine API ClassDB::bind_method(D_METHOD("find_bone", "bone_name"), &SpineSkeletonDataResource::find_bone); @@ -75,9 +117,12 @@ void SpineSkeletonDataResource::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "atlas_res", PropertyHint::PROPERTY_HINT_RESOURCE_TYPE, "SpineAtlasResource"), "set_atlas_res", "get_atlas_res"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "skeleton_file_res", PropertyHint::PROPERTY_HINT_RESOURCE_TYPE, "SpineSkeletonFileResource"), "set_skeleton_file_res", "get_skeleton_file_res"); + ADD_PROPERTY(PropertyInfo(Variant::REAL, "default_mix"), "set_default_mix", "get_default_mix"); + ADD_GROUP("Animation mixes", ""); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "animation_mixes"), "set_animation_mixes", "get_animation_mixes"); } -SpineSkeletonDataResource::SpineSkeletonDataResource() : skeleton_data(nullptr), animation_state_data(nullptr) { +SpineSkeletonDataResource::SpineSkeletonDataResource() : skeleton_data(nullptr), animation_state_data(nullptr), default_mix(0) { } SpineSkeletonDataResource::~SpineSkeletonDataResource() { @@ -137,6 +182,7 @@ void SpineSkeletonDataResource::set_atlas_res(const Ref &atl atlas_res = atlas; update_skeleton_data(); } + Ref SpineSkeletonDataResource::get_atlas_res() { return atlas_res; } @@ -145,6 +191,7 @@ void SpineSkeletonDataResource::set_skeleton_file_res(const Ref SpineSkeletonDataResource::get_skeleton_file_res() { return skeleton_file_res; } @@ -169,23 +216,21 @@ void SpineSkeletonDataResource::get_skin_names(Vector &skin_names) const } } -void SpineSkeletonDataResource::_get_property_list(List *p_list) const { - PropertyInfo property; - Vector animation_names; +void SpineSkeletonDataResource::set_default_mix(float default_mix) { + this->default_mix = default_mix; + if (animation_state_data) animation_state_data->setDefaultMix(default_mix); +} - property.name = "animations"; - property.type = Variant::STRING; - get_animation_names(animation_names); - property.hint_string = String(",").join(animation_names); - property.hint = PROPERTY_HINT_ENUM; - p_list->push_back(property); +float SpineSkeletonDataResource::get_default_mix() { + return default_mix; +} - property.name = "skins"; - property.type = Variant::STRING; - get_skin_names(animation_names); - property.hint_string = String(",").join(animation_names); - property.hint = PROPERTY_HINT_ENUM; - p_list->push_back(property); +void SpineSkeletonDataResource::set_animation_mixes(Array animation_mixes) { + this->animation_mixes = animation_mixes; +} + +Array SpineSkeletonDataResource::get_animation_mixes() { + return animation_mixes; } #define CHECK(x) \ diff --git a/spine-godot/spine_godot/SpineSkeletonDataResource.h b/spine-godot/spine_godot/SpineSkeletonDataResource.h index e8d3c8cff..c8b1d7b7d 100644 --- a/spine-godot/spine_godot/SpineSkeletonDataResource.h +++ b/spine-godot/spine_godot/SpineSkeletonDataResource.h @@ -12,8 +12,34 @@ #include "SpinePathConstraintData.h" #include "SpineEventData.h" +class SpineAnimationMix : public Resource { + GDCLASS(SpineAnimationMix, Resource) + +protected: + static void _bind_methods(); + + String from; + String to; + float mix; +public: + SpineAnimationMix(); + ~SpineAnimationMix(); + + void set_from(const StringName &from); + + String get_from(); + + void set_to(const StringName &to); + + String get_to(); + + void set_mix(float mix); + + float get_mix(); +}; + class SpineSkeletonDataResource : public Resource { - GDCLASS(SpineSkeletonDataResource, Resource); + GDCLASS(SpineSkeletonDataResource, Resource) protected: static void _bind_methods(); @@ -21,6 +47,8 @@ protected: private: Ref atlas_res; Ref skeleton_file_res; + float default_mix; + Array animation_mixes; spine::SkeletonData *skeleton_data; spine::AnimationStateData *animation_state_data; @@ -49,7 +77,13 @@ public: void get_skin_names(Vector &l) const; - void _get_property_list(List *p_list) const; + void set_default_mix(float default_mix); + + float get_default_mix(); + + void set_animation_mixes(Array animation_mixes); + + Array get_animation_mixes(); // Spine API Ref find_bone(const String &bone_name) const; diff --git a/spine-godot/spine_godot/register_types.cpp b/spine-godot/spine_godot/register_types.cpp index 9188f8cb2..0ecce45bb 100644 --- a/spine-godot/spine_godot/register_types.cpp +++ b/spine-godot/spine_godot/register_types.cpp @@ -73,11 +73,10 @@ void register_spine_godot_types() { #ifdef TOOLS_ENABLED EditorNode::add_init_callback(editor_init_callback); #endif - ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); - ClassDB::register_class(); + ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); From 53bf8064a0eb2dc440e13c367056ab5adba60f40 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 13 Apr 2022 08:51:38 +0200 Subject: [PATCH 4/7] [cpp] Fix Clang compilation error in SkeletonBinary. --- spine-cpp/spine-cpp/src/spine/SkeletonBinary.cpp | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/spine-cpp/spine-cpp/src/spine/SkeletonBinary.cpp b/spine-cpp/spine-cpp/src/spine/SkeletonBinary.cpp index 46b5170ef..97029ac7d 100644 --- a/spine-cpp/spine-cpp/src/spine/SkeletonBinary.cpp +++ b/spine-cpp/spine-cpp/src/spine/SkeletonBinary.cpp @@ -455,25 +455,25 @@ Skin *SkeletonBinary::readSkin(DataInput *input, bool defaultSkin, SkeletonData skin = new (__FILE__, __LINE__) Skin(readStringRef(input, skeletonData)); for (int i = 0, n = readVarint(input, true); i < n; i++) { int boneIndex = readVarint(input, true); - if (boneIndex >= skeletonData->_bones.size()) return NULL; + if (boneIndex >= (int)skeletonData->_bones.size()) return NULL; skin->getBones().add(skeletonData->_bones[boneIndex]); } for (int i = 0, n = readVarint(input, true); i < n; i++) { int ikIndex = readVarint(input, true); - if (ikIndex >= skeletonData->_ikConstraints.size()) return NULL; + if (ikIndex >= (int)skeletonData->_ikConstraints.size()) return NULL; skin->getConstraints().add(skeletonData->_ikConstraints[ikIndex]); } for (int i = 0, n = readVarint(input, true); i < n; i++) { int transformIndex = readVarint(input, true); - if (transformIndex >= skeletonData->_transformConstraints.size()) return NULL; + if (transformIndex >= (int)skeletonData->_transformConstraints.size()) return NULL; skin->getConstraints().add(skeletonData->_transformConstraints[transformIndex]); } for (int i = 0, n = readVarint(input, true); i < n; i++) { int pathIndex = readVarint(input, true); - if (pathIndex >= skeletonData->_pathConstraints.size()) return NULL; + if (pathIndex >= (int)skeletonData->_pathConstraints.size()) return NULL; skin->getConstraints().add(skeletonData->_pathConstraints[pathIndex]); } slotCount = readVarint(input, true); From 7d47e6804f5be08a64fa6ca3f3102fad81da0d0e Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 13 Apr 2022 10:28:51 +0200 Subject: [PATCH 5/7] [godot] Add icon. --- .../example/assets/mix-and-match/mix-and-match.atlas.import | 2 +- spine-godot/example/assets/raptor/raptor.atlas.import | 2 +- spine-godot/example/assets/spineboy/spineboy.atlas.import | 2 +- spine-godot/spine_godot/icons/spine.svg | 1 + 4 files changed, 4 insertions(+), 3 deletions(-) create mode 100644 spine-godot/spine_godot/icons/spine.svg diff --git a/spine-godot/example/assets/mix-and-match/mix-and-match.atlas.import b/spine-godot/example/assets/mix-and-match/mix-and-match.atlas.import index eb2d7b75a..602678dd4 100644 --- a/spine-godot/example/assets/mix-and-match/mix-and-match.atlas.import +++ b/spine-godot/example/assets/mix-and-match/mix-and-match.atlas.import @@ -11,4 +11,4 @@ dest_files=[ "res://.import/mix-and-match.atlas-3d349b543ecdcc01fb29033adaef0841 [params] -normal_texture_prefix="n" +normal_map_prefix="n" diff --git a/spine-godot/example/assets/raptor/raptor.atlas.import b/spine-godot/example/assets/raptor/raptor.atlas.import index e9d58e9c3..840608165 100644 --- a/spine-godot/example/assets/raptor/raptor.atlas.import +++ b/spine-godot/example/assets/raptor/raptor.atlas.import @@ -11,4 +11,4 @@ dest_files=[ "res://.import/raptor.atlas-66da4b831eebf404341993162ba3ddb8.spatla [params] -normal_texture_prefix="n" +normal_map_prefix="n" diff --git a/spine-godot/example/assets/spineboy/spineboy.atlas.import b/spine-godot/example/assets/spineboy/spineboy.atlas.import index 059e2f8b6..166d719ba 100644 --- a/spine-godot/example/assets/spineboy/spineboy.atlas.import +++ b/spine-godot/example/assets/spineboy/spineboy.atlas.import @@ -11,4 +11,4 @@ dest_files=[ "res://.import/spineboy.atlas-54c12b5ff1cdaaa1b4e452a7d0d868c9.spat [params] -normal_texture_prefix="n" +normal_map_prefix="n" diff --git a/spine-godot/spine_godot/icons/spine.svg b/spine-godot/spine_godot/icons/spine.svg new file mode 100644 index 000000000..1efe87e65 --- /dev/null +++ b/spine-godot/spine_godot/icons/spine.svg @@ -0,0 +1 @@ + \ No newline at end of file From f5fba4ec05ba611a311b7c42dc775a357d4a8fc7 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 13 Apr 2022 11:02:37 +0200 Subject: [PATCH 6/7] [godot] Add icons for editor editable classes. --- .../icons/{spine.svg => icon_spine_atlas_resource.svg} | 2 +- .../spine_godot/icons/icon_spine_skeleton_data_resource.svg | 1 + .../spine_godot/icons/icon_spine_skeleton_file_resource.svg | 1 + spine-godot/spine_godot/icons/icon_spine_sprite.svg | 1 + spine-godot/spine_godot/register_types.cpp | 3 --- 5 files changed, 4 insertions(+), 4 deletions(-) rename spine-godot/spine_godot/icons/{spine.svg => icon_spine_atlas_resource.svg} (88%) create mode 100644 spine-godot/spine_godot/icons/icon_spine_skeleton_data_resource.svg create mode 100644 spine-godot/spine_godot/icons/icon_spine_skeleton_file_resource.svg create mode 100644 spine-godot/spine_godot/icons/icon_spine_sprite.svg diff --git a/spine-godot/spine_godot/icons/spine.svg b/spine-godot/spine_godot/icons/icon_spine_atlas_resource.svg similarity index 88% rename from spine-godot/spine_godot/icons/spine.svg rename to spine-godot/spine_godot/icons/icon_spine_atlas_resource.svg index 1efe87e65..705bfb161 100644 --- a/spine-godot/spine_godot/icons/spine.svg +++ b/spine-godot/spine_godot/icons/icon_spine_atlas_resource.svg @@ -1 +1 @@ - \ No newline at end of file + \ No newline at end of file diff --git a/spine-godot/spine_godot/icons/icon_spine_skeleton_data_resource.svg b/spine-godot/spine_godot/icons/icon_spine_skeleton_data_resource.svg new file mode 100644 index 000000000..705bfb161 --- /dev/null +++ b/spine-godot/spine_godot/icons/icon_spine_skeleton_data_resource.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/spine-godot/spine_godot/icons/icon_spine_skeleton_file_resource.svg b/spine-godot/spine_godot/icons/icon_spine_skeleton_file_resource.svg new file mode 100644 index 000000000..705bfb161 --- /dev/null +++ b/spine-godot/spine_godot/icons/icon_spine_skeleton_file_resource.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/spine-godot/spine_godot/icons/icon_spine_sprite.svg b/spine-godot/spine_godot/icons/icon_spine_sprite.svg new file mode 100644 index 000000000..705bfb161 --- /dev/null +++ b/spine-godot/spine_godot/icons/icon_spine_sprite.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/spine-godot/spine_godot/register_types.cpp b/spine-godot/spine_godot/register_types.cpp index 0ecce45bb..e93171cd4 100644 --- a/spine-godot/spine_godot/register_types.cpp +++ b/spine-godot/spine_godot/register_types.cpp @@ -78,8 +78,6 @@ void register_spine_godot_types() { ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); - ClassDB::register_class(); - ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); @@ -97,7 +95,6 @@ void register_spine_godot_types() { ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); - ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); ClassDB::register_class(); From 935c7b463b237ee1a71263e2004c96a702cc821d Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Wed, 13 Apr 2022 13:54:29 +0200 Subject: [PATCH 7/7] [godot| Animation mixes editor property beginnings. --- spine-godot/spine_godot/SpineEditorPlugin.cpp | 22 +++++++------------ spine-godot/spine_godot/SpineEditorPlugin.h | 19 ++++++++++++++-- 2 files changed, 25 insertions(+), 16 deletions(-) diff --git a/spine-godot/spine_godot/SpineEditorPlugin.cpp b/spine-godot/spine_godot/SpineEditorPlugin.cpp index 231202c05..ceba20826 100644 --- a/spine-godot/spine_godot/SpineEditorPlugin.cpp +++ b/spine-godot/spine_godot/SpineEditorPlugin.cpp @@ -86,8 +86,9 @@ bool SpineEditorPlugin::handles(Object *object) const { return object->is_class("SpineSprite") || object->is_class("SpineSkeletonDataResource"); } -SpineAnimationMixesInspectorPlugin::SpineAnimationMixesInspectorPlugin() { - +SpineAnimationMixesInspectorPlugin::SpineAnimationMixesInspectorPlugin(): add_mix_button(nullptr) { + add_mix_button = memnew(Button); + add_mix_button->set_text("Add mix"); } SpineAnimationMixesInspectorPlugin::~SpineAnimationMixesInspectorPlugin() { @@ -99,23 +100,16 @@ bool SpineAnimationMixesInspectorPlugin::can_handle(Object *object) { } void SpineAnimationMixesInspectorPlugin::parse_begin(Object *object) { - EditorInspectorPlugin::parse_begin(object); -} - -void SpineAnimationMixesInspectorPlugin::parse_category(Object *object, const String &parse_category) { - EditorInspectorPlugin::parse_category(object, parse_category); - if (parse_category == "Animation mixes") { - - } + 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); + return true; + } return false; } -void SpineAnimationMixesInspectorPlugin::parse_end() { - EditorInspectorPlugin::parse_end(); -} - #endif diff --git a/spine-godot/spine_godot/SpineEditorPlugin.h b/spine-godot/spine_godot/SpineEditorPlugin.h index 229eea6e7..761264092 100644 --- a/spine-godot/spine_godot/SpineEditorPlugin.h +++ b/spine-godot/spine_godot/SpineEditorPlugin.h @@ -32,6 +32,8 @@ #ifdef TOOLS_ENABLED #include "editor/editor_node.h" +#include "SpineSprite.h" +#include "editor/editor_properties.h" class SpineAtlasResourceImportPlugin : public EditorImportPlugin { GDCLASS(SpineAtlasResourceImportPlugin, EditorImportPlugin) @@ -125,15 +127,18 @@ public: class SpineAnimationMixesInspectorPlugin: public EditorInspectorPlugin { GDCLASS(SpineAnimationMixesInspectorPlugin, EditorInspectorPlugin) + SpineSprite *sprite; + + Button *add_mix_button; + Vector