Skip to content

Commit 0e14871

Browse files
authored
Merge pull request #1081 from Spartan322/4.4-cherry-pick/animation-bugs
[4.4] Cherry-picks for the 4.4 branch - 1st animation bugs batch
2 parents 766243d + 2044aa7 commit 0e14871

17 files changed

+124
-41
lines changed

doc/classes/SkeletonModifier3D.xml

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,20 @@
1919
[method _process_modification] must not apply [member influence] to bone poses because the [Skeleton3D] automatically applies influence to all bone poses set by the modifier.
2020
</description>
2121
</method>
22+
<method name="_skeleton_changed" qualifiers="virtual">
23+
<return type="void" />
24+
<param index="0" name="old_skeleton" type="Skeleton3D" />
25+
<param index="1" name="new_skeleton" type="Skeleton3D" />
26+
<description>
27+
Called when the skeleton is changed.
28+
</description>
29+
</method>
30+
<method name="_validate_bone_names" qualifiers="virtual">
31+
<return type="void" />
32+
<description>
33+
Called when bone name and index need to be validated such as the timing of the entering tree or changing skeleton.
34+
</description>
35+
</method>
2236
<method name="get_skeleton" qualifiers="const">
2337
<return type="Skeleton3D" />
2438
<description>

editor/animation_track_editor.cpp

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -6454,7 +6454,6 @@ void AnimationTrackEditor::goto_next_step(bool p_from_mouse_event, bool p_timeli
64546454
}
64556455

64566456
void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
6457-
last_menu_track_opt = p_option;
64586457
switch (p_option) {
64596458
case EDIT_COPY_TRACKS: {
64606459
track_copy_select->clear();
@@ -6614,11 +6613,15 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
66146613

66156614
undo_redo->commit_action();
66166615
} break;
6617-
6618-
case EDIT_SCALE_SELECTION:
6616+
case EDIT_SCALE_SELECTION: {
6617+
scale_dialog->popup_centered(Size2(200, 100) * EDSCALE);
6618+
scale->get_line_edit()->grab_focus();
6619+
scale_from_cursor = false;
6620+
} break;
66196621
case EDIT_SCALE_FROM_CURSOR: {
66206622
scale_dialog->popup_centered(Size2(200, 100) * EDSCALE);
66216623
scale->get_line_edit()->grab_focus();
6624+
scale_from_cursor = true;
66226625
} break;
66236626
case EDIT_SCALE_CONFIRM: {
66246627
if (selection.is_empty()) {
@@ -6641,9 +6644,8 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
66416644
}
66426645

66436646
len = to_t - from_t;
6644-
if (last_menu_track_opt == EDIT_SCALE_FROM_CURSOR) {
6647+
if (scale_from_cursor) {
66456648
pivot = timeline->get_play_position();
6646-
66476649
} else {
66486650
pivot = from_t;
66496651
}
@@ -6685,7 +6687,7 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) {
66856687
to_restore.push_back(amr);
66866688
}
66876689

6688-
#define NEW_POS(m_ofs) (((s > 0) ? m_ofs : from_t + (len - (m_ofs - from_t))) - pivot) * ABS(s) + from_t
6690+
#define NEW_POS(m_ofs) (((s > 0) ? m_ofs : from_t + (len - (m_ofs - from_t))) - pivot) * ABS(s) + pivot
66896691
// 3 - Move the keys (re insert them).
66906692
for (RBMap<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) {
66916693
float newpos = NEW_POS(E->get().pos);

editor/animation_track_editor.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -793,7 +793,7 @@ class AnimationTrackEditor : public VBoxContainer {
793793

794794
void _edit_menu_about_to_popup();
795795
void _edit_menu_pressed(int p_option);
796-
int last_menu_track_opt = 0;
796+
bool scale_from_cursor = false;
797797

798798
void _cleanup_animation(Ref<Animation> p_animation);
799799

editor/gui/editor_spin_slider.cpp

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -437,10 +437,8 @@ void EditorSpinSlider::_draw_spin_slider() {
437437
grabber->set_texture(grabber_tex);
438438
}
439439

440-
Vector2 scale = get_global_transform_with_canvas().get_scale();
441-
grabber->set_scale(scale);
442440
grabber->reset_size();
443-
grabber->set_position((grabber_rect.get_center() - grabber->get_size() * 0.5) * scale);
441+
grabber->set_position(grabber_rect.get_center() - grabber->get_size() * 0.5);
444442

445443
if (mousewheel_over_grabber) {
446444
Input::get_singleton()->warp_mouse(grabber->get_position() + grabber_rect.size);

editor/import/3d/post_import_plugin_skeleton_rest_fixer.cpp

Lines changed: 6 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -369,31 +369,15 @@ void PostImportPluginSkeletonRestFixer::internal_process(InternalImportCategory
369369

370370
Vector3 prof_dir = prof_tail - prof_head;
371371
Vector3 src_dir = src_tail - src_head;
372+
if (Math::is_zero_approx(prof_dir.length_squared()) || Math::is_zero_approx(src_dir.length_squared())) {
373+
continue;
374+
}
375+
prof_dir.normalize();
376+
src_dir.normalize();
372377

373378
// Rotate rest.
374379
if (Math::abs(Math::rad_to_deg(src_dir.angle_to(prof_dir))) > float(p_options["retarget/rest_fixer/fix_silhouette/threshold"])) {
375-
// Get rotation difference.
376-
Vector3 up_vec; // Need to rotate other than roll axis.
377-
switch (Vector3(abs(src_dir.x), abs(src_dir.y), abs(src_dir.z)).min_axis_index()) {
378-
case Vector3::AXIS_X: {
379-
up_vec = Vector3(1, 0, 0);
380-
} break;
381-
case Vector3::AXIS_Y: {
382-
up_vec = Vector3(0, 1, 0);
383-
} break;
384-
case Vector3::AXIS_Z: {
385-
up_vec = Vector3(0, 0, 1);
386-
} break;
387-
}
388-
Basis src_b;
389-
src_b = src_b.looking_at(src_dir, up_vec);
390-
Basis prof_b;
391-
prof_b = src_b.looking_at(prof_dir, up_vec);
392-
if (prof_b.is_equal_approx(Basis())) {
393-
continue; // May not need to rotate.
394-
}
395-
Basis diff_b = prof_b * src_b.inverse();
396-
380+
Basis diff_b = Basis(Quaternion(src_dir, prof_dir));
397381
// Apply rotation difference as global transform to skeleton.
398382
Basis src_pg;
399383
int src_parent = src_skeleton->get_bone_parent(src_idx);

editor/import/3d/resource_importer_scene.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1958,6 +1958,7 @@ void ResourceImporterScene::_create_slices(AnimationPlayer *ap, Ref<Animation> a
19581958
}
19591959
}
19601960

1961+
new_anim->set_name(name);
19611962
new_anim->set_loop_mode(loop_mode);
19621963
new_anim->set_length(to - from);
19631964
new_anim->set_step(anim->get_step());

editor/plugins/skeleton_3d_editor_plugin.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,7 @@ void BonePropertiesEditor::_meta_changed(const String &p_property, const Variant
158158
}
159159

160160
String key = p_property.get_slicec('/', 3);
161-
if (!skeleton->has_bone_meta(1, key)) {
161+
if (!skeleton->has_bone_meta(bone, key)) {
162162
return;
163163
}
164164

@@ -182,7 +182,7 @@ void BonePropertiesEditor::_meta_deleted(const String &p_property) {
182182
}
183183

184184
String key = p_property.get_slicec('/', 3);
185-
if (!skeleton->has_bone_meta(1, key)) {
185+
if (!skeleton->has_bone_meta(bone, key)) {
186186
return;
187187
}
188188

scene/3d/look_at_modifier_3d.cpp

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,6 +77,20 @@ PackedStringArray LookAtModifier3D::get_configuration_warnings() const {
7777
return warnings;
7878
}
7979

80+
void LookAtModifier3D::_validate_bone_names() {
81+
// Prior bone name.
82+
if (!bone_name.is_empty()) {
83+
set_bone_name(bone_name);
84+
} else if (bone != -1) {
85+
set_bone(bone);
86+
}
87+
if (!origin_bone_name.is_empty()) {
88+
set_origin_bone_name(origin_bone_name);
89+
} else if (origin_bone != -1) {
90+
set_origin_bone(origin_bone);
91+
}
92+
}
93+
8094
void LookAtModifier3D::set_bone_name(const String &p_bone_name) {
8195
bone_name = p_bone_name;
8296
Skeleton3D *sk = get_skeleton();
@@ -531,7 +545,7 @@ void LookAtModifier3D::_process_modification() {
531545
} else {
532546
origin_tr = bone_rest_space;
533547
}
534-
forward_vector = bone_rest_space.orthonormalized().basis.xform_inv((target->get_global_position() - origin_tr.translated_local(origin_offset).origin));
548+
forward_vector = bone_rest_space.orthonormalized().basis.xform_inv(target->get_global_position() - origin_tr.translated_local(origin_offset).origin);
535549
forward_vector_nrm = forward_vector.normalized();
536550
if (forward_vector_nrm.abs().is_equal_approx(get_vector_from_axis(primary_rotation_axis))) {
537551
destination = skeleton->get_bone_pose_rotation(bone);

scene/3d/look_at_modifier_3d.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ class LookAtModifier3D : public SkeletonModifier3D {
108108
virtual PackedStringArray get_configuration_warnings() const override;
109109
void _validate_property(PropertyInfo &p_property) const;
110110

111+
virtual void _validate_bone_names() override;
112+
111113
static void _bind_methods();
112114

113115
virtual void _process_modification() override;

scene/3d/skeleton_3d.cpp

Lines changed: 6 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1106,6 +1106,12 @@ void Skeleton3D::_force_update_bone_children_transforms(int p_bone_idx) const {
11061106

11071107
// Loop through nested set.
11081108
for (int offset = 0; offset < bone_size; offset++) {
1109+
if (rest_dirty) {
1110+
int current_bone_idx = nested_set_offset_to_bone_index[offset];
1111+
Bone &b = bonesptr[current_bone_idx];
1112+
b.global_rest = b.parent >= 0 ? bonesptr[b.parent].global_rest * b.rest : b.rest; // Rest needs update apert from pose.
1113+
}
1114+
11091115
if (!bone_global_pose_dirty[offset]) {
11101116
continue;
11111117
}
@@ -1130,9 +1136,6 @@ void Skeleton3D::_force_update_bone_children_transforms(int p_bone_idx) const {
11301136
b.global_pose = b.rest;
11311137
}
11321138
}
1133-
if (rest_dirty) {
1134-
b.global_rest = b.parent >= 0 ? bonesptr[b.parent].global_rest * b.rest : b.rest;
1135-
}
11361139

11371140
#ifndef DISABLE_DEPRECATED
11381141
if (bone_enabled) {

0 commit comments

Comments
 (0)