[godot] Fix SpineBone transform methods.

This commit is contained in:
badlogic 2022-04-22 10:31:28 +02:00
parent b4d6bbaf5a
commit 8cabfa370f
3 changed files with 35 additions and 53 deletions

View File

@ -93,10 +93,10 @@ void SpineBone::_bind_methods() {
ClassDB::bind_method(D_METHOD("is_active"), &SpineBone::is_active); ClassDB::bind_method(D_METHOD("is_active"), &SpineBone::is_active);
ClassDB::bind_method(D_METHOD("set_active", "v"), &SpineBone::set_active); ClassDB::bind_method(D_METHOD("set_active", "v"), &SpineBone::set_active);
ClassDB::bind_method(D_METHOD("apply_world_transform_2d", "node2d"), &SpineBone::apply_world_transform_2d); ClassDB::bind_method(D_METHOD("apply_world_transform_2d", "node2d"), &SpineBone::apply_world_transform_2d);
ClassDB::bind_method(D_METHOD("get_godot_transform"), &SpineBone::get_godot_transform); ClassDB::bind_method(D_METHOD("get_transform"), &SpineBone::get_transform);
ClassDB::bind_method(D_METHOD("set_godot_transform", "local_transform"), &SpineBone::set_godot_transform); ClassDB::bind_method(D_METHOD("set_transform", "local_transform"), &SpineBone::set_transform);
ClassDB::bind_method(D_METHOD("get_godot_global_transform"), &SpineBone::get_godot_global_transform); ClassDB::bind_method(D_METHOD("get_global_transform"), &SpineBone::get_global_transform);
ClassDB::bind_method(D_METHOD("set_godot_global_transform", "global_transform"), &SpineBone::set_godot_global_transform); ClassDB::bind_method(D_METHOD("set_global_transform", "global_transform"), &SpineBone::set_global_transform);
} }
SpineBone::SpineBone() : bone(nullptr), sprite(nullptr) {} SpineBone::SpineBone() : bone(nullptr), sprite(nullptr) {}
@ -446,69 +446,51 @@ void SpineBone::apply_world_transform_2d(const Variant &o) {
} }
} }
Transform2D SpineBone::get_godot_transform() { Transform2D SpineBone::get_transform() {
SPINE_CHECK(bone, Transform2D()) SPINE_CHECK(bone, Transform2D())
Transform2D trans; Transform2D transform;
trans.translate(get_x(), -get_y()); transform.rotate(Math::deg2rad(-get_rotation()));
trans.rotate(Math::deg2rad(-get_rotation())); transform.scale(Size2(get_scale_x(), get_scale_y()));
trans.scale(Size2(get_scale_x(), get_scale_y())); transform.set_origin(Vector2(get_x(), -get_y()));
return trans; return transform;
} }
void SpineBone::set_godot_transform(Transform2D trans) { void SpineBone::set_transform(Transform2D transform) {
SPINE_CHECK(bone,) SPINE_CHECK(bone,)
Vector2 position = trans.get_origin(); Vector2 position = transform.get_origin();
position.y *= -1; position.y *= -1;
real_t rotation = trans.get_rotation(); float rotation = Math::rad2deg(-transform.get_rotation());
rotation = Math::rad2deg(-rotation); Vector2 scale = transform.get_scale();
Vector2 scale_x_y = trans.get_scale();
set_x(position.x); set_x(position.x);
set_y(position.y); set_y(position.y);
set_rotation(rotation); set_rotation(rotation);
set_scale_x(scale_x_y.x); set_scale_x(scale.x);
set_scale_y(scale_x_y.y); set_scale_y(scale.y);
} }
Transform2D SpineBone::get_godot_global_transform() { Transform2D SpineBone::get_global_transform() {
SPINE_CHECK(bone, Transform2D()) SPINE_CHECK(bone, Transform2D())
if (!sprite) return get_godot_transform(); if (!sprite) return get_transform();
Transform2D result = sprite->get_transform(); Transform2D local;
result.translate(get_world_x(), -get_world_y()); local.rotate(Math::deg2rad(-get_world_rotation_x()));
result.rotate(Math::deg2rad(-get_world_rotation_x())); local.scale(Vector2(get_world_scale_x(), get_world_scale_y()));
result.scale(Vector2(get_world_scale_x(), get_world_scale_y())); local.set_origin(Vector2(get_world_x(), -get_world_y()));
auto parent = sprite->get_parent() ? Object::cast_to<CanvasItem>(sprite->get_parent()) : nullptr; return sprite->get_global_transform() * local;
if (parent) {
return parent->get_global_transform() * result;
}
return result;
} }
void SpineBone::set_godot_global_transform(Transform2D transform) { void SpineBone::set_global_transform(Transform2D transform) {
SPINE_CHECK(bone,) SPINE_CHECK(bone,)
if (!sprite) set_godot_transform(transform); if (!sprite) set_transform(transform);
transform = sprite->get_global_transform().affine_inverse() * transform; transform = sprite->get_global_transform().affine_inverse() * transform;
Vector2 position = transform.get_origin(); Vector2 position = transform.get_origin();
real_t rotation = transform.get_rotation();
Vector2 scale_x_y = transform.get_scale();
position.y *= -1; position.y *= -1;
auto parent = get_parent(); float rotation = world_to_local_rotation(Math::rad2deg(-transform.get_rotation()));
if (parent.is_valid()) { Vector2 scale = transform.get_scale();
position = parent->world_to_local(position);
if (parent->get_world_scale_x() != 0)
scale_x_y.x /= parent->get_world_scale_x();
else
ERR_PRINT("The parent scale.x is zero.");
if (parent->get_world_scale_y() != 0)
scale_x_y.y /= parent->get_world_scale_y();
else
ERR_PRINT("The parent scale.y is zero.");
}
rotation = world_to_local_rotation(Math::rad2deg(-rotation));
set_x(position.x); set_x(position.x);
set_y(position.y); set_y(position.y);
set_rotation(rotation); set_rotation(rotation);
set_scale_x(scale_x_y.x); set_scale_x(scale.x);
set_scale_y(scale_x_y.y); set_scale_y(scale.y);
} }

View File

@ -178,13 +178,13 @@ public:
// External feature functions // External feature functions
void apply_world_transform_2d(const Variant &o); void apply_world_transform_2d(const Variant &o);
Transform2D get_godot_transform(); Transform2D get_transform();
void set_godot_transform(Transform2D trans); void set_transform(Transform2D transform);
Transform2D get_godot_global_transform(); Transform2D get_global_transform();
void set_godot_global_transform(Transform2D trans); void set_global_transform(Transform2D trans);
}; };
#endif//GODOT_SPINEBONE_H #endif//GODOT_SPINEBONE_H

View File

@ -551,7 +551,7 @@ Transform2D SpineSprite::get_global_bone_transform(const String &bone_name) {
print_error(vformat("Bone: '%s' not found.", bone_name)); print_error(vformat("Bone: '%s' not found.", bone_name));
return get_global_transform(); return get_global_transform();
} }
return bone->get_godot_global_transform(); return bone->get_global_transform();
} }
void SpineSprite::set_global_bone_transform(const String &bone_name, Transform2D transform) { void SpineSprite::set_global_bone_transform(const String &bone_name, Transform2D transform) {
@ -562,7 +562,7 @@ void SpineSprite::set_global_bone_transform(const String &bone_name, Transform2D
if (!bone.is_valid()) { if (!bone.is_valid()) {
return; return;
} }
bone->set_godot_global_transform(transform); bone->set_global_transform(transform);
} }
SpineSprite::UpdateMode SpineSprite::get_update_mode() { SpineSprite::UpdateMode SpineSprite::get_update_mode() {