[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [44308] trunk/blender/source/blender: change UvElement to directly use BMLoop * instead of tfindex.

Antony Riakiotakis kalast at gmail.com
Tue Feb 21 20:41:47 CET 2012


Revision: 44308
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=44308
Author:   psy-fi
Date:     2012-02-21 19:41:38 +0000 (Tue, 21 Feb 2012)
Log Message:
-----------
change UvElement to directly use BMLoop * instead of tfindex. This saves quite some lookups on uv sculpting and stitching. Based on BMESH todo by Campbell, thanks for the idea!

Modified Paths:
--------------
    trunk/blender/source/blender/blenkernel/BKE_mesh.h
    trunk/blender/source/blender/editors/mesh/bmesh_utils.c
    trunk/blender/source/blender/editors/sculpt_paint/sculpt_uv.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

Modified: trunk/blender/source/blender/blenkernel/BKE_mesh.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-02-21 18:20:47 UTC (rev 44307)
+++ trunk/blender/source/blender/blenkernel/BKE_mesh.h	2012-02-21 19:41:38 UTC (rev 44308)
@@ -193,7 +193,7 @@
 	/* Face the element belongs to */
 	struct BMFace *face;
 	/* Index in the editFace of the uv */
-	unsigned char tfindex;
+	struct BMLoop *l;
 	/* Whether this element is the first of coincident elements */
 	unsigned char separate;
 	/* general use flag */

Modified: trunk/blender/source/blender/editors/mesh/bmesh_utils.c
===================================================================
--- trunk/blender/source/blender/editors/mesh/bmesh_utils.c	2012-02-21 18:20:47 UTC (rev 44307)
+++ trunk/blender/source/blender/editors/mesh/bmesh_utils.c	2012-02-21 19:41:38 UTC (rev 44308)
@@ -771,7 +771,7 @@
 		if (!selected || ((!BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) && BM_elem_flag_test(efa, BM_ELEM_SELECT))) {
 			i = 0;
 			BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
-				buf->tfindex = i;
+				buf->l = l;
 				buf->face = efa;
 				buf->separate = 0;
 				buf->island = INVALID_ISLAND;
@@ -798,10 +798,7 @@
 			v->next = newvlist;
 			newvlist = v;
 
-			efa = v->face;
-			/* tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); */ /* UNUSED */
-
-			l = BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, efa, v->tfindex);
+			l = v->l;
 			luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 			uv = luv->uv;
 
@@ -810,10 +807,8 @@
 
 			while (iterv) {
 				next = iterv->next;
-				efa = iterv->face;
-				/* tf = CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY); */ /* UNUSED */
 
-				l = BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, efa, iterv->tfindex);
+				l = iterv->l;
 				luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 				uv2 = luv->uv;
 
@@ -867,7 +862,7 @@
 								/* found the uv corresponding to our face and vertex. Now fill it to the buffer */
 								element->island = nislands;
 								map[element - element_map->buf] = islandbufsize;
-								islandbuf[islandbufsize].tfindex = element->tfindex;
+								islandbuf[islandbufsize].l = element->l;
 								islandbuf[islandbufsize].face = element->face;
 								islandbuf[islandbufsize].separate = element->separate;
 								islandbuf[islandbufsize].island =  nislands;

Modified: trunk/blender/source/blender/editors/sculpt_paint/sculpt_uv.c
===================================================================
--- trunk/blender/source/blender/editors/sculpt_paint/sculpt_uv.c	2012-02-21 18:20:47 UTC (rev 44307)
+++ trunk/blender/source/blender/editors/sculpt_paint/sculpt_uv.c	2012-02-21 19:41:38 UTC (rev 44308)
@@ -215,7 +215,7 @@
 				if(element->separate && element != sculptdata->uv[i].element)
 					break;
 
-				l = BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, element->face, element->tfindex);
+				l = element->l;
 				luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 				copy_v2_v2(luv->uv, sculptdata->uv[i].uv);
 			}
@@ -279,7 +279,7 @@
 				if(element->separate && element != sculptdata->uv[i].element)
 					break;
 
-				l = BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, element->face, element->tfindex);
+				l = element->l;
 				luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 				copy_v2_v2(luv->uv, sculptdata->uv[i].uv);
 			}
@@ -355,7 +355,7 @@
 					if(element->separate && element != sculptdata->uv[i].element)
 						break;
 
-					l = BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, element->face, element->tfindex);
+					l = element->l;
 					luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 					copy_v2_v2(luv->uv, sculptdata->uv[i].uv);
 				}
@@ -397,7 +397,7 @@
 				if(element->separate && element != sculptdata->uv[uvindex].element)
 					break;
 
-				l = BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, element->face, element->tfindex);
+				l = element->l;
 				luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 				copy_v2_v2(luv->uv, sculptdata->uv[uvindex].uv);
 			}
@@ -433,8 +433,8 @@
 	op->customdata = NULL;
 }
 
-static int get_uv_element_offset_from_face(UvElementMap *map, BMFace *efa, int index, int island_index, int doIslands){
-	UvElement *element = ED_get_uv_element(map, efa, index);
+static int get_uv_element_offset_from_face(UvElementMap *map, BMFace *efa, BMLoop *l, int island_index, int doIslands){
+	UvElement *element = ED_get_uv_element(map, efa, l);
 	if(!element || (doIslands && element->island != island_index)){
 		return -1;
 	}
@@ -523,7 +523,7 @@
 			Image *ima= CTX_data_edit_image(C);
 			uv_find_nearest_vert(scene, ima, em, co, NULL, &hit);
 
-			element = ED_get_uv_element(data->elementMap, hit.efa, hit.lindex);
+			element = ED_get_uv_element(data->elementMap, hit.efa, hit.l);
 			island_index = element->island;
 		}
 
@@ -571,8 +571,7 @@
 						continue;
 					}
 
-					efa = element->face;
-					l = BM_iter_at_index(em->bm, BM_LOOPS_OF_FACE, element->face, element->tfindex);
+					l = element->l;
 					luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
 
 					counter++;
@@ -589,11 +588,9 @@
 		/* Now, on to generate our uv connectivity data */
 		counter = 0;
 		BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
-			int nverts = efa->len;
-			i = 0;
 			BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
-				int offset1, itmp1 = get_uv_element_offset_from_face(data->elementMap, efa, i, island_index, do_island_optimization);
-				int offset2, itmp2 = get_uv_element_offset_from_face(data->elementMap, efa, (i+1)%nverts, island_index, do_island_optimization);
+				int offset1, itmp1 = get_uv_element_offset_from_face(data->elementMap, efa, l, island_index, do_island_optimization);
+				int offset2, itmp2 = get_uv_element_offset_from_face(data->elementMap, efa, l->next, island_index, do_island_optimization);
 
 				/* Skip edge if not found(unlikely) or not on valid island */
 				if(itmp1 == -1 || itmp2 == -1)
@@ -623,7 +620,6 @@
 					BLI_ghash_insert(edgeHash, &edges[counter], &edges[counter].flag);
 				}
 				counter++;
-				i++;
 			}
 		}
 

Modified: trunk/blender/source/blender/editors/uvedit/uvedit_intern.h
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_intern.h	2012-02-21 18:20:47 UTC (rev 44307)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_intern.h	2012-02-21 19:41:38 UTC (rev 44308)
@@ -81,7 +81,7 @@
 
 /* utility tool functions */
 
-struct UvElement *ED_get_uv_element(struct UvElementMap *map, struct BMFace *efa, int index);
+struct UvElement *ED_get_uv_element(struct UvElementMap *map, struct BMFace *efa, struct BMLoop *l);
 void uvedit_live_unwrap_update(struct SpaceImage *sima, struct Scene *scene, struct Object *obedit);
 
 /* smart stitch */

Modified: trunk/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2012-02-21 18:20:47 UTC (rev 44307)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_ops.c	2012-02-21 19:41:38 UTC (rev 44308)
@@ -938,15 +938,10 @@
 	return NULL;
 }
 
-/* BMESH_TODO - in some cases we already know the loop so looking up the index isnt needed */
-
-UvElement *ED_get_uv_element(UvElementMap *map, BMFace *efa, int index)
+UvElement *ED_get_uv_element(UvElementMap *map, BMFace *efa, BMLoop *l)
 {
-	BMLoop *l;
 	UvElement *element;
 
-	l = BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, efa, index);
-
 	element = map->vert[BM_elem_index_get(l->v)];
 
 	for(; element; element = element->next)

Modified: trunk/blender/source/blender/editors/uvedit/uvedit_smart_stitch.c
===================================================================
--- trunk/blender/source/blender/editors/uvedit/uvedit_smart_stitch.c	2012-02-21 18:20:47 UTC (rev 44307)
+++ trunk/blender/source/blender/editors/uvedit/uvedit_smart_stitch.c	2012-02-21 19:41:38 UTC (rev 44308)
@@ -274,9 +274,9 @@
 		BMLoop *l_orig, *l_iter;
 
 
-		l_orig = BM_iter_at_index(state->em->bm, BM_LOOPS_OF_FACE, element->face, element->tfindex);
+		l_orig = element->l;
 		luv_orig = CustomData_bmesh_get(&state->em->bm->ldata, l_orig->head.data, CD_MLOOPUV);
-		l_iter = BM_iter_at_index(state->em->bm, BM_LOOPS_OF_FACE, element->face, element_iter->tfindex);
+		l_iter = element_iter->l;
 		luv_iter = CustomData_bmesh_get(&state->em->bm->ldata, l_iter->head.data, CD_MLOOPUV);
 
 		if(fabs(luv_orig->uv[0] - luv_iter->uv[0]) < limit
@@ -323,7 +323,7 @@
 					MLoopUV *luv;
 					BMLoop *l;
 
-					l = BM_iter_at_index(state->em->bm, BM_LOOPS_OF_FACE, element->face, element->tfindex);
+					l = element->l;
 					luv = CustomData_bmesh_get(&state->em->bm->ldata, l->head.data, CD_MLOOPUV);
 
 					if(final){
@@ -366,9 +366,9 @@
 	element1 = state->uvs[edge->uv1];
 	element2 = state->uvs[edge->uv2];
 
-	l1 = BM_iter_at_index(state->em->bm, BM_LOOPS_OF_FACE, element1->face, element1->tfindex);
+	l1 = element1->l;
 	luv1 = CustomData_bmesh_get(&state->em->bm->ldata, l1->head.data, CD_MLOOPUV);
-	l2 = BM_iter_at_index(state->em->bm, BM_LOOPS_OF_FACE, element2->face, element2->tfindex);
+	l2 = element2->l;
 	luv2 = CustomData_bmesh_get(&state->em->bm->ldata, l2->head.data, CD_MLOOPUV);
 
 	index1 = uvfinal_map[element1 - state->element_map->buf];
@@ -406,7 +406,7 @@
 	if(element->island == state->static_island && !state->midpoints)
 		return;
 
-	l = BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, element->face, element->tfindex);
+	l = element->l;
 
 	index = BM_elem_index_get(l->v);
 
@@ -473,7 +473,7 @@
 	UvElement *element_iter;
 	BMLoop *l;
 
-	l = BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, element->face, element->tfindex);
+	l = element->l;
 
 	vert_index = BM_elem_index_get(l->v);
 	element_iter = state->element_map->vert[vert_index];
@@ -537,7 +537,7 @@
 	int vert_index;
 	BMLoop *l;
 
-	l = BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, element->face, element->tfindex);
+	l = element->l;
 
 	vert_index = BM_elem_index_get(l->v);
 
@@ -675,7 +675,7 @@
 		/* copy data from MTFaces to the preview display buffers */
 		BM_ITER(efa, &iter, state->em->bm, BM_FACES_OF_MESH, NULL) {
 			/* just to test if face was added for processing. uvs of inselected vertices will return NULL */
-			UvElement *element = ED_get_uv_element(state->element_map, efa, 0);

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list