GPencil: New Normalize Weights operator
authorAntonioya <blendergit@gmail.com>
Tue, 16 Apr 2019 08:47:30 +0000 (10:47 +0200)
committerAntonioya <blendergit@gmail.com>
Tue, 16 Apr 2019 11:09:58 +0000 (13:09 +0200)
This works similar to mesh operator, but using Stroke and Points data.

release/scripts/startup/bl_ui/space_view3d.py
source/blender/editors/gpencil/gpencil_data.c
source/blender/editors/gpencil/gpencil_intern.h
source/blender/editors/gpencil/gpencil_ops.c

index 3099888..eaadf35 100644 (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")
 
index 710e8a9..81da4ab 100644 (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() */
index aa47319..84b4559 100644 (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);
index c01da39..28f13ef 100644 (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);