[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [21759] branches/bmesh/blender/source/ blender: finished first pass at bmeshafying uvedit_ops.c.

Joseph Eagar joeedh at gmail.com
Tue Jul 21 13:48:58 CEST 2009


Revision: 21759
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=21759
Author:   joeedh
Date:     2009-07-21 13:48:58 +0200 (Tue, 21 Jul 2009)

Log Message:
-----------
finished first pass at bmeshafying uvedit_ops.c.  not everything works yet, loop select for example crashes.

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
    branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
    branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
    branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_marking.c	2009-07-21 11:48:58 UTC (rev 21759)
@@ -298,6 +298,7 @@
 	return tot;
 }
 
+/*note: by design, this will not touch the editselection history stuff*/
 void BM_Select(struct BMesh *bm, void *element, int select)
 {
 	BMHeader *head = element;

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c	2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_mesh.c	2009-07-21 11:48:58 UTC (rev 21759)
@@ -214,11 +214,13 @@
 	}
 	
 	/*Zero out vertex normals*/
-	for(v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm ); v; v = BMIter_Step(&verts)) v->no[0] = v->no[1] = v->no[2] = 0.0;
+	for(v = BMIter_New(&verts, bm, BM_VERTS_OF_MESH, bm ); v; v = BMIter_Step(&verts))
+		v->no[0] = v->no[1] = v->no[2] = 0.0;
 
 	/*add face normals to vertices*/
 	for(f = BMIter_New(&faces, bm, BM_FACES_OF_MESH, bm ); f; f = BMIter_Step(&faces)){
-		for(l = BMIter_New(&loops, bm, BM_LOOPS_OF_FACE, f ); l; l = BMIter_Step(&loops)) VecAddf(l->v->no, l->v->no, f->no);
+		for(l = BMIter_New(&loops, bm, BM_LOOPS_OF_FACE, f ); l; l = BMIter_Step(&loops)) 
+			VecAddf(l->v->no, l->v->no, f->no);
 	}
 	
 	/*average the vertex normals*/

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_polygon.c	2009-07-21 11:48:58 UTC (rev 21759)
@@ -445,7 +445,7 @@
 			i += 1;
 		}while(l!=f->loopbase);
 
-		compute_poly_plane(projectverts, f->len);
+		//compute_poly_plane(projectverts, f->len);
 		compute_poly_normal(f->no, projectverts, f->len);	
 	}
 	else if(f->len == 3){

Modified: branches/bmesh/blender/source/blender/editors/include/ED_mesh.h
===================================================================
--- branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/editors/include/ED_mesh.h	2009-07-21 11:48:58 UTC (rev 21759)
@@ -103,6 +103,9 @@
 void EDBM_selectmode_set(struct BMEditMesh *em);
 void EDBM_convertsel(struct BMEditMesh *em, short oldmode, short selectmode);
 
+void EDBM_hide_mesh(struct BMEditMesh *em, int swap);
+void EDBM_reveal_mesh(struct BMEditMesh *em);
+
 int			EDBM_check_backbuf(unsigned int index);
 int			EDBM_mask_init_backbuf_border(struct ViewContext *vc, short mcords[][2], short tot, short xmin, short ymin, short xmax, short ymax);
 void		EDBM_free_backbuf(void);

Modified: branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/editors/mesh/bmeshutils.c	2009-07-21 11:48:58 UTC (rev 21759)
@@ -697,4 +697,15 @@
 {
 	/* some of these checks could be a touch overkill */
 	return em && em->bm->totface && CustomData_has_layer(&em->bm->pdata, CD_MTEXPOLY);
+}
+
+void EDBM_hide_mesh(BMEditMesh *em, int swap)
+{
+	//BMESH_TODO
+}
+
+
+void EDBM_reveal_mesh(BMEditMesh *em)
+{
+	//BMESH_TODO
 }
\ No newline at end of file

Modified: branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c	2009-07-21 11:34:55 UTC (rev 21758)
+++ branches/bmesh/blender/source/blender/editors/uvedit/uvedit_ops.c	2009-07-21 11:48:58 UTC (rev 21759)
@@ -622,7 +622,11 @@
 
 	mindist= 1e10f;
 	memset(hit, 0, sizeof(*hit));
-	
+
+	/*this will fill in hit.vert1 and hit.vert2*/
+	find_nearest_uv_edge(scene, ima, em, co, hit);
+	hit->l = hit->nextl = hit->luv = hit->nextluv = NULL;
+
 	BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
 		tf= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
 		if(!uvedit_face_visible(scene, ima, efa, tf))
@@ -706,6 +710,10 @@
 	float mindist, dist;
 	int i, nverts;
 
+	/*this will fill in hit.vert1 and hit.vert2*/
+	find_nearest_uv_edge(scene, ima, em, co, hit);
+	hit->l = hit->nextl = hit->luv = hit->nextluv = NULL;
+
 	mindist= 1e10f;
 	memset(hit, 0, sizeof(*hit));
 	
@@ -911,8 +919,8 @@
 
 	/* set flags for first face and verts */
 	nverts= hit->efa->len;
-	iterv1= uv_vertex_map_get(vmap, hit->efa, hit->vert1);
-	iterv2= uv_vertex_map_get(vmap, hit->efa, (hit->vert1+1)%nverts);
+	iterv1= uv_vertex_map_get(vmap, hit->efa, hit->lindex);
+	iterv2= uv_vertex_map_get(vmap, hit->efa, (hit->lindex+1)%nverts);
 	uv_vertex_loop_flag(iterv1);
 	uv_vertex_loop_flag(iterv2);
 
@@ -938,6 +946,9 @@
 					/* check face not hidden and not tagged */
 					iterv1= uv_vertex_map_get(vmap, efa, a);
 					iterv2= uv_vertex_map_get(vmap, efa, (a+1)%nverts);
+					
+					if (!iterv1 || !iterv2)
+						continue;
 
 					/* check if vertex is tagged and has right valence */
 					if(iterv1->flag || iterv2->flag) {
@@ -956,9 +967,9 @@
 	}
 
 	/* do the actual select/deselect */
-	nverts= efa->len;
-	iterv1= uv_vertex_map_get(vmap, hit->efa, hit->vert1);
-	iterv2= uv_vertex_map_get(vmap, hit->efa, (hit->vert1+1)%nverts);
+	nverts= hit->efa->len;
+	iterv1= uv_vertex_map_get(vmap, hit->efa, hit->lindex);
+	iterv2= uv_vertex_map_get(vmap, hit->efa, (hit->lindex+1)%nverts);
 	iterv1->flag= 1;
 	iterv2->flag= 1;
 
@@ -2589,75 +2600,62 @@
 
 static int snap_uvs_to_adjacent_unselected(Scene *scene, Image *ima, Object *obedit)
 {
-#if 0
-	EditMesh *em= BKE_mesh_get_editmesh((Mesh*)obedit->data);
-	EditFace *efa;
-	EditVert *eve;
-	MTFace *tface;
+	BMEditMesh *em= ((Mesh*)obedit->data)->edit_btmesh;
+	BMFace *efa;
+	BMLoop *l;
+	BMIter iter, liter;
+	BMVert *eve;
+	MTexPoly *tface;
+	MLoopUV *luv;
 	short change = 0;
 	int count = 0;
 	float *coords;
 	short *usercount, users;
 	
 	/* set all verts to -1 : an unused index*/
-	for(eve= em->verts.first; eve; eve= eve->next)
-		eve->tmp.l=-1;
+	BM_ITER(eve, &iter, em->bm, BM_VERTS_OF_MESH, NULL)
+		BMINDEX_SET(eve, -1);
 	
 	/* index every vert that has a selected UV using it, but only once so as to
 	 * get unique indicies and to count how much to malloc */
-	for(efa= em->faces.first; efa; efa= efa->next) {
-		tface= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
+	BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+		tface= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
+		if(!uvedit_face_visible(scene, ima, efa, tface)) {
+			BMINDEX_SET(efa, 0);
+			continue;
+		} else {
+			BMINDEX_SET(efa, 1);
+		}
 
-		if(uvedit_face_visible(scene, ima, efa, tface)) {
-			if(uvedit_uv_selected(em, scene, efa, tface, 0) && efa->v1->tmp.l==-1)		efa->v1->tmp.l= count++;
-			if(uvedit_uv_selected(em, scene, efa, tface, 1) && efa->v2->tmp.l==-1)		efa->v2->tmp.l= count++;
-			if(uvedit_uv_selected(em, scene, efa, tface, 2) && efa->v3->tmp.l==-1)		efa->v3->tmp.l= count++;
-			if(efa->v4)
-				if(uvedit_uv_selected(em, scene, efa, tface, 3) && efa->v4->tmp.l==-1)	efa->v4->tmp.l= count++;
-
-			change = 1;
-			
-			/* optional speedup */
-			efa->tmp.p = tface;
+		change = 1;
+		BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+			if (uvedit_uv_selected(em, scene, l) && BMINDEX_GET(l->v) == -1) {
+				BMINDEX_SET(l->v, count);
+				count++;
+			}
 		}
-		else
-			efa->tmp.p = NULL;
 	}
 	
 	coords = MEM_callocN(sizeof(float)*count*2, "snap to adjacent coords");
 	usercount = MEM_callocN(sizeof(short)*count, "snap to adjacent counts");
 	
 	/* add all UV coords from visible, unselected UV coords as well as counting them to average later */
-	for(efa= em->faces.first; efa; efa= efa->next) {
-		if((tface=(MTFace *)efa->tmp.p)) {
-			/* is this an unselected UV we can snap to? */
-			if(efa->v1->tmp.l >= 0 && (!uvedit_uv_selected(em, scene, efa, tface, 0))) {
-				coords[efa->v1->tmp.l*2] +=		tface->uv[0][0];
-				coords[(efa->v1->tmp.l*2)+1] +=	tface->uv[0][1];
-				usercount[efa->v1->tmp.l]++;
-				change = 1;
+	BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {
+		if (!BMINDEX_GET(efa))
+			continue;
+
+		tface= CustomData_bmesh_get(&em->bm->pdata, efa->head.data, CD_MTEXPOLY);
+		if(!uvedit_face_visible(scene, ima, efa, tface))
+			continue;
+
+		BM_ITER(l, &liter, em->bm, BM_LOOPS_OF_FACE, efa) {
+			if (BMINDEX_GET(l->v) >= 0 && 
+			    (!uvedit_uv_selected(em, scene, l))) {
+				    luv = CustomData_bmesh_get(&em->bm->ldata, l->head.data, CD_MLOOPUV);
+				    coords[BMINDEX_GET(l->v)*2] += luv->uv[0];
+				    coords[BMINDEX_GET(l->v)*2+1] += luv->uv[1];
+				    change = 1;
 			}
-			if(efa->v2->tmp.l >= 0 && (!uvedit_uv_selected(em, scene, efa, tface, 1))) {
-				coords[efa->v2->tmp.l*2] +=		tface->uv[1][0];
-				coords[(efa->v2->tmp.l*2)+1] +=	tface->uv[1][1];
-				usercount[efa->v2->tmp.l]++;
-				change = 1;
-			}
-			if(efa->v3->tmp.l >= 0 && (!uvedit_uv_selected(em, scene, efa, tface, 2))) {
-				coords[efa->v3->tmp.l*2] +=		tface->uv[2][0];
-				coords[(efa->v3->tmp.l*2)+1] +=	tface->uv[2][1];
-				usercount[efa->v3->tmp.l]++;
-				change = 1;
-			}
-			
-			if(efa->v4) {
-				if(efa->v4->tmp.l >= 0 && (!uvedit_uv_selected(em, scene, efa, tface, 3))) {
-					coords[efa->v4->tmp.l*2] +=		tface->uv[3][0];
-					coords[(efa->v4->tmp.l*2)+1] +=	tface->uv[3][1];
-					usercount[efa->v4->tmp.l]++;
-					change = 1;
-				}
-			}
 		}
 	}
 	
@@ -2665,65 +2663,43 @@
 	if(!change) {
 		MEM_freeN(coords);
 		MEM_freeN(usercount);
-		BKE_mesh_end_editmesh(obedit->data, em);
 		return change;
 	}
 	
 	/* copy the averaged unselected UVs back to the selected UVs */
-	for(efa= em->faces.first; efa; efa= efa->next) {
-		if((tface=(MTFace *)efa->tmp.p)) {
-			
-			if(	uvedit_uv_selected(em, scene, efa, tface, 0) &&
-					efa->v1->tmp.l >= 0 &&
-					(users = usercount[efa->v1->tmp.l])
-			) {
-				tface->uv[0][0] = coords[efa->v1->tmp.l*2]		/ users;
-				tface->uv[0][1] = coords[(efa->v1->tmp.l*2)+1]	/ users;
-			}
+	BM_ITER(efa, &iter, em->bm, BM_FACES_OF_MESH, NULL) {

@@ Diff output truncated at 10240 characters. @@




More information about the Bf-blender-cvs mailing list