[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