From c31ea7c6fd41acf16846b5a80695a1c3daded437 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Fri, 22 Jul 2022 14:33:57 +0200 Subject: [PATCH 1/3] [sfml] Use x86_64 on macOS for SFML as they don't ship ARM binaries. --- CMakeLists.txt | 4 ++++ spine-sfml/cpp/CMakeLists.txt | 2 -- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f77ff7f4c..7617a9239 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,10 @@ else() endif() if((${SPINE_SFML}) OR (${CMAKE_CURRENT_BINARY_DIR} MATCHES "spine-sfml")) + if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") + set(CMAKE_OSX_ARCHITECTURES x86_64) + set(ONLY_ACTIVE_ARCH NO) + endif() add_subdirectory(spine-c) add_subdirectory(spine-sfml/c) add_subdirectory(spine-cpp) diff --git a/spine-sfml/cpp/CMakeLists.txt b/spine-sfml/cpp/CMakeLists.txt index 777a9ad4d..903d0f7d4 100644 --- a/spine-sfml/cpp/CMakeLists.txt +++ b/spine-sfml/cpp/CMakeLists.txt @@ -3,8 +3,6 @@ # set(DEPS_DIR "${CMAKE_CURRENT_LIST_DIR}/dependencies/") if (${CMAKE_SYSTEM_NAME} MATCHES "Darwin") - set(CMAKE_OSX_ARCHITECTURES x86_64) - set(ONLY_ACTIVE_ARCH NO) set(SFML_URL "https://www.sfml-dev.org/files/SFML-2.5.1-macOS-clang.tar.gz") set(SFML_DIR ${DEPS_DIR}/SFML-2.5.1-macos-clang) if (NOT EXISTS "${SFML_DIR}") From 3e1b2b10cb6b65b572eb4c7009cf175078da9b91 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Mon, 25 Jul 2022 15:16:19 +0200 Subject: [PATCH 2/3] [godot] Added single skin previewing for SpineSprite in editor. --- spine-godot/spine_godot/SpineSprite.cpp | 38 +++++++++++++++++++++---- spine-godot/spine_godot/SpineSprite.h | 1 + 2 files changed, 34 insertions(+), 5 deletions(-) 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; From 0860331e9931d6fc29e4a0b79aa18b08d79c5a43 Mon Sep 17 00:00:00 2001 From: Mario Zechner Date: Mon, 25 Jul 2022 15:21:38 +0200 Subject: [PATCH 3/3] [cpp] Format fixes. --- .../spine-cpp/src/spine/SkeletonJson.cpp | 286 +++++++++--------- .../spine_godot/SpineAnimationTrack.cpp | 12 +- 2 files changed, 149 insertions(+), 149 deletions(-) diff --git a/spine-cpp/spine-cpp/src/spine/SkeletonJson.cpp b/spine-cpp/spine-cpp/src/spine/SkeletonJson.cpp index b6912ed85..8184ff13b 100644 --- a/spine-cpp/spine-cpp/src/spine/SkeletonJson.cpp +++ b/spine-cpp/spine-cpp/src/spine/SkeletonJson.cpp @@ -549,161 +549,161 @@ SkeletonData *SkeletonJson::readSkeletonData(const char *json) { } switch (type) { - case AttachmentType_Region: { - Sequence *sequence = readSequence(Json::getItem(attachmentMap, "sequence")); - attachment = _attachmentLoader->newRegionAttachment(*skin, attachmentName, attachmentPath, sequence); - if (!attachment) { - delete skeletonData; - setError(root, "Error reading attachment: ", skinAttachmentName); - return NULL; - } - - RegionAttachment *region = static_cast(attachment); - region->_path = attachmentPath; - - region->_x = Json::getFloat(attachmentMap, "x", 0) * _scale; - region->_y = Json::getFloat(attachmentMap, "y", 0) * _scale; - region->_scaleX = Json::getFloat(attachmentMap, "scaleX", 1); - region->_scaleY = Json::getFloat(attachmentMap, "scaleY", 1); - region->_rotation = Json::getFloat(attachmentMap, "rotation", 0); - region->_width = Json::getFloat(attachmentMap, "width", 32) * _scale; - region->_height = Json::getFloat(attachmentMap, "height", 32) * _scale; - region->_sequence = sequence; - - color = Json::getString(attachmentMap, "color", 0); - if (color) toColor(region->getColor(), color, true); - - if (region->_region != NULL) region->updateRegion(); - _attachmentLoader->configureAttachment(region); - break; - } - case AttachmentType_Mesh: - case AttachmentType_Linkedmesh: { - Sequence *sequence = readSequence(Json::getItem(attachmentMap, "sequence")); - attachment = _attachmentLoader->newMeshAttachment(*skin, attachmentName, attachmentPath, sequence); - - if (!attachment) { - delete skeletonData; - setError(root, "Error reading attachment: ", skinAttachmentName); - return NULL; - } - - MeshAttachment *mesh = static_cast(attachment); - mesh->_path = attachmentPath; - - color = Json::getString(attachmentMap, "color", 0); - if (color) toColor(mesh->getColor(), color, true); - - mesh->_width = Json::getFloat(attachmentMap, "width", 32) * _scale; - mesh->_height = Json::getFloat(attachmentMap, "height", 32) * _scale; - mesh->_sequence = sequence; - - entry = Json::getItem(attachmentMap, "parent"); - if (!entry) { - int verticesLength; - entry = Json::getItem(attachmentMap, "triangles"); - mesh->_triangles.ensureCapacity(entry->_size); - mesh->_triangles.setSize(entry->_size, 0); - for (entry = entry->_child, ii = 0; entry; entry = entry->_next, ++ii) - mesh->_triangles[ii] = (unsigned short) entry->_valueInt; - - entry = Json::getItem(attachmentMap, "uvs"); - verticesLength = entry->_size; - mesh->_regionUVs.ensureCapacity(verticesLength); - mesh->_regionUVs.setSize(verticesLength, 0); - for (entry = entry->_child, ii = 0; entry; entry = entry->_next, ++ii) - mesh->_regionUVs[ii] = entry->_valueFloat; - - readVertices(attachmentMap, mesh, verticesLength); - - if (mesh->_region != NULL) mesh->updateRegion(); - - mesh->_hullLength = Json::getInt(attachmentMap, "hull", 0); - - entry = Json::getItem(attachmentMap, "edges"); - if (entry) { - mesh->_edges.ensureCapacity(entry->_size); - mesh->_edges.setSize(entry->_size, 0); - for (entry = entry->_child, ii = 0; entry; entry = entry->_next, ++ii) - mesh->_edges[ii] = entry->_valueInt; + case AttachmentType_Region: { + Sequence *sequence = readSequence(Json::getItem(attachmentMap, "sequence")); + attachment = _attachmentLoader->newRegionAttachment(*skin, attachmentName, attachmentPath, sequence); + if (!attachment) { + delete skeletonData; + setError(root, "Error reading attachment: ", skinAttachmentName); + return NULL; } - _attachmentLoader->configureAttachment(mesh); - } else { - bool inheritTimelines = Json::getInt(attachmentMap, "timelines", 1) ? true : false; - LinkedMesh *linkedMesh = new (__FILE__, __LINE__) LinkedMesh(mesh, - String(Json::getString( - attachmentMap, - "skin", 0)), - slot->getIndex(), - String(entry->_valueString), - inheritTimelines); - _linkedMeshes.add(linkedMesh); + + RegionAttachment *region = static_cast(attachment); + region->_path = attachmentPath; + + region->_x = Json::getFloat(attachmentMap, "x", 0) * _scale; + region->_y = Json::getFloat(attachmentMap, "y", 0) * _scale; + region->_scaleX = Json::getFloat(attachmentMap, "scaleX", 1); + region->_scaleY = Json::getFloat(attachmentMap, "scaleY", 1); + region->_rotation = Json::getFloat(attachmentMap, "rotation", 0); + region->_width = Json::getFloat(attachmentMap, "width", 32) * _scale; + region->_height = Json::getFloat(attachmentMap, "height", 32) * _scale; + region->_sequence = sequence; + + color = Json::getString(attachmentMap, "color", 0); + if (color) toColor(region->getColor(), color, true); + + if (region->_region != NULL) region->updateRegion(); + _attachmentLoader->configureAttachment(region); + break; } - break; - } - case AttachmentType_Boundingbox: { - attachment = _attachmentLoader->newBoundingBoxAttachment(*skin, attachmentName); + case AttachmentType_Mesh: + case AttachmentType_Linkedmesh: { + Sequence *sequence = readSequence(Json::getItem(attachmentMap, "sequence")); + attachment = _attachmentLoader->newMeshAttachment(*skin, attachmentName, attachmentPath, sequence); - BoundingBoxAttachment *box = static_cast(attachment); + if (!attachment) { + delete skeletonData; + setError(root, "Error reading attachment: ", skinAttachmentName); + return NULL; + } - int vertexCount = Json::getInt(attachmentMap, "vertexCount", 0) << 1; - readVertices(attachmentMap, box, vertexCount); - color = Json::getString(attachmentMap, "color", NULL); - if (color) toColor(box->getColor(), color, true); - _attachmentLoader->configureAttachment(attachment); - break; - } - case AttachmentType_Path: { - attachment = _attachmentLoader->newPathAttachment(*skin, attachmentName); + MeshAttachment *mesh = static_cast(attachment); + mesh->_path = attachmentPath; - PathAttachment *pathAttatchment = static_cast(attachment); + color = Json::getString(attachmentMap, "color", 0); + if (color) toColor(mesh->getColor(), color, true); - int vertexCount = 0; - pathAttatchment->_closed = Json::getInt(attachmentMap, "closed", 0) ? true : false; - pathAttatchment->_constantSpeed = Json::getInt(attachmentMap, "constantSpeed", 1) ? true - : false; - vertexCount = Json::getInt(attachmentMap, "vertexCount", 0); - readVertices(attachmentMap, pathAttatchment, vertexCount << 1); + mesh->_width = Json::getFloat(attachmentMap, "width", 32) * _scale; + mesh->_height = Json::getFloat(attachmentMap, "height", 32) * _scale; + mesh->_sequence = sequence; - pathAttatchment->_lengths.ensureCapacity(vertexCount / 3); - pathAttatchment->_lengths.setSize(vertexCount / 3, 0); + entry = Json::getItem(attachmentMap, "parent"); + if (!entry) { + int verticesLength; + entry = Json::getItem(attachmentMap, "triangles"); + mesh->_triangles.ensureCapacity(entry->_size); + mesh->_triangles.setSize(entry->_size, 0); + for (entry = entry->_child, ii = 0; entry; entry = entry->_next, ++ii) + mesh->_triangles[ii] = (unsigned short) entry->_valueInt; - curves = Json::getItem(attachmentMap, "lengths"); - for (curves = curves->_child, ii = 0; curves; curves = curves->_next, ++ii) - pathAttatchment->_lengths[ii] = curves->_valueFloat * _scale; - color = Json::getString(attachmentMap, "color", NULL); - if (color) toColor(pathAttatchment->getColor(), color, true); - _attachmentLoader->configureAttachment(attachment); - break; - } - case AttachmentType_Point: { - attachment = _attachmentLoader->newPointAttachment(*skin, attachmentName); + entry = Json::getItem(attachmentMap, "uvs"); + verticesLength = entry->_size; + mesh->_regionUVs.ensureCapacity(verticesLength); + mesh->_regionUVs.setSize(verticesLength, 0); + for (entry = entry->_child, ii = 0; entry; entry = entry->_next, ++ii) + mesh->_regionUVs[ii] = entry->_valueFloat; - PointAttachment *point = static_cast(attachment); + readVertices(attachmentMap, mesh, verticesLength); - point->_x = Json::getFloat(attachmentMap, "x", 0) * _scale; - point->_y = Json::getFloat(attachmentMap, "y", 0) * _scale; - point->_rotation = Json::getFloat(attachmentMap, "rotation", 0); - color = Json::getString(attachmentMap, "color", NULL); - if (color) toColor(point->getColor(), color, true); - _attachmentLoader->configureAttachment(attachment); - break; - } - case AttachmentType_Clipping: { - attachment = _attachmentLoader->newClippingAttachment(*skin, attachmentName); + if (mesh->_region != NULL) mesh->updateRegion(); - ClippingAttachment *clip = static_cast(attachment); + mesh->_hullLength = Json::getInt(attachmentMap, "hull", 0); - int vertexCount = 0; - const char *end = Json::getString(attachmentMap, "end", 0); - if (end) clip->_endSlot = skeletonData->findSlot(end); - vertexCount = Json::getInt(attachmentMap, "vertexCount", 0) << 1; - readVertices(attachmentMap, clip, vertexCount); - color = Json::getString(attachmentMap, "color", NULL); - if (color) toColor(clip->getColor(), color, true); - _attachmentLoader->configureAttachment(attachment); - break; - } + entry = Json::getItem(attachmentMap, "edges"); + if (entry) { + mesh->_edges.ensureCapacity(entry->_size); + mesh->_edges.setSize(entry->_size, 0); + for (entry = entry->_child, ii = 0; entry; entry = entry->_next, ++ii) + mesh->_edges[ii] = entry->_valueInt; + } + _attachmentLoader->configureAttachment(mesh); + } else { + bool inheritTimelines = Json::getInt(attachmentMap, "timelines", 1) ? true : false; + LinkedMesh *linkedMesh = new (__FILE__, __LINE__) LinkedMesh(mesh, + String(Json::getString( + attachmentMap, + "skin", 0)), + slot->getIndex(), + String(entry->_valueString), + inheritTimelines); + _linkedMeshes.add(linkedMesh); + } + break; + } + case AttachmentType_Boundingbox: { + attachment = _attachmentLoader->newBoundingBoxAttachment(*skin, attachmentName); + + BoundingBoxAttachment *box = static_cast(attachment); + + int vertexCount = Json::getInt(attachmentMap, "vertexCount", 0) << 1; + readVertices(attachmentMap, box, vertexCount); + color = Json::getString(attachmentMap, "color", NULL); + if (color) toColor(box->getColor(), color, true); + _attachmentLoader->configureAttachment(attachment); + break; + } + case AttachmentType_Path: { + attachment = _attachmentLoader->newPathAttachment(*skin, attachmentName); + + PathAttachment *pathAttatchment = static_cast(attachment); + + int vertexCount = 0; + pathAttatchment->_closed = Json::getInt(attachmentMap, "closed", 0) ? true : false; + pathAttatchment->_constantSpeed = Json::getInt(attachmentMap, "constantSpeed", 1) ? true + : false; + vertexCount = Json::getInt(attachmentMap, "vertexCount", 0); + readVertices(attachmentMap, pathAttatchment, vertexCount << 1); + + pathAttatchment->_lengths.ensureCapacity(vertexCount / 3); + pathAttatchment->_lengths.setSize(vertexCount / 3, 0); + + curves = Json::getItem(attachmentMap, "lengths"); + for (curves = curves->_child, ii = 0; curves; curves = curves->_next, ++ii) + pathAttatchment->_lengths[ii] = curves->_valueFloat * _scale; + color = Json::getString(attachmentMap, "color", NULL); + if (color) toColor(pathAttatchment->getColor(), color, true); + _attachmentLoader->configureAttachment(attachment); + break; + } + case AttachmentType_Point: { + attachment = _attachmentLoader->newPointAttachment(*skin, attachmentName); + + PointAttachment *point = static_cast(attachment); + + point->_x = Json::getFloat(attachmentMap, "x", 0) * _scale; + point->_y = Json::getFloat(attachmentMap, "y", 0) * _scale; + point->_rotation = Json::getFloat(attachmentMap, "rotation", 0); + color = Json::getString(attachmentMap, "color", NULL); + if (color) toColor(point->getColor(), color, true); + _attachmentLoader->configureAttachment(attachment); + break; + } + case AttachmentType_Clipping: { + attachment = _attachmentLoader->newClippingAttachment(*skin, attachmentName); + + ClippingAttachment *clip = static_cast(attachment); + + int vertexCount = 0; + const char *end = Json::getString(attachmentMap, "end", 0); + if (end) clip->_endSlot = skeletonData->findSlot(end); + vertexCount = Json::getInt(attachmentMap, "vertexCount", 0) << 1; + readVertices(attachmentMap, clip, vertexCount); + color = Json::getString(attachmentMap, "color", NULL); + if (color) toColor(clip->getColor(), color, true); + _attachmentLoader->configureAttachment(attachment); + break; + } } skin->setAttachment(slot->getIndex(), skinAttachmentName, attachment); diff --git a/spine-godot/spine_godot/SpineAnimationTrack.cpp b/spine-godot/spine_godot/SpineAnimationTrack.cpp index 3099c4396..b99237af7 100644 --- a/spine-godot/spine_godot/SpineAnimationTrack.cpp +++ b/spine-godot/spine_godot/SpineAnimationTrack.cpp @@ -40,8 +40,8 @@ void SpineAnimationTrack::_bind_methods() { ClassDB::bind_method(D_METHOD("get_draw_order_threshold"), &SpineAnimationTrack::get_draw_order_threshold); ClassDB::bind_method(D_METHOD("set_mix_blend", "mix_blend"), &SpineAnimationTrack::set_mix_blend); ClassDB::bind_method(D_METHOD("get_mix_blend"), &SpineAnimationTrack::get_mix_blend); - ClassDB::bind_method(D_METHOD("set_blend_tree_mode", "blend_tree_mode_enabled"), &SpineAnimationTrack::set_blend_tree_mode); - ClassDB::bind_method(D_METHOD("get_blend_tree_mode"), &SpineAnimationTrack::get_blend_tree_mode); + ClassDB::bind_method(D_METHOD("set_blend_tree_mode", "blend_tree_mode_enabled"), &SpineAnimationTrack::set_blend_tree_mode); + ClassDB::bind_method(D_METHOD("get_blend_tree_mode"), &SpineAnimationTrack::get_blend_tree_mode); ClassDB::bind_method(D_METHOD("set_debug", "debug"), &SpineAnimationTrack::set_debug); ClassDB::bind_method(D_METHOD("get_debug"), &SpineAnimationTrack::get_debug); @@ -60,7 +60,7 @@ void SpineAnimationTrack::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VARIANT_FLOAT, "attachment_threshold"), "set_attachment_threshold", "get_attachment_threshold"); ADD_PROPERTY(PropertyInfo(Variant::VARIANT_FLOAT, "draw_order_threshold"), "set_draw_order_threshold", "get_draw_order_threshold"); ADD_PROPERTY(PropertyInfo(Variant::INT, "mix_blend", PROPERTY_HINT_ENUM, "Setup,First,Replace,Add"), "set_mix_blend", "get_mix_blend"); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "blend_tree_mode"), "set_blend_tree_mode", "get_blend_tree_mode"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "blend_tree_mode"), "set_blend_tree_mode", "get_blend_tree_mode"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "debug"), "set_debug", "get_debug"); } @@ -251,7 +251,7 @@ void SpineAnimationTrack::update_animation_state(const Variant &variant_sprite) if (Engine::get_singleton()->is_editor_hint()) { #ifdef TOOLS_ENABLED if (blend_tree_mode) { - AnimationTreeEditor* tree_editor = AnimationTreeEditor::get_singleton(); + AnimationTreeEditor *tree_editor = AnimationTreeEditor::get_singleton(); // When the animation tree dock is no longer visible, bail. if (!tree_editor->is_visible_in_tree()) { skeleton->setToSetupPose(); @@ -512,11 +512,11 @@ SpineConstant::MixBlend SpineAnimationTrack::get_mix_blend() { } void SpineAnimationTrack::set_blend_tree_mode(bool _blend_tree_mode) { - blend_tree_mode = _blend_tree_mode; + blend_tree_mode = _blend_tree_mode; } bool SpineAnimationTrack::get_blend_tree_mode() { - return blend_tree_mode; + return blend_tree_mode; } void SpineAnimationTrack::set_debug(bool _debug) {