[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [56641] trunk/blender/source/blender: avoid customdata lookups for selection test/enable disable.
Campbell Barton
ideasman42 at gmail.com
Fri May 10 08:46:32 CEST 2013
Revision: 56641
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=56641
Author: campbellbarton
Date: 2013-05-10 06:46:32 +0000 (Fri, 10 May 2013)
Log Message:
-----------
avoid customdata lookups for selection test/enable disable.
also add uvedit_face_select_set, uvedit_edge_select_set, uvedit_uv_select_set - since quite a few areas where setting based on a boolean.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
trunk/blender/source/blender/editors/include/ED_uvedit.h
trunk/blender/source/blender/editors/mesh/meshtools.c
trunk/blender/source/blender/editors/transform/transform_conversions.c
trunk/blender/source/blender/editors/uvedit/uvedit_buttons.c
trunk/blender/source/blender/editors/uvedit/uvedit_draw.c
trunk/blender/source/blender/editors/uvedit/uvedit_intern.h
trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
trunk/blender/source/blender/editors/uvedit/uvedit_smart_stitch.c
trunk/blender/source/blender/editors/uvedit/uvedit_unwrap_ops.c
Modified: trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c
===================================================================
--- trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c 2013-05-10 06:26:01 UTC (rev 56640)
+++ trunk/blender/source/blender/blenkernel/intern/editderivedmesh.c 2013-05-10 06:46:32 UTC (rev 56641)
@@ -221,33 +221,28 @@
BMFace *efa;
BMIter iter;
+ const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
+
+ if (UNLIKELY(cd_loop_uv_offset == -1)) {
+ return;
+ }
+
glBegin(GL_LINES);
BM_ITER_MESH (efa, &iter, bm, BM_FACES_OF_MESH) {
- BMIter liter;
- BMLoop *l;
- MLoopUV *lastluv = NULL, *firstluv = NULL;
+ BMLoop *l_iter, *l_first;
+ const float *uv, *uv_prev;
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN))
continue;
- BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- MLoopUV *luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
-
- if (luv) {
- if (lastluv)
- glVertex2fv(luv->uv);
- glVertex2fv(luv->uv);
-
- lastluv = luv;
- if (!firstluv)
- firstluv = luv;
- }
- }
-
- if (lastluv) {
- glVertex2fv(lastluv->uv);
- glVertex2fv(firstluv->uv);
- }
+ l_iter = l_first = BM_FACE_FIRST_LOOP(efa);
+ uv_prev = ((MLoopUV *)BM_ELEM_CD_GET_VOID_P(l_iter->prev, cd_loop_uv_offset))->uv;
+ do {
+ uv = ((MLoopUV *)BM_ELEM_CD_GET_VOID_P(l_iter, cd_loop_uv_offset))->uv;
+ glVertex2fv(uv);
+ glVertex2fv(uv_prev);
+ uv_prev = uv;
+ } while ((l_iter = l_iter->next) != l_first);
}
glEnd();
}
@@ -1312,6 +1307,7 @@
if (index != -1) {
/* offset = bm->pdata.layers[index].offset; */ /* UNUSED */
+ BMLoop *(*looptris)[3] = bmdm->em->looptris;
const int size = CustomData_sizeof(type);
int i, j;
@@ -1322,20 +1318,29 @@
data = datalayer = DM_get_tessface_data_layer(dm, type);
if (type == CD_MTFACE) {
+ const int cd_loop_uv_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPUV);
+ const int cd_poly_tex_offset = CustomData_get_offset(&bm->pdata, CD_MTEXPOLY);
+
for (i = 0; i < bmdm->em->tottri; i++, data += size) {
- BMFace *efa = bmdm->em->looptris[i][0]->f;
- bmdata = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
+ BMFace *efa = looptris[i][0]->f;
+
+ // bmdata = CustomData_bmesh_get(&bm->pdata, efa->head.data, CD_MTEXPOLY);
+ bmdata = BM_ELEM_CD_GET_VOID_P(efa, cd_poly_tex_offset);
+
ME_MTEXFACE_CPY(((MTFace *)data), ((MTexPoly *)bmdata));
for (j = 0; j < 3; j++) {
- bmdata = CustomData_bmesh_get(&bm->ldata, bmdm->em->looptris[i][j]->head.data, CD_MLOOPUV);
+ // bmdata = CustomData_bmesh_get(&bm->ldata, looptris[i][j]->head.data, CD_MLOOPUV);
+ bmdata = BM_ELEM_CD_GET_VOID_P(looptris[i][j], cd_loop_uv_offset);
copy_v2_v2(((MTFace *)data)->uv[j], ((MLoopUV *)bmdata)->uv);
}
}
}
else {
+ const int cd_loop_color_offset = CustomData_get_offset(&bm->ldata, CD_MLOOPCOL);
for (i = 0; i < bmdm->em->tottri; i++, data += size) {
for (j = 0; j < 3; j++) {
- bmdata = CustomData_bmesh_get(&bm->ldata, bmdm->em->looptris[i][j]->head.data, CD_MLOOPCOL);
+ // bmdata = CustomData_bmesh_get(&bm->ldata, looptris[i][j]->head.data, CD_MLOOPCOL);
+ bmdata = BM_ELEM_CD_GET_VOID_P(looptris[i][j], cd_loop_color_offset);
MESH_MLOOPCOL_TO_MCOL(((MLoopCol *)bmdata), (((MCol *)data) + j));
}
}
Modified: trunk/blender/source/blender/editors/include/ED_uvedit.h
===================================================================
--- trunk/blender/source/blender/editors/include/ED_uvedit.h 2013-05-10 06:26:01 UTC (rev 56640)
+++ trunk/blender/source/blender/editors/include/ED_uvedit.h 2013-05-10 06:46:32 UTC (rev 56641)
@@ -59,18 +59,35 @@
int ED_uvedit_test(struct Object *obedit);
/* visibility and selection */
-int uvedit_face_visible_test(struct Scene *scene, struct Image *ima, struct BMFace *efa, struct MTexPoly *tf);
-int uvedit_face_select_test(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
-int uvedit_edge_select_test(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-int uvedit_uv_select_test(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
+bool uvedit_face_visible_test(struct Scene *scene, struct Image *ima, struct BMFace *efa, struct MTexPoly *tf);
+bool uvedit_face_select_test(struct Scene *scene, struct BMFace *efa,
+ const int cd_loop_uv_offset);
+bool uvedit_edge_select_test(struct Scene *scene, struct BMLoop *l,
+ const int cd_loop_uv_offset);
+bool uvedit_uv_select_test(struct Scene *scene, struct BMLoop *l,
+ const int cd_loop_uv_offset);
+/* uv face */
+bool uvedit_face_select_set(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const bool select,
+ const bool do_history, const int cd_loop_uv_offset);
+bool uvedit_face_select_enable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa,
+ const bool do_history, const int cd_loop_uv_offset);
+bool uvedit_face_select_disable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa,
+ const int cd_loop_uv_offset);
+/* uv edge */
+void uvedit_edge_select_set(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool select,
+ const bool do_history, const int cd_loop_uv_offset);
+void uvedit_edge_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
+ const bool do_history, const int cd_loop_uv_offset);
+void uvedit_edge_select_disable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
+ const int cd_loop_uv_offset);
+/* uv vert */
+void uvedit_uv_select_set(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool select,
+ const bool do_history, const int cd_loop_uv_offset);
+void uvedit_uv_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
+ const bool do_history, const int cd_loop_uv_offset);
+void uvedit_uv_select_disable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l,
+ const int cd_loop_uv_offset);
-int uvedit_face_select_enable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa, const bool do_history);
-int uvedit_face_select_disable(struct Scene *scene, struct BMEditMesh *em, struct BMFace *efa);
-void uvedit_edge_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool do_history);
-void uvedit_edge_select_disable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-void uvedit_uv_select_enable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l, const bool do_history);
-void uvedit_uv_select_disable(struct BMEditMesh *em, struct Scene *scene, struct BMLoop *l);
-
int ED_uvedit_nearest_uv(struct Scene *scene, struct Object *obedit, struct Image *ima,
const float co[2], float r_uv[2]);
Modified: trunk/blender/source/blender/editors/mesh/meshtools.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/meshtools.c 2013-05-10 06:26:01 UTC (rev 56640)
+++ trunk/blender/source/blender/editors/mesh/meshtools.c 2013-05-10 06:46:32 UTC (rev 56641)
@@ -1047,7 +1047,7 @@
BMFace *efa;
BM_ITER_MESH (efa, &iter, em->bm, BM_FACES_OF_MESH) {
- uv_poly_center(em, efa, cent);
+ uv_poly_center(efa, cent, cd_loop_uv_offset);
if ( (fabsf(cent[0] - cent_vec[0]) < 0.001f) && (fabsf(cent[1] - cent_vec[1]) < 0.001f) ) {
BMIter liter;
Modified: trunk/blender/source/blender/editors/transform/transform_conversions.c
===================================================================
--- trunk/blender/source/blender/editors/transform/transform_conversions.c 2013-05-10 06:26:01 UTC (rev 56640)
+++ trunk/blender/source/blender/editors/transform/transform_conversions.c 2013-05-10 06:46:32 UTC (rev 56641)
@@ -2418,6 +2418,8 @@
int propmode = t->flag & T_PROP_EDIT;
int propconnected = t->flag & T_PROP_CONNECTED;
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+
if (!ED_space_image_show_uvedit(sima, t->obedit)) return;
/* count */
@@ -2442,7 +2444,7 @@
BM_elem_flag_enable(efa, BM_ELEM_TAG);
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- if (uvedit_uv_select_test(em, scene, l)) {
+ if (uvedit_uv_select_test(scene, l, cd_loop_uv_offset)) {
countsel++;
if (propconnected) {
@@ -2478,7 +2480,7 @@
continue;
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
- if (!propmode && !uvedit_uv_select_test(em, scene, l))
+ if (!propmode && !uvedit_uv_select_test(scene, l, cd_loop_uv_offset))
continue;
if (propconnected) {
@@ -2489,8 +2491,8 @@
}
}
- luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
- UVsToTransData(sima, td++, td2d++, luv->uv, uvedit_uv_select_test(em, scene, l));
+ luv = BM_ELEM_CD_GET_VOID_P(l, cd_loop_uv_offset);
+ UVsToTransData(sima, td++, td2d++, luv->uv, uvedit_uv_select_test(scene, l, cd_loop_uv_offset));
}
}
Modified: trunk/blender/source/blender/editors/uvedit/uvedit_buttons.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_buttons.c 2013-05-10 06:26:01 UTC (rev 56640)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_buttons.c 2013-05-10 06:46:32 UTC (rev 56641)
@@ -71,17 +71,20 @@
BMIter iter, liter;
MTexPoly *tf;
MLoopUV *luv;
- int tot = 0.0;
+ int tot = 0;
+
+ const int cd_loop_uv_offset = CustomData_get_offset(&em->bm->ldata, CD_MLOOPUV);
+ const int cd_poly_tex_offset = CustomData_get_offset(&em->bm->pdata, CD_MTEXPOLY);
zero_v2(center);
BM_ITER_MESH (f, &iter, em->bm, BM_FACES_OF_MESH) {
- tf = CustomData_bmesh_get(&em->bm->pdata, f->head.data, CD_MTEXPOLY);
+ tf = BM_ELEM_CD_GET_VOID_P(f, cd_poly_tex_offset);
if (!uvedit_face_visible_test(scene, ima, f, tf))
continue;
BM_ITER_ELEM (l, &liter, f, BM_LOOPS_OF_FACE) {
- luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
- if (uvedit_uv_select_test(em, scene, l)) {
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list