Fix T84673: Skin resize operator always using object origin as pivot

The TransData converted to work in Skin Resize had no defined center.

Caused by rB54ee4109143b
This commit is contained in:
Germano Cavalcante 2021-01-15 11:24:11 -03:00
parent 6c840a2cb9
commit c63442d2f2
Notes: blender-bot 2023-02-14 10:04:50 +01:00
Referenced by issue #84673, Skin resize operator is always using object origin as pivot point
1 changed files with 27 additions and 3 deletions

View File

@ -48,7 +48,23 @@
*
* \{ */
static void mesh_skin_transdata_create(TransDataBasic *td, BMEditMesh *em, BMVert *eve)
static float *mesh_skin_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];
}
else {
return eve->co;
}
}
static void mesh_skin_transdata_create(TransDataBasic *td,
BMEditMesh *em,
BMVert *eve,
const struct TransIslandData *island_data,
const int island_index)
{
BLI_assert(BM_elem_flag_test(eve, BM_ELEM_HIDDEN) == 0);
MVertSkin *vs = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MVERT_SKIN);
@ -65,6 +81,7 @@ static void mesh_skin_transdata_create(TransDataBasic *td, BMEditMesh *em, BMVer
td->flag |= TD_SELECTED;
}
copy_v3_v3(td->center, mesh_skin_transdata_center(island_data, island_index, eve));
td->extra = eve;
}
@ -188,8 +205,15 @@ void createTransMeshSkin(TransInfo *t)
continue;
}
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];
}
if (mirror_data.vert_map && mirror_data.vert_map[a].index != -1) {
mesh_skin_transdata_create((TransDataBasic *)td_mirror, em, eve);
mesh_skin_transdata_create(
(TransDataBasic *)td_mirror, em, eve, &island_data, island_index);
int elem_index = mirror_data.vert_map[a].index;
BMVert *v_src = BM_vert_at_index(bm, elem_index);
@ -200,7 +224,7 @@ void createTransMeshSkin(TransInfo *t)
td_mirror++;
}
else if (prop_mode || BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
mesh_skin_transdata_create((TransDataBasic *)td, em, eve);
mesh_skin_transdata_create((TransDataBasic *)td, em, eve, &island_data, island_index);
if (t->around == V3D_AROUND_LOCAL_ORIGINS) {
createSpaceNormal(td->axismtx, eve->no);