[Bf-blender-cvs] [b294600ddcf] master: Fix T61051: crash with multi-object mixed mode snapping

Philipp Oeser noreply at git.blender.org
Wed Feb 6 09:49:31 CET 2019


Commit: b294600ddcf17183869e61d878f2801efd52d65d
Author: Philipp Oeser
Date:   Thu Jan 31 13:01:52 2019 +0100
Branches: master
https://developer.blender.org/rBb294600ddcf17183869e61d878f2801efd52d65d

Fix T61051: crash with multi-object mixed mode snapping

rBec3357e03ab1 introduced multi-object snapping.
Seems like this was done without mixed-mode selections in mind.

So code assumed that all selected objects are actually armatures [which
can fail].
In 2.7 this was not a problem, because code only took active object into
account, 2.8 was iterating over all selected_editable_objects.

Now just iterate over objects in posemode instead

Reviewers: brecht, dfelinto

Maniphest Tasks: T61051

Differential Revision: https://developer.blender.org/D4287

===================================================================

M	source/blender/editors/space_view3d/view3d_snap.c

===================================================================

diff --git a/source/blender/editors/space_view3d/view3d_snap.c b/source/blender/editors/space_view3d/view3d_snap.c
index 47b08557222..506d8f31bb0 100644
--- a/source/blender/editors/space_view3d/view3d_snap.c
+++ b/source/blender/editors/space_view3d/view3d_snap.c
@@ -308,8 +308,12 @@ static int snap_selected_to_location(bContext *C, const float snap_target_global
 	}
 	else if (obact && (obact->mode & OB_MODE_POSE)) {
 		struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOCATION_ID);
-		CTX_DATA_BEGIN (C, Object *, ob, selected_editable_objects)
-		{
+		ViewLayer *view_layer = CTX_data_view_layer(C);
+		uint objects_len = 0;
+		Object **objects = BKE_view_layer_array_from_objects_in_mode_unique_data(view_layer, CTX_wm_view3d(C),
+		                                                                         &objects_len, OB_MODE_POSE);
+		for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
+			Object *ob = objects[ob_index];
 			bPoseChannel *pchan;
 			bArmature *arm = ob->data;
 			float snap_target_local[3];
@@ -373,7 +377,7 @@ static int snap_selected_to_location(bContext *C, const float snap_target_global
 
 			DEG_id_tag_update(&ob->id, ID_RECALC_GEOMETRY);
 		}
-		CTX_DATA_END;
+		MEM_freeN(objects);
 	}
 	else {
 		struct KeyingSet *ks = ANIM_get_keyingset_for_autokeying(scene, ANIM_KS_LOCATION_ID);



More information about the Bf-blender-cvs mailing list