Fix T25582: Add a 'smooth factor' to smooth_vertex BMesh op.
Based on code by wahooney (Keith Boshoff), patch itself was merely rewritten due to BMesh changes...
This commit is contained in:
parent
653b67055b
commit
da78dd78be
Notes:
blender-bot
2023-02-14 15:29:48 +01:00
Referenced by issue #25582, Added smoothing factor to vertex smooth operator
|
@ -104,6 +104,7 @@ static BMOpDefine bmo_smooth_vert_def = {
|
|||
"smooth_vert",
|
||||
/* slots_in */
|
||||
{{"verts", BMO_OP_SLOT_ELEMENT_BUF, {BM_VERT}}, /* input vertices */
|
||||
{"smooth_factor", BMO_OP_SLOT_FLT}, /* Smoothing factor, 0.5f to get previous behavior */
|
||||
{"mirror_clip_x", BMO_OP_SLOT_BOOL}, /* set vertices close to the x axis before the operation to 0 */
|
||||
{"mirror_clip_y", BMO_OP_SLOT_BOOL}, /* set vertices close to the y axis before the operation to 0 */
|
||||
{"mirror_clip_z", BMO_OP_SLOT_BOOL}, /* set vertices close to the z axis before the operation to 0 */
|
||||
|
|
|
@ -291,6 +291,7 @@ void bmo_smooth_vert_exec(BMesh *UNUSED(bm), BMOperator *op)
|
|||
BMEdge *e;
|
||||
float (*cos)[3] = MEM_mallocN(sizeof(*cos) * BMO_slot_buffer_count(op->slots_in, "verts"), __func__);
|
||||
float *co, *co2, clip_dist = BMO_slot_float_get(op->slots_in, "clip_dist");
|
||||
float fac = BMO_slot_float_get(op->slots_in, "smooth_factor");
|
||||
int i, j, clipx, clipy, clipz;
|
||||
int xaxis, yaxis, zaxis;
|
||||
|
||||
|
@ -322,7 +323,7 @@ void bmo_smooth_vert_exec(BMesh *UNUSED(bm), BMOperator *op)
|
|||
}
|
||||
|
||||
mul_v3_fl(co, 1.0f / (float)j);
|
||||
mid_v3_v3v3(co, co, v->co);
|
||||
interp_v3_v3v3(co, v->co, co, fac);
|
||||
|
||||
if (clipx && fabsf(v->co[0]) <= clip_dist)
|
||||
co[0] = 0.0f;
|
||||
|
|
|
@ -1288,6 +1288,7 @@ static int edbm_do_smooth_vertex_exec(bContext *C, wmOperator *op)
|
|||
bool mirrx = false, mirry = false, mirrz = false;
|
||||
int i, repeat;
|
||||
float clip_dist = 0.0f;
|
||||
float smooth_fac;
|
||||
bool use_topology = (me->editflag & ME_EDIT_MIRROR_TOPO) != 0;
|
||||
|
||||
const bool xaxis = RNA_boolean_get(op->ptr, "xaxis");
|
||||
|
@ -1322,12 +1323,14 @@ static int edbm_do_smooth_vertex_exec(bContext *C, wmOperator *op)
|
|||
repeat = RNA_int_get(op->ptr, "repeat");
|
||||
if (!repeat)
|
||||
repeat = 1;
|
||||
|
||||
|
||||
smooth_fac = RNA_float_get(op->ptr, "smooth_factor");
|
||||
|
||||
for (i = 0; i < repeat; i++) {
|
||||
if (!EDBM_op_callf(em, op,
|
||||
"smooth_vert verts=%hv mirror_clip_x=%b mirror_clip_y=%b mirror_clip_z=%b clip_dist=%f "
|
||||
"use_axis_x=%b use_axis_y=%b use_axis_z=%b",
|
||||
BM_ELEM_SELECT, mirrx, mirry, mirrz, clip_dist, xaxis, yaxis, zaxis))
|
||||
"smooth_vert verts=%hv smooth_factor=%f mirror_clip_x=%b mirror_clip_y=%b mirror_clip_z=%b "
|
||||
"clip_dist=%f use_axis_x=%b use_axis_y=%b use_axis_z=%b",
|
||||
BM_ELEM_SELECT, smooth_fac, mirrx, mirry, mirrz, clip_dist, xaxis, yaxis, zaxis))
|
||||
{
|
||||
return OPERATOR_CANCELLED;
|
||||
}
|
||||
|
@ -1358,7 +1361,8 @@ void MESH_OT_vertices_smooth(wmOperatorType *ot)
|
|||
/* flags */
|
||||
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
|
||||
|
||||
RNA_def_int(ot->srna, "repeat", 1, 1, 1000, "Number of times to smooth the mesh", "", 1, 100);
|
||||
RNA_def_float(ot->srna, "smooth_factor", 0.5f, 0.0f, 1.0f, "Smoothing", "Smoothing factor", 0.0f, 1.0f);
|
||||
RNA_def_int(ot->srna, "repeat", 1, 1, 1000, "Repeat", "Number of times to smooth the mesh", 1, 100);
|
||||
RNA_def_boolean(ot->srna, "xaxis", 1, "X-Axis", "Smooth along the X axis");
|
||||
RNA_def_boolean(ot->srna, "yaxis", 1, "Y-Axis", "Smooth along the Y axis");
|
||||
RNA_def_boolean(ot->srna, "zaxis", 1, "Z-Axis", "Smooth along the Z axis");
|
||||
|
|
Loading…
Reference in New Issue