[Bf-blender-cvs] [e83b9cde1a6] master: Fix T54129: Moving keyframes on top of other keyframes, removes both keyframes

Joshua Leung noreply at git.blender.org
Thu Feb 22 15:15:17 CET 2018


Commit: e83b9cde1a6caeb4468f12d68632df0d0e4e8ae7
Author: Joshua Leung
Date:   Fri Feb 23 03:13:56 2018 +1300
Branches: master
https://developer.blender.org/rBe83b9cde1a6caeb4468f12d68632df0d0e4e8ae7

Fix T54129: Moving keyframes on top of other keyframes, removes both keyframes

Regression caused by earlier commits to improve the automerge behaviour.
In this case, the problems only occurred when moving a selected keyframe
forwards in time to overlap an unselected keyframe.

===================================================================

M	source/blender/editors/transform/transform_conversions.c

===================================================================

diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c
index 42a15939aee..adcd3a29bd0 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -3595,27 +3595,40 @@ static void posttrans_fcurve_clean(FCurve *fcu, const bool use_handle)
 	for (int i = fcu->totvert - 1; i >= 0; i--) {
 		BezTriple *bezt = &fcu->bezt[i];
 		
-		/* Is this a candidate for deletion? */
+		/* Is this keyframe a candidate for deletion? */
 		/* TODO: Replace loop with an O(1) lookup instead */
 		for (tRetainedKeyframe *rk = retained_keys.last; rk; rk = rk->prev) {
 			if (IS_EQT(bezt->vec[1][0], rk->frame, BEZT_BINARYSEARCH_THRESH)) {
-				/* Delete this keyframe, unless it's the last selected one on this frame,
-				 * in which case, we'll update its value instead
-				 */
-				if (BEZT_ISSEL_ANY(bezt) && (rk->del_count == rk->tot_count - 1)) {
-					/* Update keyframe */
-					if (can_average_points) {
-						/* TODO: update handles too? */
-						bezt->vec[1][1] = rk->val;
+				/* Selected keys are treated with greater care than unselected ones... */
+				if (BEZT_ISSEL_ANY(bezt)) {
+					/* - If this is the last selected key left (based on rk->del_count) ==> UPDATE IT
+					 *   (or else we wouldn't have any keyframe left here)
+					 * - Otherwise, there are still other selected keyframes on this frame
+					 *   to be merged down still ==> DELETE IT
+					 */
+					if (rk->del_count == rk->tot_count - 1) {
+						/* Update keyframe... */
+						if (can_average_points) {
+							/* TODO: update handles too? */
+							bezt->vec[1][1] = rk->val;
+						}
+					}
+					else {
+						/* Delete Keyframe */
+						delete_fcurve_key(fcu, i, 0);
 					}
+					
+					/* Update count of how many we've deleted
+					 * - It should only matter that we're doing this for all but the last one
+					 */
+					rk->del_count++;
 				}
 				else {
-					/* Delete keyframe */
+					/* Always delete - Unselected keys don't matter */
 					delete_fcurve_key(fcu, i, 0);
 				}
-				
-				/* Stop searching for matching RK's */
-				rk->del_count++;
+								
+				/* Stop the RK search... we've found our match now */
 				break;
 			}
 		}



More information about the Bf-blender-cvs mailing list