[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [41006] branches/bmesh/blender/source/ blender: Fix vertex paint face selection

Andrew Wiggin ender79bl at gmail.com
Fri Oct 14 11:05:20 CEST 2011


Revision: 41006
          http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-blender&revision=41006
Author:   ender79
Date:     2011-10-14 09:05:20 +0000 (Fri, 14 Oct 2011)
Log Message:
-----------
Fix vertex paint face selection

Modified Paths:
--------------
    branches/bmesh/blender/source/blender/blenloader/intern/writefile.c
    branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
    branches/bmesh/blender/source/blender/editors/mesh/editface.c

Modified: branches/bmesh/blender/source/blender/blenloader/intern/writefile.c
===================================================================
--- branches/bmesh/blender/source/blender/blenloader/intern/writefile.c	2011-10-14 08:06:59 UTC (rev 41005)
+++ branches/bmesh/blender/source/blender/blenloader/intern/writefile.c	2011-10-14 09:05:20 UTC (rev 41006)
@@ -1667,6 +1667,7 @@
 				write_customdata(wd, &mesh->id, mesh->pv->totvert, &mesh->vdata, -1, 0);
 				write_customdata(wd, &mesh->id, mesh->pv->totedge, &mesh->edata,
 					CD_MEDGE, mesh->totedge);
+				/* BMESH_TODO: probably need to deal with polys here */
 				write_customdata(wd, &mesh->id, mesh->pv->totface, &mesh->fdata,
 					CD_MFACE, mesh->totface);
 			}

Modified: branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c
===================================================================
--- branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c	2011-10-14 08:06:59 UTC (rev 41005)
+++ branches/bmesh/blender/source/blender/bmesh/intern/bmesh_interp.c	2011-10-14 09:05:20 UTC (rev 41006)
@@ -360,14 +360,13 @@
 
 mdisps is a grid of displacements, ordered thus:
 
-v1/center -- v4/next -> x
-|                 |
-|				  |
-v2/prev ---- v3/cur
-|
-V
-
-y
+ v1/center----v4/next -> x
+     |           |
+     |           |
+  v2/prev------v3/cur
+     |
+     V
+     y
 */
 
 static int compute_mdisp_quad(BMLoop *l, double v1[3], double v2[3], double v3[3], double v4[3], double e1[3], double e2[3])
@@ -611,15 +610,15 @@
 		/*****
 		mdisps is a grid of displacements, ordered thus:
 		
-		              v4/next
-		                |		                
-		 |       v1/cent-mid2 ---> x
-		 |       |       | 
-		 |       |       |
-		v2/prev--mid1--v3/cur
-		         |
-		         V
-		         y
+		                   v4/next
+		                     |		                
+		 |      v1/cent-----mid2 ---> x
+		 |         |         | 
+		 |         |         |
+		v2/prev---mid1-----v3/cur
+		           |
+		           V
+		           y
 		*****/
 		  
 		sides = sqrt(mdp->totdisp);
@@ -642,15 +641,15 @@
 		/*****
 		mdisps is a grid of displacements, ordered thus:
 		
-		              v4/next
-		                |		                
-		 |       v1/cent-mid2 ---> x
-		 |       |       | 
-		 |       |       |
-		v2/prev--mid1--v3/cur
-		         |
-		         V
-		         y
+		                   v4/next
+		                     |		                
+		 |      v1/cent-----mid2 ---> x
+		 |         |         | 
+		 |         |         |
+		v2/prev---mid1-----v3/cur
+		           |
+		           V
+		           y
 		*****/
 		 
 		if (l->radial_next == l)
@@ -737,8 +736,8 @@
 	else if(yn>=xn && yn>=zn) {ax= 0; ay= 2;}
 	else {ax= 1; ay= 2;} 
 	
-	/*scale source face coordinates a bit, so points sitting directonly on an
-      edge will work.*/
+	/* scale source face coordinates a bit, so points sitting directonly on an
+	   edge will work.*/
 	mul_v3_fl(cent, 1.0f/(float)source->len);
 	for (i=0; i<source->len; i++) {
 		float vec[3], tmp[3];

Modified: branches/bmesh/blender/source/blender/editors/mesh/editface.c
===================================================================
--- branches/bmesh/blender/source/blender/editors/mesh/editface.c	2011-10-14 08:06:59 UTC (rev 41005)
+++ branches/bmesh/blender/source/blender/editors/mesh/editface.c	2011-10-14 09:05:20 UTC (rev 41006)
@@ -69,28 +69,50 @@
 
 /* copy the face flags, most importantly selection from the mesh to the final derived mesh,
  * use in object mode when selecting faces (while painting) */
+
 void paintface_flush_flags(Object *ob)
 {
-	Mesh *me= get_mesh(ob);
-	DerivedMesh *dm= ob->derivedFinal;
-	MPoly *mf_orig, *mp;
-	int *index = NULL;
-	int totface;
+	Mesh *me = get_mesh(ob);
+	DerivedMesh *dm = ob->derivedFinal;
+	MPoly *polys, *mp_orig;
+	MFace *faces, *mf;
+	int *index_array = NULL;
+	int totface, totpoly;
 	int i;
 	
-	if(me==NULL || dm==NULL)
+	if (me==NULL || dm==NULL) {
 		return;
+	}
 
-	totface = dm->getNumFaces(dm);
-	index = DM_get_face_data_layer(dm, CD_ORIGINDEX);
-	mp = dm->getPolyArray(dm);
-	for (i=0; i<dm->numPolyData; i++, index++, mp++) {
-		if (!index)
-			break;
+	/*
+	 * Try to push updated mesh poly flags to two other data sets:
+	 *  - Mesh polys => Mesh tess faces
+	 *  - Mesh polys => Final derived mesh polys
+	 */
 
-		mf_orig = me->mpoly + *index;
-		mp->flag = mf_orig->flag;
+	if (index_array = CustomData_get_layer(&me->fdata, CD_ORIGINDEX)) {
+		faces = me->mface;
+		totface = me->totface;
+		
+		/* loop over tessfaces */
+		for (i= 0; i<totface; i++) {
+			/* Copy flags onto the tessface from its poly */
+			mp_orig = me->mpoly + index_array[i];
+			faces[i].flag = mp_orig->flag;
+		}
 	}
+
+	if (index_array = CustomData_get_layer(&dm->polyData, CD_ORIGINDEX)) {
+		polys = dm->getPolyArray(dm);
+		totpoly = dm->getNumFaces(dm);
+
+		/* loop over final derived polys */
+		for (i= 0; i<totpoly; i++) {
+			/* Copy flags onto the mesh poly from its final derived poly */
+			mp_orig = me->mpoly + index_array[i];
+			polys[i].flag = mp_orig->flag;
+		}
+	}
 }
 
 /* returns 0 if not found, otherwise 1 */




More information about the Bf-blender-cvs mailing list