[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [57048] trunk/blender/source/blender: bmesh optimization: use offsets for deform-vert lookups to avoid customdata layer lookups within loops .
Campbell Barton
ideasman42 at gmail.com
Mon May 27 14:42:49 CEST 2013
Revision: 57048
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=57048
Author: campbellbarton
Date: 2013-05-27 12:42:48 +0000 (Mon, 27 May 2013)
Log Message:
-----------
bmesh optimization: use offsets for deform-vert lookups to avoid customdata layer lookups within loops.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
trunk/blender/source/blender/blenkernel/intern/key.c
trunk/blender/source/blender/bmesh/operators/bmo_similar.c
trunk/blender/source/blender/editors/mesh/editmesh_select.c
trunk/blender/source/blender/editors/object/object_hook.c
trunk/blender/source/blender/editors/object/object_vgroup.c
trunk/blender/source/blender/editors/space_view3d/view3d_buttons.c
Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c 2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c 2013-05-27 12:42:48 UTC (rev 57048)
@@ -1428,6 +1428,8 @@
{
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 @@
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 @@
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 @@
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 @@
/* 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]);
}
}
}
Modified: trunk/blender/source/blender/blenkernel/intern/key.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/key.c 2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/blenkernel/intern/key.c 2013-05-27 12:42:48 UTC (rev 57048)
@@ -1067,12 +1067,10 @@
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 {
Modified: trunk/blender/source/blender/bmesh/operators/bmo_similar.c
===================================================================
--- trunk/blender/source/blender/bmesh/operators/bmo_similar.c 2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/bmesh/operators/bmo_similar.c 2013-05-27 12:42:48 UTC (rev 57048)
@@ -530,6 +530,7 @@
{
#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 @@
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;
Modified: trunk/blender/source/blender/editors/mesh/editmesh_select.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/editmesh_select.c 2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/editors/mesh/editmesh_select.c 2013-05-27 12:42:48 UTC (rev 57048)
@@ -3312,11 +3312,12 @@
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 @@
{
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 @@
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);
Modified: trunk/blender/source/blender/editors/object/object_hook.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_hook.c 2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/editors/object/object_hook.c 2013-05-27 12:42:48 UTC (rev 57048)
@@ -102,11 +102,13 @@
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 @@
/* 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 @@
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 @@
/* 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 @@
return return_editlattice_indexar(lt->editlatt->latt, tot, indexar, cent_r);
}
default:
- return 0;
+ return false;
}
}
Modified: trunk/blender/source/blender/editors/object/object_vgroup.c
===================================================================
--- trunk/blender/source/blender/editors/object/object_vgroup.c 2013-05-27 11:33:17 UTC (rev 57047)
+++ trunk/blender/source/blender/editors/object/object_vgroup.c 2013-05-27 12:42:48 UTC (rev 57048)
@@ -223,11 +223,13 @@
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 @@
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 @@
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 @@
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)) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list