diff options
author | Matt Ebb <matt@mke3.net> | 2009-11-20 08:09:57 +0300 |
---|---|---|
committer | Matt Ebb <matt@mke3.net> | 2009-11-20 08:09:57 +0300 |
commit | cb40583b903c164d35b514ae8d0c4bf225d2d9fb (patch) | |
tree | 3c0957f7cef42313ed65267e9b137551f5cf136a /source/blender | |
parent | e6d382bd5353e526c21d3f3f021560fd58d07c41 (diff) |
* Added a quick little weight group 'Levels' operator, can interactively tweak overall weight value offset and gain in weight paint mode.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/editors/object/object_intern.h | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_ops.c | 1 | ||||
-rw-r--r-- | source/blender/editors/object/object_vgroup.c | 59 |
3 files changed, 61 insertions, 0 deletions
diff --git a/source/blender/editors/object/object_intern.h b/source/blender/editors/object/object_intern.h index 6272d3cd4cf..41d4af60a03 100644 --- a/source/blender/editors/object/object_intern.h +++ b/source/blender/editors/object/object_intern.h @@ -173,6 +173,7 @@ void OBJECT_OT_vertex_group_copy_to_linked(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_copy(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_normalize(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_normalize_all(struct wmOperatorType *ot); +void OBJECT_OT_vertex_group_levels(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_invert(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_blend(struct wmOperatorType *ot); void OBJECT_OT_vertex_group_clean(struct wmOperatorType *ot); diff --git a/source/blender/editors/object/object_ops.c b/source/blender/editors/object/object_ops.c index f74ab0096ad..813d88f9aab 100644 --- a/source/blender/editors/object/object_ops.c +++ b/source/blender/editors/object/object_ops.c @@ -169,6 +169,7 @@ void ED_operatortypes_object(void) WM_operatortype_append(OBJECT_OT_vertex_group_normalize); WM_operatortype_append(OBJECT_OT_vertex_group_normalize_all); WM_operatortype_append(OBJECT_OT_vertex_group_invert); + WM_operatortype_append(OBJECT_OT_vertex_group_levels); WM_operatortype_append(OBJECT_OT_vertex_group_blend); WM_operatortype_append(OBJECT_OT_vertex_group_clean); WM_operatortype_append(OBJECT_OT_vertex_group_menu); diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c index 7152a4de851..14fb91f6690 100644 --- a/source/blender/editors/object/object_vgroup.c +++ b/source/blender/editors/object/object_vgroup.c @@ -28,6 +28,7 @@ */ #include <string.h> +#include <math.h> #include "MEM_guardedalloc.h" @@ -615,6 +616,32 @@ static void vgroup_normalize(Object *ob) } } +static void vgroup_levels(Object *ob, float offset, float gain) +{ + bDeformGroup *dg; + MDeformWeight *dw; + MDeformVert *dvert, *dvert_array=NULL; + int i, def_nr, dvert_tot=0; + + ED_vgroup_give_array(ob->data, &dvert_array, &dvert_tot); + + dg = BLI_findlink(&ob->defbase, (ob->actdef-1)); + + if(dg) { + def_nr= ob->actdef-1; + + for(i = 0; i < dvert_tot; i++) { + dvert = dvert_array+i; + dw = ED_vgroup_weight_get(dvert, def_nr); + if(dw) { + dw->weight = gain * (dw->weight + offset); + + CLAMP(dw->weight, 0.0f, 1.0f); + } + } + } +} + /* TODO - select between groups */ static void vgroup_normalize_all(Object *ob, int lock_active) { @@ -1467,6 +1494,38 @@ void OBJECT_OT_vertex_group_copy(wmOperatorType *ot) ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; } +static int vertex_group_levels_exec(bContext *C, wmOperator *op) +{ + Object *ob= CTX_data_pointer_get_type(C, "object", &RNA_Object).data; + + float offset= RNA_float_get(op->ptr,"offset"); + float gain= RNA_float_get(op->ptr,"gain"); + + vgroup_levels(ob, offset, gain); + + DAG_id_flush_update(&ob->id, OB_RECALC_DATA); + WM_event_add_notifier(C, NC_OBJECT|ND_DRAW, ob); + WM_event_add_notifier(C, NC_GEOM|ND_DATA, ob->data); + + return OPERATOR_FINISHED; +} + +void OBJECT_OT_vertex_group_levels(wmOperatorType *ot) +{ + /* identifiers */ + ot->name= "Vertex Group Levels"; + ot->idname= "OBJECT_OT_vertex_group_levels"; + + /* api callbacks */ + ot->poll= vertex_group_poll; + ot->exec= vertex_group_levels_exec; + + /* flags */ + ot->flag= OPTYPE_REGISTER|OPTYPE_UNDO; + + RNA_def_float(ot->srna, "offset", 0.f, -1.0, 1.0, "Offset", "Value to add to weights.", -1.0f, 1.f); + RNA_def_float(ot->srna, "gain", 1.f, 0.f, FLT_MAX, "Gain", "Value to multiply weights by.", 0.0f, 10.f); +} static int vertex_group_normalize_exec(bContext *C, wmOperator *op) { |