BMesh: add use_shapekey to BMesh transform operators

Currently unused, needed for symmetrize to support shape keys.
This commit is contained in:
Campbell Barton 2021-01-05 15:42:04 +11:00
parent 5370a7dd40
commit 4150facd61
4 changed files with 66 additions and 9 deletions

View File

@ -326,6 +326,7 @@ static BMOpDefine bmo_mirror_def = {
{"mirror_u", BMO_OP_SLOT_BOOL}, /* mirror UVs across the u axis */
{"mirror_v", BMO_OP_SLOT_BOOL}, /* mirror UVs across the v axis */
{"mirror_udim", BMO_OP_SLOT_BOOL}, /* mirror UVs in each tile */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
/* slots_out */
@ -758,6 +759,7 @@ static BMOpDefine bmo_rotate_def = {
{"matrix", BMO_OP_SLOT_MAT}, /* matrix defining rotation */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"space", BMO_OP_SLOT_MAT}, /* matrix to define the space (typically object matrix) */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
@ -776,6 +778,7 @@ static BMOpDefine bmo_translate_def = {
{{"vec", BMO_OP_SLOT_VEC}, /* translation offset */
{"space", BMO_OP_SLOT_MAT}, /* matrix to define the space (typically object matrix) */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
@ -794,6 +797,7 @@ static BMOpDefine bmo_scale_def = {
{{"vec", BMO_OP_SLOT_VEC}, /* scale factor */
{"space", BMO_OP_SLOT_MAT}, /* matrix to define the space (typically object matrix) */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
@ -814,6 +818,7 @@ static BMOpDefine bmo_transform_def = {
{{"matrix", BMO_OP_SLOT_MAT}, /* transform matrix */
{"space", BMO_OP_SLOT_MAT}, /* matrix to define the space (typically object matrix) */
{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
{{{'\0'}}}, /* no output */
@ -2072,6 +2077,7 @@ static BMOpDefine bmo_symmetrize_def = {
{{"input", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT | BM_EDGE | BM_FACE}}, /* input geometry */
{"direction", BMO_OP_SLOT_INT, {(int)BMO_OP_SLOT_SUBTYPE_INT_ENUM}, bmo_enum_axis_neg_xyz_and_xyz}, /* axis to use */
{"dist", BMO_OP_SLOT_FLT}, /* minimum distance */
{"use_shapekey", BMO_OP_SLOT_BOOL}, /* Transform shape keys too. */
{{'\0'}},
},
/* slots_out */

View File

@ -55,7 +55,15 @@ void bmo_mirror_exec(BMesh *bm, BMOperator *op)
/* feed old data to transform bmo */
scale[axis] = -1.0f;
BMO_op_callf(bm, op->flag, "scale verts=%fv vec=%v space=%s", ELE_NEW, scale, op, "matrix");
BMO_op_callf(bm,
op->flag,
"scale verts=%fv vec=%v space=%s use_shapekey=%s",
ELE_NEW,
scale,
op,
"matrix",
op,
"use_shapekey");
BMO_op_init(bm, &weldop, op->flag, "weld_verts");

View File

@ -76,7 +76,14 @@ void bmo_symmetrize_exec(BMesh *bm, BMOperator *op)
BMO_slot_buffer_flag_enable(bm, op_bisect.slots_out, "geom.out", BM_ALL_NOLOOP, ELE_OUT);
BMO_slot_buffer_flag_enable(bm, op_dupe.slots_out, "geom.out", BM_ALL_NOLOOP, ELE_OUT);
BMO_op_callf(bm, op->flag, "scale verts=%S vec=%v", &op_dupe, "geom.out", scale);
BMO_op_callf(bm,
op->flag,
"scale verts=%S vec=%v use_shapekey=%s",
&op_dupe,
"geom.out",
scale,
op,
"use_shapekey");
/* important 'flip_multires' is disabled,
* otherwise multi-res data will be reversed, see: T47788 */

View File

@ -46,12 +46,17 @@ void bmo_create_vert_exec(BMesh *bm, BMOperator *op)
BMO_slot_buffer_from_enabled_flag(bm, op, op->slots_out, "vert.out", BM_VERT, ELE_NEW);
}
void bmo_transform_exec(BMesh *UNUSED(bm), BMOperator *op)
void bmo_transform_exec(BMesh *bm, BMOperator *op)
{
BMOIter iter;
BMVert *v;
float mat[4][4], mat_space[4][4], imat_space[4][4];
const uint shape_keys_len = BMO_slot_bool_get(op->slots_in, "use_shapekey") ?
CustomData_number_of_layers(&bm->vdata, CD_SHAPEKEY) :
0;
const uint cd_shape_key_offset = CustomData_get_offset(&bm->vdata, CD_SHAPEKEY);
BMO_slot_mat4_get(op->slots_in, "matrix", mat);
BMO_slot_mat4_get(op->slots_in, "space", mat_space);
@ -62,6 +67,13 @@ void bmo_transform_exec(BMesh *UNUSED(bm), BMOperator *op)
BMO_ITER (v, &iter, op->slots_in, "verts", BM_VERT) {
mul_m4_v3(mat, v->co);
if (shape_keys_len != 0) {
float(*co_dst)[3] = BM_ELEM_CD_GET_VOID_P(v, cd_shape_key_offset);
for (int i = 0; i < shape_keys_len; i++, co_dst++) {
mul_m4_v3(mat, *co_dst);
}
}
}
}
@ -74,8 +86,16 @@ void bmo_translate_exec(BMesh *bm, BMOperator *op)
unit_m4(mat);
copy_v3_v3(mat[3], vec);
BMO_op_callf(
bm, op->flag, "transform matrix=%m4 space=%s verts=%s", mat, op, "space", op, "verts");
BMO_op_callf(bm,
op->flag,
"transform matrix=%m4 space=%s verts=%s use_shapekey=%s",
mat,
op,
"space",
op,
"verts",
op,
"use_shapekey");
}
void bmo_scale_exec(BMesh *bm, BMOperator *op)
@ -89,8 +109,16 @@ void bmo_scale_exec(BMesh *bm, BMOperator *op)
mat[1][1] = vec[1];
mat[2][2] = vec[2];
BMO_op_callf(
bm, op->flag, "transform matrix=%m3 space=%s verts=%s", mat, op, "space", op, "verts");
BMO_op_callf(bm,
op->flag,
"transform matrix=%m3 space=%s verts=%s use_shapekey=%s",
mat,
op,
"space",
op,
"verts",
op,
"use_shapekey");
}
void bmo_rotate_exec(BMesh *bm, BMOperator *op)
@ -102,8 +130,16 @@ void bmo_rotate_exec(BMesh *bm, BMOperator *op)
BMO_slot_mat4_get(op->slots_in, "matrix", mat);
transform_pivot_set_m4(mat, center);
BMO_op_callf(
bm, op->flag, "transform matrix=%m4 space=%s verts=%s", mat, op, "space", op, "verts");
BMO_op_callf(bm,
op->flag,
"transform matrix=%m4 space=%s verts=%s use_shapekey=%s",
mat,
op,
"space",
op,
"verts",
op,
"use_shapekey");
}
void bmo_reverse_faces_exec(BMesh *bm, BMOperator *op)