From adadde0aa97c014d448e9af03924f0c64d071fa1 Mon Sep 17 00:00:00 2001 From: Wojtek Figat Date: Wed, 1 Sep 2021 14:42:59 +0200 Subject: [PATCH] Add epsilon clamping for keyframes adding in timeline --- Source/Editor/GUI/CurveEditor.cs | 16 ++++++++++++++-- .../Editor/GUI/Timeline/GUI/KeyframesEditor.cs | 8 +++++++- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/Source/Editor/GUI/CurveEditor.cs b/Source/Editor/GUI/CurveEditor.cs index b4f1d9333..e60b0554b 100644 --- a/Source/Editor/GUI/CurveEditor.cs +++ b/Source/Editor/GUI/CurveEditor.cs @@ -1026,15 +1026,21 @@ namespace FlaxEditor.GUI /// The index of the keyframe. public int AddKeyframe(LinearCurve.Keyframe k) { + var eps = Mathf.Epsilon; if (FPS.HasValue) { float fps = FPS.Value; k.Time = Mathf.Floor(k.Time * fps) / fps; + eps = 1.0f / fps; } + int pos = 0; while (pos < _keyframes.Count && _keyframes[pos].Time < k.Time) pos++; - _keyframes.Insert(pos, k); + if (_keyframes.Count > pos && Mathf.Abs(_keyframes[pos].Time - k.Time) < eps) + _keyframes[pos] = k; + else + _keyframes.Insert(pos, k); OnKeyframesChanged(); OnEdited(); @@ -1513,15 +1519,21 @@ namespace FlaxEditor.GUI /// The index of the keyframe. public int AddKeyframe(BezierCurve.Keyframe k) { + var eps = Mathf.Epsilon; if (FPS.HasValue) { float fps = FPS.Value; k.Time = Mathf.Floor(k.Time * fps) / fps; + eps = 1.0f / fps; } + int pos = 0; while (pos < _keyframes.Count && _keyframes[pos].Time < k.Time) pos++; - _keyframes.Insert(pos, k); + if (_keyframes.Count > pos && Mathf.Abs(_keyframes[pos].Time - k.Time) < eps) + _keyframes[pos] = k; + else + _keyframes.Insert(pos, k); OnKeyframesChanged(); OnEdited(); diff --git a/Source/Editor/GUI/Timeline/GUI/KeyframesEditor.cs b/Source/Editor/GUI/Timeline/GUI/KeyframesEditor.cs index aa34657ee..a92998255 100644 --- a/Source/Editor/GUI/Timeline/GUI/KeyframesEditor.cs +++ b/Source/Editor/GUI/Timeline/GUI/KeyframesEditor.cs @@ -837,15 +837,21 @@ namespace FlaxEditor.GUI /// The keyframe to add. public void AddKeyframe(Keyframe k) { + var eps = Mathf.Epsilon; if (FPS.HasValue) { float fps = FPS.Value; k.Time = Mathf.Floor(k.Time * fps) / fps; + eps = 1.0f / fps; } + int pos = 0; while (pos < _keyframes.Count && _keyframes[pos].Time < k.Time) pos++; - _keyframes.Insert(pos, k); + if (_keyframes.Count > pos && Mathf.Abs(_keyframes[pos].Time - k.Time) < eps) + _keyframes[pos] = k; + else + _keyframes.Insert(pos, k); OnKeyframesChanged(); OnEdited();