[#24827] Crash when auto-keyframing while playing animation
authorMartin Poirier <theeth@yahoo.com>
Sat, 20 Nov 2010 21:43:16 +0000 (21:43 +0000)
committerMartin Poirier <theeth@yahoo.com>
Sat, 20 Nov 2010 21:43:16 +0000 (21:43 +0000)
Reported by AndrĂ© Oliveira

Need to pass valid context to autokeying callback function.

source/blender/editors/transform/transform.c
source/blender/editors/transform/transform.h
source/blender/editors/transform/transform_generics.c

index 2c88402352b395fc7661c5e40942609c7359d08a..63287f86464896678d726f03089c24e7db00be55 100644 (file)
@@ -1490,6 +1490,8 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
 {
        int options = 0;
 
+       t->context = C;
+
        /* added initialize, for external calls to set stuff in TransInfo, like undo string */
 
        t->state = TRANS_STARTING;
@@ -1723,11 +1725,15 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int
                }
        }
 
+       t->context = NULL;
+
        return 1;
 }
 
-void transformApply(const bContext *C, TransInfo *t)
+void transformApply(bContext *C, TransInfo *t)
 {
+       t->context = C;
+
        if ((t->redraw & TREDRAW_HARD) || (t->draw_handle_apply == NULL && (t->redraw & TREDRAW_SOFT)))
        {
                selectConstraint(t);
@@ -1752,15 +1758,17 @@ void transformApply(const bContext *C, TransInfo *t)
                //do_screenhandlers(G.curscreen);
                t->redraw |= TREDRAW_HARD;
        }
+
+       t->context = NULL;
 }
 
-void drawTransformApply(const struct bContext *C, struct ARegion *UNUSED(ar), void *arg)
+void drawTransformApply(const bContext *C, struct ARegion *UNUSED(ar), void *arg)
 {
        TransInfo *t = arg;
 
        if (t->redraw & TREDRAW_SOFT) {
                t->redraw |= TREDRAW_HARD;
-               transformApply(C, t);
+               transformApply((bContext *)C, t);
        }
 }
 
@@ -1768,6 +1776,8 @@ int transformEnd(bContext *C, TransInfo *t)
 {
        int exit_code = OPERATOR_RUNNING_MODAL;
 
+       t->context = C;
+
        if (t->state != TRANS_STARTING && t->state != TRANS_RUNNING)
        {
                /* handle restoring objects */
@@ -1804,6 +1814,8 @@ int transformEnd(bContext *C, TransInfo *t)
                viewRedrawForce(C, t);
        }
 
+       t->context = NULL;
+
        return exit_code;
 }
 
index de978626b3e16cec4d28a13399caa4028e34a2ba..2778aa4df08279ac8c7f911b610497f3bc95d94d 100644 (file)
@@ -317,6 +317,7 @@ typedef struct TransInfo {
        float           axis_orig[3];   /* TransCon can change 'axis', store the original value here */
 
        void            *view;
+       struct bContext *context; /* Only valid (non null) during an operator called function. */
        struct ScrArea  *sa;
        struct ARegion  *ar;
        struct Scene    *scene;
@@ -448,7 +449,7 @@ void TRANSFORM_OT_transform(struct wmOperatorType *ot);
 int initTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op, struct wmEvent *event, int mode);
 void saveTransform(struct bContext *C, struct TransInfo *t, struct wmOperator *op);
 int  transformEvent(TransInfo *t, struct wmEvent *event);
-void transformApply(const struct bContext *C, TransInfo *t);
+void transformApply(struct bContext *C, TransInfo *t);
 int  transformEnd(struct bContext *C, TransInfo *t);
 
 void setTransformViewMatrices(TransInfo *t);
index 6e71cf3011247d2b6570faf6d922736a7fc760b3..02db25fb50ba7491cf12d4cff48bafa9d226bf31 100644 (file)
@@ -817,7 +817,7 @@ void recalcData(TransInfo *t)
                                // TODO: autokeyframe calls need some setting to specify to add samples (FPoints) instead of keyframes?
                                if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
                                        animrecord_check_state(t->scene, &ob->id, t->animtimer);
-                                       autokeyframe_ob_cb_func(NULL, t->scene, (View3D *)t->view, ob, t->mode);
+                                       autokeyframe_ob_cb_func(t->context, t->scene, (View3D *)t->view, ob, t->mode);
                                }
                                
                                /* sets recalc flags fully, instead of flushing existing ones