Make Cubic to CubicInTime and reduce items in the track intrp type
This commit is contained in:
parent
a8476c04f4
commit
d96cc7450a
6 changed files with 4 additions and 116 deletions
|
@ -600,9 +600,6 @@
|
||||||
<constant name="INTERPOLATION_CUBIC" value="2" enum="InterpolationType">
|
<constant name="INTERPOLATION_CUBIC" value="2" enum="InterpolationType">
|
||||||
Cubic interpolation.
|
Cubic interpolation.
|
||||||
</constant>
|
</constant>
|
||||||
<constant name="INTERPOLATION_CUBIC_IN_TIME" value="3" enum="InterpolationType">
|
|
||||||
Cubic interpolation with uniformed time.
|
|
||||||
</constant>
|
|
||||||
<constant name="UPDATE_CONTINUOUS" value="0" enum="UpdateMode">
|
<constant name="UPDATE_CONTINUOUS" value="0" enum="UpdateMode">
|
||||||
Update between keyframes.
|
Update between keyframes.
|
||||||
</constant>
|
</constant>
|
||||||
|
|
|
@ -2122,11 +2122,10 @@ void AnimationTrackEdit::_notification(int p_what) {
|
||||||
get_theme_icon(SNAME("InterpWrapClamp"), SNAME("EditorIcons")),
|
get_theme_icon(SNAME("InterpWrapClamp"), SNAME("EditorIcons")),
|
||||||
get_theme_icon(SNAME("InterpWrapLoop"), SNAME("EditorIcons")),
|
get_theme_icon(SNAME("InterpWrapLoop"), SNAME("EditorIcons")),
|
||||||
};
|
};
|
||||||
Ref<Texture2D> interp_icon[4] = {
|
Ref<Texture2D> interp_icon[3] = {
|
||||||
get_theme_icon(SNAME("InterpRaw"), SNAME("EditorIcons")),
|
get_theme_icon(SNAME("InterpRaw"), SNAME("EditorIcons")),
|
||||||
get_theme_icon(SNAME("InterpLinear"), SNAME("EditorIcons")),
|
get_theme_icon(SNAME("InterpLinear"), SNAME("EditorIcons")),
|
||||||
get_theme_icon(SNAME("InterpCubic"), SNAME("EditorIcons")),
|
get_theme_icon(SNAME("InterpCubic"), SNAME("EditorIcons")),
|
||||||
get_theme_icon(SNAME("InterpCubicInTime"), SNAME("EditorIcons"))
|
|
||||||
};
|
};
|
||||||
Ref<Texture2D> cont_icon[4] = {
|
Ref<Texture2D> cont_icon[4] = {
|
||||||
get_theme_icon(SNAME("TrackContinuous"), SNAME("EditorIcons")),
|
get_theme_icon(SNAME("TrackContinuous"), SNAME("EditorIcons")),
|
||||||
|
@ -2849,7 +2848,6 @@ void AnimationTrackEdit::gui_input(const Ref<InputEvent> &p_event) {
|
||||||
menu->add_icon_item(get_theme_icon(SNAME("InterpRaw"), SNAME("EditorIcons")), TTR("Nearest"), MENU_INTERPOLATION_NEAREST);
|
menu->add_icon_item(get_theme_icon(SNAME("InterpRaw"), SNAME("EditorIcons")), TTR("Nearest"), MENU_INTERPOLATION_NEAREST);
|
||||||
menu->add_icon_item(get_theme_icon(SNAME("InterpLinear"), SNAME("EditorIcons")), TTR("Linear"), MENU_INTERPOLATION_LINEAR);
|
menu->add_icon_item(get_theme_icon(SNAME("InterpLinear"), SNAME("EditorIcons")), TTR("Linear"), MENU_INTERPOLATION_LINEAR);
|
||||||
menu->add_icon_item(get_theme_icon(SNAME("InterpCubic"), SNAME("EditorIcons")), TTR("Cubic"), MENU_INTERPOLATION_CUBIC);
|
menu->add_icon_item(get_theme_icon(SNAME("InterpCubic"), SNAME("EditorIcons")), TTR("Cubic"), MENU_INTERPOLATION_CUBIC);
|
||||||
menu->add_icon_item(get_theme_icon(SNAME("InterpCubicInTime"), SNAME("EditorIcons")), TTR("CubicInTime"), MENU_INTERPOLATION_CUBIC_IN_TIME);
|
|
||||||
menu->reset_size();
|
menu->reset_size();
|
||||||
|
|
||||||
Vector2 popup_pos = get_screen_position() + interp_mode_rect.position + Vector2(0, interp_mode_rect.size.height);
|
Vector2 popup_pos = get_screen_position() + interp_mode_rect.position + Vector2(0, interp_mode_rect.size.height);
|
||||||
|
@ -3190,8 +3188,7 @@ void AnimationTrackEdit::_menu_selected(int p_index) {
|
||||||
} break;
|
} break;
|
||||||
case MENU_INTERPOLATION_NEAREST:
|
case MENU_INTERPOLATION_NEAREST:
|
||||||
case MENU_INTERPOLATION_LINEAR:
|
case MENU_INTERPOLATION_LINEAR:
|
||||||
case MENU_INTERPOLATION_CUBIC:
|
case MENU_INTERPOLATION_CUBIC: {
|
||||||
case MENU_INTERPOLATION_CUBIC_IN_TIME: {
|
|
||||||
Animation::InterpolationType interp_mode = Animation::InterpolationType(p_index - MENU_INTERPOLATION_NEAREST);
|
Animation::InterpolationType interp_mode = Animation::InterpolationType(p_index - MENU_INTERPOLATION_NEAREST);
|
||||||
undo_redo->create_action(TTR("Change Animation Interpolation Mode"));
|
undo_redo->create_action(TTR("Change Animation Interpolation Mode"));
|
||||||
undo_redo->add_do_method(animation.ptr(), "track_set_interpolation_type", track, interp_mode);
|
undo_redo->add_do_method(animation.ptr(), "track_set_interpolation_type", track, interp_mode);
|
||||||
|
|
|
@ -144,7 +144,6 @@ class AnimationTrackEdit : public Control {
|
||||||
MENU_INTERPOLATION_NEAREST,
|
MENU_INTERPOLATION_NEAREST,
|
||||||
MENU_INTERPOLATION_LINEAR,
|
MENU_INTERPOLATION_LINEAR,
|
||||||
MENU_INTERPOLATION_CUBIC,
|
MENU_INTERPOLATION_CUBIC,
|
||||||
MENU_INTERPOLATION_CUBIC_IN_TIME,
|
|
||||||
MENU_LOOP_WRAP,
|
MENU_LOOP_WRAP,
|
||||||
MENU_LOOP_CLAMP,
|
MENU_LOOP_CLAMP,
|
||||||
MENU_KEY_INSERT,
|
MENU_KEY_INSERT,
|
||||||
|
@ -501,7 +500,7 @@ class AnimationTrackEditor : public VBoxContainer {
|
||||||
NodePath full_path;
|
NodePath full_path;
|
||||||
NodePath base_path;
|
NodePath base_path;
|
||||||
Animation::TrackType track_type = Animation::TYPE_ANIMATION;
|
Animation::TrackType track_type = Animation::TYPE_ANIMATION;
|
||||||
Animation::InterpolationType interp_type = Animation::INTERPOLATION_CUBIC_IN_TIME;
|
Animation::InterpolationType interp_type = Animation::INTERPOLATION_CUBIC;
|
||||||
Animation::UpdateMode update_mode = Animation::UPDATE_CAPTURE;
|
Animation::UpdateMode update_mode = Animation::UPDATE_CAPTURE;
|
||||||
Animation::LoopMode loop_mode = Animation::LOOP_PINGPONG;
|
Animation::LoopMode loop_mode = Animation::LOOP_PINGPONG;
|
||||||
bool loop_wrap = false;
|
bool loop_wrap = false;
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
<svg enable-background="new -595.5 420.5 16 8" height="8" viewBox="-595.5 420.5 16 8" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m-593.5 426.5c1-4 3.5-5.5 6-2s5 2 6-2" fill="none" stroke="#ff92cb" stroke-linecap="round" stroke-width="2"/></svg>
|
|
Before Width: | Height: | Size: 257 B |
|
@ -2328,96 +2328,6 @@ real_t Animation::_interpolate(const real_t &p_a, const real_t &p_b, real_t p_c)
|
||||||
|
|
||||||
// Cubic interpolation for anytype.
|
// Cubic interpolation for anytype.
|
||||||
|
|
||||||
Vector3 Animation::_cubic_interpolate(const Vector3 &p_pre_a, const Vector3 &p_a, const Vector3 &p_b, const Vector3 &p_post_b, real_t p_c) const {
|
|
||||||
return p_a.cubic_interpolate(p_b, p_pre_a, p_post_b, p_c);
|
|
||||||
}
|
|
||||||
|
|
||||||
Quaternion Animation::_cubic_interpolate(const Quaternion &p_pre_a, const Quaternion &p_a, const Quaternion &p_b, const Quaternion &p_post_b, real_t p_c) const {
|
|
||||||
return p_a.spherical_cubic_interpolate(p_b, p_pre_a, p_post_b, p_c);
|
|
||||||
}
|
|
||||||
|
|
||||||
Variant Animation::_cubic_interpolate(const Variant &p_pre_a, const Variant &p_a, const Variant &p_b, const Variant &p_post_b, real_t p_c) const {
|
|
||||||
Variant::Type type_a = p_a.get_type();
|
|
||||||
Variant::Type type_b = p_b.get_type();
|
|
||||||
Variant::Type type_pa = p_pre_a.get_type();
|
|
||||||
Variant::Type type_pb = p_post_b.get_type();
|
|
||||||
|
|
||||||
//make int and real play along
|
|
||||||
|
|
||||||
uint32_t vformat = 1 << type_a;
|
|
||||||
vformat |= 1 << type_b;
|
|
||||||
vformat |= 1 << type_pa;
|
|
||||||
vformat |= 1 << type_pb;
|
|
||||||
|
|
||||||
if (vformat == ((1 << Variant::INT) | (1 << Variant::FLOAT)) || vformat == (1 << Variant::FLOAT)) {
|
|
||||||
//mix of real and int
|
|
||||||
real_t a = p_a;
|
|
||||||
real_t b = p_b;
|
|
||||||
real_t pa = p_pre_a;
|
|
||||||
real_t pb = p_post_b;
|
|
||||||
|
|
||||||
return Math::cubic_interpolate(a, b, pa, pb, p_c);
|
|
||||||
} else if ((vformat & (vformat - 1))) {
|
|
||||||
return p_a; //can't interpolate, mix of types
|
|
||||||
}
|
|
||||||
|
|
||||||
switch (type_a) {
|
|
||||||
case Variant::VECTOR2: {
|
|
||||||
Vector2 a = p_a;
|
|
||||||
Vector2 b = p_b;
|
|
||||||
Vector2 pa = p_pre_a;
|
|
||||||
Vector2 pb = p_post_b;
|
|
||||||
|
|
||||||
return a.cubic_interpolate(b, pa, pb, p_c);
|
|
||||||
}
|
|
||||||
case Variant::RECT2: {
|
|
||||||
Rect2 a = p_a;
|
|
||||||
Rect2 b = p_b;
|
|
||||||
Rect2 pa = p_pre_a;
|
|
||||||
Rect2 pb = p_post_b;
|
|
||||||
|
|
||||||
return Rect2(
|
|
||||||
a.position.cubic_interpolate(b.position, pa.position, pb.position, p_c),
|
|
||||||
a.size.cubic_interpolate(b.size, pa.size, pb.size, p_c));
|
|
||||||
}
|
|
||||||
case Variant::VECTOR3: {
|
|
||||||
Vector3 a = p_a;
|
|
||||||
Vector3 b = p_b;
|
|
||||||
Vector3 pa = p_pre_a;
|
|
||||||
Vector3 pb = p_post_b;
|
|
||||||
|
|
||||||
return a.cubic_interpolate(b, pa, pb, p_c);
|
|
||||||
}
|
|
||||||
case Variant::QUATERNION: {
|
|
||||||
Quaternion a = p_a;
|
|
||||||
Quaternion b = p_b;
|
|
||||||
Quaternion pa = p_pre_a;
|
|
||||||
Quaternion pb = p_post_b;
|
|
||||||
|
|
||||||
return a.spherical_cubic_interpolate(b, pa, pb, p_c);
|
|
||||||
}
|
|
||||||
case Variant::AABB: {
|
|
||||||
AABB a = p_a;
|
|
||||||
AABB b = p_b;
|
|
||||||
AABB pa = p_pre_a;
|
|
||||||
AABB pb = p_post_b;
|
|
||||||
|
|
||||||
return AABB(
|
|
||||||
a.position.cubic_interpolate(b.position, pa.position, pb.position, p_c),
|
|
||||||
a.size.cubic_interpolate(b.size, pa.size, pb.size, p_c));
|
|
||||||
}
|
|
||||||
default: {
|
|
||||||
return _interpolate(p_a, p_b, p_c);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
real_t Animation::_cubic_interpolate(const real_t &p_pre_a, const real_t &p_a, const real_t &p_b, const real_t &p_post_b, real_t p_c) const {
|
|
||||||
return _interpolate(p_a, p_b, p_c);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Cubic interpolation in time for anytype.
|
|
||||||
|
|
||||||
Vector3 Animation::_cubic_interpolate_in_time(const Vector3 &p_pre_a, const Vector3 &p_a, const Vector3 &p_b, const Vector3 &p_post_b, real_t p_c, real_t p_pre_a_t, real_t p_b_t, real_t p_post_b_t) const {
|
Vector3 Animation::_cubic_interpolate_in_time(const Vector3 &p_pre_a, const Vector3 &p_a, const Vector3 &p_b, const Vector3 &p_post_b, real_t p_c, real_t p_pre_a_t, real_t p_b_t, real_t p_post_b_t) const {
|
||||||
return p_a.cubic_interpolate_in_time(p_b, p_pre_a, p_post_b, p_c, p_b_t, p_pre_a_t, p_post_b_t);
|
return p_a.cubic_interpolate_in_time(p_b, p_pre_a, p_post_b, p_c, p_b_t, p_pre_a_t, p_post_b_t);
|
||||||
}
|
}
|
||||||
|
@ -2685,8 +2595,7 @@ T Animation::_interpolate(const Vector<TKey<T>> &p_keys, double p_time, Interpol
|
||||||
case INTERPOLATION_LINEAR: {
|
case INTERPOLATION_LINEAR: {
|
||||||
return _interpolate(p_keys[idx].value, p_keys[next].value, c);
|
return _interpolate(p_keys[idx].value, p_keys[next].value, c);
|
||||||
} break;
|
} break;
|
||||||
case INTERPOLATION_CUBIC:
|
case INTERPOLATION_CUBIC: {
|
||||||
case INTERPOLATION_CUBIC_IN_TIME: {
|
|
||||||
int pre = 0;
|
int pre = 0;
|
||||||
int post = 0;
|
int post = 0;
|
||||||
if (!p_backward) {
|
if (!p_backward) {
|
||||||
|
@ -2726,9 +2635,6 @@ T Animation::_interpolate(const Vector<TKey<T>> &p_keys, double p_time, Interpol
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loop_mode == LOOP_LINEAR && p_loop_wrap) {
|
if (loop_mode == LOOP_LINEAR && p_loop_wrap) {
|
||||||
if (p_interp == INTERPOLATION_CUBIC) {
|
|
||||||
return _cubic_interpolate(p_keys[pre].value, p_keys[idx].value, p_keys[next].value, p_keys[post].value, c);
|
|
||||||
}
|
|
||||||
return _cubic_interpolate_in_time(
|
return _cubic_interpolate_in_time(
|
||||||
p_keys[pre].value, p_keys[idx].value, p_keys[next].value, p_keys[post].value, c,
|
p_keys[pre].value, p_keys[idx].value, p_keys[next].value, p_keys[post].value, c,
|
||||||
pre > idx ? -length + p_keys[pre].time - p_keys[idx].time : p_keys[pre].time - p_keys[idx].time,
|
pre > idx ? -length + p_keys[pre].time - p_keys[idx].time : p_keys[pre].time - p_keys[idx].time,
|
||||||
|
@ -2736,9 +2642,6 @@ T Animation::_interpolate(const Vector<TKey<T>> &p_keys, double p_time, Interpol
|
||||||
next < idx || post <= idx ? length + p_keys[post].time - p_keys[idx].time : p_keys[post].time - p_keys[idx].time);
|
next < idx || post <= idx ? length + p_keys[post].time - p_keys[idx].time : p_keys[post].time - p_keys[idx].time);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (p_interp == INTERPOLATION_CUBIC) {
|
|
||||||
return _cubic_interpolate(p_keys[pre].value, p_keys[idx].value, p_keys[next].value, p_keys[post].value, c);
|
|
||||||
}
|
|
||||||
return _cubic_interpolate_in_time(
|
return _cubic_interpolate_in_time(
|
||||||
p_keys[pre].value, p_keys[idx].value, p_keys[next].value, p_keys[post].value, c,
|
p_keys[pre].value, p_keys[idx].value, p_keys[next].value, p_keys[post].value, c,
|
||||||
p_keys[pre].time - p_keys[idx].time,
|
p_keys[pre].time - p_keys[idx].time,
|
||||||
|
@ -4073,7 +3976,6 @@ void Animation::_bind_methods() {
|
||||||
BIND_ENUM_CONSTANT(INTERPOLATION_NEAREST);
|
BIND_ENUM_CONSTANT(INTERPOLATION_NEAREST);
|
||||||
BIND_ENUM_CONSTANT(INTERPOLATION_LINEAR);
|
BIND_ENUM_CONSTANT(INTERPOLATION_LINEAR);
|
||||||
BIND_ENUM_CONSTANT(INTERPOLATION_CUBIC);
|
BIND_ENUM_CONSTANT(INTERPOLATION_CUBIC);
|
||||||
BIND_ENUM_CONSTANT(INTERPOLATION_CUBIC_IN_TIME);
|
|
||||||
|
|
||||||
BIND_ENUM_CONSTANT(UPDATE_CONTINUOUS);
|
BIND_ENUM_CONSTANT(UPDATE_CONTINUOUS);
|
||||||
BIND_ENUM_CONSTANT(UPDATE_DISCRETE);
|
BIND_ENUM_CONSTANT(UPDATE_DISCRETE);
|
||||||
|
|
|
@ -57,7 +57,6 @@ public:
|
||||||
INTERPOLATION_NEAREST,
|
INTERPOLATION_NEAREST,
|
||||||
INTERPOLATION_LINEAR,
|
INTERPOLATION_LINEAR,
|
||||||
INTERPOLATION_CUBIC,
|
INTERPOLATION_CUBIC,
|
||||||
INTERPOLATION_CUBIC_IN_TIME,
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enum UpdateMode {
|
enum UpdateMode {
|
||||||
|
@ -238,11 +237,6 @@ private:
|
||||||
_FORCE_INLINE_ Variant _interpolate(const Variant &p_a, const Variant &p_b, real_t p_c) const;
|
_FORCE_INLINE_ Variant _interpolate(const Variant &p_a, const Variant &p_b, real_t p_c) const;
|
||||||
_FORCE_INLINE_ real_t _interpolate(const real_t &p_a, const real_t &p_b, real_t p_c) const;
|
_FORCE_INLINE_ real_t _interpolate(const real_t &p_a, const real_t &p_b, real_t p_c) const;
|
||||||
|
|
||||||
_FORCE_INLINE_ Vector3 _cubic_interpolate(const Vector3 &p_pre_a, const Vector3 &p_a, const Vector3 &p_b, const Vector3 &p_post_b, real_t p_c) const;
|
|
||||||
_FORCE_INLINE_ Quaternion _cubic_interpolate(const Quaternion &p_pre_a, const Quaternion &p_a, const Quaternion &p_b, const Quaternion &p_post_b, real_t p_c) const;
|
|
||||||
_FORCE_INLINE_ Variant _cubic_interpolate(const Variant &p_pre_a, const Variant &p_a, const Variant &p_b, const Variant &p_post_b, real_t p_c) const;
|
|
||||||
_FORCE_INLINE_ real_t _cubic_interpolate(const real_t &p_pre_a, const real_t &p_a, const real_t &p_b, const real_t &p_post_b, real_t p_c) const;
|
|
||||||
|
|
||||||
_FORCE_INLINE_ Vector3 _cubic_interpolate_in_time(const Vector3 &p_pre_a, const Vector3 &p_a, const Vector3 &p_b, const Vector3 &p_post_b, real_t p_c, real_t p_pre_a_t, real_t p_b_t, real_t p_post_b_t) const;
|
_FORCE_INLINE_ Vector3 _cubic_interpolate_in_time(const Vector3 &p_pre_a, const Vector3 &p_a, const Vector3 &p_b, const Vector3 &p_post_b, real_t p_c, real_t p_pre_a_t, real_t p_b_t, real_t p_post_b_t) const;
|
||||||
_FORCE_INLINE_ Quaternion _cubic_interpolate_in_time(const Quaternion &p_pre_a, const Quaternion &p_a, const Quaternion &p_b, const Quaternion &p_post_b, real_t p_c, real_t p_pre_a_t, real_t p_b_t, real_t p_post_b_t) const;
|
_FORCE_INLINE_ Quaternion _cubic_interpolate_in_time(const Quaternion &p_pre_a, const Quaternion &p_a, const Quaternion &p_b, const Quaternion &p_post_b, real_t p_c, real_t p_pre_a_t, real_t p_b_t, real_t p_post_b_t) const;
|
||||||
_FORCE_INLINE_ Variant _cubic_interpolate_in_time(const Variant &p_pre_a, const Variant &p_a, const Variant &p_b, const Variant &p_post_b, real_t p_c, real_t p_pre_a_t, real_t p_b_t, real_t p_post_b_t) const;
|
_FORCE_INLINE_ Variant _cubic_interpolate_in_time(const Variant &p_pre_a, const Variant &p_a, const Variant &p_b, const Variant &p_post_b, real_t p_c, real_t p_pre_a_t, real_t p_b_t, real_t p_post_b_t) const;
|
||||||
|
|
Loading…
Reference in a new issue