From b9b123ff4828af45f53b069b69022f7d879ffb35 Mon Sep 17 00:00:00 2001 From: badlogic Date: Sun, 1 May 2022 07:12:52 +0200 Subject: [PATCH] [godot] Fix update order of SpineBoneNode. --- .../05-mouse-following/mouse-following.gd | 4 +- .../05-mouse-following/mouse-following.tscn | 5 +- .../examples/11-bone-node/bone-node.tscn | 4 +- spine-godot/example/tests/batch-test.tscn | 288 ++++++++++++++++++ spine-godot/example/tests/transforms.tscn | 26 ++ spine-godot/spine_godot/SpineBone.cpp | 35 ++- spine-godot/spine_godot/SpineBoneNode.cpp | 33 +- spine-godot/spine_godot/SpineBoneNode.h | 2 +- spine-godot/spine_godot/SpineSprite.cpp | 3 + spine-godot/spine_godot/SpineSprite.h | 4 + 10 files changed, 376 insertions(+), 28 deletions(-) create mode 100644 spine-godot/example/tests/transforms.tscn diff --git a/spine-godot/example/examples/05-mouse-following/mouse-following.gd b/spine-godot/example/examples/05-mouse-following/mouse-following.gd index 93054a586..471eab156 100644 --- a/spine-godot/example/examples/05-mouse-following/mouse-following.gd +++ b/spine-godot/example/examples/05-mouse-following/mouse-following.gd @@ -2,10 +2,10 @@ extends Node2D onready var spineboy: SpineSprite = $Spineboy -func _before_world_transforms_change(_sprite): +func _world_transforms_changed(_sprite): spineboy.set_global_bone_transform("crosshair", Transform2D(0, get_viewport().get_mouse_position())) func _ready(): spineboy.get_animation_state().set_animation("walk", true, 0) spineboy.get_animation_state().set_animation("aim", true, 1) - spineboy.connect("before_world_transforms_change", self, "_before_world_transforms_change") + spineboy.connect("world_transforms_changed", self, "_world_transforms_changed") diff --git a/spine-godot/example/examples/05-mouse-following/mouse-following.tscn b/spine-godot/example/examples/05-mouse-following/mouse-following.tscn index f6ac070af..e4e08a03a 100644 --- a/spine-godot/example/examples/05-mouse-following/mouse-following.tscn +++ b/spine-godot/example/examples/05-mouse-following/mouse-following.tscn @@ -8,5 +8,8 @@ script = ExtResource( 1 ) [node name="Spineboy" type="SpineSprite" parent="."] position = Vector2( 481, 457 ) -scale = Vector2( 0.457952, 0.457952 ) +scale = Vector2( 0.5, 0.5 ) skeleton_data_res = ExtResource( 2 ) +preview_animation = "-- Empty --" +preview_frame = false +preview_time = 0.0 diff --git a/spine-godot/example/examples/11-bone-node/bone-node.tscn b/spine-godot/example/examples/11-bone-node/bone-node.tscn index 28508144b..da36a1a9c 100644 --- a/spine-godot/example/examples/11-bone-node/bone-node.tscn +++ b/spine-godot/example/examples/11-bone-node/bone-node.tscn @@ -15,8 +15,7 @@ preview_frame = true preview_time = 0.0 [node name="HoverboardCenterBone" type="SpineBoneNode" parent="SpineSprite"] -position = Vector2( -6.26196, -111.618 ) -rotation = -0.0046904 +position = Vector2( 21.5753, -111.472 ) bone_name = "hoverboard-controller" bone_mode = 1 @@ -35,7 +34,6 @@ cast_to = Vector2( 0, 1000 ) [node name="HipBone" type="SpineBoneNode" parent="SpineSprite"] position = Vector2( -36.9481, -338.198 ) -rotation = 3.14072 bone_name = "hip" bone_mode = 1 diff --git a/spine-godot/example/tests/batch-test.tscn b/spine-godot/example/tests/batch-test.tscn index a65b0c9e1..0d5ac3bcb 100644 --- a/spine-godot/example/tests/batch-test.tscn +++ b/spine-godot/example/tests/batch-test.tscn @@ -10,574 +10,862 @@ rotation = -3.67884e-05 position = Vector2( 53.8037, 119.483 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite2" type="SpineSprite" parent="."] position = Vector2( 111.488, 119.485 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite3" type="SpineSprite" parent="."] position = Vector2( 164.678, 119.487 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = true +preview_time = 2.36477e-39 script = ExtResource( 2 ) [node name="SpineSprite4" type="SpineSprite" parent="."] position = Vector2( 217.119, 121.736 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = true +preview_time = 6.85235e-43 script = ExtResource( 2 ) [node name="SpineSprite5" type="SpineSprite" parent="."] position = Vector2( 277.051, 120.989 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite6" type="SpineSprite" parent="."] position = Vector2( 337.733, 118.744 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite7" type="SpineSprite" parent="."] position = Vector2( 403.658, 120.994 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite8" type="SpineSprite" parent="."] position = Vector2( 464.34, 120.996 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite9" type="SpineSprite" parent="."] position = Vector2( 525.021, 120.998 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 51.0 script = ExtResource( 2 ) [node name="SpineSprite10" type="SpineSprite" parent="."] position = Vector2( 589.448, 121.001 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite11" type="SpineSprite" parent="."] position = Vector2( 649.381, 121.752 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite12" type="SpineSprite" parent="."] position = Vector2( 709.313, 123.253 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite13" type="SpineSprite" parent="."] position = Vector2( 769.245, 119.509 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite14" type="SpineSprite" parent="."] position = Vector2( 830.676, 119.511 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite15" type="SpineSprite" parent="."] position = Vector2( 892.106, 121.761 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite16" type="SpineSprite" parent="."] position = Vector2( 953.537, 121.763 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite17" type="SpineSprite" parent="."] position = Vector2( 56.0478, 207.883 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite18" type="SpineSprite" parent="."] position = Vector2( 113.733, 207.885 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite19" type="SpineSprite" parent="."] position = Vector2( 166.923, 207.887 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite20" type="SpineSprite" parent="."] position = Vector2( 219.363, 210.136 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite21" type="SpineSprite" parent="."] position = Vector2( 279.295, 209.389 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite22" type="SpineSprite" parent="."] position = Vector2( 339.977, 207.144 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite23" type="SpineSprite" parent="."] position = Vector2( 405.902, 209.394 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite24" type="SpineSprite" parent="."] position = Vector2( 466.584, 209.396 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite25" type="SpineSprite" parent="."] position = Vector2( 527.265, 209.399 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite26" type="SpineSprite" parent="."] position = Vector2( 591.692, 209.401 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite27" type="SpineSprite" parent="."] position = Vector2( 651.625, 210.152 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite28" type="SpineSprite" parent="."] position = Vector2( 711.557, 211.653 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite29" type="SpineSprite" parent="."] position = Vector2( 771.489, 207.909 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite30" type="SpineSprite" parent="."] position = Vector2( 832.92, 207.911 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite31" type="SpineSprite" parent="."] position = Vector2( 894.351, 210.161 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite32" type="SpineSprite" parent="."] position = Vector2( 955.781, 210.163 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite33" type="SpineSprite" parent="."] position = Vector2( 60.5394, 300.778 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite34" type="SpineSprite" parent="."] position = Vector2( 118.224, 300.78 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite35" type="SpineSprite" parent="."] position = Vector2( 171.414, 300.782 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite36" type="SpineSprite" parent="."] position = Vector2( 223.855, 303.032 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite37" type="SpineSprite" parent="."] position = Vector2( 283.787, 302.285 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite38" type="SpineSprite" parent="."] position = Vector2( 344.468, 300.039 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite39" type="SpineSprite" parent="."] position = Vector2( 410.394, 302.289 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite40" type="SpineSprite" parent="."] position = Vector2( 471.075, 302.292 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite41" type="SpineSprite" parent="."] position = Vector2( 531.757, 302.294 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite42" type="SpineSprite" parent="."] position = Vector2( 596.184, 302.296 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite43" type="SpineSprite" parent="."] position = Vector2( 656.116, 303.047 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite44" type="SpineSprite" parent="."] position = Vector2( 716.048, 304.548 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite45" type="SpineSprite" parent="."] position = Vector2( 775.981, 300.804 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite46" type="SpineSprite" parent="."] position = Vector2( 837.411, 300.807 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite47" type="SpineSprite" parent="."] position = Vector2( 898.842, 303.056 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite48" type="SpineSprite" parent="."] position = Vector2( 960.273, 303.059 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite49" type="SpineSprite" parent="."] position = Vector2( 60.5361, 389.178 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite50" type="SpineSprite" parent="."] position = Vector2( 118.221, 389.18 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite51" type="SpineSprite" parent="."] position = Vector2( 171.411, 389.182 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite52" type="SpineSprite" parent="."] position = Vector2( 223.851, 391.432 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite53" type="SpineSprite" parent="."] position = Vector2( 283.784, 390.685 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite54" type="SpineSprite" parent="."] position = Vector2( 344.465, 388.44 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite55" type="SpineSprite" parent="."] position = Vector2( 410.391, 390.689 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite56" type="SpineSprite" parent="."] position = Vector2( 471.072, 390.692 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite57" type="SpineSprite" parent="."] position = Vector2( 531.753, 390.694 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite58" type="SpineSprite" parent="."] position = Vector2( 596.181, 390.696 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite59" type="SpineSprite" parent="."] position = Vector2( 656.113, 391.448 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite60" type="SpineSprite" parent="."] position = Vector2( 716.045, 392.948 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite61" type="SpineSprite" parent="."] position = Vector2( 775.978, 389.204 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite62" type="SpineSprite" parent="."] position = Vector2( 837.408, 389.207 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite63" type="SpineSprite" parent="."] position = Vector2( 898.839, 391.456 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite64" type="SpineSprite" parent="."] position = Vector2( 960.269, 391.459 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite65" type="SpineSprite" parent="."] position = Vector2( 62.0311, 477.578 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite66" type="SpineSprite" parent="."] position = Vector2( 119.716, 477.581 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite67" type="SpineSprite" parent="."] position = Vector2( 172.906, 477.583 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite68" type="SpineSprite" parent="."] position = Vector2( 225.346, 479.832 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite69" type="SpineSprite" parent="."] position = Vector2( 285.279, 479.085 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite70" type="SpineSprite" parent="."] position = Vector2( 345.96, 476.84 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite71" type="SpineSprite" parent="."] position = Vector2( 411.886, 479.09 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite72" type="SpineSprite" parent="."] position = Vector2( 472.567, 479.092 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite73" type="SpineSprite" parent="."] position = Vector2( 533.248, 479.094 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite74" type="SpineSprite" parent="."] position = Vector2( 597.676, 479.096 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite75" type="SpineSprite" parent="."] position = Vector2( 657.608, 479.848 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite76" type="SpineSprite" parent="."] position = Vector2( 717.54, 481.348 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite77" type="SpineSprite" parent="."] position = Vector2( 777.473, 477.605 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite78" type="SpineSprite" parent="."] position = Vector2( 838.903, 477.607 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite79" type="SpineSprite" parent="."] position = Vector2( 900.334, 479.857 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite80" type="SpineSprite" parent="."] position = Vector2( 961.765, 479.859 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite81" type="SpineSprite" parent="."] position = Vector2( 66.5229, 562.233 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite82" type="SpineSprite" parent="."] position = Vector2( 124.208, 562.235 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite83" type="SpineSprite" parent="."] position = Vector2( 177.398, 562.237 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite84" type="SpineSprite" parent="."] position = Vector2( 229.838, 564.486 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite85" type="SpineSprite" parent="."] position = Vector2( 289.77, 563.74 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite86" type="SpineSprite" parent="."] position = Vector2( 350.452, 561.494 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite87" type="SpineSprite" parent="."] position = Vector2( 416.377, 563.744 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite88" type="SpineSprite" parent="."] position = Vector2( 477.059, 563.746 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite89" type="SpineSprite" parent="."] position = Vector2( 537.74, 563.749 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite90" type="SpineSprite" parent="."] position = Vector2( 602.167, 563.751 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite91" type="SpineSprite" parent="."] position = Vector2( 662.1, 564.502 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite92" type="SpineSprite" parent="."] position = Vector2( 722.032, 566.003 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite93" type="SpineSprite" parent="."] position = Vector2( 781.964, 562.259 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite94" type="SpineSprite" parent="."] position = Vector2( 843.395, 562.261 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite95" type="SpineSprite" parent="."] position = Vector2( 904.826, 564.511 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) [node name="SpineSprite96" type="SpineSprite" parent="."] position = Vector2( 966.256, 564.513 ) scale = Vector2( 0.1, 0.1 ) skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 script = ExtResource( 2 ) diff --git a/spine-godot/example/tests/transforms.tscn b/spine-godot/example/tests/transforms.tscn new file mode 100644 index 000000000..fe70681c9 --- /dev/null +++ b/spine-godot/example/tests/transforms.tscn @@ -0,0 +1,26 @@ +[gd_scene load_steps=3 format=2] + +[ext_resource path="res://assets/spineboy/spineboy-data-res.tres" type="SpineSkeletonDataResource" id=1] +[ext_resource path="res://icon.png" type="Texture" id=2] + +[node name="Node2D" type="Node2D"] + +[node name="SpineSprite" type="SpineSprite" parent="."] +position = Vector2( 483, 490 ) +scale = Vector2( 0.548763, 0.548763 ) +skeleton_data_res = ExtResource( 1 ) +preview_animation = "" +preview_frame = false +preview_time = 0.0 + +[node name="SpineBoneNode" type="SpineBoneNode" parent="SpineSprite"] +position = Vector2( 40.8752, -276.036 ) +rotation = 0.837234 +scale = Vector2( 1, 1 ) +bone_name = "gun" +bone_mode = 1 + +[node name="Sprite" type="Sprite" parent="."] +visible = false +position = Vector2( 505.431, 338.522 ) +texture = ExtResource( 2 ) diff --git a/spine-godot/spine_godot/SpineBone.cpp b/spine-godot/spine_godot/SpineBone.cpp index 26a1cfd9e..f4ad04233 100644 --- a/spine-godot/spine_godot/SpineBone.cpp +++ b/spine-godot/spine_godot/SpineBone.cpp @@ -449,6 +449,8 @@ void SpineBone::set_transform(Transform2D transform) { set_rotation(rotation); set_scale_x(scale.x); set_scale_y(scale.y); + + get_spine_owner()->set_modified_bones(); } Transform2D SpineBone::get_global_transform() { @@ -466,15 +468,28 @@ void SpineBone::set_global_transform(Transform2D transform) { SPINE_CHECK(get_spine_object(),) if (!get_spine_owner()) set_transform(transform); if (!get_spine_owner()->is_visible_in_tree()) return; - transform = get_spine_owner()->get_global_transform().affine_inverse() * transform; - Vector2 position = transform.get_origin(); - position.y *= -1; - float rotation = world_to_local_rotation(Math::rad2deg(transform.get_rotation())); - Vector2 scale = transform.get_scale(); - set_x(position.x); - set_y(position.y); - set_rotation(rotation); - set_scale_x(scale.x); - set_scale_y(scale.y); + auto bone = get_spine_object(); + + Transform2D inverse_sprite_transform = get_spine_owner()->get_global_transform().affine_inverse(); + transform = inverse_sprite_transform * transform; + Vector2 position = transform.get_origin(); + float local_x = position.x, local_y = position.y; + float local_rotation = Math::rad2deg(transform.get_rotation()); + Vector2 local_scale = transform.get_scale(); + spine::Bone *parent = bone->getParent(); + if (parent) { + parent->worldToLocal(local_x, local_y, local_x, local_y); + parent->worldToLocal(position.x + local_scale.x, position.y + local_scale.y, local_scale.x, local_scale.y); + local_scale.x -= local_x; + local_scale.y = -(local_scale.y - local_y); + local_rotation = 180 + bone->worldToLocalRotation(local_rotation); + } + bone->setX(local_x); + bone->setY(local_y); + bone->setRotation(local_rotation); + bone->setScaleX(local_scale.x); + bone->setScaleY(local_scale.y); + + get_spine_owner()->set_modified_bones(); } diff --git a/spine-godot/spine_godot/SpineBoneNode.cpp b/spine-godot/spine_godot/SpineBoneNode.cpp index 91554d61b..701025918 100644 --- a/spine-godot/spine_godot/SpineBoneNode.cpp +++ b/spine-godot/spine_godot/SpineBoneNode.cpp @@ -32,7 +32,6 @@ void SpineBoneNode::_bind_methods() { ClassDB::bind_method(D_METHOD("set_bone_mode"), &SpineBoneNode::set_bone_mode); ClassDB::bind_method(D_METHOD("get_bone_mode"), &SpineBoneNode::get_bone_mode); - ClassDB::bind_method(D_METHOD("_before_world_transforms_change", "spine_sprite"), &SpineBoneNode::before_world_transforms_change); ClassDB::bind_method(D_METHOD("_on_world_transforms_changed", "spine_sprite"), &SpineBoneNode::on_world_transforms_changed); ADD_PROPERTY(PropertyInfo(Variant::INT, "bone_mode", PROPERTY_HINT_ENUM, "Follow,Drive"), "set_bone_mode", "get_bone_mode"); @@ -44,10 +43,8 @@ void SpineBoneNode::_notification(int what) { SpineSprite *sprite = cast_to(get_parent()); if (sprite) { #if VERSION_MAJOR > 3 - sprite->connect("before_world_transforms_change", callable_mp(this, &SpineBoneNode::before_world_transforms_change)); sprite->connect("world_transforms_changed", callable_mp(this, &SpineSlotNode::on_world_transforms_changed)); #else - sprite->connect("before_world_transforms_change", this, "_before_world_transforms_change"); sprite->connect("world_transforms_changed", this, "_on_world_transforms_changed"); #endif update_transform(sprite); @@ -70,10 +67,8 @@ void SpineBoneNode::_notification(int what) { SpineSprite *sprite = cast_to(get_parent()); if (sprite) { #if VERSION_MAJOR > 3 - sprite->disconnect("before_world_transforms_change", callable_mp(this, &SpineBoneNode::before_world_transforms_change)); sprite->disconnect("world_transforms_changed", callable_mp(this, &SpineSlotNode::on_world_transforms_changed)); #else - sprite->disconnect("before_world_transforms_change", this, "_before_world_transforms_change"); sprite->disconnect("world_transforms_changed", this, "_on_world_transforms_changed"); #endif } @@ -114,19 +109,16 @@ bool SpineBoneNode::_get(const StringName& property, Variant& value) const { bool SpineBoneNode::_set(const StringName& property, const Variant& value) { if (property == "bone_name") { bone_name = value; + SpineSprite *sprite = cast_to(get_parent()); + init_transform(sprite); return true; } return false; } -void SpineBoneNode::before_world_transforms_change(const Variant& _sprite) { - SpineSprite* sprite = cast_to(_sprite.operator Object*()); - if (bone_mode == SpineConstant::BoneMode_Drive) update_transform(sprite); -} - void SpineBoneNode::on_world_transforms_changed(const Variant& _sprite) { SpineSprite* sprite = cast_to(_sprite.operator Object*()); - if (bone_mode == SpineConstant::BoneMode_Follow) update_transform(sprite); + update_transform(sprite); } void SpineBoneNode::update_transform(SpineSprite* sprite) { @@ -143,10 +135,29 @@ void SpineBoneNode::update_transform(SpineSprite* sprite) { } } +void SpineBoneNode::init_transform(SpineSprite* sprite) { + if (!sprite) return; + if (bone_mode == SpineConstant::BoneMode_Drive) return; + sprite->get_skeleton()->set_to_setup_pose(); + set_global_transform(sprite->get_global_bone_transform(bone_name)); + update_transform(sprite); +#if VERSION_MAJOR == 3 + _change_notify("transform/translation"); + _change_notify("transform/rotation"); + _change_notify("transform/scale"); + _change_notify("translation"); + _change_notify("rotation"); + _change_notify("rotation_deg"); + _change_notify("scale"); +#endif +} + SpineConstant::BoneMode SpineBoneNode::get_bone_mode() { return bone_mode; } void SpineBoneNode::set_bone_mode(SpineConstant::BoneMode _bone_mode) { bone_mode = _bone_mode; + SpineSprite *sprite = cast_to(get_parent()); + init_transform(sprite); } diff --git a/spine-godot/spine_godot/SpineBoneNode.h b/spine-godot/spine_godot/SpineBoneNode.h index 83fac369c..d669edee2 100644 --- a/spine-godot/spine_godot/SpineBoneNode.h +++ b/spine-godot/spine_godot/SpineBoneNode.h @@ -45,9 +45,9 @@ protected: void _get_property_list(List *list) const; bool _get(const StringName &property, Variant &value) const; bool _set(const StringName &property, const Variant &value); - void before_world_transforms_change(const Variant &_sprite); void on_world_transforms_changed(const Variant &_sprite); void update_transform(SpineSprite *sprite); + void init_transform(SpineSprite *sprite); public: SpineBoneNode(): bone_mode(SpineConstant::BoneMode_Follow) {} diff --git a/spine-godot/spine_godot/SpineSprite.cpp b/spine-godot/spine_godot/SpineSprite.cpp index ff827a253..a47635759 100644 --- a/spine-godot/spine_godot/SpineSprite.cpp +++ b/spine-godot/spine_godot/SpineSprite.cpp @@ -313,6 +313,7 @@ bool SpineSprite::_get(const StringName& property, Variant& value) const { } static void update_preview_animation(SpineSprite *sprite, const String &animation, bool frame, float time) { + sprite->get_skeleton()->set_to_setup_pose(); if (EMPTY(animation) || animation == "-- Empty --") { sprite->get_animation_state()->set_empty_animation(0, 0); return; @@ -365,7 +366,9 @@ void SpineSprite::update_skeleton(float delta) { animation_state->apply(skeleton); emit_signal("before_world_transforms_change", this); skeleton->update_world_transform(); + modified_bones = false; emit_signal("world_transforms_changed", this); + if (modified_bones) skeleton->update_world_transform(); sort_slot_nodes(); update_meshes(skeleton); update(); diff --git a/spine-godot/spine_godot/SpineSprite.h b/spine-godot/spine_godot/SpineSprite.h index 0363fc466..cb2a8983b 100644 --- a/spine-godot/spine_godot/SpineSprite.h +++ b/spine-godot/spine_godot/SpineSprite.h @@ -39,6 +39,8 @@ class SpineSlotNode; class SpineSprite : public Node2D, public spine::AnimationStateListenerObject { GDCLASS(SpineSprite, Node2D) + + friend class SpineBone; protected: Ref skeleton_data_res; @@ -58,6 +60,7 @@ protected: Ref multiply_material; Ref screen_material; spine::SkeletonClipping *skeleton_clipper; + bool modified_bones; static void _bind_methods(); void _notification(int what); @@ -69,6 +72,7 @@ protected: void remove_meshes(); void sort_slot_nodes(); void update_meshes(Ref skeleton_ref); + void set_modified_bones() { modified_bones = true; } void callback(spine::AnimationState *state, spine::EventType type, spine::TrackEntry *entry, spine::Event *event);