[Bf-blender-cvs] [54ee4109143] master: Fix T84376: Skin Resize(Ctrl + A) does not work in Symmetry

Germano Cavalcante noreply at git.blender.org
Mon Jan 4 21:37:23 CET 2021


Commit: 54ee4109143b6fdabf749d2fde183907469cfa3b
Author: Germano Cavalcante
Date:   Mon Jan 4 17:36:51 2021 -0300
Branches: master
https://developer.blender.org/rB54ee4109143b6fdabf749d2fde183907469cfa3b

Fix T84376: Skin Resize(Ctrl + A) does not work in Symmetry

Since the `TransData` converted from vertices is the same used for other
transform modes (Move, Rotate, Resize), the logic used for mirroring
focused only on the position of the vertices.

The solution here is to create a specific `TansData` for `CD_MVERT_SKIN`.

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

M	source/blender/editors/transform/CMakeLists.txt
M	source/blender/editors/transform/transform_convert.c
M	source/blender/editors/transform/transform_convert.h
M	source/blender/editors/transform/transform_convert_mesh.c
A	source/blender/editors/transform/transform_convert_mesh_skin.c
M	source/blender/editors/transform/transform_convert_mesh_uv.c
M	source/blender/editors/transform/transform_mode_skin_resize.c

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

diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt
index a2eb68a1b71..faed8abb202 100644
--- a/source/blender/editors/transform/CMakeLists.txt
+++ b/source/blender/editors/transform/CMakeLists.txt
@@ -50,6 +50,7 @@ set(SRC
   transform_convert_mball.c
   transform_convert_mesh.c
   transform_convert_mesh_edge.c
+  transform_convert_mesh_skin.c
   transform_convert_mesh_uv.c
   transform_convert_nla.c
   transform_convert_node.c
diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c
index dd35d67e1fa..fb365da6b43 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -1078,7 +1078,12 @@ void createTransData(bContext *C, TransInfo *t)
     initTransDataContainers_FromObjectData(t, ob, NULL, 0);
 
     if (t->obedit_type == OB_MESH) {
-      convert_type = TC_MESH_VERTS;
+      if (t->mode == TFM_SKIN_RESIZE) {
+        convert_type = TC_MESH_SKIN;
+      }
+      else {
+        convert_type = TC_MESH_VERTS;
+      }
     }
     else if (ELEM(t->obedit_type, OB_CURVE, OB_SURF)) {
       convert_type = TC_CURVE_VERTS;
@@ -1202,6 +1207,9 @@ void createTransData(bContext *C, TransInfo *t)
     case TC_MESH_EDGES:
       createTransEdge(t);
       break;
+    case TC_MESH_SKIN:
+      createTransMeshSkin(t);
+      break;
     case TC_MESH_UV:
       createTransUVs(C, t);
       break;
@@ -1273,9 +1281,9 @@ void createTransData(bContext *C, TransInfo *t)
     if (ELEM(convert_type, TC_ACTION_DATA, TC_GRAPH_EDIT_DATA)) {
       /* Distance has already been set. */
     }
-    else if (convert_type == TC_MESH_VERTS) {
+    else if (ELEM(convert_type, TC_MESH_VERTS, TC_MESH_SKIN)) {
       if (t->flag & T_PROP_CONNECTED) {
-        /* Already calculated by editmesh_set_connectivity_distance. */
+        /* Already calculated by transform_convert_mesh_connectivity_distance. */
       }
       else {
         set_prop_dist(t, false);
@@ -1536,6 +1544,9 @@ void recalcData(TransInfo *t)
     case TC_MESH_EDGES:
       recalcData_mesh(t);
       break;
+    case TC_MESH_SKIN:
+      recalcData_mesh_skin(t);
+      break;
     case TC_MESH_UV:
       recalcData_uv(t);
       break;
diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h
index 59fcd016020..be4322b42e2 100644
--- a/source/blender/editors/transform/transform_convert.h
+++ b/source/blender/editors/transform/transform_convert.h
@@ -25,6 +25,8 @@
 #pragma once
 
 struct BezTriple;
+struct BMEditMesh;
+struct BMesh;
 struct FCurve;
 struct ListBase;
 struct Object;
@@ -65,6 +67,7 @@ typedef enum eTransConvertType {
   TC_MBALL_VERTS,
   TC_MESH_VERTS,
   TC_MESH_EDGES,
+  TC_MESH_SKIN,
   TC_MESH_UV,
   TC_NLA_DATA,
   TC_NODE_DATA,
@@ -136,6 +139,55 @@ void special_aftertrans_update__mask(bContext *C, TransInfo *t);
 void createTransMBallVerts(TransInfo *t);
 
 /* transform_convert_mesh.c */
+struct TransIslandData {
+  float (*center)[3];
+  float (*axismtx)[3][3];
+  int island_tot;
+  int *island_vert_map;
+};
+
+struct MirrorDataVert {
+  int index;
+  int flag;
+};
+
+struct TransMirrorData {
+  struct MirrorDataVert *vert_map;
+  int mirror_elem_len;
+};
+
+struct TransMeshDataCrazySpace {
+  float (*quats)[4];
+  float (*defmats)[3][3];
+};
+
+void transform_convert_mesh_islands_calc(struct BMEditMesh *em,
+                                         const bool calc_single_islands,
+                                         const bool calc_island_center,
+                                         const bool calc_island_axismtx,
+                                         struct TransIslandData *r_island_data);
+void transform_convert_mesh_islanddata_free(struct TransIslandData *island_data);
+void transform_convert_mesh_connectivity_distance(struct BMesh *bm,
+                                                  const float mtx[3][3],
+                                                  float *dists,
+                                                  int *index);
+void transform_convert_mesh_mirrordata_calc(struct BMEditMesh *em,
+                                            const bool use_select,
+                                            const bool use_topology,
+                                            const bool mirror_axis[3],
+                                            struct TransMirrorData *r_mirror_data);
+void transform_convert_mesh_mirrordata_free(struct TransMirrorData *mirror_data);
+void transform_convert_mesh_crazyspace_detect(TransInfo *t,
+                                              struct TransDataContainer *tc,
+                                              struct BMEditMesh *em,
+                                              struct TransMeshDataCrazySpace *r_crazyspace_data);
+void transform_convert_mesh_crazyspace_transdata_set(const float mtx[3][3],
+                                                     const float smtx[3][3],
+                                                     const float defmat[3][3],
+                                                     const float quat[4],
+                                                     struct TransData *r_td);
+void transform_convert_mesh_crazyspace_free(struct TransMeshDataCrazySpace *r_crazyspace_data);
+
 void createTransEditVerts(TransInfo *t);
 void recalcData_mesh(TransInfo *t);
 void special_aftertrans_update__mesh(bContext *C, TransInfo *t);
@@ -143,6 +195,10 @@ void special_aftertrans_update__mesh(bContext *C, TransInfo *t);
 /* transform_convert_mesh_edge.c */
 void createTransEdge(TransInfo *t);
 
+/* transform_convert_mesh_skin.c */
+void createTransMeshSkin(TransInfo *t);
+void recalcData_mesh_skin(TransInfo *t);
+
 /* transform_convert_mesh_uv.c */
 void createTransUVs(bContext *C, TransInfo *t);
 void recalcData_uv(TransInfo *t);
diff --git a/source/blender/editors/transform/transform_convert_mesh.c b/source/blender/editors/transform/transform_convert_mesh.c
index 5f41aaa8e50..b3bd6b31879 100644
--- a/source/blender/editors/transform/transform_convert_mesh.c
+++ b/source/blender/editors/transform/transform_convert_mesh.c
@@ -27,8 +27,6 @@
 #include "MEM_guardedalloc.h"
 
 #include "BLI_alloca.h"
-#include "BLI_bitmap.h"
-#include "BLI_ghash.h"
 #include "BLI_linklist_stack.h"
 #include "BLI_math.h"
 #include "BLI_memarena.h"
@@ -45,12 +43,10 @@
 #include "DEG_depsgraph_query.h"
 
 #include "transform.h"
-#include "transform_mode.h"
+#include "transform_orientations.h"
 #include "transform_snap.h"
 
-/* Own include. */
 #include "transform_convert.h"
-#include "transform_orientations.h"
 
 #define USE_FACE_SUBSTITUTE
 
@@ -59,18 +55,11 @@
  *
  * \{ */
 
-struct TransIslandData {
-  float (*center)[3];
-  float (*axismtx)[3][3];
-  int island_tot;
-  int *island_vert_map;
-};
-
-static void editmesh_islands_info_calc(BMEditMesh *em,
-                                       const bool calc_single_islands,
-                                       const bool calc_island_center,
-                                       const bool calc_island_axismtx,
-                                       struct TransIslandData *r_island_data)
+void transform_convert_mesh_islands_calc(struct BMEditMesh *em,
+                                         const bool calc_single_islands,
+                                         const bool calc_island_center,
+                                         const bool calc_island_axismtx,
+                                         struct TransIslandData *r_island_data)
 {
   BMesh *bm = em->bm;
   char htype;
@@ -242,6 +231,19 @@ static void editmesh_islands_info_calc(BMEditMesh *em,
   r_island_data->island_vert_map = vert_map;
 }
 
+void transform_convert_mesh_islanddata_free(struct TransIslandData *island_data)
+{
+  if (island_data->center) {
+    MEM_freeN(island_data->center);
+  }
+  if (island_data->axismtx) {
+    MEM_freeN(island_data->axismtx);
+  }
+  if (island_data->island_vert_map) {
+    MEM_freeN(island_data->island_vert_map);
+  }
+}
+
 /** \} */
 
 /* -------------------------------------------------------------------- */
@@ -285,10 +287,10 @@ static bool bmesh_test_dist_add(BMVert *v,
  * \param dists: Store the closest connected distance to selected vertices.
  * \param index: Optionally store the original index we're measuring the distance to (can be NULL).
  */
-static void editmesh_set_connectivity_distance(BMesh *bm,
-                                               const float mtx[3][3],
-                                               float *dists,
-                                               int *index)
+void transform_convert_mesh_connectivity_distance(struct BMesh *bm,
+                                                  const float mtx[3][3],
+                                                  float *dists,
+                                                  int *index)
 {
   BLI_LINKSTACK_DECLARE(queue, BMVert *);
 
@@ -436,16 +438,6 @@ static void editmesh_set_connectivity_distance(BMesh *bm,
 /* Used for both mirror epsilon and TD_MIRROR_EDGE_ */
 #define TRANSFORM_MAXDIST_MIRROR 0.00002f
 
-struct MirrorDataVert {
-  int index;
-  int flag;
-};
-
-struct TransMirrorData {
-  struct MirrorDataVert *vert_map;
-  int mirror_elem_len;
-};
-
 static bool is_in_quadrant_v3(const float co[3], const int quadrant[3], const float epsilon)
 {
   if (quadrant[0] && ((co[0] * quadrant[0]) < -epsilon)) {
@@ -460,11 +452,11 @@ static bool is_in_quadrant_v3(const float co[3], const int quadrant[3], const fl
   return true;
 }
 
-static void editmesh_mirror_data_calc(BMEditMesh *em,
-                                      const bool use_select,
-                                      const bool use_topology,
-                                      const bool mirror_axis[3],
-                                      struct TransMirrorData *r_mirror_data)
+void transform_convert_mesh_mirrordata_calc(struct BMEditMesh *em,
+                                            const bool use_select,
+                                            const bool use_topology,
+                                            const bool mirror_axis[3],
+          

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list