GPencil: New Normalize Weights operator
This works similar to mesh operator, but using Stroke and Points data.
This commit is contained in:
@@ -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() */
|
||||
|
@@ -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);
|
||||
|
@@ -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);
|
||||
|
Reference in New Issue
Block a user