mirror of
https://github.com/EsotericSoftware/spine-runtimes.git
synced 2025-12-21 01:36:02 +08:00
[godot] Fix SpineBone::set_global_transform and examples
This commit is contained in:
parent
47f21e24b0
commit
2a4adc282e
@ -1,3 +1,8 @@
|
|||||||
[gd_resource type="SpineSkeletonDataResource" format=2]
|
[gd_resource type="SpineSkeletonDataResource" load_steps=3 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://assets/raggedyspineboy/Raggedy Spineboy.atlas" type="SpineAtlasResource" id=1]
|
||||||
|
[ext_resource path="res://assets/raggedyspineboy/raggedy spineboy.json" type="SpineSkeletonFileResource" id=2]
|
||||||
|
|
||||||
[resource]
|
[resource]
|
||||||
|
atlas_res = ExtResource( 1 )
|
||||||
|
skeleton_file_res = ExtResource( 2 )
|
||||||
|
|||||||
@ -9,4 +9,7 @@
|
|||||||
position = Vector2( 496.207, 477.185 )
|
position = Vector2( 496.207, 477.185 )
|
||||||
scale = Vector2( 0.466832, 0.466832 )
|
scale = Vector2( 0.466832, 0.466832 )
|
||||||
skeleton_data_res = ExtResource( 3 )
|
skeleton_data_res = ExtResource( 3 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
|||||||
@ -11,6 +11,9 @@ script = ExtResource( 1 )
|
|||||||
position = Vector2( 473, 487 )
|
position = Vector2( 473, 487 )
|
||||||
scale = Vector2( 0.575051, 0.575051 )
|
scale = Vector2( 0.575051, 0.575051 )
|
||||||
skeleton_data_res = ExtResource( 2 )
|
skeleton_data_res = ExtResource( 2 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
|
|
||||||
[node name="FootstepAudio" type="AudioStreamPlayer" parent="."]
|
[node name="FootstepAudio" type="AudioStreamPlayer" parent="."]
|
||||||
stream = ExtResource( 3 )
|
stream = ExtResource( 3 )
|
||||||
|
|||||||
@ -9,4 +9,7 @@
|
|||||||
position = Vector2( 532.982, 480.287 )
|
position = Vector2( 532.982, 480.287 )
|
||||||
scale = Vector2( 0.441932, 0.441932 )
|
scale = Vector2( 0.441932, 0.441932 )
|
||||||
skeleton_data_res = ExtResource( 1 )
|
skeleton_data_res = ExtResource( 1 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
script = ExtResource( 2 )
|
script = ExtResource( 2 )
|
||||||
|
|||||||
@ -9,4 +9,7 @@
|
|||||||
position = Vector2( 501.503, 472.035 )
|
position = Vector2( 501.503, 472.035 )
|
||||||
scale = Vector2( 0.518624, 0.518624 )
|
scale = Vector2( 0.518624, 0.518624 )
|
||||||
skeleton_data_res = ExtResource( 1 )
|
skeleton_data_res = ExtResource( 1 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
script = ExtResource( 2 )
|
script = ExtResource( 2 )
|
||||||
|
|||||||
@ -22,5 +22,4 @@ scale = Vector2( 1, 1 )
|
|||||||
bone_name = "gun-tip"
|
bone_name = "gun-tip"
|
||||||
|
|
||||||
[node name="Sprite" type="Sprite" parent="Spineboy/GunTipBone"]
|
[node name="Sprite" type="Sprite" parent="Spineboy/GunTipBone"]
|
||||||
scale = Vector2( 1, 1 )
|
|
||||||
texture = ExtResource( 3 )
|
texture = ExtResource( 3 )
|
||||||
|
|||||||
@ -12,6 +12,9 @@ script = ExtResource( 1 )
|
|||||||
position = Vector2( 474, 506 )
|
position = Vector2( 474, 506 )
|
||||||
scale = Vector2( 0.560712, 0.560712 )
|
scale = Vector2( 0.560712, 0.560712 )
|
||||||
skeleton_data_res = ExtResource( 2 )
|
skeleton_data_res = ExtResource( 2 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
|
|
||||||
[node name="GunSlot" type="SpineSlotNode" parent="Spineboy"]
|
[node name="GunSlot" type="SpineSlotNode" parent="Spineboy"]
|
||||||
position = Vector2( 40.8753, -276.036 )
|
position = Vector2( 40.8753, -276.036 )
|
||||||
@ -23,6 +26,9 @@ slot_name = "gun"
|
|||||||
position = Vector2( 84.6909, -67.9174 )
|
position = Vector2( 84.6909, -67.9174 )
|
||||||
scale = Vector2( 0.193472, 0.193472 )
|
scale = Vector2( 0.193472, 0.193472 )
|
||||||
skeleton_data_res = ExtResource( 3 )
|
skeleton_data_res = ExtResource( 3 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
|
|
||||||
[node name="EyeSlot" type="SpineSlotNode" parent="Spineboy"]
|
[node name="EyeSlot" type="SpineSlotNode" parent="Spineboy"]
|
||||||
position = Vector2( -23.4598, -402.301 )
|
position = Vector2( -23.4598, -402.301 )
|
||||||
@ -45,3 +51,6 @@ slot_name = "front-fist"
|
|||||||
position = Vector2( -2.64624, -10.8111 )
|
position = Vector2( -2.64624, -10.8111 )
|
||||||
scale = Vector2( 0.193389, 0.193389 )
|
scale = Vector2( 0.193389, 0.193389 )
|
||||||
skeleton_data_res = ExtResource( 2 )
|
skeleton_data_res = ExtResource( 2 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
|
|||||||
@ -1850,6 +1850,9 @@ script = ExtResource( 2 )
|
|||||||
position = Vector2( 72.0001, 520 )
|
position = Vector2( 72.0001, 520 )
|
||||||
scale = Vector2( 0.323942, 0.323942 )
|
scale = Vector2( 0.323942, 0.323942 )
|
||||||
skeleton_data_res = ExtResource( 1 )
|
skeleton_data_res = ExtResource( 1 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
|
|
||||||
[node name="SpineAnimationTrack" type="SpineAnimationTrack" parent="Spineboy"]
|
[node name="SpineAnimationTrack" type="SpineAnimationTrack" parent="Spineboy"]
|
||||||
track_index = 0
|
track_index = 0
|
||||||
@ -1916,6 +1919,9 @@ anims/walk_looped = SubResource( 129 )
|
|||||||
position = Vector2( 1284, 520 )
|
position = Vector2( 1284, 520 )
|
||||||
scale = Vector2( -0.328761, 0.328761 )
|
scale = Vector2( -0.328761, 0.328761 )
|
||||||
skeleton_data_res = ExtResource( 3 )
|
skeleton_data_res = ExtResource( 3 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
|
|
||||||
[node name="SpineAnimationTrack" type="SpineAnimationTrack" parent="Raptor"]
|
[node name="SpineAnimationTrack" type="SpineAnimationTrack" parent="Raptor"]
|
||||||
track_index = 0
|
track_index = 0
|
||||||
|
|||||||
@ -31,9 +31,12 @@ position = Vector2( 501, 507 )
|
|||||||
scale = Vector2( 0.546374, 0.546373 )
|
scale = Vector2( 0.546374, 0.546373 )
|
||||||
skeleton_data_res = ExtResource( 1 )
|
skeleton_data_res = ExtResource( 1 )
|
||||||
normal_material = SubResource( 2 )
|
normal_material = SubResource( 2 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
|
|
||||||
[node name="GunSlot" type="SpineSlotNode" parent="SpineSprite"]
|
[node name="GunSlot" type="SpineSlotNode" parent="SpineSprite"]
|
||||||
position = Vector2( 40.8752, -276.036 )
|
position = Vector2( 40.8753, -276.036 )
|
||||||
rotation = 0.837234
|
rotation = 0.837234
|
||||||
scale = Vector2( 1, 1 )
|
scale = Vector2( 1, 1 )
|
||||||
slot_name = "gun"
|
slot_name = "gun"
|
||||||
|
|||||||
@ -11,6 +11,9 @@ script = ExtResource( 3 )
|
|||||||
position = Vector2( 576, 506 )
|
position = Vector2( 576, 506 )
|
||||||
scale = Vector2( 0.458967, 0.458967 )
|
scale = Vector2( 0.458967, 0.458967 )
|
||||||
skeleton_data_res = ExtResource( 1 )
|
skeleton_data_res = ExtResource( 1 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
|
|
||||||
[node name="Light2D" type="Light2D" parent="."]
|
[node name="Light2D" type="Light2D" parent="."]
|
||||||
position = Vector2( 822, 270 )
|
position = Vector2( 822, 270 )
|
||||||
|
|||||||
@ -5,24 +5,15 @@ onready var center_bone = $SpineSprite/HoverboardCenterBone
|
|||||||
onready var center_ray = $SpineSprite/HoverboardCenterBone/RayCast2D
|
onready var center_ray = $SpineSprite/HoverboardCenterBone/RayCast2D
|
||||||
onready var target_bone = $SpineSprite/HoverboardTargetBone
|
onready var target_bone = $SpineSprite/HoverboardTargetBone
|
||||||
onready var target_ray = $SpineSprite/HoverboardTargetBone/RayCast2D
|
onready var target_ray = $SpineSprite/HoverboardTargetBone/RayCast2D
|
||||||
onready var hip_bone = $SpineSprite/HipBone
|
|
||||||
onready var root_bone = $SpineSprite/RootBone
|
|
||||||
var center_hip_y_distance = 0
|
|
||||||
var center_root_y_distance = 0
|
|
||||||
|
|
||||||
func _ready():
|
func _ready():
|
||||||
center_hip_y_distance = hip_bone.global_position.y - center_bone.global_position.y
|
|
||||||
center_root_y_distance = spineboy.global_position.y - center_bone.global_position.y
|
|
||||||
spineboy.get_animation_state().set_animation("hoverboard", true, 0)
|
spineboy.get_animation_state().set_animation("hoverboard", true, 0)
|
||||||
|
|
||||||
|
|
||||||
func _process(delta):
|
func _process(delta):
|
||||||
if target_ray.is_colliding():
|
if target_ray.is_colliding():
|
||||||
target_bone.global_position.y = target_ray.get_collision_point().y - 50
|
target_bone.global_position.y = target_ray.get_collision_point().y - 50
|
||||||
if center_ray.is_colliding():
|
if center_ray.is_colliding():
|
||||||
center_bone.global_position.y = center_ray.get_collision_point().y - 50
|
center_bone.global_position.y = center_ray.get_collision_point().y - 50
|
||||||
hip_bone.global_position.y = center_bone.global_position.y + center_hip_y_distance
|
|
||||||
|
|
||||||
spineboy.global_position.x += delta * 150;
|
spineboy.global_position.x += delta * 150;
|
||||||
spineboy.global_position.y = center_bone.global_position.y + center_root_y_distance
|
spineboy.global_position.y = center_bone.global_position.y
|
||||||
pass
|
|
||||||
|
|||||||
@ -7,7 +7,7 @@
|
|||||||
script = ExtResource( 1 )
|
script = ExtResource( 1 )
|
||||||
|
|
||||||
[node name="SpineSprite" type="SpineSprite" parent="."]
|
[node name="SpineSprite" type="SpineSprite" parent="."]
|
||||||
position = Vector2( 63, 549 )
|
position = Vector2( 8, 553 )
|
||||||
scale = Vector2( 0.278096, 0.278096 )
|
scale = Vector2( 0.278096, 0.278096 )
|
||||||
skeleton_data_res = ExtResource( 2 )
|
skeleton_data_res = ExtResource( 2 )
|
||||||
preview_animation = "hoverboard"
|
preview_animation = "hoverboard"
|
||||||
@ -15,7 +15,6 @@ preview_frame = true
|
|||||||
preview_time = 0.0
|
preview_time = 0.0
|
||||||
|
|
||||||
[node name="HoverboardCenterBone" type="SpineBoneNode" parent="SpineSprite"]
|
[node name="HoverboardCenterBone" type="SpineBoneNode" parent="SpineSprite"]
|
||||||
position = Vector2( 21.5753, -111.472 )
|
|
||||||
bone_name = "hoverboard-controller"
|
bone_name = "hoverboard-controller"
|
||||||
bone_mode = 1
|
bone_mode = 1
|
||||||
|
|
||||||
@ -24,7 +23,8 @@ enabled = true
|
|||||||
cast_to = Vector2( 0, 1000 )
|
cast_to = Vector2( 0, 1000 )
|
||||||
|
|
||||||
[node name="HoverboardTargetBone" type="SpineBoneNode" parent="SpineSprite"]
|
[node name="HoverboardTargetBone" type="SpineBoneNode" parent="SpineSprite"]
|
||||||
position = Vector2( 265.717, -112.716 )
|
position = Vector2( 262.499, 0 )
|
||||||
|
rotation = -0.000872665
|
||||||
bone_name = "board-ik"
|
bone_name = "board-ik"
|
||||||
bone_mode = 1
|
bone_mode = 1
|
||||||
|
|
||||||
@ -33,7 +33,8 @@ enabled = true
|
|||||||
cast_to = Vector2( 0, 1000 )
|
cast_to = Vector2( 0, 1000 )
|
||||||
|
|
||||||
[node name="HipBone" type="SpineBoneNode" parent="SpineSprite"]
|
[node name="HipBone" type="SpineBoneNode" parent="SpineSprite"]
|
||||||
position = Vector2( -36.9481, -338.198 )
|
position = Vector2( 0, -169.006 )
|
||||||
|
rotation = -0.000872665
|
||||||
bone_name = "hip"
|
bone_name = "hip"
|
||||||
bone_mode = 1
|
bone_mode = 1
|
||||||
|
|
||||||
|
|||||||
20
spine-godot/example/examples/12-ragdoll/ragdoll.tscn
Normal file
20
spine-godot/example/examples/12-ragdoll/ragdoll.tscn
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
[gd_scene load_steps=2 format=2]
|
||||||
|
|
||||||
|
[ext_resource path="res://assets/raggedyspineboy/raggedy spineboy-res.tres" type="SpineSkeletonDataResource" id=1]
|
||||||
|
|
||||||
|
[node name="Node2D" type="Node2D"]
|
||||||
|
|
||||||
|
[node name="SpineSprite" type="SpineSprite" parent="."]
|
||||||
|
position = Vector2( 502, 480 )
|
||||||
|
skeleton_data_res = ExtResource( 1 )
|
||||||
|
preview_animation = "-- Empty --"
|
||||||
|
preview_frame = false
|
||||||
|
preview_time = 0.0
|
||||||
|
|
||||||
|
[node name="Ragdoll" type="Node2D" parent="SpineSprite"]
|
||||||
|
|
||||||
|
[node name="SpineBoneNode" type="SpineBoneNode" parent="SpineSprite/Ragdoll"]
|
||||||
|
position = Vector2( -11.8961, -346.865 )
|
||||||
|
rotation = 3.0463
|
||||||
|
bone_name = "hair2"
|
||||||
|
bone_mode = 1
|
||||||
@ -6,8 +6,6 @@
|
|||||||
[node name="Node2D" type="Node2D"]
|
[node name="Node2D" type="Node2D"]
|
||||||
|
|
||||||
[node name="SpineSprite" type="SpineSprite" parent="."]
|
[node name="SpineSprite" type="SpineSprite" parent="."]
|
||||||
position = Vector2( 483, 490 )
|
|
||||||
scale = Vector2( 0.548763, 0.548763 )
|
|
||||||
skeleton_data_res = ExtResource( 1 )
|
skeleton_data_res = ExtResource( 1 )
|
||||||
preview_animation = ""
|
preview_animation = ""
|
||||||
preview_frame = false
|
preview_frame = false
|
||||||
@ -16,11 +14,8 @@ preview_time = 0.0
|
|||||||
[node name="SpineBoneNode" type="SpineBoneNode" parent="SpineSprite"]
|
[node name="SpineBoneNode" type="SpineBoneNode" parent="SpineSprite"]
|
||||||
position = Vector2( 40.8752, -276.036 )
|
position = Vector2( 40.8752, -276.036 )
|
||||||
rotation = 0.837234
|
rotation = 0.837234
|
||||||
scale = Vector2( 1, 1 )
|
|
||||||
bone_name = "gun"
|
bone_name = "gun"
|
||||||
bone_mode = 1
|
bone_mode = 1
|
||||||
|
|
||||||
[node name="Sprite" type="Sprite" parent="."]
|
[node name="Sprite" type="Sprite" parent="SpineSprite/SpineBoneNode"]
|
||||||
visible = false
|
|
||||||
position = Vector2( 505.431, 338.522 )
|
|
||||||
texture = ExtResource( 2 )
|
texture = ExtResource( 2 )
|
||||||
|
|||||||
@ -431,17 +431,16 @@ void SpineBone::apply_world_transform_2d(const Variant &o) {
|
|||||||
Transform2D SpineBone::get_transform() {
|
Transform2D SpineBone::get_transform() {
|
||||||
SPINE_CHECK(get_spine_object(), Transform2D())
|
SPINE_CHECK(get_spine_object(), Transform2D())
|
||||||
Transform2D transform;
|
Transform2D transform;
|
||||||
transform.rotate(Math::deg2rad(-get_rotation()));
|
transform.rotate(Math::deg2rad(get_rotation()));
|
||||||
transform.scale(Size2(get_scale_x(), get_scale_y()));
|
transform.scale(Size2(get_scale_x(), get_scale_y()));
|
||||||
transform.set_origin(Vector2(get_x(), -get_y()));
|
transform.set_origin(Vector2(get_x(), get_y()));
|
||||||
return transform;
|
return transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpineBone::set_transform(Transform2D transform) {
|
void SpineBone::set_transform(Transform2D transform) {
|
||||||
SPINE_CHECK(get_spine_object(),)
|
SPINE_CHECK(get_spine_object(),)
|
||||||
Vector2 position = transform.get_origin();
|
Vector2 position = transform.get_origin();
|
||||||
position.y *= -1;
|
float rotation = Math::rad2deg(transform.get_rotation());
|
||||||
float rotation = Math::rad2deg(-transform.get_rotation());
|
|
||||||
Vector2 scale = transform.get_scale();
|
Vector2 scale = transform.get_scale();
|
||||||
|
|
||||||
set_x(position.x);
|
set_x(position.x);
|
||||||
@ -474,19 +473,17 @@ void SpineBone::set_global_transform(Transform2D transform) {
|
|||||||
Transform2D inverse_sprite_transform = get_spine_owner()->get_global_transform().affine_inverse();
|
Transform2D inverse_sprite_transform = get_spine_owner()->get_global_transform().affine_inverse();
|
||||||
transform = inverse_sprite_transform * transform;
|
transform = inverse_sprite_transform * transform;
|
||||||
Vector2 position = transform.get_origin();
|
Vector2 position = transform.get_origin();
|
||||||
float local_x = position.x, local_y = position.y;
|
float rotation = Math::rad2deg(transform.get_rotation());
|
||||||
float local_rotation = Math::rad2deg(transform.get_rotation());
|
Vector2 scale = transform.get_scale();
|
||||||
Vector2 local_scale = transform.get_scale();
|
Vector2 local_position = position;
|
||||||
|
float local_rotation = bone->worldToLocalRotation(rotation) - 180;
|
||||||
|
Vector2 local_scale = scale;
|
||||||
spine::Bone *parent = bone->getParent();
|
spine::Bone *parent = bone->getParent();
|
||||||
if (parent) {
|
if (parent) {
|
||||||
parent->worldToLocal(local_x, local_y, local_x, local_y);
|
parent->worldToLocal(local_position.x, local_position.y, local_position.x, local_position.y);
|
||||||
parent->worldToLocal(position.x + local_scale.x, position.y + local_scale.y, local_scale.x, local_scale.y);
|
|
||||||
local_scale.x = (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->setX(local_position.x);
|
||||||
bone->setY(local_y);
|
bone->setY(local_position.y);
|
||||||
bone->setRotation(local_rotation);
|
bone->setRotation(local_rotation);
|
||||||
bone->setScaleX(local_scale.x);
|
bone->setScaleX(local_scale.x);
|
||||||
bone->setScaleY(local_scale.y);
|
bone->setScaleY(local_scale.y);
|
||||||
|
|||||||
@ -29,6 +29,8 @@
|
|||||||
|
|
||||||
#include "SpineBoneNode.h"
|
#include "SpineBoneNode.h"
|
||||||
|
|
||||||
|
#include "core/engine.h"
|
||||||
|
|
||||||
void SpineBoneNode::_bind_methods() {
|
void SpineBoneNode::_bind_methods() {
|
||||||
ClassDB::bind_method(D_METHOD("set_bone_mode"), &SpineBoneNode::set_bone_mode);
|
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("get_bone_mode"), &SpineBoneNode::get_bone_mode);
|
||||||
@ -40,7 +42,7 @@ void SpineBoneNode::_bind_methods() {
|
|||||||
void SpineBoneNode::_notification(int what) {
|
void SpineBoneNode::_notification(int what) {
|
||||||
switch(what) {
|
switch(what) {
|
||||||
case NOTIFICATION_PARENTED: {
|
case NOTIFICATION_PARENTED: {
|
||||||
SpineSprite *sprite = cast_to<SpineSprite>(get_parent());
|
SpineSprite *sprite = find_parent_sprite();
|
||||||
if (sprite) {
|
if (sprite) {
|
||||||
#if VERSION_MAJOR > 3
|
#if VERSION_MAJOR > 3
|
||||||
sprite->connect("world_transforms_changed", callable_mp(this, &SpineSlotNode::on_world_transforms_changed));
|
sprite->connect("world_transforms_changed", callable_mp(this, &SpineSlotNode::on_world_transforms_changed));
|
||||||
@ -64,14 +66,19 @@ void SpineBoneNode::_notification(int what) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case NOTIFICATION_UNPARENTED: {
|
case NOTIFICATION_UNPARENTED: {
|
||||||
SpineSprite *sprite = cast_to<SpineSprite>(get_parent());
|
SpineSprite *sprite = find_parent_sprite();
|
||||||
if (sprite) {
|
if (sprite) {
|
||||||
#if VERSION_MAJOR > 3
|
#if VERSION_MAJOR > 3
|
||||||
sprite->disconnect("world_transforms_changed", callable_mp(this, &SpineSlotNode::on_world_transforms_changed));
|
sprite->disconnect("world_transforms_changed", callable_mp(this, &SpineSlotNode::on_world_transforms_changed));
|
||||||
#else
|
#else
|
||||||
sprite->disconnect("world_transforms_changed", this, "_on_world_transforms_changed");
|
sprite->disconnect("world_transforms_changed", this, "_on_world_transforms_changed");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case NOTIFICATION_DRAW: {
|
||||||
|
draw();
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
@ -80,7 +87,7 @@ void SpineBoneNode::_notification(int what) {
|
|||||||
|
|
||||||
void SpineBoneNode::_get_property_list(List<PropertyInfo>* list) const {
|
void SpineBoneNode::_get_property_list(List<PropertyInfo>* list) const {
|
||||||
Vector<String> bone_names;
|
Vector<String> bone_names;
|
||||||
SpineSprite *sprite = cast_to<SpineSprite>(get_parent());
|
SpineSprite *sprite = find_parent_sprite();
|
||||||
if (sprite) sprite->get_skeleton_data_res()->get_bone_names(bone_names);
|
if (sprite) sprite->get_skeleton_data_res()->get_bone_names(bone_names);
|
||||||
else bone_names.push_back(bone_name);
|
else bone_names.push_back(bone_name);
|
||||||
auto element = list->front();
|
auto element = list->front();
|
||||||
@ -109,7 +116,7 @@ bool SpineBoneNode::_get(const StringName& property, Variant& value) const {
|
|||||||
bool SpineBoneNode::_set(const StringName& property, const Variant& value) {
|
bool SpineBoneNode::_set(const StringName& property, const Variant& value) {
|
||||||
if (property == "bone_name") {
|
if (property == "bone_name") {
|
||||||
bone_name = value;
|
bone_name = value;
|
||||||
SpineSprite *sprite = cast_to<SpineSprite>(get_parent());
|
SpineSprite *sprite = find_parent_sprite();
|
||||||
init_transform(sprite);
|
init_transform(sprite);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
@ -119,19 +126,32 @@ bool SpineBoneNode::_set(const StringName& property, const Variant& value) {
|
|||||||
void SpineBoneNode::on_world_transforms_changed(const Variant& _sprite) {
|
void SpineBoneNode::on_world_transforms_changed(const Variant& _sprite) {
|
||||||
SpineSprite* sprite = cast_to<SpineSprite>(_sprite.operator Object*());
|
SpineSprite* sprite = cast_to<SpineSprite>(_sprite.operator Object*());
|
||||||
update_transform(sprite);
|
update_transform(sprite);
|
||||||
|
update();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SpineBoneNode::update_transform(SpineSprite* sprite) {
|
void SpineBoneNode::update_transform(SpineSprite* sprite) {
|
||||||
if (!is_visible_in_tree()) return;
|
Ref<SpineBone> bone = find_bone();
|
||||||
if (!sprite) return;
|
|
||||||
if (!sprite->get_skeleton().is_valid() || !sprite->get_skeleton()->get_spine_object()) return;
|
|
||||||
auto bone = sprite->get_skeleton()->find_bone(bone_name);
|
|
||||||
if (!bone.is_valid()) return;
|
if (!bone.is_valid()) return;
|
||||||
|
|
||||||
|
Transform2D bone_transform = bone->get_global_transform();
|
||||||
|
Transform2D this_transform = get_global_transform();
|
||||||
|
|
||||||
if (bone_mode == SpineConstant::BoneMode_Drive) {
|
if (bone_mode == SpineConstant::BoneMode_Drive) {
|
||||||
bone->set_global_transform(get_global_transform());
|
bone->set_global_transform(this_transform);
|
||||||
} else {
|
} else {
|
||||||
this->set_global_transform(bone->get_global_transform());
|
set_global_transform(bone_transform);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (Engine::get_singleton()->is_editor_hint()) {
|
||||||
|
#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
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -139,17 +159,38 @@ void SpineBoneNode::init_transform(SpineSprite* sprite) {
|
|||||||
if (!sprite) return;
|
if (!sprite) return;
|
||||||
if (bone_mode == SpineConstant::BoneMode_Drive) return;
|
if (bone_mode == SpineConstant::BoneMode_Drive) return;
|
||||||
sprite->get_skeleton()->set_to_setup_pose();
|
sprite->get_skeleton()->set_to_setup_pose();
|
||||||
set_global_transform(sprite->get_global_bone_transform(bone_name));
|
sprite->get_skeleton()->update_world_transform();
|
||||||
|
Transform2D global_transform = sprite->get_global_bone_transform(bone_name);
|
||||||
|
set_global_transform(global_transform);
|
||||||
update_transform(sprite);
|
update_transform(sprite);
|
||||||
#if VERSION_MAJOR == 3
|
}
|
||||||
_change_notify("transform/translation");
|
|
||||||
_change_notify("transform/rotation");
|
SpineSprite *SpineBoneNode::find_parent_sprite() const {
|
||||||
_change_notify("transform/scale");
|
auto parent = get_parent();
|
||||||
_change_notify("translation");
|
SpineSprite *sprite = nullptr;
|
||||||
_change_notify("rotation");
|
while (parent) {
|
||||||
_change_notify("rotation_deg");
|
sprite = cast_to<SpineSprite>(parent);
|
||||||
_change_notify("scale");
|
if (sprite) break;
|
||||||
#endif
|
parent = parent->get_parent();
|
||||||
|
}
|
||||||
|
return sprite;
|
||||||
|
}
|
||||||
|
|
||||||
|
Ref<SpineBone> SpineBoneNode::find_bone() const {
|
||||||
|
if (!is_visible_in_tree()) return nullptr;
|
||||||
|
SpineSprite *sprite = find_parent_sprite();
|
||||||
|
if (!sprite) return nullptr;
|
||||||
|
if (!sprite->get_skeleton().is_valid() || !sprite->get_skeleton()->get_spine_object()) return nullptr;
|
||||||
|
auto bone = sprite->get_skeleton()->find_bone(bone_name);
|
||||||
|
return bone;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SpineBoneNode::draw() {
|
||||||
|
if (!Engine::get_singleton()->is_editor_hint() && !get_tree()->is_debugging_collisions_hint()) return;
|
||||||
|
Ref<SpineBone> bone = find_bone();
|
||||||
|
if (!bone.is_valid()) return;
|
||||||
|
|
||||||
|
draw_circle(get_global_position(), 10, Color::hex(0xffff0000));
|
||||||
}
|
}
|
||||||
|
|
||||||
SpineConstant::BoneMode SpineBoneNode::get_bone_mode() {
|
SpineConstant::BoneMode SpineBoneNode::get_bone_mode() {
|
||||||
@ -158,6 +199,6 @@ SpineConstant::BoneMode SpineBoneNode::get_bone_mode() {
|
|||||||
|
|
||||||
void SpineBoneNode::set_bone_mode(SpineConstant::BoneMode _bone_mode) {
|
void SpineBoneNode::set_bone_mode(SpineConstant::BoneMode _bone_mode) {
|
||||||
bone_mode = _bone_mode;
|
bone_mode = _bone_mode;
|
||||||
SpineSprite *sprite = cast_to<SpineSprite>(get_parent());
|
SpineSprite *sprite = find_parent_sprite();
|
||||||
init_transform(sprite);
|
init_transform(sprite);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -48,6 +48,9 @@ protected:
|
|||||||
void on_world_transforms_changed(const Variant &_sprite);
|
void on_world_transforms_changed(const Variant &_sprite);
|
||||||
void update_transform(SpineSprite *sprite);
|
void update_transform(SpineSprite *sprite);
|
||||||
void init_transform(SpineSprite *sprite);
|
void init_transform(SpineSprite *sprite);
|
||||||
|
SpineSprite *find_parent_sprite() const;
|
||||||
|
Ref<SpineBone> find_bone() const;
|
||||||
|
void draw();;
|
||||||
|
|
||||||
public:
|
public:
|
||||||
SpineBoneNode(): bone_mode(SpineConstant::BoneMode_Follow) {}
|
SpineBoneNode(): bone_mode(SpineConstant::BoneMode_Follow) {}
|
||||||
|
|||||||
@ -354,5 +354,5 @@ float SpineSkeleton::get_scale_y() {
|
|||||||
|
|
||||||
void SpineSkeleton::set_scale_y(float v) {
|
void SpineSkeleton::set_scale_y(float v) {
|
||||||
SPINE_CHECK(skeleton,)
|
SPINE_CHECK(skeleton,)
|
||||||
skeleton->setScaleY(-v);
|
skeleton->setScaleY(v);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -149,6 +149,7 @@ void SpineSlotNode::on_world_transforms_changed(const Variant& _sprite) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void SpineSlotNode::update_transform(SpineSprite *sprite) {
|
void SpineSlotNode::update_transform(SpineSprite *sprite) {
|
||||||
|
if (!is_visible_in_tree()) return;
|
||||||
if (!sprite) return;
|
if (!sprite) return;
|
||||||
if (!sprite->get_skeleton().is_valid() || !sprite->get_skeleton()->get_spine_object()) return;
|
if (!sprite->get_skeleton().is_valid() || !sprite->get_skeleton()->get_spine_object()) return;
|
||||||
auto slot = sprite->get_skeleton()->find_slot(slot_name);
|
auto slot = sprite->get_skeleton()->find_slot(slot_name);
|
||||||
@ -160,7 +161,6 @@ void SpineSlotNode::update_transform(SpineSprite *sprite) {
|
|||||||
}
|
}
|
||||||
auto bone = slot->get_bone();
|
auto bone = slot->get_bone();
|
||||||
if (!bone.is_valid()) return;
|
if (!bone.is_valid()) return;
|
||||||
if (!is_visible_in_tree()) return;
|
|
||||||
this->set_global_transform(bone->get_global_transform());
|
this->set_global_transform(bone->get_global_transform());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -90,7 +90,7 @@ void SpineSprite::_bind_methods() {
|
|||||||
ADD_GROUP("Preview", "");
|
ADD_GROUP("Preview", "");
|
||||||
}
|
}
|
||||||
|
|
||||||
SpineSprite::SpineSprite() : update_mode(SpineConstant::UpdateMode_Process), skeleton_clipper(nullptr), preview_frame(false), preview_time(0), modified_bones(false) {
|
SpineSprite::SpineSprite() : update_mode(SpineConstant::UpdateMode_Process), preview_animation("-- Empty --"), preview_frame(false), preview_time(0), skeleton_clipper(nullptr), modified_bones(false) {
|
||||||
skeleton_clipper = new spine::SkeletonClipping();
|
skeleton_clipper = new spine::SkeletonClipping();
|
||||||
|
|
||||||
// One material per blend mode, shared across all sprites.
|
// One material per blend mode, shared across all sprites.
|
||||||
@ -162,7 +162,6 @@ void SpineSprite::on_skeleton_data_changed() {
|
|||||||
if (skeleton_data_res.is_valid() && skeleton_data_res->is_skeleton_data_loaded()) {
|
if (skeleton_data_res.is_valid() && skeleton_data_res->is_skeleton_data_loaded()) {
|
||||||
skeleton = Ref<SpineSkeleton>(memnew(SpineSkeleton));
|
skeleton = Ref<SpineSkeleton>(memnew(SpineSkeleton));
|
||||||
skeleton->set_spine_sprite(this);
|
skeleton->set_spine_sprite(this);
|
||||||
skeleton->get_spine_object()->setScaleY(-1);
|
|
||||||
|
|
||||||
animation_state = Ref<SpineAnimationState>(memnew(SpineAnimationState));
|
animation_state = Ref<SpineAnimationState>(memnew(SpineAnimationState));
|
||||||
animation_state->set_spine_sprite(this);
|
animation_state->set_spine_sprite(this);
|
||||||
|
|||||||
@ -72,6 +72,8 @@ void register_spine_godot_types() {
|
|||||||
EditorNode::add_init_callback(editor_init_callback);
|
EditorNode::add_init_callback(editor_init_callback);
|
||||||
ClassDB::register_class<SpineEditorPropertyAnimationMixes>();
|
ClassDB::register_class<SpineEditorPropertyAnimationMixes>();
|
||||||
#endif
|
#endif
|
||||||
|
spine::Bone::setYDown(true);
|
||||||
|
|
||||||
ClassDB::register_class<SpineAtlasResource>();
|
ClassDB::register_class<SpineAtlasResource>();
|
||||||
ClassDB::register_class<SpineSkeletonFileResource>();
|
ClassDB::register_class<SpineSkeletonFileResource>();
|
||||||
ClassDB::register_class<SpineSkeletonDataResource>();
|
ClassDB::register_class<SpineSkeletonDataResource>();
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user