fix for crashes moving armature layers and applying loc/scale/rot in armature editmode.
authorCampbell Barton <ideasman42@gmail.com>
Tue, 22 Mar 2011 08:30:07 +0000 (08:30 +0000)
committerCampbell Barton <ideasman42@gmail.com>
Tue, 22 Mar 2011 08:30:07 +0000 (08:30 +0000)
source/blender/editors/armature/poseobject.c
source/blender/editors/object/object_transform.c

index 6baf76192a6633a30cf7b1a88b8f139e4e9c9215..23253c0b4cf80ac0e524ec78268b5ec65ab7a995 100644 (file)
@@ -1707,20 +1707,23 @@ static int pose_armature_layers_invoke (bContext *C, wmOperator *op, wmEvent *ev
 static int pose_armature_layers_exec (bContext *C, wmOperator *op)
 {
        Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
-       bArmature *arm= (ob)? ob->data : NULL;
        PointerRNA ptr;
        int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
-       
+
+       if(ob==NULL || ob->data==NULL) {
+               return OPERATOR_CANCELLED;
+       }
+
        /* get the values set in the operator properties */
        RNA_boolean_get_array(op->ptr, "layers", layers);
-       
+
        /* get pointer for armature, and write data there... */
-       RNA_id_pointer_create((ID *)arm, &ptr);
+       RNA_id_pointer_create((ID *)ob->data, &ptr);
        RNA_boolean_set_array(&ptr, "layers", layers);
-       
+
        /* note, notifier might evolve */
        WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
-       
+
        return OPERATOR_FINISHED;
 }
 
@@ -1794,25 +1797,28 @@ static int pose_bone_layers_invoke (bContext *C, wmOperator *op, wmEvent *evt)
 static int pose_bone_layers_exec (bContext *C, wmOperator *op)
 {
        Object *ob= ED_object_pose_armature(CTX_data_active_object(C));
-       bArmature *arm= (ob)? ob->data : NULL;
        PointerRNA ptr;
        int layers[32]; /* hardcoded for now - we can only have 32 armature layers, so this should be fine... */
-       
+
+       if(ob==NULL || ob->data==NULL) {
+               return OPERATOR_CANCELLED;
+       }
+
        /* get the values set in the operator properties */
        RNA_boolean_get_array(op->ptr, "layers", layers);
-       
+
        /* set layers of pchans based on the values set in the operator props */
-       CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pose_bones) 
+       CTX_DATA_BEGIN(C, bPoseChannel *, pchan, selected_pose_bones)
        {
                /* get pointer for pchan, and write flags this way */
-               RNA_pointer_create((ID *)arm, &RNA_Bone, pchan->bone, &ptr);
+               RNA_pointer_create((ID *)ob->data, &RNA_Bone, pchan->bone, &ptr);
                RNA_boolean_set_array(&ptr, "layers", layers);
        }
        CTX_DATA_END;
-       
+
        /* note, notifier might evolve */
        WM_event_add_notifier(C, NC_OBJECT|ND_POSE, ob);
-       
+
        return OPERATOR_FINISHED;
 }
 
index c373f30a6ac6f3995c6f2f48725ddcc22763d808..c41a1bf9a756f49447367a3b514742ddde350f8e 100644 (file)
@@ -607,7 +607,7 @@ void OBJECT_OT_location_apply(wmOperatorType *ot)
        
        /* api callbacks */
        ot->exec= location_apply_exec;
-       ot->poll= ED_operator_scene_editable;
+       ot->poll= ED_operator_objectmode; /* editmode will crash */
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -627,7 +627,7 @@ void OBJECT_OT_scale_apply(wmOperatorType *ot)
        
        /* api callbacks */
        ot->exec= scale_apply_exec;
-       ot->poll= ED_operator_scene_editable;
+       ot->poll= ED_operator_objectmode;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;
@@ -647,7 +647,7 @@ void OBJECT_OT_rotation_apply(wmOperatorType *ot)
        
        /* api callbacks */
        ot->exec= rotation_apply_exec;
-       ot->poll= ED_operator_scene_editable;
+       ot->poll= ED_operator_objectmode;
        
        /* flags */
        ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO;