Fix #34040: Moving Normal Node with enabled Cycles Material Preview crashes
[blender.git] / source / blender / editors / space_action / action_edit.c
index 0e2c6fbe3ce8d1af216b8ff74d22b297ab798b86..7e99e6c065dfed7ce87c4f3bf8ce46c0427fed19 100644 (file)
@@ -52,6 +52,8 @@
 
 #include "BKE_action.h"
 #include "BKE_fcurve.h"
+#include "BKE_global.h"
+#include "BKE_main.h"
 #include "BKE_nla.h"
 #include "BKE_context.h"
 #include "BKE_report.h"
@@ -103,8 +105,10 @@ static int act_new_exec(bContext *C, wmOperator *UNUSED(op))
                        action = BKE_action_copy(oldact);
                }
                else {
+                       Main *bmain = CTX_data_main(C);
+
                        /* just make a new (empty) action */
-                       action = add_empty_action("Action");
+                       action = add_empty_action(bmain, "Action");
                }
                
                /* when creating new ID blocks, use is already 1 (fake user), 
@@ -254,8 +258,9 @@ static void get_keyframe_extents(bAnimContext *ac, float *min, float *max, const
 
                                /* find gp-frame which is less than or equal to cframe */
                                for (gpf = gpl->frames.first; gpf; gpf = gpf->next) {
-                                       *min = MIN2(*min, gpf->framenum);
-                                       *max = MAX2(*max, gpf->framenum);
+                                       const float framenum = (float)gpf->framenum;
+                                       *min = min_ff(*min, framenum);
+                                       *max = max_ff(*max, framenum);
                                }
                        }
                        else if (ale->datatype == ALE_MASKLAY) {
@@ -267,8 +272,9 @@ static void get_keyframe_extents(bAnimContext *ac, float *min, float *max, const
                                     masklay_shape;
                                     masklay_shape = masklay_shape->next)
                                {
-                                       *min = MIN2(*min, masklay_shape->frame);
-                                       *max = MAX2(*max, masklay_shape->frame);
+                                       const float framenum = (float)masklay_shape->frame;
+                                       *min = min_ff(*min, framenum);
+                                       *max = max_ff(*max, framenum);
                                }
                        }
                        else {
@@ -284,8 +290,8 @@ static void get_keyframe_extents(bAnimContext *ac, float *min, float *max, const
                                }
 
                                /* try to set cur using these values, if they're more extreme than previously set values */
-                               *min = MIN2(*min, tmin);
-                               *max = MAX2(*max, tmax);
+                               *min = min_ff(*min, tmin);
+                               *max = max_ff(*max, tmax);
                        }
                }
                
@@ -491,7 +497,7 @@ static int actkeys_copy_exec(bContext *C, wmOperator *op)
                return OPERATOR_CANCELLED;
 
        /* copy keyframes */
-       if (ELEM(ac.datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK)) {
+       if (ac.datatype == ANIMCONT_GPENCIL) {
                /* FIXME... */
                BKE_report(op->reports, RPT_ERROR, "Keyframe pasting is not available for grease pencil mode");
                return OPERATOR_CANCELLED;
@@ -1306,6 +1312,15 @@ void ACTION_OT_keyframe_type(wmOperatorType *ot)
 
 /* ***************** Jump to Selected Frames Operator *********************** */
 
+static int actkeys_framejump_poll(bContext *C)
+{
+       /* prevent changes during render */
+       if (G.is_rendering)
+               return 0;
+
+       return ED_operator_action_active(C);
+}
+
 /* snap current-frame indicator to 'average time' of selected keyframe */
 static int actkeys_framejump_exec(bContext *C, wmOperator *UNUSED(op))
 {
@@ -1359,7 +1374,7 @@ void ACTION_OT_frame_jump(wmOperatorType *ot)
        
        /* api callbacks */
        ot->exec = actkeys_framejump_exec;
-       ot->poll = ED_operator_action_active;
+       ot->poll = actkeys_framejump_poll;
        
        /* flags */
        ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
@@ -1410,15 +1425,20 @@ static void snap_action_keys(bAnimContext *ac, short mode)
        for (ale = anim_data.first; ale; ale = ale->next) {
                AnimData *adt = ANIM_nla_mapping_get(ac, ale);
                
-               if (adt) {
+               if (ale->type == ANIMTYPE_GPLAYER) {
+                       ED_gplayer_snap_frames(ale->data, ac->scene, mode);
+               }
+               else if (ale->type == ANIMTYPE_MASKLAYER) {
+                       ED_masklayer_snap_frames(ale->data, ac->scene, mode);
+               }
+               else if (adt) {
                        ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 0, 1); 
                        ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve);
                        ANIM_nla_mapping_apply_fcurve(adt, ale->key_data, 1, 1);
                }
-               //else if (ale->type == ACTTYPE_GPLAYER)
-               //      snap_gplayer_frames(ale->data, mode);
-               else 
+               else {
                        ANIM_fcurve_keyframes_loop(&ked, ale->key_data, NULL, edit_cb, calchandles_fcurve);
+               }
        }
        
        BLI_freelistN(&anim_data);
@@ -1434,11 +1454,7 @@ static int actkeys_snap_exec(bContext *C, wmOperator *op)
        /* get editor data */
        if (ANIM_animdata_get_context(C, &ac) == 0)
                return OPERATOR_CANCELLED;
-               
-       /* XXX... */
-       if (ELEM(ac.datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))
-               return OPERATOR_PASS_THROUGH;
-               
+       
        /* get snapping mode */
        mode = RNA_enum_get(op->ptr, "type");
        
@@ -1446,7 +1462,8 @@ static int actkeys_snap_exec(bContext *C, wmOperator *op)
        snap_action_keys(&ac, mode);
        
        /* validate keyframes after editing */
-       ANIM_editkeyframes_refresh(&ac);
+       if (!ELEM(ac.datatype, ANIMCONT_GPENCIL, ANIMCONT_MASK))
+               ANIM_editkeyframes_refresh(&ac);
        
        /* set notifier that keyframes have changed */
        WM_event_add_notifier(C, NC_ANIMATION | ND_KEYFRAME | NA_EDITED, NULL);