GPencil: New Normalize Weights operator

This works similar to mesh operator, but using Stroke and Points data.
This commit is contained in:
Antonio Vazquez 2019-04-16 10:47:30 +02:00
parent 31c2e69d49
commit a8852ade8a
4 changed files with 68 additions and 0 deletions

View File

@ -4095,6 +4095,9 @@ class VIEW3D_MT_weight_gpencil(Menu):
def draw(self, context):
layout = self.layout
layout.operator("gpencil.vertex_group_normalize", text="Normalize")
layout.separator()
layout.operator("gpencil.vertex_group_invert", text="Invert")
layout.operator("gpencil.vertex_group_smooth", text="Smooth")

View File

@ -1873,6 +1873,69 @@ void GPENCIL_OT_vertex_group_smooth(wmOperatorType *ot)
RNA_def_int(ot->srna, "repeat", 1, 1, 10000, "Iterations", "", 1, 200);
}
/* normalize */
static int gpencil_vertex_group_normalize_exec(bContext *C, wmOperator *UNUSED(op))
{
ToolSettings *ts = CTX_data_tool_settings(C);
Object *ob = CTX_data_active_object(C);
/* sanity checks */
if (ELEM(NULL, ts, ob, ob->data))
return OPERATOR_CANCELLED;
MDeformVert *dvert;
const int def_nr = ob->actdef - 1;
if (!BLI_findlink(&ob->defbase, def_nr))
return OPERATOR_CANCELLED;
CTX_DATA_BEGIN(C, bGPDstroke *, gps, editable_gpencil_strokes)
{
/* look for max value */
float maxvalue = 0.0f;
for (int i = 0; i < gps->totpoints; i++) {
dvert = &gps->dvert[i];
MDeformWeight *dw = defvert_find_index(dvert, def_nr);
if ((dw != NULL) && (dw->weight > maxvalue)) {
maxvalue = dw->weight;
}
}
/* normalize weights */
if (maxvalue > 0.0f) {
for (int i = 0; i < gps->totpoints; i++) {
dvert = &gps->dvert[i];
MDeformWeight *dw = defvert_find_index(dvert, def_nr);
if (dw != NULL) {
dw->weight = dw->weight / maxvalue;
}
}
}
}
CTX_DATA_END;
/* notifiers */
bGPdata *gpd = ob->data;
DEG_id_tag_update(&gpd->id, ID_RECALC_TRANSFORM | ID_RECALC_GEOMETRY);
WM_event_add_notifier(C, NC_GPENCIL | ND_DATA | NA_EDITED | ND_SPACE_PROPERTIES, NULL);
return OPERATOR_FINISHED;
}
void GPENCIL_OT_vertex_group_normalize(wmOperatorType *ot)
{
/* identifiers */
ot->name = "Normalize Vertex Group";
ot->idname = "GPENCIL_OT_vertex_group_normalize";
ot->description = "Normalize weights to the active vertex group";
/* api callbacks */
ot->poll = gpencil_vertex_group_weight_poll;
ot->exec = gpencil_vertex_group_normalize_exec;
/* flags */
ot->flag = OPTYPE_REGISTER | OPTYPE_UNDO;
}
/****************************** Join ***********************************/
/* userdata for joined_gpencil_fix_animdata_cb() */

View File

@ -496,6 +496,7 @@ void GPENCIL_OT_vertex_group_select(struct wmOperatorType *ot);
void GPENCIL_OT_vertex_group_deselect(struct wmOperatorType *ot);
void GPENCIL_OT_vertex_group_invert(struct wmOperatorType *ot);
void GPENCIL_OT_vertex_group_smooth(struct wmOperatorType *ot);
void GPENCIL_OT_vertex_group_normalize(struct wmOperatorType *ot);
/* color handle */
void GPENCIL_OT_lock_layer(struct wmOperatorType *ot);

View File

@ -322,6 +322,7 @@ void ED_operatortypes_gpencil(void)
WM_operatortype_append(GPENCIL_OT_vertex_group_deselect);
WM_operatortype_append(GPENCIL_OT_vertex_group_invert);
WM_operatortype_append(GPENCIL_OT_vertex_group_smooth);
WM_operatortype_append(GPENCIL_OT_vertex_group_normalize);
/* color handle */
WM_operatortype_append(GPENCIL_OT_lock_layer);