diff options
author | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-09-21 21:08:25 +0300 |
---|---|---|
committer | Brecht Van Lommel <brechtvanlommel@gmail.com> | 2018-09-21 21:21:40 +0300 |
commit | d5f94b49bd988665b4070e02664851fd5339c73a (patch) | |
tree | 5ed985953c40b1efb067435fa3ed58f237293cc1 /source | |
parent | 890b617919670ea43ae11730a3cb621c85682840 (diff) |
Fix part of T56865: wrong center with orbit around selection in weight paint.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/editors/transform/transform.h | 2 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_conversions.c | 26 | ||||
-rw-r--r-- | source/blender/editors/transform/transform_generics.c | 26 |
3 files changed, 26 insertions, 28 deletions
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h index e015015085d..98d8b6d8611 100644 --- a/source/blender/editors/transform/transform.h +++ b/source/blender/editors/transform/transform.h @@ -826,7 +826,7 @@ void setInputPostFct(MouseInput *mi, void (*post)(struct TransInfo *t, float val /*********************** Generics ********************************/ -void initTransDataContainers_FromObjectData(TransInfo *t); +void initTransDataContainers_FromObjectData(TransInfo *t, struct Object *obact, struct Object **objects, uint objects_len); void initTransInfo(struct bContext *C, TransInfo *t, struct wmOperator *op, const struct wmEvent *event); void freeTransCustomDataForMode(TransInfo *t); void postTrans(struct bContext *C, TransInfo *t); diff --git a/source/blender/editors/transform/transform_conversions.c b/source/blender/editors/transform/transform_conversions.c index ae3ad145c31..a5388779cf4 100644 --- a/source/blender/editors/transform/transform_conversions.c +++ b/source/blender/editors/transform/transform_conversions.c @@ -1097,19 +1097,8 @@ static short pose_grab_with_ik(Main *bmain, Object *ob) /** * When objects array is NULL, use 't->data_container' as is. */ -static void createTransPose(TransInfo *t, Object **objects, uint objects_len) +static void createTransPose(TransInfo *t) { - if (objects != NULL) { - if (t->data_container) { - MEM_freeN(t->data_container); - } - t->data_container = MEM_callocN(sizeof(*t->data_container) * objects_len, __func__); - t->data_container_len = objects_len; - int th_index; - FOREACH_TRANS_DATA_CONTAINER_INDEX (t, tc, th_index) { - tc->poseobj = objects[th_index]; - } - } Main *bmain = CTX_data_main(t->context); t->data_len_all = 0; @@ -8440,7 +8429,7 @@ void createTransData(bContext *C, TransInfo *t) } else if (t->options & CTX_EDGE) { /* Multi object editing. */ - initTransDataContainers_FromObjectData(t); + initTransDataContainers_FromObjectData(t, ob, NULL, 0); FOREACH_TRANS_DATA_CONTAINER (t, tc) { tc->data_ext = NULL; } @@ -8490,7 +8479,7 @@ void createTransData(bContext *C, TransInfo *t) } else if (t->obedit_type == OB_MESH) { - initTransDataContainers_FromObjectData(t); + initTransDataContainers_FromObjectData(t, ob, NULL, 0); createTransUVs(C, t); countAndCleanTransDataContainer(t); @@ -8579,7 +8568,7 @@ void createTransData(bContext *C, TransInfo *t) } else if (t->obedit_type != -1) { /* Multi object editing. */ - initTransDataContainers_FromObjectData(t); + initTransDataContainers_FromObjectData(t, ob, NULL, 0); FOREACH_TRANS_DATA_CONTAINER (t, tc) { tc->data_ext = NULL; @@ -8643,8 +8632,8 @@ void createTransData(bContext *C, TransInfo *t) // XXX active-layer checking isn't done as that should probably be checked through context instead /* Multi object editing. */ - initTransDataContainers_FromObjectData(t); - createTransPose(t, NULL, 0); + initTransDataContainers_FromObjectData(t, ob, NULL, 0); + createTransPose(t); countAndCleanTransDataContainer(t); } else if (ob && (ob->mode & OB_MODE_WEIGHT_PAINT) && !(t->options & CTX_PAINT_CURVE)) { @@ -8658,7 +8647,8 @@ void createTransData(bContext *C, TransInfo *t) Object *objects[1]; objects[0] = ob_armature; uint objects_len = 1; - createTransPose(t, objects, objects_len); + initTransDataContainers_FromObjectData(t, ob_armature, objects, objects_len); + createTransPose(t); countAndCleanTransDataContainer(t); } } diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c index e6ad60e0ebb..f9a34fcaaa9 100644 --- a/source/blender/editors/transform/transform_generics.c +++ b/source/blender/editors/transform/transform_generics.c @@ -1199,10 +1199,10 @@ static int initTransInfo_edit_pet_to_flag(const int proportional) } } -void initTransDataContainers_FromObjectData(TransInfo *t) +void initTransDataContainers_FromObjectData(TransInfo *t, Object *obact, Object **objects, uint objects_len) { - const eObjectMode object_mode = OBACT(t->view_layer) ? OBACT(t->view_layer)->mode : OB_MODE_OBJECT; - const short object_type = OBACT(t->view_layer) ? OBACT(t->view_layer)->type : -1; + const eObjectMode object_mode = obact ? obact->mode : OB_MODE_OBJECT; + const short object_type = obact ? obact->type : -1; if ((object_mode & OB_MODE_EDIT) || ((object_mode & OB_MODE_POSE) && (object_type == OB_ARMATURE))) @@ -1210,11 +1210,16 @@ void initTransDataContainers_FromObjectData(TransInfo *t) if (t->data_container) { MEM_freeN(t->data_container); } - uint objects_len; - Object **objects = BKE_view_layer_array_from_objects_in_mode( - t->view_layer, &objects_len, { - .object_mode = object_mode, - .no_dup_data = true}); + + bool free_objects = false; + if (objects == NULL) { + objects = BKE_view_layer_array_from_objects_in_mode( + t->view_layer, &objects_len, { + .object_mode = object_mode, + .no_dup_data = true}); + free_objects = true; + } + t->data_container = MEM_callocN(sizeof(*t->data_container) * objects_len, __func__); t->data_container_len = objects_len; @@ -1242,7 +1247,10 @@ void initTransDataContainers_FromObjectData(TransInfo *t) } /* Otherwise leave as zero. */ } - MEM_freeN(objects); + + if (free_objects) { + MEM_freeN(objects); + } } } |