Revision: 57667
          
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57667
Author:   gaiaclary
Date:     2013-06-23 15:37:08 +0000 (Sun, 23 Jun 2013)
Log Message:
-----------
Added polished Vertex Weights Panel (properties sidebar)

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_deform.h
    trunk/blender/source/blender/blenkernel/intern/deform.c
    trunk/blender/source/blender/editors/include/ED_mesh.h
    trunk/blender/source/blender/editors/include/ED_object.h
    trunk/blender/source/blender/editors/object/object_intern.h
    trunk/blender/source/blender/editors/object/object_ops.c
    trunk/blender/source/blender/editors/object/object_vgroup.c
    trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
    trunk/blender/source/blender/makesdna/DNA_scene_types.h
    trunk/blender/source/blender/makesrna/intern/rna_scene.c

Modified: trunk/blender/source/blender/blenkernel/BKE_deform.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_deform.h        2013-06-23 
15:12:26 UTC (rev 57666)
+++ trunk/blender/source/blender/blenkernel/BKE_deform.h        2013-06-23 
15:37:08 UTC (rev 57667)
@@ -65,6 +65,8 @@
 float  defvert_array_find_weight_safe(const struct MDeformVert *dvert, const 
int index, const int defgroup);
 
 void defvert_copy(struct MDeformVert *dvert_dst, const struct MDeformVert 
*dvert_src);
+void defvert_copy_subset(struct MDeformVert *dvert_dst, const struct 
MDeformVert *dvert_src,
+                         const bool *vgroup_subset, const int vgroup_tot);
 void defvert_copy_index(struct MDeformVert *dvert_dst, const struct 
MDeformVert *dvert_src, const int defgroup);
 void defvert_sync(struct MDeformVert *dvert_dst, const struct MDeformVert 
*dvert_src, const bool use_verify);
 void defvert_sync_mapped(struct MDeformVert *dvert_dst, const struct 
MDeformVert *dvert_src,
@@ -73,6 +75,8 @@
 void defvert_flip(struct MDeformVert *dvert, const int *flip_map, const int 
flip_map_len);
 void defvert_flip_merged(struct MDeformVert *dvert, const int *flip_map, const 
int flip_map_len);
 void defvert_normalize(struct MDeformVert *dvert);
+void defvert_normalize_subset(struct MDeformVert *dvert,
+                              const bool *vgroup_subset, const int vgroup_tot);
 void defvert_normalize_lock_single(struct MDeformVert *dvert, const int 
def_nr_lock);
 void defvert_normalize_lock_map(struct MDeformVert *dvert, const bool 
*lock_flags, const int defbase_tot);
 

Modified: trunk/blender/source/blender/blenkernel/intern/deform.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/deform.c     2013-06-23 
15:12:26 UTC (rev 57666)
+++ trunk/blender/source/blender/blenkernel/intern/deform.c     2013-06-23 
15:37:08 UTC (rev 57667)
@@ -80,7 +80,21 @@
        return outgroup;
 }
 
-/* copy & overwrite weights */
+/* overwrite weights filtered by vgroup_subset
+ * - do nothing if neither are set.
+ * - add destination weight if needed
+ */
+void defvert_copy_subset(MDeformVert *dvert_dst, const MDeformVert *dvert_src,
+                         const bool *vgroup_subset, const int vgroup_tot)
+{
+       int defgroup;
+       for (defgroup=0; defgroup < vgroup_tot; defgroup++) {
+               if (vgroup_subset[defgroup]) {
+                       defvert_copy_index(dvert_dst, dvert_src, defgroup);
+               }
+       }
+}
+
 void defvert_copy(MDeformVert *dvert_dst, const MDeformVert *dvert_src)
 {
        if (dvert_dst->totweight == dvert_src->totweight) {
@@ -181,6 +195,35 @@
        }
 }
 
+/**
+ * Same as #defvert_normalize but takes a bool array.
+ */
+void defvert_normalize_subset(MDeformVert *dvert,
+                              const bool *vgroup_subset, const int vgroup_tot)
+{
+       MDeformWeight *dw;
+       unsigned int i;
+       float tot_weight = 0.0f;
+
+       for (i = dvert->totweight, dw = dvert->dw; i != 0; i--, dw++) {
+               if ((dw->def_nr < vgroup_tot) && vgroup_subset[dw->def_nr]) {
+                       tot_weight += dw->weight;
+               }
+       }
+
+       if (tot_weight > 0.0f) {
+               float scalar = 1.0f / tot_weight;
+               for (i = dvert->totweight, dw = dvert->dw; i != 0; i--, dw++) {
+                       if ((dw->def_nr < vgroup_tot) && 
vgroup_subset[dw->def_nr]) {
+                               dw->weight *= scalar;
+                               
+                               /* in case of division errors with very low 
weights */
+                               CLAMP(dw->weight, 0.0f, 1.0f);
+                       }
+               }
+       }
+}
+
 void defvert_normalize(MDeformVert *dvert)
 {
        if (dvert->totweight <= 0) {

Modified: trunk/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_mesh.h      2013-06-23 
15:12:26 UTC (rev 57666)
+++ trunk/blender/source/blender/editors/include/ED_mesh.h      2013-06-23 
15:37:08 UTC (rev 57667)
@@ -250,6 +250,7 @@
 void                 ED_vgroup_vert_add(struct Object *ob, struct bDeformGroup 
*dg, int vertnum,  float weight, int assignmode);
 void                 ED_vgroup_vert_remove(struct Object *ob, struct 
bDeformGroup *dg, int vertnum);
 float                ED_vgroup_vert_weight(struct Object *ob, struct 
bDeformGroup *dg, int vertnum);
+void                 ED_vgroup_vert_active_mirror(struct Object *ob, int 
def_nr);
 
 
 /* mesh_data.c */

Modified: trunk/blender/source/blender/editors/include/ED_object.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_object.h    2013-06-23 
15:12:26 UTC (rev 57666)
+++ trunk/blender/source/blender/editors/include/ED_object.h    2013-06-23 
15:37:08 UTC (rev 57667)
@@ -65,7 +65,12 @@
 struct wmKeyMap;
 struct wmOperator;
 struct wmOperatorType;
+struct PointerRNA;
+struct PropertyRNA;
+struct EnumPropertyItem;
 
+enum eVGroupSelect;
+
 /* object_edit.c */
 struct Object *ED_object_context(struct bContext *C);               /* 
context.object */
 struct Object *ED_object_active_context(struct bContext *C); /* context.object 
or context.active_object */
@@ -200,21 +205,16 @@
 /* object_select.c */
 void ED_object_select_linked_by_id(struct bContext *C, struct ID *id);
 
-/* object_vgroup.c */
-typedef enum eVGroupSelect {
-       WT_VGROUP_ACTIVE = 1,
-       WT_VGROUP_BONE_SELECT = 2,
-       WT_VGROUP_BONE_DEFORM = 3,
-       WT_VGROUP_ALL = 4,
-} eVGroupSelect;
 
-#define WT_VGROUP_MASK_ALL \
-       ((1 << WT_VGROUP_ACTIVE) | \
-        (1 << WT_VGROUP_BONE_SELECT) | \
-        (1 << WT_VGROUP_BONE_DEFORM) | \
-        (1 << WT_VGROUP_ALL))
+bool *ED_vgroup_subset_from_select_type(struct Object *ob, enum eVGroupSelect 
subset_type,
+                                        int *r_vgroup_tot, int 
*r_subset_count);
 
-bool *ED_vgroup_subset_from_select_type(struct Object *ob, eVGroupSelect 
subset_type, int *r_vgroup_tot, int *r_subset_count);
+struct EnumPropertyItem *ED_object_vgroup_selection_itemf_helper(
+        const struct bContext *C,
+        struct PointerRNA *ptr,
+        struct PropertyRNA *prop,
+        int *free,
+        const unsigned int selection_mask);
 
 #ifdef __cplusplus
 }

Modified: trunk/blender/source/blender/editors/object/object_intern.h
===================================================================
--- trunk/blender/source/blender/editors/object/object_intern.h 2013-06-23 
15:12:26 UTC (rev 57666)
+++ trunk/blender/source/blender/editors/object/object_intern.h 2013-06-23 
15:37:08 UTC (rev 57667)
@@ -223,6 +223,11 @@
 void OBJECT_OT_vertex_group_set_active(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_sort(struct wmOperatorType *ot);
 void OBJECT_OT_vertex_group_move(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_weight_paste(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_weight_delete(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_weight_set_active(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_weight_normalize_active(struct wmOperatorType *ot);
+void OBJECT_OT_vertex_weight_copy(struct wmOperatorType *ot);
 
 /* object_shapekey.c */
 void OBJECT_OT_shape_key_add(struct wmOperatorType *ot);

Modified: trunk/blender/source/blender/editors/object/object_ops.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_ops.c    2013-06-23 
15:12:26 UTC (rev 57666)
+++ trunk/blender/source/blender/editors/object/object_ops.c    2013-06-23 
15:37:08 UTC (rev 57667)
@@ -195,6 +195,11 @@
        WM_operatortype_append(OBJECT_OT_vertex_group_set_active);
        WM_operatortype_append(OBJECT_OT_vertex_group_sort);
        WM_operatortype_append(OBJECT_OT_vertex_group_move);
+       WM_operatortype_append(OBJECT_OT_vertex_weight_paste);
+       WM_operatortype_append(OBJECT_OT_vertex_weight_delete);
+       WM_operatortype_append(OBJECT_OT_vertex_weight_set_active);
+       WM_operatortype_append(OBJECT_OT_vertex_weight_normalize_active);
+       WM_operatortype_append(OBJECT_OT_vertex_weight_copy);
 
        WM_operatortype_append(OBJECT_OT_game_property_new);
        WM_operatortype_append(OBJECT_OT_game_property_remove);

Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c 2013-06-23 
15:12:26 UTC (rev 57666)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c 2013-06-23 
15:37:08 UTC (rev 57667)
@@ -411,6 +411,239 @@
        return true;
 }
 
+static MDeformVert *ED_mesh_active_dvert_get_em(Object *ob, BMVert **r_eve)
+{
+       if (ob->mode & OB_MODE_EDIT && ob->type == OB_MESH && 
ob->defbase.first) {
+               Mesh *me = ob->data;
+               BMEditMesh *em = me->edit_btmesh;
+               const int cd_dvert_offset = 
CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
+
+               if (cd_dvert_offset != -1) {
+                       BMEditSelection *ese = (BMEditSelection 
*)em->bm->selected.last;
+
+                       if (ese && ese->htype == BM_VERT) {
+                               BMVert *eve = (BMVert *)ese->ele;
+                               if (r_eve) *r_eve = eve;
+                               return BM_ELEM_CD_GET_VOID_P(eve, 
cd_dvert_offset);
+                       }
+               }
+       }
+
+       if (r_eve) *r_eve = NULL;
+       return NULL;
+}
+
+/* TODO, cache flip data to speedup calls within a loop. */
+static void mesh_defvert_mirror_update_internal(Object *ob,
+                                                MDeformVert *dvert_dst, 
MDeformVert *dvert_src,
+                                                const int def_nr)
+{
+       if (def_nr == -1) {
+               /* all vgroups, add groups where neded  */
+               int flip_map_len;
+               int *flip_map = defgroup_flip_map(ob, &flip_map_len, true);
+               defvert_sync_mapped(dvert_dst, dvert_src, flip_map, 
flip_map_len, true);
+               MEM_freeN(flip_map);
+       }
+       else {
+               /* single vgroup */
+               MDeformWeight *dw = defvert_verify_index(dvert_dst, 
defgroup_flip_index(ob, def_nr, 1));
+               if (dw) {
+                       dw->weight = defvert_find_weight(dvert_src, def_nr);
+               }
+       }
+}
+
+static MDeformVert *ED_mesh_active_dvert_get_ob(Object *ob, int *r_index)
+{
+       Mesh *me = ob->data;
+       int index = BKE_mesh_mselect_active_get(me, ME_VSEL);
+       if (r_index) *r_index = index;
+       if (index == -1 || me->dvert == NULL) {
+               return NULL;
+       }
+       else {
+               return me->dvert + index;
+       }
+}
+
+static void ED_mesh_defvert_mirror_update_em(Object *ob, BMVert *eve, int 
def_nr, int vidx,
+                                             const int cd_dvert_offset)
+{
+       Mesh *me = ob->data;
+       BMEditMesh *em = me->edit_btmesh;
+       BMVert *eve_mirr;
+
+       eve_mirr = editbmesh_get_x_mirror_vert(ob, em, eve, eve->co, vidx);
+
+       if (eve_mirr && eve_mirr != eve) {
+               MDeformVert *dvert_src = BM_ELEM_CD_GET_VOID_P(eve, 
cd_dvert_offset);

@@ Diff output truncated at 10240 characters. @@
_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to