[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