[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [35093] branches/bmesh/blender: =bmesh=

Joseph Eagar joeedh at gmail.com
Wed Feb 23 01:01:51 CET 2011


Revision: 35093
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=35093
Author:   joeedh
Date:     2011-02-23 00:01:50 +0000 (Wed, 23 Feb 2011)
Log Message:
-----------
=bmesh=

Fixed join meshes, and an annoying modifier bug (making modifiers
not work in editmode).  Also fixed a tesselation bug.

Also got edge slide to work right, yay!  Dunno why I couldn't get
it working right before; took me twenty minutes to fix.

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/bmesh/bmesh.h
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
    branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
    branches/bmesh/blender/source/blender/editors/mesh/meshtools.c
    branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c
    branches/bmesh/blender/source/blender/editors/transform/transform.c
    branches/bmesh/blender/source/blender/modifiers/intern/MOD_mirror.c
    branches/bmesh/blender/test/test_vcol.blend.crash.blend

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-02-22 23:40:06 UTC (rev 35092)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/cdderivedmesh.c	2011-02-23 00:01:50 UTC (rev 35093)
@@ -1794,8 +1794,6 @@
 	                 CD_CALLOC, dm->numVertData);
 	CustomData_merge(&em->bm->edata, &dm->edgeData, CD_MASK_DERIVEDMESH,
 	                 CD_CALLOC, dm->numEdgeData);
-	CustomData_merge(&em->bm->pdata, &dm->faceData, CD_MASK_DERIVEDMESH,
-	                 CD_CALLOC, dm->numFaceData);
 	CustomData_merge(&em->bm->ldata, &dm->loopData, CD_MASK_DERIVEDMESH,
 	                 CD_CALLOC, dm->numLoopData);
 	CustomData_merge(&em->bm->pdata, &dm->polyData, CD_MASK_DERIVEDMESH,

Modified: branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c
===================================================================
--- branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-02-22 23:40:06 UTC (rev 35092)
+++ branches/bmesh/blender/source/blender/blenkernel/intern/mesh.c	2011-02-23 00:01:50 UTC (rev 35093)
@@ -1923,38 +1923,14 @@
 	mp = mpoly;
 	polyorigIndex = use_poly_origindex? CustomData_get_layer(pdata, CD_ORIGINDEX) : NULL;
 	for (i=0; i<totpoly; i++, mp++) {
-		ml = mloop + mp->loopstart;
-		
-		if (mp->totloop < 5) {
-			BLI_array_growone(mf);
-			BLI_array_growone(origIndex);
+		if (mp->totloop > 2) {		
+			ml = mloop + mp->loopstart;
 
-			origIndex[k] = use_face_origindex ? k : i;
-			
-			for (j=0; j<mp->totloop; j++, ml++) {
-				switch (j) {
-					case 0:
-						mf[k].v1 = mp->loopstart + j;
-					case 1:
-						mf[k].v2 = mp->loopstart + j;
-					case 2:
-						mf[k].v3 = mp->loopstart + j;
-					case 3:
-						mf[k].v4 = mp->loopstart + j;
-				}
-			}
-			if (mp->totloop == 4 && !mf->v4) {
-				SWAP(int, mf[k].v1, mf[k].v4);
-				SWAP(int, mf[k].v2, mf[k].v3);
-			}
-
-			k++;
-		} else {		
 			firstv = NULL;
 			lastv = NULL;
 			for (j=0; j<mp->totloop; j++, ml++) {
 				v = BLI_addfillvert(mvert[ml->v].co);
-				if (polyorigIndex)
+				if (polyorigIndex && use_poly_origindex)
 					v->tmp.l = polyorigIndex[i];
 				else
 					v->tmp.l = i;
@@ -1980,6 +1956,8 @@
 				mf[k].v1 = f->v1->keyindex;
 				mf[k].v2 = f->v2->keyindex;
 				mf[k].v3 = f->v3->keyindex;
+				
+				/*put poly index in mf->v4*/
 				mf[k].v4 = f->v1->tmp.l;
 				
 				mf[k].mat_nr = mp->mat_nr;
@@ -2003,28 +1981,28 @@
 
 	mface = mf;
 	for (i=0; i<totface; i++, mf++) {
-		/*ensure winding is correct*/
+		/*sort loop indices to ensure winding is correct*/
 		if (mf->v1 > mf->v2) SWAP(int, mf->v1, mf->v2);
 		if (mf->v2 > mf->v3) SWAP(int, mf->v2, mf->v3);
 		if (mf->v1 > mf->v2) SWAP(int, mf->v1, mf->v2);
-		if (mf->v4 && mf->v1 > mf->v4) SWAP(int, mf->v1, mf->v4);
+
 		if (mf->v1 > mf->v2) SWAP(int, mf->v1, mf->v2);
 		if (mf->v2 > mf->v3) SWAP(int, mf->v2, mf->v3);
 		if (mf->v1 > mf->v2) SWAP(int, mf->v1, mf->v2);
-
+	
 		lindex[0] = mf->v1;
 		lindex[1] = mf->v2;
 		lindex[2] = mf->v3;
-		lindex[4] = mf->v4;
 
 		/*transform loop indices to vert indices*/
 		mf->v1 = mloop[mf->v1].v;
 		mf->v2 = mloop[mf->v2].v;
 		mf->v3 = mloop[mf->v3].v;
-		mf->v4 = mf->v4 ? mloop[mf->v4].v : 0;
 
 		mesh_loops_to_corners(fdata, ldata, pdata,
-			lindex, i, mf->v4, numTex, numCol, mf->v4 ? 4 : 3);
+			lindex, i, mf->v4, numTex, numCol, 3);
+		
+		mf->v4 = 0;
 	}
 
 	return totface;

Modified: branches/bmesh/blender/source/blender/bmesh/bmesh.h
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/bmesh.h	2011-02-22 23:40:06 UTC (rev 35092)
+++ branches/bmesh/blender/source/blender/bmesh/bmesh.h	2011-02-23 00:01:50 UTC (rev 35093)
@@ -144,7 +144,7 @@
 struct BMFace *BM_Make_Ngon ( struct BMesh *bm, struct BMVert *v1, struct BMVert *v2, struct BMEdge **edges, int len, int nodouble );
 
 /*stuff for dealing with header flags*/
-#define BM_TestHFlag(ele, f) (((BMHeader*)ele)->flag & (f))
+#define BM_TestHFlag(ele, f) (ele && (((BMHeader*)ele)->flag & (f)))
 #define BM_SetHFlag(ele, f) (((BMHeader*)ele)->flag = ((BMHeader*)ele)->flag | (f))
 #define BM_ClearHFlag(ele, f) (((BMHeader*)ele)->flag = ((BMHeader*)ele)->flag & ~(f))
 

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c	2011-02-22 23:40:06 UTC (rev 35092)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_newcore.c	2011-02-23 00:01:50 UTC (rev 35093)
@@ -657,7 +657,7 @@
 static int count_flagged_radial(BMLoop *l, int flag)
 {
 	BMLoop *l2 = l;
-	int i = 0;
+	int i = 0, c=0;
 
 	do {
 		if (!l2) {
@@ -667,10 +667,11 @@
 		
 		i += bmesh_api_getflag(l2->f, flag) ? 1 : 0;
 		l2 = bmesh_radial_nextloop(l2);
-		if (i >= 800000) {
+		if (c >= 800000) {
 			bmesh_error();
 			return 0;
 		}
+		c++;
 	} while (l2 != l);
 
 	return i;

Modified: branches/bmesh/blender/source/blender/editors/mesh/knifetool.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/knifetool.c	2011-02-22 23:40:06 UTC (rev 35092)
+++ branches/bmesh/blender/source/blender/editors/mesh/knifetool.c	2011-02-23 00:01:50 UTC (rev 35093)
@@ -1583,7 +1583,11 @@
 static int knifetool_modal (bContext *C, wmOperator *op, wmEvent *event)
 {
 	knifetool_opdata *kcd= op->customdata;
-
+	
+	if (!C) {
+		return OPERATOR_FINISHED;
+	}
+	
 	view3d_operator_needs_opengl(C);
 
 	switch (event->type) {

Modified: branches/bmesh/blender/source/blender/editors/mesh/meshtools.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/meshtools.c	2011-02-22 23:40:06 UTC (rev 35092)
+++ branches/bmesh/blender/source/blender/editors/mesh/meshtools.c	2011-02-23 00:01:50 UTC (rev 35093)
@@ -435,8 +435,6 @@
 					medge->v1+= vertofs;
 					medge->v2+= vertofs;
 				}
-				
-				edgeofs += me->totedge;
 			}
 
 			if (me->totloop) {
@@ -447,8 +445,6 @@
 					mloop->v += vertofs;
 					mloop->e += edgeofs;
 				}
-				
-				loopofs += me->totloop;
 			}
 			
 			if(me->totpoly) {
@@ -472,13 +468,15 @@
 					mpoly->mat_nr= matmap[(int)mpoly->mat_nr];
 				}
 				
-				polyofs += me->totface;
+				polyofs += me->totpoly;
 			}
 
-			/* vertofs is used to help newly added verts be reattached to their edge/face 
-			 * (cannot be set earlier, or else reattaching goes wrong)
+			/* these are used for relinking (cannot be set earlier, 
+			 * or else reattaching goes wrong)
 			 */
 			vertofs += me->totvert;
+			edgeofs += me->totedge;
+			loopofs += me->totloop;
 			
 			/* free base, now that data is merged */
 			if(base->object != ob)

Modified: branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c	2011-02-22 23:40:06 UTC (rev 35092)
+++ branches/bmesh/blender/source/blender/editors/space_view3d/drawobject.c	2011-02-23 00:01:50 UTC (rev 35093)
@@ -1992,6 +1992,9 @@
 	int vcount, pin=0;
 	int opac = UI_GetThemeValue(TH_PIN_OPAC);
 	
+	if (!efa)
+		return 0;
+	
 	if (!BM_TestHFlag(efa, BM_HIDDEN)) {
 
 		/* Check if all verts of a face are pinned. If so, then display it in a darker shade. */

Modified: branches/bmesh/blender/source/blender/editors/transform/transform.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/transform/transform.c	2011-02-22 23:40:06 UTC (rev 35092)
+++ branches/bmesh/blender/source/blender/editors/transform/transform.c	2011-02-23 00:01:50 UTC (rev 35093)
@@ -4460,38 +4460,44 @@
 			TransDataSlideVert *sv1, *sv2;
 			float vec1[3], dis2, ec2[3], vec[3], mval[2] = {t->mval[0], t->mval[1]}, d, z2;
 						
-			/*search cross edges for magnitude of transform vector*/
+			/*search cross edges for visible edge to the mouse cursor,
+              then use the shared vertex to calculate screen vector*/
 			dis2 = -1.0f;
 			for (i=0; i<2; i++) {
-				BM_ITER(e2, &iter2, em->bm, BM_EDGES_OF_VERT, i?e->v1:e->v2) {
+				v = i?e->v1:e->v2;
+				BM_ITER(e2, &iter2, em->bm, BM_EDGES_OF_VERT, v) {
 					if (BM_TestHFlag(e2, BM_SELECT))
 						continue;
 					
 					if (!BMBVH_EdgeVisible(btree, e2, v3d, t->obedit))
 						continue;
 					
-					view3d_project_float_v3(ar, e2->v1->co, vec1, projectMat);
-					view3d_project_float_v3(ar, e2->v2->co, vec2, projectMat);
 					
+					j = GET_INT_FROM_POINTER(BLI_smallhash_lookup(&table, (intptr_t)v));
+
+					if (tempsv[j].down) {
+						view3d_project_float_v3(ar, tempsv[j].down->co, vec1, projectMat);
+					} else {
+						add_v3_v3v3(vec1, v->co, tempsv[j].downvec);
+						view3d_project_float_v3(ar, vec1, vec1, projectMat);
+					}
+					
+					if (tempsv[j].up) {
+						view3d_project_float_v3(ar, tempsv[j].up->co, vec2, projectMat);
+					} else {
+						add_v3_v3v3(vec1, v->co, tempsv[j].upvec);
+						view3d_project_float_v3(ar, vec2, vec2, projectMat);
+					}
+
 					d = dist_to_line_segment_v2(mval, vec1, vec2);
 					if (dis2 == -1.0f || d < dis2) {
 						dis2 = d;
 						ee = e2;
 						size = len_v3v3(vec1, vec2);
+						sub_v3_v3v3(dir, vec1, vec2);
 					}
 				}
 			}
-			
-			view3d_project_float_v3(ar, e->v1->co, vec1, projectMat);
-			view3d_project_float_v3(ar, e->v2->co, vec2, projectMat);
-			
-			d = dist_to_line_segment_v2(mval, vec1, vec2);
-			if ((d < dis || dis == -1.0) && (!le || BMBVH_EdgeVisible(btree, e, v3d, t->obedit))) {
-				le = e;
-				dis = d;
-				sub_v3_v3v3(dir, vec1, vec2);
-				normalize_v3(dir);
-			}
 		}
 	}
 	
@@ -4500,23 +4506,7 @@
 	
 	/*dir holds a vector along edge loop*/
 	copy_v3_v3(end, dir);
-
-	/*find perpindicular 2d line*/
-	SWAP(float, end[0], end[1]);
-
-	if (le) {	
-		j = GET_INT_FROM_POINTER(BLI_smallhash_lookup(&table, (intptr_t)le->v1));
-		sv = tempsv + j;
-		copy_v3_v3(vec, sv->upvec);
-		normalize_v3(vec);
-
-		if (dot_v2v2(vec, end) > 0.0) {
-			mul_v3_fl(end, -1.0);
-		}
-	}
-			
-	size *= 0.5;
-	mul_v3_fl(end, size);
+	mul_v3_fl(end, 0.5);
 	
 	sld->start[0] = t->mval[0] + start[0];
 	sld->start[1] = t->mval[1] + start[1];

Modified: branches/bmesh/blender/source/blender/modifiers/intern/MOD_mirror.c
===================================================================

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list