[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