From a8852ade8aa65cc591d1fa20d732bb766aefe60a Mon Sep 17 00:00:00 2001 From: Antonioya Date: Tue, 16 Apr 2019 10:47:30 +0200 Subject: GPencil: New Normalize Weights operator This works similar to mesh operator, but using Stroke and Points data. --- source/blender/editors/gpencil/gpencil_data.c | 63 +++++++++++++++++++++++++ source/blender/editors/gpencil/gpencil_intern.h | 1 + source/blender/editors/gpencil/gpencil_ops.c | 1 + 3 files changed, 65 insertions(+) (limited to 'source/blender/editors') diff --git a/source/blender/editors/gpencil/gpencil_data.c b/source/blender/editors/gpencil/gpencil_data.c index 710e8a9bc1c..81da4ab8bc9 100644 --- a/source/blender/editors/gpencil/gpencil_data.c +++ b/source/blender/editors/gpencil/gpencil_data.c @@ -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() */ diff --git a/source/blender/editors/gpencil/gpencil_intern.h b/source/blender/editors/gpencil/gpencil_intern.h index aa47319e3d9..84b45593244 100644 --- a/source/blender/editors/gpencil/gpencil_intern.h +++ b/source/blender/editors/gpencil/gpencil_intern.h @@ -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); diff --git a/source/blender/editors/gpencil/gpencil_ops.c b/source/blender/editors/gpencil/gpencil_ops.c index c01da39bcd8..28f13ef0277 100644 --- a/source/blender/editors/gpencil/gpencil_ops.c +++ b/source/blender/editors/gpencil/gpencil_ops.c @@ -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); -- cgit v1.2.3