[Bf-blender-cvs] [1c189aa70af] master: Fix T70873: Pivot Center doesn't compute mirror elements

Germano Cavalcante noreply at git.blender.org
Mon Jun 8 13:28:52 CEST 2020


Commit: 1c189aa70aff01f72ae1fc2eacefcf924ede62c7
Author: Germano Cavalcante
Date:   Mon Jun 8 08:23:04 2020 -0300
Branches: master
https://developer.blender.org/rB1c189aa70aff01f72ae1fc2eacefcf924ede62c7

Fix T70873: Pivot Center doesn't compute mirror elements

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

M	source/blender/editors/transform/transform.h
M	source/blender/editors/transform/transform_convert.c
M	source/blender/editors/transform/transform_convert_mesh.c
M	source/blender/editors/transform/transform_data.h
M	source/blender/editors/transform/transform_generics.c

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

diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index cf8698ab0e8..2bda04ad811 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -204,29 +204,22 @@ typedef struct TransCustomDataContainer {
 #define TRANS_CUSTOM_DATA_ELEM_MAX (sizeof(TransCustomDataContainer) / sizeof(TransCustomData))
 
 typedef struct TransDataContainer {
-  /**
-   * Use for cases we care about the active, eg: active vert of active mesh.
-   * if set this will _always_ be the first item in the array.
-   */
-  bool is_active;
-
   /** Transformed data (array). */
   TransData *data;
-  /** Total number of transformed data. */
-  int data_len;
-
   /** Transformed data extension (array). */
   TransDataExtension *data_ext;
   /** Transformed data for 2d (array). */
   TransData2D *data_2d;
+  /** Transformed data for mirror elements (array). */
+  TransDataMirror *data_mirror;
+
+  /** Total number of transformed data, data_ext, data_2d. */
+  int data_len;
+  /** Total number of transformed data_mirror. */
+  int data_mirror_len;
 
   struct Object *obedit;
 
-  /**
-   * Store matrix, this avoids having to have duplicate check all over
-   * Typically: 'obedit->obmat' or 'poseobj->obmat', but may be used elsewhere too.
-   */
-  bool use_local_mat;
   float mat[4][4];
   float imat[4][4];
   /** 3x3 copies of matrices above. */
@@ -243,22 +236,27 @@ typedef struct TransDataContainer {
   float center_local[3];
 
   /**
-   * Mirror option
+   * Use for cases we care about the active, eg: active vert of active mesh.
+   * if set this will _always_ be the first item in the array.
    */
-  struct {
-    union {
-      struct {
-        uint axis_x : 1;
-        uint axis_y : 1;
-        uint axis_z : 1;
-      };
-      /* For easy checking. */
-      char use_mirror_any;
+  bool is_active;
+
+  /**
+   * Store matrix, this avoids having to have duplicate check all over
+   * Typically: 'obedit->obmat' or 'poseobj->obmat', but may be used elsewhere too.
+   */
+  bool use_local_mat;
+
+  /**  Mirror option. */
+  union {
+    struct {
+      uint use_mirror_axis_x : 1;
+      uint use_mirror_axis_y : 1;
+      uint use_mirror_axis_z : 1;
     };
-    /** Mirror data array. */
-    TransDataMirror *data;
-    int data_len;
-  } mirror;
+    /* For easy checking. */
+    char use_mirror_axis_any;
+  };
 
   TransCustomDataContainer custom;
 } TransDataContainer;
diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c
index 59ba362c6f7..e40af2feafb 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -1894,16 +1894,14 @@ static void special_aftertrans_update__mesh(bContext *UNUSED(C), TransInfo *t)
       char hflag;
       bool has_face_sel = (bm->totfacesel != 0);
 
-      if (tc->mirror.use_mirror_any) {
-        TransDataMirror *tdm;
-        int i;
-
+      if (tc->use_mirror_axis_any) {
         /* Rather then adjusting the selection (which the user would notice)
          * tag all mirrored verts, then auto-merge those. */
         BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_TAG, false);
 
-        for (i = tc->mirror.data_len, tdm = tc->mirror.data; i--; tdm++) {
-          BM_elem_flag_enable((BMVert *)tdm->extra, BM_ELEM_TAG);
+        TransDataMirror *td_mirror = tc->data_mirror;
+        for (int i = tc->data_mirror_len; i--; td_mirror++) {
+          BM_elem_flag_enable((BMVert *)td_mirror->extra, BM_ELEM_TAG);
         }
 
         hflag = BM_ELEM_SELECT | BM_ELEM_TAG;
diff --git a/source/blender/editors/transform/transform_convert_mesh.c b/source/blender/editors/transform/transform_convert_mesh.c
index 6546f257132..6bee3760f4d 100644
--- a/source/blender/editors/transform/transform_convert_mesh.c
+++ b/source/blender/editors/transform/transform_convert_mesh.c
@@ -532,10 +532,10 @@ static TransDataMirror *editmesh_mirror_data_calc(BMEditMesh *em,
     }
   }
 
-  TransDataMirror *mirror_data_iter, *mirror_data = NULL;
+  TransDataMirror *td_mirror_iter, *td_mirror = NULL;
   if (mirror_elem_len != 0) {
-    mirror_data = MEM_mallocN(mirror_elem_len * sizeof(*mirror_data), __func__);
-    mirror_data_iter = &mirror_data[0];
+    td_mirror = MEM_mallocN(mirror_elem_len * sizeof(*td_mirror), __func__);
+    td_mirror_iter = &td_mirror_iter[0];
 
     *r_mirror_bitmap = BLI_BITMAP_NEW(bm->totvert, __func__);
 
@@ -544,14 +544,29 @@ static TransDataMirror *editmesh_mirror_data_calc(BMEditMesh *em,
       if (elem_index != -1) {
         BMVert *v_src = BM_vert_at_index(bm, elem_index);
 
-        mirror_data_iter->loc_src = v_src->co;
-        mirror_data_iter->loc_dst = eve->co;
-        mirror_data_iter->sign_x = index[0] && index[0][i] == -2 ? -1 : 1;
-        mirror_data_iter->sign_y = index[1] && index[1][i] == -2 ? -1 : 1;
-        mirror_data_iter->sign_z = index[2] && index[2][i] == -2 ? -1 : 1;
-        mirror_data_iter->extra = eve;
+        int flag = 0;
+        if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
+          flag |= TD_SELECTED;
+        }
+        if (index[0] && index[0][i] == -2) {
+          flag |= TD_MIRROR_X;
+        }
+        if (index[1] && index[1][i] == -2) {
+          flag |= TD_MIRROR_Y;
+        }
+        if (index[2] && index[2][i] == -2) {
+          flag |= TD_MIRROR_Z;
+        }
+
+        td_mirror_iter->extra = eve;
+        td_mirror_iter->loc = eve->co;
+        copy_v3_v3(td_mirror_iter->iloc, eve->co);
+        td_mirror_iter->flag = flag;
+        td_mirror_iter->loc_src = v_src->co;
+        /** `center` will be set in the main createTransEditVerts loop.
+         * copy_v3_v3(td_mirror_iter->center, eve->co); */
 
-        mirror_data_iter++;
+        td_mirror_iter++;
 
         BLI_BITMAP_ENABLE(*r_mirror_bitmap, i);
       }
@@ -564,7 +579,21 @@ static TransDataMirror *editmesh_mirror_data_calc(BMEditMesh *em,
 
   bm->elem_index_dirty |= BM_VERT;
   *r_mirror_data_len = mirror_elem_len;
-  return mirror_data;
+  return td_mirror;
+}
+
+static void transdata_center_get(const struct TransIslandData *island_data,
+                                 const int island_index,
+                                 const bool no_island_center,
+                                 const float iloc[3],
+                                 float r_center[3])
+{
+  if (island_index != -1 && !no_island_center) {
+    copy_v3_v3(r_center, island_data->center[island_index]);
+  }
+  else {
+    copy_v3_v3(r_center, iloc);
+  }
 }
 
 /* way to overwrite what data is edited with transform */
@@ -597,25 +626,15 @@ static void VertsToTransData(TransInfo *t,
     no = eve->no;
   }
 
-  if (island_index != -1) {
-    if (no_island_center) {
-      copy_v3_v3(td->center, td->loc);
-    }
-    else {
-      copy_v3_v3(td->center, island_data->center[island_index]);
-    }
-  }
+  transdata_center_get(island_data, island_index, no_island_center, td->iloc, td->center);
 
   if ((island_index != -1) && island_data->axismtx) {
     copy_m3_m3(td->axismtx, island_data->axismtx[island_index]);
   }
   else if (t->around == V3D_AROUND_LOCAL_ORIGINS) {
-    copy_v3_v3(td->center, td->loc);
     createSpaceNormal(td->axismtx, no);
   }
   else {
-    copy_v3_v3(td->center, td->loc);
-
     /* Setting normals */
     copy_v3_v3(td->axismtx[2], no);
     td->axismtx[0][0] = td->axismtx[0][1] = td->axismtx[0][2] = td->axismtx[1][0] =
@@ -651,7 +670,6 @@ static void VertsToTransData(TransInfo *t,
 void createTransEditVerts(TransInfo *t)
 {
   FOREACH_TRANS_DATA_CONTAINER (t, tc) {
-    TransData *tob = NULL;
     TransDataExtension *tx = NULL;
     BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
     Mesh *me = tc->obedit->data;
@@ -700,12 +718,12 @@ void createTransEditVerts(TransInfo *t)
       cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
     }
 
-    if (tc->mirror.use_mirror_any) {
+    if (tc->use_mirror_axis_any) {
       bool use_topology = (me->editflag & ME_EDIT_MIRROR_TOPO) != 0;
       bool use_select = (t->flag & T_PROP_EDIT) == 0;
-      bool mirror_axis[3] = {tc->mirror.axis_x, tc->mirror.axis_y, tc->mirror.axis_z};
-      tc->mirror.data = editmesh_mirror_data_calc(
-          em, use_select, use_topology, mirror_axis, &tc->mirror.data_len, &mirror_bitmap);
+      bool mirror_axis[3] = {tc->use_mirror_axis_x, tc->use_mirror_axis_y, tc->use_mirror_axis_z};
+      tc->data_mirror = editmesh_mirror_data_calc(
+          em, use_select, use_topology, mirror_axis, &tc->data_mirror_len, &mirror_bitmap);
     }
 
     int data_len = 0;
@@ -741,7 +759,7 @@ void createTransEditVerts(TransInfo *t)
     BLI_assert(data_len != 0);
 
     tc->data_len = data_len;
-    tc->data = tob = MEM_callocN(data_len * sizeof(TransData), "TransObData(Mesh EditMode)");
+    tc->data = MEM_callocN(data_len * sizeof(TransData), "TransObData(Mesh EditMode)");
     if (ELEM(t->mode, TFM_SKIN_RESIZE, TFM_SHRINKFATTEN)) {
       /* warning, this is overkill, we only need 2 extra floats,
        * but this stores loads of extra stuff, for TFM_SHRINKFATTEN its even more overkill
@@ -813,89 +831,97 @@ void createTransEditVerts(TransInfo *t)
       }
     }
 
+    TransData *tob = tc->data;
+    TransDataMirror *td_mirror = tc->data_mirror;
     BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, a) {
       if (BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
         continue;
       }
-      if (mirror_bitmap && BLI_BITMAP_TEST(mirror_bitmap, a)) {
-        continue;
-      }
-      if (prop_mode || BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
-        float *bweight = (cd_vert_bweight_offset != -1) ?
-                             BM_ELEM_CD_GET_VOID_P(eve, cd_vert_bweight_offset) :
-                             NULL;
-
+      else {
         int island_index = -1;
         if (island_data.island_vert_map) {
           const int connected_index = (dists_index && dists_index[a] != -1) ? dists_index[a] : a;
           island_index = island_data.island_vert_map[connected_index];
         }
 
-        /* Do not use the island center in case we are using islands
-         * only to get axis for

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list