Commit: 65b82e09d94e77f7d8fb079f24fe82aee8e2509e
Author: Campbell Barton
Date:   Mon Jan 14 14:59:18 2019 +1100
Branches: master
https://developer.blender.org/rB65b82e09d94e77f7d8fb079f24fe82aee8e2509e

Fix T57852: Mesh X Mirror option not working

D3869 by @lichtwerk w/ own edits

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

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

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

diff --git a/source/blender/editors/transform/transform.c 
b/source/blender/editors/transform/transform.c
index 055e9744043..c70bfc63b33 100644
--- a/source/blender/editors/transform/transform.c
+++ b/source/blender/editors/transform/transform.c
@@ -2171,7 +2171,7 @@ void saveTransform(bContext *C, TransInfo *t, wmOperator 
*op)
        }
 
        if ((prop = RNA_struct_find_property(op->ptr, "mirror"))) {
-               RNA_property_boolean_set(op->ptr, prop, (t->flag & T_MIRROR) != 
0);
+               RNA_property_boolean_set(op->ptr, prop, (t->flag & T_NO_MIRROR) 
== 0);
        }
 
        if ((prop = RNA_struct_find_property(op->ptr, "constraint_axis"))) {
@@ -5980,7 +5980,7 @@ static void slide_origdata_create_data_vert(
 }
 
 static void slide_origdata_create_data(
-        TransInfo *t, TransDataContainer *tc, SlideOrigData *sod,
+        TransDataContainer *tc, SlideOrigData *sod,
         TransDataGenericSlideVert *sv_array, unsigned int v_stride, unsigned 
int v_num)
 {
        if (sod->use_origfaces) {
@@ -6015,7 +6015,7 @@ static void slide_origdata_create_data(
                        slide_origdata_create_data_vert(bm, sod, sv);
                }
 
-               if (t->flag & T_MIRROR) {
+               if (tc->mirror.axis_flag) {
                        TransData *td = tc->data;
                        TransDataGenericSlideVert *sv_mirror;
 
@@ -6995,7 +6995,7 @@ static bool createEdgeSlideVerts_double_side(TransInfo 
*t, TransDataContainer *t
        /* create copies of faces for customdata projection */
        bmesh_edit_begin(bm, BMO_OPTYPE_FLAG_UNTAN_MULTIRES);
        slide_origdata_init_data(tc, &sld->orig_data);
-       slide_origdata_create_data(t, tc, &sld->orig_data, 
(TransDataGenericSlideVert *)sld->sv, sizeof(*sld->sv), sld->totsv);
+       slide_origdata_create_data(tc, &sld->orig_data, 
(TransDataGenericSlideVert *)sld->sv, sizeof(*sld->sv), sld->totsv);
 
        if (rv3d) {
                calcEdgeSlide_even(t, tc, sld, mval);
@@ -7190,7 +7190,7 @@ static bool createEdgeSlideVerts_single_side(TransInfo 
*t, TransDataContainer *t
        /* create copies of faces for customdata projection */
        bmesh_edit_begin(bm, BMO_OPTYPE_FLAG_UNTAN_MULTIRES);
        slide_origdata_init_data(tc, &sld->orig_data);
-       slide_origdata_create_data(t, tc, &sld->orig_data, 
(TransDataGenericSlideVert *)sld->sv, sizeof(*sld->sv), sld->totsv);
+       slide_origdata_create_data(tc, &sld->orig_data, 
(TransDataGenericSlideVert *)sld->sv, sizeof(*sld->sv), sld->totsv);
 
        if (rv3d) {
                calcEdgeSlide_even(t, tc, sld, mval);
@@ -7806,7 +7806,7 @@ static bool createVertSlideVerts(TransInfo *t, 
TransDataContainer *tc)
 
        bmesh_edit_begin(bm, BMO_OPTYPE_FLAG_UNTAN_MULTIRES);
        slide_origdata_init_data(tc, &sld->orig_data);
-       slide_origdata_create_data(t, tc, &sld->orig_data, 
(TransDataGenericSlideVert *)sld->sv, sizeof(*sld->sv), sld->totsv);
+       slide_origdata_create_data(tc, &sld->orig_data, 
(TransDataGenericSlideVert *)sld->sv, sizeof(*sld->sv), sld->totsv);
 
        sld->em = em;
 
diff --git a/source/blender/editors/transform/transform.h 
b/source/blender/editors/transform/transform.h
index 115c06317f5..530c03d56f8 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -514,6 +514,16 @@ typedef struct TransDataContainer {
        /** Center of transformation (in local-space), Calculated from 
#TransInfo.center_global. */
        float center_local[3];
 
+       /**
+        * Mirror option
+        */
+       struct {
+               /* Currently for mesh X mirror only. */
+               int axis_flag;
+               /** Set to -1.0f or 1.0 when use_mirror is set. */
+               float sign;
+       } mirror;
+
        TransCustomDataContainer custom;
 } TransDataContainer;
 
@@ -618,8 +628,6 @@ typedef struct TransInfo {
 
        short           prop_mode;
 
-       short           mirror;
-
        float           values[4];
        /** Offset applied ontop of modal input. */
        float           values_modal_offset[4];
@@ -710,7 +718,8 @@ enum {
     /** Auto-ik is on. */
        T_AUTOIK =            1 << 18,
 
-       T_MIRROR =            1 << 19,
+       /** Don't use mirror even if the data-block option is set. */
+       T_NO_MIRROR =         1 << 19,
 
        T_AUTOVALUES =        1 << 20,
 
diff --git a/source/blender/editors/transform/transform_conversions.c 
b/source/blender/editors/transform/transform_conversions.c
index 6e4386a4171..cf911a995a1 100644
--- a/source/blender/editors/transform/transform_conversions.c
+++ b/source/blender/editors/transform/transform_conversions.c
@@ -2676,12 +2676,9 @@ static void createTransEditVerts(TransInfo *t)
                 * Optional, allocate if needed. */
                int *dists_index = NULL;
 
-               if (t->flag & T_MIRROR) {
-                       /* TODO(campbell): xform: We need support for many 
mirror objects at once! */
-                       if (tc->is_active) {
-                               EDBM_verts_mirror_cache_begin(em, 0, false, 
(t->flag & T_PROP_EDIT) == 0, use_topology);
-                               mirror = 1;
-                       }
+               if (tc->mirror.axis_flag) {
+                       EDBM_verts_mirror_cache_begin(em, 0, false, (t->flag & 
T_PROP_EDIT) == 0, use_topology);
+                       mirror = 1;
                }
 
                /**
@@ -2791,7 +2788,7 @@ static void createTransEditVerts(TransInfo *t)
                        BM_ITER_MESH (eve, &iter, bm, BM_VERTS_OF_MESH) {
                                if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && 
eve->co[0] != 0.0f) {
                                        if (eve->co[0] < 0.0f) {
-                                               t->mirror = -1;
+                                               tc->mirror.sign = -1.0f;
                                                mirror = -1;
                                        }
                                        break;
@@ -2895,7 +2892,7 @@ cleanup:
                if (dists_index)
                        MEM_freeN(dists_index);
 
-               if (t->flag & T_MIRROR) {
+               if (tc->mirror.axis_flag) {
                        EDBM_verts_mirror_cache_end(em);
                }
        }
@@ -6381,7 +6378,7 @@ static void special_aftertrans_update__mesh(bContext 
*UNUSED(C), TransInfo *t)
                        char hflag;
                        bool has_face_sel = (bm->totfacesel != 0);
 
-                       if (t->flag & T_MIRROR) {
+                       if (tc->mirror.axis_flag) {
                                TransData *td;
                                int i;
 
diff --git a/source/blender/editors/transform/transform_generics.c 
b/source/blender/editors/transform/transform_generics.c
index 8ae23737e5e..5f7d3ec5bde 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -237,27 +237,29 @@ static void clipMirrorModifier(TransInfo *t)
 static void editbmesh_apply_to_mirror(TransInfo *t)
 {
        FOREACH_TRANS_DATA_CONTAINER (t, tc) {
-               TransData *td = tc->data;
-               BMVert *eve;
-               int i;
+               if (tc->mirror.axis_flag) {
+                       TransData *td = tc->data;
+                       BMVert *eve;
+                       int i;
 
-               for (i = 0; i < tc->data_len; i++, td++) {
-                       if (td->flag & TD_NOACTION)
-                               break;
-                       if (td->loc == NULL)
-                               break;
-                       if (td->flag & TD_SKIP)
-                               continue;
-
-                       eve = td->extra;
-                       if (eve) {
-                               eve->co[0] = -td->loc[0];
-                               eve->co[1] = td->loc[1];
-                               eve->co[2] = td->loc[2];
-                       }
+                       for (i = 0; i < tc->data_len; i++, td++) {
+                               if (td->flag & TD_NOACTION)
+                                       break;
+                               if (td->loc == NULL)
+                                       break;
+                               if (td->flag & TD_SKIP)
+                                       continue;
 
-                       if (td->flag & TD_MIRROR_EDGE) {
-                               td->loc[0] = 0;
+                               eve = td->extra;
+                               if (eve) {
+                                       eve->co[0] = -td->loc[0];
+                                       eve->co[1] = td->loc[1];
+                                       eve->co[2] = td->loc[2];
+                               }
+
+                               if (td->flag & TD_MIRROR_EDGE) {
+                                       td->loc[0] = 0;
+                               }
                        }
                }
        }
@@ -812,8 +814,11 @@ static void recalcData_objects(TransInfo *t)
                                applyProject(t);
                                clipMirrorModifier(t);
                        }
-                       if ((t->options & CTX_NO_MIRROR) == 0 && (t->flag & 
T_MIRROR))
+                       if ((t->flag & T_NO_MIRROR) == 0 &&
+                           (t->options & CTX_NO_MIRROR) == 0)
+                       {
                                editbmesh_apply_to_mirror(t);
+                       }
 
                        if (t->mode == TFM_EDGE_SLIDE) {
                                projectEdgeSlideData(t, false);
@@ -1227,6 +1232,12 @@ void initTransDataContainers_FromObjectData(TransInfo 
*t, Object *obact, Object
 
                for (int i = 0; i < objects_len; i++) {
                        TransDataContainer *tc = &t->data_container[i];
+                       /* TODO, multiple axes. */
+                       tc->mirror.axis_flag = (
+                               ((t->flag & T_NO_MIRROR) == 0) &&
+                               ((t->options & CTX_NO_MIRROR) == 0) &&
+                               (((Mesh *)objects[i]->data)->editflag & 
ME_EDIT_MIRROR_X) != 0);
+
                        if (object_mode & OB_MODE_EDIT) {
                                tc->obedit = objects[i];
                                /* Check needed for UV's */
@@ -1548,18 +1559,16 @@ void initTransInfo(bContext *C, TransInfo *t, 
wmOperator *op, const wmEvent *eve
        if (op && ((prop = RNA_struct_find_property(op->ptr, "mirror")) &&
                   RNA_property_is_set(op->ptr, prop)))
        {
-               if (RNA_property_boolean_get(op->ptr, prop)) {
-                       t->flag |= T_MIRROR;
-                       t->mirror = 1;
+               if (!RNA_property_boolean_get(op->ptr, prop)) {
+                       t->flag |= T_NO_MIRROR;
                }
        }
-       // Need stuff to take it from edit mesh or whatnot here
-       else if (t->spacetype == SPACE_VIEW3D) {
-               /* TODO(campbell): xform, get mirror from each object. */
-               if (t->obedit_type == OB_MESH && (((Mesh 
*)OBACT(t->view_layer)->data)->editflag & ME_EDIT_MIRROR_X)) {
-                       t->flag |= T_MIRROR;
-                       t->mirror = 1;
-               }
+       else if ((t->spacetype == SPACE_VIEW3D) && (t->obedit_type == OB_MESH)) 
{
+               /* pass */
+       }
+       else {
+               /* Avoid mirroring for unsupported contexts. */
+               t->options |= CTX_NO_MIRROR;
        }
 
        /* setting PET flag only if property exist in operator. Otherwise, 
assume it's not supported */
@@ -2168,7 +2177,7 @@ void calculatePropRatio(TransInfo *t)
                                if (td->flag & TD_SELECTED) {
                                        td->factor = 1.0f;
                                }
-                               else if (t->flag & T_MIRROR && td->loc[0] * 
t->mirror < -0.00001f) {
+                               else if (tc->mirror.axis_flag && (td->loc[0] * 
tc->mirror.sign) < -0.00001f) {
                                        td->flag |= TD_SKIP;
                                        td->factor = 0.0f;
                                        restoreElement(td);

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to