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()


_______________________________________________
Bf-blender-cvs mailing list
[email protected]
http://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to