[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57667] trunk/blender/source/blender: Added polished Vertex Weights Panel (properties sidebar)

Gaia Clary gaia.clary at machinimatrix.org
Sun Jun 23 17:37:08 CEST 2013


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. @@



More information about the Bf-blender-cvs mailing list