[Bf-blender-cvs] [d14c2d549b2] master: Fix T99643: Vertex Crease fails with symmetry

Germano Cavalcante noreply at git.blender.org
Tue Jul 19 19:13:20 CEST 2022


Commit: d14c2d549b2fdde2a116f6a37837a1e3776da3cb
Author: Germano Cavalcante
Date:   Tue Jul 19 11:43:38 2022 -0300
Branches: master
https://developer.blender.org/rBd14c2d549b2fdde2a116f6a37837a1e3776da3cb

Fix T99643: Vertex Crease fails with symmetry

Create a transform conversion type that only considers the Vertex
Custom Data.

This reduces the complexity of converting Meshes and slightly
optimizes the transformation.

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

M	source/blender/editors/transform/CMakeLists.txt
M	source/blender/editors/transform/transform.h
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_vert_cdata.c
M	source/blender/editors/transform/transform_mode_edge_bevelweight.c
M	source/blender/editors/transform/transform_mode_edge_crease.c

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

diff --git a/source/blender/editors/transform/CMakeLists.txt b/source/blender/editors/transform/CMakeLists.txt
index 68c4f4e76ca..6984dcb18d4 100644
--- a/source/blender/editors/transform/CMakeLists.txt
+++ b/source/blender/editors/transform/CMakeLists.txt
@@ -39,6 +39,7 @@ set(SRC
   transform_convert_mesh_edge.c
   transform_convert_mesh_skin.c
   transform_convert_mesh_uv.c
+  transform_convert_mesh_vert_cdata.c
   transform_convert_nla.c
   transform_convert_node.c
   transform_convert_object.c
diff --git a/source/blender/editors/transform/transform.h b/source/blender/editors/transform/transform.h
index 049d1b6a90e..b01affc7307 100644
--- a/source/blender/editors/transform/transform.h
+++ b/source/blender/editors/transform/transform.h
@@ -222,6 +222,7 @@ typedef enum {
   TC_MESH_EDGES,
   TC_MESH_SKIN,
   TC_MESH_UV,
+  TC_MESH_VERT_CDATA,
   TC_NLA_DATA,
   TC_NODE_DATA,
   TC_OBJECT,
diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c
index bab700560fe..b0148ce508c 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -823,6 +823,7 @@ void special_aftertrans_update(bContext *C, TransInfo *t)
     case TC_GPENCIL:
     case TC_LATTICE_VERTS:
     case TC_MBALL_VERTS:
+    case TC_MESH_VERT_CDATA:
     case TC_MESH_UV:
     case TC_MESH_SKIN:
     case TC_OBJECT_TEXSPACE:
@@ -905,6 +906,7 @@ static void init_proportional_edit(TransInfo *t)
     case TC_MESH_EDGES:
     case TC_MESH_SKIN:
     case TC_MESH_UV:
+    case TC_MESH_VERT_CDATA:
     case TC_NODE_DATA:
     case TC_OBJECT:
     case TC_PARTICLE_VERTS:
@@ -939,7 +941,7 @@ static void init_proportional_edit(TransInfo *t)
     if (ELEM(convert_type, TC_ACTION_DATA, TC_GRAPH_EDIT_DATA)) {
       /* Distance has already been set. */
     }
-    else if (ELEM(convert_type, TC_MESH_VERTS, TC_MESH_SKIN)) {
+    else if (ELEM(convert_type, TC_MESH_VERTS, TC_MESH_SKIN, TC_MESH_VERT_CDATA)) {
       if (t->flag & T_PROP_CONNECTED) {
         /* Already calculated by transform_convert_mesh_connectivity_distance. */
       }
@@ -984,6 +986,7 @@ static void init_TransDataContainers(TransInfo *t,
     case TC_MESH_EDGES:
     case TC_MESH_SKIN:
     case TC_MESH_UV:
+    case TC_MESH_VERT_CDATA:
       break;
     case TC_ACTION_DATA:
     case TC_GRAPH_EDIT_DATA:
@@ -1095,6 +1098,7 @@ static eTFlag flags_from_data_type(eTConvertType data_type)
     case TC_MBALL_VERTS:
     case TC_MESH_VERTS:
     case TC_MESH_SKIN:
+    case TC_MESH_VERT_CDATA:
       return T_EDIT | T_POINTS;
     case TC_MESH_EDGES:
       return T_EDIT;
@@ -1194,6 +1198,9 @@ static eTConvertType convert_type_get(const TransInfo *t, Object **r_obj_armatur
       if (t->mode == TFM_SKIN_RESIZE) {
         convert_type = TC_MESH_SKIN;
       }
+      else if (ELEM(t->mode, TFM_BWEIGHT, TFM_VERT_CREASE)) {
+        convert_type = TC_MESH_VERT_CDATA;
+      }
       else {
         convert_type = TC_MESH_VERTS;
       }
@@ -1317,6 +1324,9 @@ void createTransData(bContext *C, TransInfo *t)
     case TC_NLA_DATA:
       createTransNlaData(C, t);
       break;
+    case TC_MESH_VERT_CDATA:
+      createTransMeshVertCData(t);
+      break;
     case TC_NODE_DATA:
       createTransNodeData(t);
       break;
@@ -1623,6 +1633,9 @@ void recalcData(TransInfo *t)
     case TC_MESH_UV:
       recalcData_uv(t);
       break;
+    case TC_MESH_VERT_CDATA:
+      recalcData_mesh_cdata(t);
+      break;
     case TC_NLA_DATA:
       recalcData_nla(t);
       break;
diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h
index f25a3db3f75..1b7c33e443c 100644
--- a/source/blender/editors/transform/transform_convert.h
+++ b/source/blender/editors/transform/transform_convert.h
@@ -252,6 +252,11 @@ void createTransUVs(bContext *C, TransInfo *t);
 /* helper for recalcData() - for Image Editor transforms */
 void recalcData_uv(TransInfo *t);
 
+/* transform_convert_mesh_vert_cdata.c */
+
+void createTransMeshVertCData(TransInfo *t);
+void recalcData_mesh_cdata(TransInfo *t);
+
 /* transform_convert_nla.c */
 
 void createTransNlaData(bContext *C, TransInfo *t);
diff --git a/source/blender/editors/transform/transform_convert_mesh.c b/source/blender/editors/transform/transform_convert_mesh.c
index c8d943df3fa..de736fad94e 100644
--- a/source/blender/editors/transform/transform_convert_mesh.c
+++ b/source/blender/editors/transform/transform_convert_mesh.c
@@ -1408,7 +1408,6 @@ static void VertsToTransData(TransInfo *t,
                              TransDataExtension *tx,
                              BMEditMesh *em,
                              BMVert *eve,
-                             float *bweight,
                              const struct TransIslandData *island_data,
                              const int island_index)
 {
@@ -1449,11 +1448,7 @@ static void VertsToTransData(TransInfo *t,
   td->ext = NULL;
   td->val = NULL;
   td->extra = eve;
-  if (ELEM(t->mode, TFM_BWEIGHT, TFM_VERT_CREASE)) {
-    td->val = bweight;
-    td->ival = *bweight;
-  }
-  else if (t->mode == TFM_SHRINKFATTEN) {
+  if (t->mode == TFM_SHRINKFATTEN) {
     td->ext = tx;
     tx->isize[0] = BM_vert_calc_shell_factor_ex(eve, no, BM_ELEM_SELECT);
   }
@@ -1589,17 +1584,6 @@ void createTransEditVerts(TransInfo *t)
                                       "TransObData ext");
     }
 
-    int cd_vert_bweight_offset = -1;
-    int cd_vert_crease_offset = -1;
-    if (t->mode == TFM_BWEIGHT) {
-      BM_mesh_cd_flag_ensure(bm, BKE_mesh_from_object(tc->obedit), ME_CDFLAG_VERT_BWEIGHT);
-      cd_vert_bweight_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
-    }
-    else if (t->mode == TFM_VERT_CREASE) {
-      BM_mesh_cd_flag_ensure(bm, BKE_mesh_from_object(tc->obedit), ME_CDFLAG_VERT_CREASE);
-      cd_vert_crease_offset = CustomData_get_offset(&bm->vdata, CD_CREASE);
-    }
-
     TransData *tob = tc->data;
     TransDataMirror *td_mirror = tc->data_mirror;
     BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, a) {
@@ -1632,15 +1616,9 @@ void createTransEditVerts(TransInfo *t)
         td_mirror++;
       }
       else 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) :
-                         (cd_vert_crease_offset != -1) ?
-                             BM_ELEM_CD_GET_VOID_P(eve, cd_vert_crease_offset) :
-                             NULL;
-
         /* Do not use the island center in case we are using islands
          * only to get axis for snap/rotate to normal... */
-        VertsToTransData(t, tob, tx, em, eve, bweight, &island_data, island_index);
+        VertsToTransData(t, tob, tx, em, eve, &island_data, island_index);
         if (tx) {
           tx++;
         }
diff --git a/source/blender/editors/transform/transform_convert_mesh_vert_cdata.c b/source/blender/editors/transform/transform_convert_mesh_vert_cdata.c
new file mode 100644
index 00000000000..ff58c2c888b
--- /dev/null
+++ b/source/blender/editors/transform/transform_convert_mesh_vert_cdata.c
@@ -0,0 +1,290 @@
+/* SPDX-License-Identifier: GPL-2.0-or-later
+ * Copyright 2001-2002 NaN Holding BV. All rights reserved. */
+
+/** \file
+ * \ingroup edtransform
+ */
+
+#include "DNA_mesh_types.h"
+#include "DNA_meshdata_types.h"
+
+#include "MEM_guardedalloc.h"
+
+#include "BLI_math.h"
+
+#include "BKE_context.h"
+#include "BKE_crazyspace.h"
+#include "BKE_editmesh.h"
+#include "BKE_modifier.h"
+#include "BKE_scene.h"
+
+#include "ED_mesh.h"
+
+#include "DEG_depsgraph_query.h"
+
+#include "transform.h"
+#include "transform_orientations.h"
+
+#include "transform_convert.h"
+
+/* -------------------------------------------------------------------- */
+/** \name Edit Mesh #CD_BWEIGHT and #CD_CREASE Transform Creation
+ * \{ */
+
+static float *tc_mesh_cdata_transdata_center(const struct TransIslandData *island_data,
+                                             const int island_index,
+                                             BMVert *eve)
+{
+  if (island_data->center && island_index != -1) {
+    return island_data->center[island_index];
+  }
+  return eve->co;
+}
+
+static void tc_mesh_cdata_transdata_create(TransDataBasic *td,
+                                           BMEditMesh *em,
+                                           BMVert *eve,
+                                           float *weight,
+                                           const struct TransIslandData *island_data,
+                                           const int island_index)
+{
+  BLI_assert(BM_elem_flag_test(eve, BM_ELEM_HIDDEN) == 0);
+
+  td->loc = weight;
+  td->iloc[0] = *weight;
+
+  if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
+    td->flag |= TD_SELECTED;
+  }
+
+  copy_v3_v3(td->center, tc_mesh_cdata_transdata_center(island_data, island_index, eve));
+  td->extra = eve;
+}
+
+void createTransMeshVertCData(TransInfo *t)
+{
+  BLI_assert(ELEM(t->mode, TFM_BWEIGHT, TFM_VERT_CREASE));
+  FOREACH_TRANS_DATA_CONTAINER (t, tc) {
+    BMEditMesh *em = BKE_editmesh_from_object(tc->obedit);
+    Mesh *me = tc->obedit->data;
+    BMesh *bm = em->bm;
+    BMVert *eve;
+    BMIter iter;
+    float mtx[3][3], smtx[3][3];
+    int a;
+    const int prop_mode = (t->flag & T_PROP_EDIT) ? (t->flag & T_PROP_EDIT_ALL) : 0;
+
+    struct TransIslandData island_data = {NULL};
+    struct TransMirrorData mirror_data = {NULL};
+    struct TransMeshDataCrazySpace crazyspace_data = {NULL};
+
+    /* Support other objects using PET to adjust these, unless connected is enabled. */
+    if ((!prop_mode || (prop_mode & T_PROP_CONNECTED)) && (bm->totvertsel == 0)) {
+      continue;
+    }
+
+    int cd_offset = -1;
+    if (t->mode == TFM_BWEIGHT) {
+      BM_mesh_cd_flag_ensure(bm, me, ME_CDFLAG_VERT_BWEIGHT);
+      cd_offset = CustomData_get_offset(&bm->vdata, CD_BWEIGHT);
+    }
+    else {
+      BM_mesh_cd_flag_ensure(bm, me, ME_CDFLAG_VERT_CREASE);
+      cd_offset = CustomData_get_offset(&bm->vdata, CD_CREASE);
+    }
+
+    if (cd_offset == -1) {
+      continue;
+    

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list