From 84befe2056a8ae03d38ab539b26f1638bdcbd41c Mon Sep 17 00:00:00 2001 From: Martin Poirier Date: Sun, 27 Mar 2011 22:15:37 +0000 Subject: [PATCH] [#26622] Blender crashes when calling transform operator Add cancellation checks for time* transforms that only run in specific spaces. Hide Transform Mode operator property (it shouldn't be modified after the operator is run), made default mode Translate, not the useless Dummy. --- source/blender/editors/transform/transform.c | 25 +++++++++++++++---- .../blender/editors/transform/transform_ops.c | 5 +++- 2 files changed, 24 insertions(+), 6 deletions(-) diff --git a/source/blender/editors/transform/transform.c b/source/blender/editors/transform/transform.c index 0a055358902..3ec7e6eec2c 100644 --- a/source/blender/editors/transform/transform.c +++ b/source/blender/editors/transform/transform.c @@ -1650,11 +1650,6 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int break; case TFM_EDGE_SLIDE: initEdgeSlide(t); - if(t->state == TRANS_CANCEL) - { - postTrans(C, t); - return 0; - } break; case TFM_BONE_ROLL: initBoneRoll(t); @@ -1709,6 +1704,13 @@ int initTransform(bContext *C, TransInfo *t, wmOperator *op, wmEvent *event, int break; } + if(t->state == TRANS_CANCEL) + { + postTrans(C, t); + return 0; + } + + /* overwrite initial values if operator supplied a non-null vector */ if (RNA_property_is_set(op->ptr, "value")) { @@ -5515,6 +5517,11 @@ static void doAnimEdit_SnapFrame(TransInfo *t, TransData *td, TransData2D *td2d, void initTimeTranslate(TransInfo *t) { + /* this tool is only really available in the Action Editor... */ + if (t->spacetype != SPACE_ACTION) { + t->state = TRANS_CANCEL; + } + t->mode = TFM_TIME_TRANSLATE; t->transform = TimeTranslate; @@ -5663,8 +5670,11 @@ void initTimeSlide(TransInfo *t) /* set flag for drawing stuff */ saction->flag |= SACTION_MOVING; + } else { + t->state = TRANS_CANCEL; } + t->mode = TFM_TIME_SLIDE; t->transform = TimeSlide; t->flag |= T_FREE_CUSTOMDATA; @@ -5789,6 +5799,11 @@ void initTimeScale(TransInfo *t) { int center[2]; + /* this tool is only really available in the Action Editor... */ + if (t->spacetype != SPACE_ACTION) { + t->state = TRANS_CANCEL; + } + t->mode = TFM_TIME_SCALE; t->transform = TimeScale; diff --git a/source/blender/editors/transform/transform_ops.c b/source/blender/editors/transform/transform_ops.c index c31722d97cb..9a78a05dba9 100644 --- a/source/blender/editors/transform/transform_ops.c +++ b/source/blender/editors/transform/transform_ops.c @@ -755,6 +755,8 @@ void TRANSFORM_OT_seq_slide(struct wmOperatorType *ot) void TRANSFORM_OT_transform(struct wmOperatorType *ot) { + PropertyRNA *prop; + static EnumPropertyItem transform_mode_types[] = { {TFM_INIT, "INIT", 0, "Init", ""}, {TFM_DUMMY, "DUMMY", 0, "Dummy", ""}, @@ -800,7 +802,8 @@ void TRANSFORM_OT_transform(struct wmOperatorType *ot) ot->cancel = transform_cancel; ot->poll = ED_operator_areaactive; - RNA_def_enum(ot->srna, "mode", transform_mode_types, 0, "Mode", ""); + prop= RNA_def_enum(ot->srna, "mode", transform_mode_types, TFM_TRANSLATION, "Mode", ""); + RNA_def_property_flag(prop, PROP_HIDDEN); RNA_def_float_vector(ot->srna, "value", 4, NULL, -FLT_MAX, FLT_MAX, "Values", "", -FLT_MAX, FLT_MAX);