Browse Source

[godot] Fix update order of SpineBoneNode.

badlogic 3 years ago
parent
commit
b9b123ff48

+ 2 - 2
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")

+ 4 - 1
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

+ 1 - 3
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
 

+ 288 - 0
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 )

+ 26 - 0
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 )

+ 24 - 9
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;
+
+	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();
-	position.y *= -1;
-	float rotation = world_to_local_rotation(Math::rad2deg(transform.get_rotation()));
-	Vector2 scale = transform.get_scale();
+	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);
 
-	set_x(position.x);
-	set_y(position.y);
-	set_rotation(rotation);
-	set_scale_x(scale.x);
-	set_scale_y(scale.y);
+	get_spine_owner()->set_modified_bones();
 }

+ 22 - 11
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<SpineSprite>(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<SpineSprite>(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<SpineSprite>(get_parent());
+		init_transform(sprite);
 		return true;
 	}
 	return false;
 }
 
-void SpineBoneNode::before_world_transforms_change(const Variant& _sprite) {
-	SpineSprite* sprite = cast_to<SpineSprite>(_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<SpineSprite>(_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<SpineSprite>(get_parent());
+	init_transform(sprite);
 }

+ 1 - 1
spine-godot/spine_godot/SpineBoneNode.h

@@ -45,9 +45,9 @@ protected:
 	void _get_property_list(List<PropertyInfo> *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) {}

+ 3 - 0
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();

+ 4 - 0
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<SpineSkeletonDataResource> skeleton_data_res;
@@ -58,6 +60,7 @@ protected:
 	Ref<Material> multiply_material;
 	Ref<Material> 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<SpineSkeleton> skeleton_ref);
+	void set_modified_bones() { modified_bones = true; }
 
 	void callback(spine::AnimationState *state, spine::EventType type, spine::TrackEntry *entry, spine::Event *event);