[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [23600] branches/blender2.4/source/blender /src: fix for [#19013] Projection Paint Mask is failing (for campbell)

Campbell Barton ideasman42 at gmail.com
Fri Oct 2 08:06:09 CEST 2009


Revision: 23600
          http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=23600
Author:   campbellbarton
Date:     2009-10-02 08:06:09 +0200 (Fri, 02 Oct 2009)

Log Message:
-----------
fix for [#19013] Projection Paint Mask is failing (for campbell)
- flush face selection to the derived mesh where possible (if CD_ORIGINDEX is available).

- fixed border-select while painting which rarely worked.
- painting on a mesh with no UV's didn't free the derived mesh.

Modified Paths:
--------------
    branches/blender2.4/source/blender/src/editface.c
    branches/blender2.4/source/blender/src/imagepaint.c

Modified: branches/blender2.4/source/blender/src/editface.c
===================================================================
--- branches/blender2.4/source/blender/src/editface.c	2009-10-02 03:09:17 UTC (rev 23599)
+++ branches/blender2.4/source/blender/src/editface.c	2009-10-02 06:06:09 UTC (rev 23600)
@@ -125,6 +125,33 @@
 #define MENUSTRING(string, code) string " %x" STRING(code)
 #define MENUTITLE(string) string " %t|" 
 
+/* 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 object_facesel_flush_dm(Object *ob)
+{
+	Mesh *me= get_mesh(ob);
+	DerivedMesh *dm= ob->derivedFinal;
+	MFace *faces, *mf, *mf_orig;
+	int *index_array = NULL;
+	int totface;
+	int i;
+	
+	
+	if(me==NULL || dm==NULL || !CustomData_has_layer( &dm->faceData, CD_ORIGINDEX))
+		return;
+	
+	faces = dm->getFaceArray(dm);
+	totface = dm->getNumFaces(dm);
+	
+	index_array = dm->getFaceDataArray(dm, CD_ORIGINDEX);
+	
+	mf= faces;
+	
+	for (i= 0; i<totface; i++, mf++) { /* loop over derived mesh faces */
+		mf_orig= me->mface + index_array[i];
+		mf->flag= mf_orig->flag;;
+	}
+}
 
 /* returns 0 if not found, otherwise 1 */
 int facesel_face_pick(Mesh *me, short *mval, unsigned int *index, short rect)
@@ -678,7 +705,8 @@
 	}
 
 	BIF_undo_push("Reveal face");
-
+	
+	object_facesel_flush_dm(OBACT);
 	object_tface_flags_changed(OBACT, 0);
 }
 
@@ -714,7 +742,8 @@
 	}
 
 	BIF_undo_push("Hide face");
-
+	
+	object_facesel_flush_dm(OBACT);
 	object_tface_flags_changed(OBACT, 0);
 }
 
@@ -754,7 +783,10 @@
 	sel= 0;
 	while(a--) {
 		if(mface->flag & ME_HIDE);
-		else if(mface->flag & ME_FACE_SEL) sel= 1;
+		else if(mface->flag & ME_FACE_SEL) {
+			sel= 1;
+			break;
+		}
 		mface++;
 	}
 	
@@ -770,7 +802,8 @@
 	}
 
 	BIF_undo_push("(De)select all faces");
-
+	
+	object_facesel_flush_dm(OBACT);
 	object_tface_flags_changed(OBACT, 0);
 }
 
@@ -796,6 +829,7 @@
 
 	BIF_undo_push("Select inverse face");
 
+	object_facesel_flush_dm(OBACT);
 	object_tface_flags_changed(OBACT, 0);
 }
 
@@ -1169,6 +1203,7 @@
 	
 	BIF_undo_push("Select UV face");
 
+	object_facesel_flush_dm(OBACT);
 	object_tface_flags_changed(OBACT, 1);
 }
 
@@ -1187,14 +1222,15 @@
 	if(me->totface==0) return;
 	
 	val= get_border(&rect, 3);
-	
-	/* why readbuffer here? shouldn't be necessary (maybe a flush or so) */
-	glReadBuffer(GL_BACK);
-#ifdef __APPLE__
-	glReadBuffer(GL_AUX0); /* apple only */
-#endif
-	
+		
 	if(val) {
+		
+		/* without this border select often fails */
+		if (G.vd->flag & V3D_NEEDBACKBUFDRAW) {
+			check_backbuf();
+			persp(PERSP_VIEW);
+		}
+		
 		selar= MEM_callocN(me->totface+1, "selar");
 		
 		sx= (rect.xmax-rect.xmin+1);
@@ -1231,6 +1267,7 @@
 
 		BIF_undo_push("Border Select UV face");
 
+		object_facesel_flush_dm(OBACT);
 		object_tface_flags_changed(OBACT, 0);
 	}
 #ifdef __APPLE__	

Modified: branches/blender2.4/source/blender/src/imagepaint.c
===================================================================
--- branches/blender2.4/source/blender/src/imagepaint.c	2009-10-02 03:09:17 UTC (rev 23599)
+++ branches/blender2.4/source/blender/src/imagepaint.c	2009-10-02 06:06:09 UTC (rev 23600)
@@ -214,6 +214,7 @@
 	DerivedMesh    *dm;
 	int 			dm_totface;
 	int 			dm_totvert;
+	int				dm_release;
 	
 	MVert 		   *dm_mvert;
 	MFace 		   *dm_mface;
@@ -2913,12 +2914,26 @@
 	/* ---- end defines ---- */
 	
 	/* paint onto the derived mesh */
-	ps->dm = mesh_get_derived_final(ps->ob, get_viewedit_datamask());
 	
+	/* Workaround for subsurf selection, try the display mesh first */
+	if(ps->ob->derivedFinal && CustomData_has_layer( &ps->ob->derivedFinal->faceData, CD_MTFACE)) {
+		ps->dm = ps->ob->derivedFinal;
+		ps->dm_release= FALSE;
+	}
+	else {
+		ps->dm = mesh_get_derived_final(ps->ob, get_viewedit_datamask());
+		ps->dm_release= TRUE;
+	}
+	
 	if ( !CustomData_has_layer( &ps->dm->faceData, CD_MTFACE) ) {
+		
+		if(ps->dm_release)
+			ps->dm->release(ps->dm);
+		
 		ps->dm = NULL;
 		return; 
 	}
+	
 	ps->dm_mvert = ps->dm->getVertArray(ps->dm);
 	ps->dm_mface = ps->dm->getFaceArray(ps->dm);
 	ps->dm_mtface= ps->dm->getFaceDataArray(ps->dm, CD_MTFACE);
@@ -3382,7 +3397,8 @@
 		BLI_memarena_free(ps->arena_mt[a]);
 	}
 	
-	ps->dm->release(ps->dm);
+	if(ps->dm_release)
+		ps->dm->release(ps->dm);
 }
 
 /* Use this rather then mouse_cursor()





More information about the Bf-blender-cvs mailing list