Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2013-05-27 16:42:48 +0400
committerCampbell Barton <ideasman42@gmail.com>2013-05-27 16:42:48 +0400
commit083115c5e790d5c6e87a7a4a42daea70da1ded1b (patch)
tree75314e71ff24b7de4a8508e76662b3afbc3e5ddf /source/blender
parente51ee75e826846d44dcbb7028ee44e8f3e7b6858 (diff)
bmesh optimization: use offsets for deform-vert lookups to avoid customdata layer lookups within loops.
Diffstat (limited to 'source/blender')
-rw-r--r--source/blender/blenkernel/intern/editderivedmesh.c16
-rw-r--r--source/blender/blenkernel/intern/key.c8
-rw-r--r--source/blender/bmesh/operators/bmo_similar.c9
-rw-r--r--source/blender/editors/mesh/editmesh_select.c7
-rw-r--r--source/blender/editors/object/object_hook.c29
-rw-r--r--source/blender/editors/object/object_vgroup.c80
-rw-r--r--source/blender/editors/space_view3d/view3d_buttons.c55
7 files changed, 120 insertions, 84 deletions
diff --git a/source/blender/blenkernel/intern/editderivedmesh.c b/source/blender/blenkernel/intern/editderivedmesh.c
index 13ee9328cf6..794e6481d34 100644
--- a/source/blender/blenkernel/intern/editderivedmesh.c
+++ b/source/blender/blenkernel/intern/editderivedmesh.c
@@ -1428,6 +1428,8 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em,
{
EditDerivedBMesh *bmdm = MEM_callocN(sizeof(*bmdm), __func__);
BMesh *bm = em->bm;
+ const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
+ const int cd_skin_offset = CustomData_get_offset(&bm->vdata, CD_MVERT_SKIN);
bmdm->em = em;
@@ -1485,7 +1487,7 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em,
bmdm->vertexCos = vertexCos;
- if (CustomData_has_layer(&bm->vdata, CD_MDEFORMVERT)) {
+ if (cd_dvert_offset != -1) {
BMIter iter;
BMVert *eve;
int i;
@@ -1494,11 +1496,11 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em,
BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
DM_set_vert_data(&bmdm->dm, i, CD_MDEFORMVERT,
- CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_MDEFORMVERT));
+ BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset));
}
}
- if (CustomData_has_layer(&bm->vdata, CD_MVERT_SKIN)) {
+ if (cd_skin_offset != -1) {
BMIter iter;
BMVert *eve;
int i;
@@ -1507,8 +1509,7 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em,
BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
DM_set_vert_data(&bmdm->dm, i, CD_MVERT_SKIN,
- CustomData_bmesh_get(&bm->vdata, eve->head.data,
- CD_MVERT_SKIN));
+ BM_ELEM_CD_GET_VOID_P(eve, cd_skin_offset));
}
}
@@ -1538,9 +1539,8 @@ DerivedMesh *getEditDerivedBMesh(BMEditMesh *em,
/* following Mesh convention; we use vertex coordinate itself
* for normal in this case */
- if (normalize_v3(no) == 0.0f) {
- copy_v3_v3(no, vertexCos[i]);
- normalize_v3(no);
+ if (UNLIKELY(normalize_v3(no) == 0.0f)) {
+ normalize_v3_v3(no, vertexCos[i]);
}
}
}
diff --git a/source/blender/blenkernel/intern/key.c b/source/blender/blenkernel/intern/key.c
index 74bf36adc6e..dfa5fcff94c 100644
--- a/source/blender/blenkernel/intern/key.c
+++ b/source/blender/blenkernel/intern/key.c
@@ -1067,12 +1067,10 @@ static float *get_weights_array(Object *ob, char *vgroup)
weights = MEM_callocN(totvert * sizeof(float), "weights");
if (em) {
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
BM_ITER_MESH_INDEX (eve, &iter, em->bm, BM_VERTS_OF_MESH, i) {
- dvert = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
-
- if (dvert) {
- weights[i] = defvert_find_weight(dvert, defgrp_index);
- }
+ dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
+ weights[i] = defvert_find_weight(dvert, defgrp_index);
}
}
else {
diff --git a/source/blender/bmesh/operators/bmo_similar.c b/source/blender/bmesh/operators/bmo_similar.c
index 5bea47969da..b02f9cdfaa6 100644
--- a/source/blender/bmesh/operators/bmo_similar.c
+++ b/source/blender/bmesh/operators/bmo_similar.c
@@ -530,6 +530,7 @@ void bmo_similar_verts_exec(BMesh *bm, BMOperator *op)
{
#define VERT_MARK 1
+ const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
BMOIter vs_iter; /* selected verts iterator */
BMIter v_iter; /* mesh verts iterator */
BMVert *vs; /* selected vertex */
@@ -573,13 +574,9 @@ void bmo_similar_verts_exec(BMesh *bm, BMOperator *op)
break;
case SIMVERT_VGROUP:
- if (CustomData_has_layer(&(bm->vdata), CD_MDEFORMVERT)) {
- v_ext[i].dvert = CustomData_bmesh_get(&bm->vdata, v_ext[i].v->head.data, CD_MDEFORMVERT);
- }
- else {
- v_ext[i].dvert = NULL;
- }
+ v_ext[i].dvert = (cd_dvert_offset != -1) ? BM_ELEM_CD_GET_VOID_P(v_ext[i].v, cd_dvert_offset) : NULL;
break;
+
case SIMVERT_EDGE:
v_ext[i].num_edges = BM_vert_edge_count(v);
break;
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index e2fc91198a3..9edfffd67c3 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -3312,11 +3312,12 @@ static int edbm_select_ungrouped_poll(bContext *C)
if (ED_operator_editmesh(C)) {
Object *obedit = CTX_data_edit_object(C);
BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
if ((em->selectmode & SCE_SELECT_VERTEX) == 0) {
CTX_wm_operator_poll_msg_set(C, "Must be in vertex selection mode");
}
- else if (obedit->defbase.first == NULL) {
+ else if (obedit->defbase.first == NULL || cd_dvert_offset == -1) {
CTX_wm_operator_poll_msg_set(C, "No weights/vertex groups on object");
}
else {
@@ -3330,6 +3331,8 @@ static int edbm_select_ungrouped_exec(bContext *C, wmOperator *op)
{
Object *obedit = CTX_data_edit_object(C);
BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
+
BMVert *eve;
BMIter iter;
@@ -3339,7 +3342,7 @@ static int edbm_select_ungrouped_exec(bContext *C, wmOperator *op)
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
- MDeformVert *dv = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ MDeformVert *dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
/* no dv or dv set with no weight */
if (ELEM(NULL, dv, dv->dw)) {
BM_vert_select_set(em->bm, eve, true);
diff --git a/source/blender/editors/object/object_hook.c b/source/blender/editors/object/object_hook.c
index 861dd4003e1..04c67b8d3fa 100644
--- a/source/blender/editors/object/object_hook.c
+++ b/source/blender/editors/object/object_hook.c
@@ -102,11 +102,13 @@ static int return_editmesh_indexar(BMEditMesh *em, int *tot, int **indexar, floa
return totvert;
}
-static int return_editmesh_vgroup(Object *obedit, BMEditMesh *em, char *name, float *cent)
+static bool return_editmesh_vgroup(Object *obedit, BMEditMesh *em, char *name, float *cent)
{
+ const int cd_dvert_offset = obedit->actdef ? CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT) : -1;
+
zero_v3(cent);
- if (obedit->actdef) {
+ if (cd_dvert_offset != -1) {
const int defgrp_index = obedit->actdef - 1;
int totvert = 0;
@@ -116,24 +118,22 @@ static int return_editmesh_vgroup(Object *obedit, BMEditMesh *em, char *name, fl
/* find the vertices */
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- dvert = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
- if (dvert) {
- if (defvert_find_weight(dvert, defgrp_index) > 0.0f) {
- add_v3_v3(cent, eve->co);
- totvert++;
- }
+ if (defvert_find_weight(dvert, defgrp_index) > 0.0f) {
+ add_v3_v3(cent, eve->co);
+ totvert++;
}
}
if (totvert) {
bDeformGroup *dg = BLI_findlink(&obedit->defbase, defgrp_index);
BLI_strncpy(name, dg->name, sizeof(dg->name));
mul_v3_fl(cent, 1.0f / (float)totvert);
- return 1;
+ return true;
}
}
- return 0;
+ return false;
}
static void select_editbmesh_hook(Object *ob, HookModifierData *hmd)
@@ -296,7 +296,7 @@ static int return_editcurve_indexar(Object *obedit, int *tot, int **indexar, flo
return totvert;
}
-static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
+static bool object_hook_index_array(Scene *scene, Object *obedit, int *tot, int **indexar, char *name, float *cent_r)
{
*indexar = NULL;
*tot = 0;
@@ -319,11 +319,10 @@ static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int *
/* check selected vertices first */
if (return_editmesh_indexar(em, tot, indexar, cent_r)) {
- return 1;
+ return true;
}
else {
- int ret = return_editmesh_vgroup(obedit, em, name, cent_r);
- return ret;
+ return return_editmesh_vgroup(obedit, em, name, cent_r);
}
}
case OB_CURVE:
@@ -335,7 +334,7 @@ static int object_hook_index_array(Scene *scene, Object *obedit, int *tot, int *
return return_editlattice_indexar(lt->editlatt->latt, tot, indexar, cent_r);
}
default:
- return 0;
+ return false;
}
}
diff --git a/source/blender/editors/object/object_vgroup.c b/source/blender/editors/object/object_vgroup.c
index 02481ec5222..f7d33fb4a5f 100644
--- a/source/blender/editors/object/object_vgroup.c
+++ b/source/blender/editors/object/object_vgroup.c
@@ -223,11 +223,13 @@ static bool ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_t
if (me->edit_btmesh) {
BMEditMesh *em = me->edit_btmesh;
+ BMesh *bm = em->bm;
+ const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
BMIter iter;
BMVert *eve;
int i;
- if (!CustomData_has_layer(&em->bm->vdata, CD_MDEFORMVERT)) {
+ if (cd_dvert_offset == -1) {
return false;
}
@@ -240,13 +242,13 @@ static bool ED_vgroup_give_parray(ID *id, MDeformVert ***dvert_arr, int *dvert_t
if (use_vert_sel) {
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
(*dvert_arr)[i] = BM_elem_flag_test(eve, BM_ELEM_SELECT) ?
- CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT) : NULL;
+ BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset) : NULL;
i++;
}
}
else {
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- (*dvert_arr)[i] = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ (*dvert_arr)[i] = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
i++;
}
}
@@ -983,12 +985,19 @@ static float get_vert_def_nr(Object *ob, const int def_nr, const int vertnum)
Mesh *me = ob->data;
if (me->edit_btmesh) {
+ BMEditMesh *em = me->edit_btmesh;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
/* warning, this lookup is _not_ fast */
- BMVert *eve = BM_vert_at_index(me->edit_btmesh->bm, vertnum);
- if (!eve) {
+ BMVert *eve;
+
+ EDBM_index_arrays_ensure(em, BM_VERT);
+
+ if ((cd_dvert_offset != -1) || (eve = EDBM_vert_at_index(em, vertnum))) {
+ dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
+ }
+ else {
return 0.0f;
}
- dv = CustomData_bmesh_get(&me->edit_btmesh->bm->vdata, eve->head.data, CD_MDEFORMVERT);
}
else {
if (me->dvert) {
@@ -1052,12 +1061,13 @@ static void vgroup_select_verts(Object *ob, int select)
if (me->edit_btmesh) {
BMEditMesh *em = me->edit_btmesh;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
BMIter iter;
BMVert *eve;
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (!BM_elem_flag_test(eve, BM_ELEM_HIDDEN)) {
- MDeformVert *dv = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ MDeformVert *dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
if (defvert_find_index(dv, def_nr)) {
BM_vert_select_set(em->bm, eve, select);
}
@@ -1831,6 +1841,8 @@ static void vgroup_blend(Object *ob, const float fac)
vg_users = MEM_callocN(sizeof(int) * dvert_tot, "vgroup_blend_i");
if (bm) {
+ const int cd_dvert_offset = CustomData_get_offset(&bm->vdata, CD_MDEFORMVERT);
+
BM_ITER_MESH (eed, &iter, bm, BM_EDGES_OF_MESH) {
sel1 = BM_elem_flag_test(eed->v1, BM_ELEM_SELECT);
sel2 = BM_elem_flag_test(eed->v2, BM_ELEM_SELECT);
@@ -1849,7 +1861,7 @@ static void vgroup_blend(Object *ob, const float fac)
eve = eed->v1;
}
- dv = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
dw = defvert_find_index(dv, def_nr);
if (dw) {
vg_weights[i1] += dw->weight;
@@ -1860,7 +1872,7 @@ static void vgroup_blend(Object *ob, const float fac)
BM_ITER_MESH_INDEX (eve, &iter, bm, BM_VERTS_OF_MESH, i) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && vg_users[i] > 0) {
- dv = CustomData_bmesh_get(&bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
dw = defvert_verify_index(dv, def_nr);
dw->weight = (fac * (vg_weights[i] / (float)vg_users[i])) + (ifac * dw->weight);
@@ -2152,9 +2164,10 @@ void ED_vgroup_mirror(Object *ob,
BMEditMesh *em = me->edit_btmesh;
if (em) {
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
BMIter iter;
- if (!CustomData_has_layer(&em->bm->vdata, CD_MDEFORMVERT)) {
+ if (cd_dvert_offset == -1) {
goto cleanup;
}
@@ -2167,11 +2180,10 @@ void ED_vgroup_mirror(Object *ob,
sel_mirr = BM_elem_flag_test(eve_mirr, BM_ELEM_SELECT);
if ((sel || sel_mirr) && (eve != eve_mirr)) {
- dvert = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
- dvert_mirr = CustomData_bmesh_get(&em->bm->vdata, eve_mirr->head.data, CD_MDEFORMVERT);
- if (dvert && dvert_mirr) {
- VGROUP_MIRR_OP;
- }
+ dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
+ dvert_mirr = BM_ELEM_CD_GET_VOID_P(eve_mirr, cd_dvert_offset);
+
+ VGROUP_MIRR_OP;
}
/* don't use these again */
@@ -2402,11 +2414,13 @@ static void vgroup_active_remove_verts(Object *ob, const bool allverts, bDeformG
if (me->edit_btmesh) {
BMEditMesh *em = me->edit_btmesh;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
+
BMVert *eve;
BMIter iter;
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- dv = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
if (dv && dv->dw && (allverts || BM_elem_flag_test(eve, BM_ELEM_SELECT))) {
MDeformWeight *dw = defvert_find_index(dv, def_nr);
@@ -2470,12 +2484,14 @@ static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg)
if (ob->type == OB_MESH) {
Mesh *me = ob->data;
BMEditMesh *em = me->edit_btmesh;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
+
BMIter iter;
BMVert *eve;
MDeformVert *dvert;
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- dvert = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
if (dvert)
for (i = 0; i < dvert->totweight; i++)
@@ -2598,6 +2614,8 @@ static void vgroup_assign_verts(Object *ob, const float weight)
if (me->edit_btmesh) {
BMEditMesh *em = me->edit_btmesh;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
+
BMIter iter;
BMVert *eve;
@@ -2609,7 +2627,7 @@ static void vgroup_assign_verts(Object *ob, const float weight)
if (BM_elem_flag_test(eve, BM_ELEM_SELECT)) {
MDeformVert *dv;
MDeformWeight *dw;
- dv = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT); /* can be NULL */
+ dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset); /* can be NULL */
dw = defvert_verify_index(dv, def_nr);
if (dw) {
dw->weight = weight;
@@ -3615,13 +3633,17 @@ static int vgroup_do_remap(Object *ob, const char *name_array, wmOperator *op)
if (ob->mode == OB_MODE_EDIT) {
if (ob->type == OB_MESH) {
BMEditMesh *em = BKE_editmesh_from_object(ob);
- BMIter iter;
- BMVert *eve;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
- BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
- dvert = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
- if (dvert && dvert->totweight) {
- defvert_remap(dvert, sort_map, defbase_tot);
+ if (cd_dvert_offset != -1) {
+ BMIter iter;
+ BMVert *eve;
+
+ BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
+ dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
+ if (dvert->totweight) {
+ defvert_remap(dvert, sort_map, defbase_tot);
+ }
}
}
}
@@ -3637,10 +3659,12 @@ static int vgroup_do_remap(Object *ob, const char *name_array, wmOperator *op)
ED_vgroup_give_array(ob->data, &dvert, &dvert_tot);
/*create as necessary*/
- while (dvert && dvert_tot--) {
- if (dvert->totweight)
- defvert_remap(dvert, sort_map, defbase_tot);
- dvert++;
+ if (dvert) {
+ while (dvert_tot--) {
+ if (dvert->totweight)
+ defvert_remap(dvert, sort_map, defbase_tot);
+ dvert++;
+ }
}
}
diff --git a/source/blender/editors/space_view3d/view3d_buttons.c b/source/blender/editors/space_view3d/view3d_buttons.c
index 828ef221e97..e5ebe70020e 100644
--- a/source/blender/editors/space_view3d/view3d_buttons.c
+++ b/source/blender/editors/space_view3d/view3d_buttons.c
@@ -774,25 +774,30 @@ static void v3d_editvertex_buts(uiLayout *layout, View3D *v3d, Object *ob, float
#define B_VGRP_PNL_EDIT_SINGLE 8 /* or greater */
#define B_VGRP_PNL_COPY_SINGLE 16384 /* or greater */
-static void act_vert_def(Object *ob, BMVert **eve, MDeformVert **dvert)
+static void act_vert_def(Object *ob, BMVert **r_eve, MDeformVert **r_dvert)
{
if (ob && ob->mode & OB_MODE_EDIT && ob->type == OB_MESH && ob->defbase.first) {
Mesh *me = ob->data;
BMEditMesh *em = me->edit_btmesh;
- BMEditSelection *ese = (BMEditSelection *)em->bm->selected.last;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
- if (ese && ese->htype == BM_VERT) {
- *eve = (BMVert *)ese->ele;
- *dvert = CustomData_bmesh_get(&em->bm->vdata, (*eve)->head.data, CD_MDEFORMVERT);
- return;
+ if (cd_dvert_offset != -1) {
+ BMEditSelection *ese = (BMEditSelection *)em->bm->selected.last;
+
+ if (ese && ese->htype == BM_VERT) {
+ *r_eve = (BMVert *)ese->ele;
+ *r_dvert = BM_ELEM_CD_GET_VOID_P(*r_eve, cd_dvert_offset);
+ return;
+ }
}
}
- *eve = NULL;
- *dvert = NULL;
+ *r_eve = NULL;
+ *r_dvert = NULL;
}
-static void editvert_mirror_update(Object *ob, BMVert *eve, int def_nr, int index)
+static void editvert_mirror_update(Object *ob, BMVert *eve, int def_nr, int index,
+ const int cd_dvert_offset)
{
Mesh *me = ob->data;
BMEditMesh *em = me->edit_btmesh;
@@ -801,8 +806,8 @@ static void editvert_mirror_update(Object *ob, BMVert *eve, int def_nr, int inde
eve_mirr = editbmesh_get_x_mirror_vert(ob, em, eve, eve->co, index);
if (eve_mirr && eve_mirr != eve) {
- MDeformVert *dvert_src = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
- MDeformVert *dvert_dst = CustomData_bmesh_get(&em->bm->vdata, eve_mirr->head.data, CD_MDEFORMVERT);
+ MDeformVert *dvert_src = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
+ MDeformVert *dvert_dst = BM_ELEM_CD_GET_VOID_P(eve_mirr, cd_dvert_offset);
if (dvert_dst) {
if (def_nr == -1) {
/* all vgroups, add groups where neded */
@@ -824,14 +829,17 @@ static void editvert_mirror_update(Object *ob, BMVert *eve, int def_nr, int inde
static void vgroup_adjust_active(Object *ob, int def_nr)
{
+ Mesh *me = ob->data;
+ BMEditMesh *em = me->edit_btmesh;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
BMVert *eve_act;
MDeformVert *dvert_act;
act_vert_def(ob, &eve_act, &dvert_act);
if (dvert_act) {
- if (((Mesh *)ob->data)->editflag & ME_EDIT_MIRROR_X)
- editvert_mirror_update(ob, eve_act, def_nr, -1);
+ if (me->editflag & ME_EDIT_MIRROR_X)
+ editvert_mirror_update(ob, eve_act, def_nr, -1, cd_dvert_offset);
}
}
@@ -848,6 +856,8 @@ static void vgroup_copy_active_to_sel(Object *ob)
else {
Mesh *me = ob->data;
BMEditMesh *em = me->edit_btmesh;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
+
BMIter iter;
BMVert *eve;
MDeformVert *dvert;
@@ -855,12 +865,12 @@ static void vgroup_copy_active_to_sel(Object *ob)
BM_ITER_MESH (eve, &iter, em->bm, BM_VERTS_OF_MESH) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && eve != eve_act) {
- dvert = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ dvert = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
if (dvert) {
defvert_copy(dvert, dvert_act);
if (me->editflag & ME_EDIT_MIRROR_X)
- editvert_mirror_update(ob, eve, -1, index);
+ editvert_mirror_update(ob, eve, -1, index, cd_dvert_offset);
}
}
@@ -883,6 +893,7 @@ static void vgroup_copy_active_to_sel_single(Object *ob, const int def_nr)
else {
Mesh *me = ob->data;
BMEditMesh *em = me->edit_btmesh;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
BMIter iter;
BMVert *eve;
MDeformVert *dv;
@@ -900,26 +911,30 @@ static void vgroup_copy_active_to_sel_single(Object *ob, const int def_nr)
eve = BM_iter_new(&iter, em->bm, BM_VERTS_OF_MESH, NULL);
for (index = 0; eve; eve = BM_iter_step(&iter), index++) {
if (BM_elem_flag_test(eve, BM_ELEM_SELECT) && eve != eve_act) {
- dv = CustomData_bmesh_get(&em->bm->vdata, eve->head.data, CD_MDEFORMVERT);
+ dv = BM_ELEM_CD_GET_VOID_P(eve, cd_dvert_offset);
dw = defvert_find_index(dv, def_nr);
if (dw) {
dw->weight = weight_act;
if (me->editflag & ME_EDIT_MIRROR_X) {
- editvert_mirror_update(ob, eve, -1, index);
+ editvert_mirror_update(ob, eve, -1, index, cd_dvert_offset);
}
}
}
}
if (me->editflag & ME_EDIT_MIRROR_X) {
- editvert_mirror_update(ob, eve_act, -1, -1);
+ editvert_mirror_update(ob, eve_act, -1, -1, cd_dvert_offset);
}
}
}
static void vgroup_normalize_active(Object *ob)
{
+ Mesh *me = ob->data;
+ BMEditMesh *em = me->edit_btmesh;
+ const int cd_dvert_offset = CustomData_get_offset(&em->bm->vdata, CD_MDEFORMVERT);
+
BMVert *eve_act;
MDeformVert *dvert_act;
@@ -930,8 +945,8 @@ static void vgroup_normalize_active(Object *ob)
defvert_normalize(dvert_act);
- if (((Mesh *)ob->data)->editflag & ME_EDIT_MIRROR_X)
- editvert_mirror_update(ob, eve_act, -1, -1);
+ if (me->editflag & ME_EDIT_MIRROR_X)
+ editvert_mirror_update(ob, eve_act, -1, -1, cd_dvert_offset);
}
static void do_view3d_vgroup_buttons(bContext *C, void *UNUSED(arg), int event)