[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