Merge branch 'master' into blender2.8
authorCampbell Barton <ideasman42@gmail.com>
Mon, 23 Apr 2018 10:59:57 +0000 (12:59 +0200)
committerCampbell Barton <ideasman42@gmail.com>
Mon, 23 Apr 2018 10:59:57 +0000 (12:59 +0200)
source/blender/editors/transform/transform_generics.c

index a5ff091321e562556641d1ca7f552498385cb2bd..08f54a75dcf903df4ac8c78f9ec7979b03f584e3 100644 (file)
@@ -277,6 +277,7 @@ static void animrecord_check_state(Scene *scene, ID *id, wmTimer *animtimer)
                /* if playback has just looped around, we need to add a new NLA track+strip to allow a clean pass to occur */
                if ((sad) && (sad->flag & ANIMPLAY_FLAG_JUMPED)) {
                        AnimData *adt = BKE_animdata_from_id(id);
+                       const bool is_first = (adt) && (adt->nla_tracks.first == NULL);
                        
                        /* perform push-down manually with some differences 
                         * NOTE: BKE_nla_action_pushdown() sync warning...
@@ -297,6 +298,29 @@ static void animrecord_check_state(Scene *scene, ID *id, wmTimer *animtimer)
                                        strip->extendmode = NLASTRIP_EXTEND_NOTHING;
                                        strip->flag &= ~(NLASTRIP_FLAG_AUTO_BLENDS | NLASTRIP_FLAG_SELECT | NLASTRIP_FLAG_ACTIVE);
                                        
+                                       /* copy current "action blending" settings from adt to the strip,
+                                        * as it was keyframed with these settings, so omitting them will
+                                        * change the effect  [T54766]
+                                        */
+                                       if (is_first == false) {
+                                               strip->blendmode = adt->act_blendmode;
+                                               strip->influence = adt->act_influence;
+                                               
+                                               if (adt->act_influence < 1.0f) {
+                                                       /* enable "user-controlled" influence (which will insert a default keyframe)
+                                                        * so that the influence doesn't get lost on the new update
+                                                        *
+                                                        * NOTE: An alternative way would have been to instead hack the influence
+                                                        * to not get always get reset to full strength if NLASTRIP_FLAG_USR_INFLUENCE
+                                                        * is disabled but auto-blending isn't being used. However, that approach
+                                                        * is a bit hacky/hard to discover, and may cause backwards compatability issues,
+                                                        * so it's better to just do it this way.
+                                                        */
+                                                       strip->flag |= NLASTRIP_FLAG_USR_INFLUENCE;
+                                                       BKE_nlastrip_validate_fcurves(strip);
+                                               }
+                                       }
+                                       
                                        /* also, adjust the AnimData's action extend mode to be on 
                                         * 'nothing' so that previous result still play 
                                         */