[Bf-blender-cvs] [3b761901b6d] master: Fix T103783: crash when canceling vertex crease having vertex groups

Germano Cavalcante noreply at git.blender.org
Wed Jan 11 15:52:58 CET 2023


Commit: 3b761901b6d6d5c089a89d0df9d8d12fd7f8e368
Author: Germano Cavalcante
Date:   Wed Jan 11 11:50:45 2023 -0300
Branches: master
https://developer.blender.org/rB3b761901b6d6d5c089a89d0df9d8d12fd7f8e368

Fix T103783: crash when canceling vertex crease having vertex groups

`transdata_restore_basic` uses `copy_v3_v3` to restore a pointer that is 1D.

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

M	source/blender/editors/transform/transform_convert_mesh_vert_cdata.c
M	source/blender/editors/transform/transform_data.h
M	source/blender/editors/transform/transform_generics.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/transform_convert_mesh_vert_cdata.c b/source/blender/editors/transform/transform_convert_mesh_vert_cdata.c
index 6145962acbf..0d29892cd5e 100644
--- a/source/blender/editors/transform/transform_convert_mesh_vert_cdata.c
+++ b/source/blender/editors/transform/transform_convert_mesh_vert_cdata.c
@@ -49,8 +49,8 @@ static void tc_mesh_cdata_transdata_create(TransDataBasic *td,
 {
   BLI_assert(BM_elem_flag_test(eve, BM_ELEM_HIDDEN) == 0);
 
-  td->loc = weight;
-  td->iloc[0] = *weight;
+  td->val = weight;
+  td->ival = *weight;
 
   if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
     td->flag |= TD_SELECTED;
@@ -268,7 +268,7 @@ static void tc_mesh_cdata_apply_to_mirror(TransInfo *t)
     if (tc->use_mirror_axis_any) {
       TransDataMirror *td_mirror = tc->data_mirror;
       for (int i = 0; i < tc->data_mirror_len; i++, td_mirror++) {
-        td_mirror->loc[0] = td_mirror->loc_src[0];
+        *td_mirror->val = td_mirror->loc_src[0];
       }
     }
   }
diff --git a/source/blender/editors/transform/transform_data.h b/source/blender/editors/transform/transform_data.h
index 195fab93f72..2518fef3b39 100644
--- a/source/blender/editors/transform/transform_data.h
+++ b/source/blender/editors/transform/transform_data.h
@@ -20,6 +20,10 @@ struct bConstraint;
   float iloc[3]; \
   /** Individual data center. */ \
   float center[3]; \
+  /** Value pointer for special transforms. */ \
+  float *val; \
+  /** Old value. */ \
+  float ival; \
   /** Various flags. */ \
   int flag
 
@@ -114,10 +118,6 @@ typedef struct TransData {
   float rdist;
   /** Factor of the transformation (for Proportional Editing). */
   float factor;
-  /** Value pointer for special transforms. */
-  float *val;
-  /** Old value. */
-  float ival;
   /** Transformation matrix from data space to global space. */
   float mtx[3][3];
   /** Transformation matrix from global space to data space. */
diff --git a/source/blender/editors/transform/transform_generics.c b/source/blender/editors/transform/transform_generics.c
index 449a53573e6..5d3e326d8b0 100644
--- a/source/blender/editors/transform/transform_generics.c
+++ b/source/blender/editors/transform/transform_generics.c
@@ -815,16 +815,16 @@ static void transdata_restore_basic(TransDataBasic *td_basic)
   if (td_basic->loc) {
     copy_v3_v3(td_basic->loc, td_basic->iloc);
   }
+
+  if (td_basic->val && td_basic->val != td_basic->loc) {
+    *td_basic->val = td_basic->ival;
+  }
 }
 
 static void restoreElement(TransData *td)
 {
   transdata_restore_basic((TransDataBasic *)td);
 
-  if (td->val && td->val != td->loc) {
-    *td->val = td->ival;
-  }
-
   if (td->ext && (td->flag & TD_NO_EXT) == 0) {
     if (td->ext->rot) {
       copy_v3_v3(td->ext->rot, td->ext->irot);
diff --git a/source/blender/editors/transform/transform_mode_edge_bevelweight.c b/source/blender/editors/transform/transform_mode_edge_bevelweight.c
index e96e74b596c..c46eee5eb56 100644
--- a/source/blender/editors/transform/transform_mode_edge_bevelweight.c
+++ b/source/blender/editors/transform/transform_mode_edge_bevelweight.c
@@ -44,11 +44,11 @@ static void transdata_elem_bevel_weight(const TransInfo *UNUSED(t),
                                         TransData *td,
                                         const float weight)
 {
-  if (td->loc == NULL) {
+  if (td->val == NULL) {
     return;
   }
-  *td->loc = td->iloc[0] + weight * td->factor;
-  CLAMP(*td->loc, 0.0f, 1.0f);
+  *td->val = td->ival + weight * td->factor;
+  CLAMP(*td->val, 0.0f, 1.0f);
 }
 
 static void transdata_elem_bevel_weight_fn(void *__restrict iter_data_v,
diff --git a/source/blender/editors/transform/transform_mode_edge_crease.c b/source/blender/editors/transform/transform_mode_edge_crease.c
index 1a3ccf30387..2ced57860c5 100644
--- a/source/blender/editors/transform/transform_mode_edge_crease.c
+++ b/source/blender/editors/transform/transform_mode_edge_crease.c
@@ -44,12 +44,12 @@ static void transdata_elem_crease(const TransInfo *UNUSED(t),
                                   TransData *td,
                                   const float crease)
 {
-  if (td->loc == NULL) {
+  if (td->val == NULL) {
     return;
   }
 
-  *td->loc = td->iloc[0] + crease * td->factor;
-  CLAMP(*td->loc, 0.0f, 1.0f);
+  *td->val = td->ival + crease * td->factor;
+  CLAMP(*td->val, 0.0f, 1.0f);
 }
 
 static void transdata_elem_crease_fn(void *__restrict iter_data_v,



More information about the Bf-blender-cvs mailing list