[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [42908] branches/bmesh/blender/source/ blender: macro for getting next/previous MPoly loops

Campbell Barton ideasman42 at gmail.com
Wed Dec 28 08:10:35 CET 2011


Revision: 42908
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=42908
Author:   campbellbarton
Date:     2011-12-28 07:10:27 +0000 (Wed, 28 Dec 2011)
Log Message:
-----------
macro for getting next/previous MPoly loops

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
    branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
    branches/bmesh/blender/source/blender/editors/mesh/editface.c
    branches/bmesh/blender/source/blender/editors/object/object_modifier.c
    branches/bmesh/blender/source/blender/makesdna/DNA_meshdata_types.h
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-12-28 04:43:29 UTC (rev 42907)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-12-28 07:10:27 UTC (rev 42908)
@@ -2548,7 +2548,7 @@
 		ml = cddm->mloop + mp->loopstart;
 		for (j=0; j<mp->totloop; j++, ml++) {
 			v1 = ml->v;
-			v2 = (cddm->mloop + mp->loopstart + ((j+1)%mp->totloop))->v;
+			v2 = ME_POLY_LOOP_NEXT(cddm->mloop, mp, j)->v;
 			if (!BLI_edgehash_haskey(eh, v1, v2)) {
 				BLI_edgehash_insert(eh, v1, v2, NULL);
 			}
@@ -2589,7 +2589,7 @@
 		ml = cddm->mloop + mp->loopstart;
 		for (j=0; j<mp->totloop; j++, ml++) {
 			v1 = ml->v;
-			v2 = (cddm->mloop + mp->loopstart + ((j+1)%mp->totloop))->v;
+			v2 = ME_POLY_LOOP_NEXT(cddm->mloop, mp, j)->v;
 			ml->e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(eh, v1, v2));
 		}
 	}

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-12-28 04:43:29 UTC (rev 42907)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-12-28 07:10:27 UTC (rev 42908)
@@ -1001,7 +1001,7 @@
 			int v1, v2;
 			
 			v1 = mloop[b].v;
-			v2 = mloop[(b+1)%mpoly->totloop].v;
+			v2 = ME_POLY_LOOP_NEXT(mloop, mpoly, b)->v;
 			mloop[b].e = GET_INT_FROM_POINTER(BLI_edgehash_lookup(hash, v1, v2));
 		}
 	}

Modified: branches/bmesh/blender/source/blender/editors/mesh/editface.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editface.c	2011-12-28 04:43:29 UTC (rev 42907)
+++ branches/bmesh/blender/source/blender/editors/mesh/editface.c	2011-12-28 07:10:27 UTC (rev 42908)
@@ -235,14 +235,13 @@
 
 /* Set tface seams based on edge data, uses hash table to find seam edges. */
 
-static void hash_add_face(EdgeHash *ehash, MPoly *mf, MLoop *mloop)
+static void hash_add_face(EdgeHash *ehash, MPoly *mp, MLoop *mloop)
 {
-	MLoop *ml, *ml2;
+	MLoop *ml;
 	int i;
 
-	for (i=0, ml=mloop; i<mf->totloop; i++, ml++) {
-		ml2 = mloop + (i+1) % mf->totloop;
-		BLI_edgehash_insert(ehash, ml->v, ml2->v, NULL);
+	for (i=0, ml=mloop; i<mp->totloop; i++, ml++) {
+		BLI_edgehash_insert(ehash, ml->v, ME_POLY_LOOP_NEXT(mloop, mp, i)->v, NULL);
 	}
 }
 

Modified: branches/bmesh/blender/source/blender/editors/object/object_modifier.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/object/object_modifier.c	2011-12-28 04:43:29 UTC (rev 42907)
+++ branches/bmesh/blender/source/blender/editors/object/object_modifier.c	2011-12-28 07:10:27 UTC (rev 42908)
@@ -1199,10 +1199,10 @@
 		
 		ml = me->mloop + mp->loopstart;
 		for (j=0; j<mp->totloop; j++, ml++) {
-			MLoop *ml2 = me->mloop + mp->loopstart + (j+mp->totloop-1)%mp->totloop;
-			MLoop *ml3 = me->mloop + mp->loopstart + (j+1)%mp->totloop;
+			MLoop *ml_prev = ME_POLY_LOOP_PREV(me->mloop, mp, j);
+			MLoop *ml_next = ME_POLY_LOOP_NEXT(me->mloop, mp, j);
 			
-			if ((me->mvert[ml->v].flag&SELECT) && (me->mvert[ml2->v].flag&SELECT) && (me->mvert[ml3->v].flag&SELECT)) {
+			if ((me->mvert[ml->v].flag&SELECT) && (me->mvert[ml_prev->v].flag&SELECT) && (me->mvert[ml_next->v].flag&SELECT)) {
 				MDisps *md = mdisps + mp->loopstart + j;
 				int res = sqrt(md->totdisp);
 				

Modified: branches/bmesh/blender/source/blender/makesdna/DNA_meshdata_types.h
===================================================================
--- branches/bmesh/blender/source/blender/makesdna/DNA_meshdata_types.h	2011-12-28 04:43:29 UTC (rev 42907)
+++ branches/bmesh/blender/source/blender/makesdna/DNA_meshdata_types.h	2011-12-28 07:10:27 UTC (rev 42908)
@@ -239,6 +239,9 @@
 /* flag ME_HIDE==16 is used here too */ 
 #define ME_DRAW_ACT			4
 
+#define ME_POLY_LOOP_PREV(mloop, mp, i)  (&(mloop)[(mp)->loopstart + (((i) + (mp)->totloop - 1) % (mp)->totloop)])
+#define ME_POLY_LOOP_NEXT(mloop, mp, i)  (&(mloop)[(mp)->loopstart + (((i) + 1) % (mp)->totloop)])
+
 /* mselect->type */
 #define ME_VSEL	0
 #define ME_ESEL 1

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c
===================================================================
--- branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c	2011-12-28 04:43:29 UTC (rev 42907)
+++ branches/bmesh/blender/source/blender/modifiers/intern/MOD_solidify.c	2011-12-28 07:10:27 UTC (rev 42908)
@@ -104,15 +104,21 @@
 
 		/* This function adds an edge hash if its not there, and adds the face index */
 #define NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(EDV1, EDV2); \
-				edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, EDV1, EDV2); \
+			{ \
+				const unsigned int ed_v1 = EDV1; \
+				const unsigned int ed_v2 = EDV2; \
+				edge_ref = (EdgeFaceRef *)BLI_edgehash_lookup(edge_hash, ed_v1, ed_v2); \
 				if (!edge_ref) { \
 					edge_ref = &edge_ref_array[edge_ref_count]; edge_ref_count++; \
-					edge_ref->f1=i; \
-					edge_ref->f2=-1; \
-					BLI_edgehash_insert(edge_hash, EDV1, EDV2, edge_ref); \
-				} else { \
+					edge_ref->f1 = i; \
+					edge_ref->f2 =- 1; \
+					BLI_edgehash_insert(edge_hash, ed_v1, ed_v2, edge_ref); \
+				} \
+				else { \
 					edge_ref->f2=i; \
-				}
+				} \
+			}
+		/* --- end define --- */
 
 		for(i = 0; i < numFaces; i++, mp++) {
 			int j;
@@ -122,8 +128,8 @@
 				mesh_calc_poly_normal(mp, mloop+mp->loopstart, mvert, f_no);
 
 			ml = mloop + mp->loopstart;
-			for (j=0; j<mp->totloop; j++) {
-				NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(ml[j].v, ml[(j+1)%mp->totloop].v);
+			for (j=0; j<mp->totloop; j++, ml++) {
+				NOCALC_EDGEWEIGHT_ADD_EDGEREF_FACE(ml->v, ME_POLY_LOOP_NEXT(mloop, mp, j)->v);
 			}
 		}
 
@@ -273,14 +279,19 @@
 #define INVALID_PAIR -2
 
 #define ADD_EDGE_USER(_v1, _v2, edge_ord) \
-		eidx= GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, _v1, _v2)); \
-		if(edge_users[eidx] == INVALID_UNUSED) { \
-			ed= orig_medge + eidx; \
-			edge_users[eidx]= (_v1 < _v2) == (ed->v1 < ed->v2) ? i:(i+numFaces); \
-			edge_order[eidx]= edge_ord; \
-		} else { \
-			edge_users[eidx]= INVALID_PAIR; \
-		} \
+		{ \
+			const unsigned int ml_v1 = _v1; \
+			const unsigned int ml_v2 = _v2; \
+			eidx= GET_INT_FROM_POINTER(BLI_edgehash_lookup(edgehash, ml_v1, ml_v2)); \
+			if(edge_users[eidx] == INVALID_UNUSED) { \
+				ed= orig_medge + eidx; \
+				edge_users[eidx] = (ml_v1 < ml_v2) == (ed->v1 < ed->v2) ? i : (i + numFaces); \
+				edge_order[eidx] = edge_ord; \
+			} \
+			else { \
+				edge_users[eidx] = INVALID_PAIR; \
+			} \
+		}
 
 
 		edge_users= MEM_mallocN(sizeof(int) * numEdges, "solid_mod edges");
@@ -291,8 +302,7 @@
 			MLoop *ml;
 			
 			for (ml=orig_mloop + mp->loopstart, j=0; j<mp->totloop; ml++, j++) {
-				MLoop *ml2 = orig_mloop + mp->loopstart + (j+1)%mp->totloop;
-				ADD_EDGE_USER(ml->v, ml2->v, j);
+				ADD_EDGE_USER(ml->v, ME_POLY_LOOP_NEXT(orig_mloop, mp, j)->v, j);
 			}	
 		}
 
@@ -456,12 +466,13 @@
 			/* just added, calc the normal */
 			BLI_array_empty(face_angles);
 			for (j=0, ml=mloop+mp->loopstart; j<mp->totloop; j++, ml++) {
-				MLoop *ml2 = &mloop[mp->loopstart + (j + 1) % mp->totloop]; //next
-				MLoop *ml3 = &mloop[mp->loopstart + (j + mp->totloop - 1) % mp->totloop]; //previous
+				MLoop *ml_prev = ME_POLY_LOOP_PREV(mloop, mp, j);
+				MLoop *ml_next = ME_POLY_LOOP_NEXT(mloop, mp, j);
+
 				float e1[3], e2[3], angle;
 				
-				sub_v3_v3v3(e1, mvert[ml2->v].co, mvert[ml->v].co);
-				sub_v3_v3v3(e2, mvert[ml3->v].co, mvert[ml->v].co);
+				sub_v3_v3v3(e1, mvert[ml_next->v].co, mvert[ml->v].co);
+				sub_v3_v3v3(e2, mvert[ml_prev->v].co, mvert[ml->v].co);
 				angle = M_PI - angle_normalized_v3v3(e1, e2);
 				BLI_array_append(face_angles, angle);
 			}




More information about the Bf-blender-cvs mailing list