diff options
author | Campbell Barton <ideasman42@gmail.com> | 2009-10-02 10:06:09 +0400 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2009-10-02 10:06:09 +0400 |
commit | 624d26e0a8e89126b8e5f31d8d0e612407a1d803 (patch) | |
tree | b79cbe50399e06ba30d8825f27798e76738a5889 | |
parent | 9f23a0c08130a298a89a132679577f54c3caeea2 (diff) |
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.
-rw-r--r-- | source/blender/src/editface.c | 59 | ||||
-rw-r--r-- | source/blender/src/imagepaint.c | 20 |
2 files changed, 66 insertions, 13 deletions
diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c index 1430c6ad0d5..a2a3b2f7a50 100644 --- a/source/blender/src/editface.c +++ b/source/blender/src/editface.c @@ -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 @@ void reveal_tface() } BIF_undo_push("Reveal face"); - + + object_facesel_flush_dm(OBACT); object_tface_flags_changed(OBACT, 0); } @@ -714,7 +742,8 @@ void hide_tface() } BIF_undo_push("Hide face"); - + + object_facesel_flush_dm(OBACT); object_tface_flags_changed(OBACT, 0); } @@ -754,7 +783,10 @@ void deselectall_tface() 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 @@ void deselectall_tface() } BIF_undo_push("(De)select all faces"); - + + object_facesel_flush_dm(OBACT); object_tface_flags_changed(OBACT, 0); } @@ -796,6 +829,7 @@ void selectswap_tface(void) BIF_undo_push("Select inverse face"); + object_facesel_flush_dm(OBACT); object_tface_flags_changed(OBACT, 0); } @@ -1169,6 +1203,7 @@ void face_select() BIF_undo_push("Select UV face"); + object_facesel_flush_dm(OBACT); object_tface_flags_changed(OBACT, 1); } @@ -1187,14 +1222,15 @@ void face_borderselect() 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 @@ void face_borderselect() BIF_undo_push("Border Select UV face"); + object_facesel_flush_dm(OBACT); object_tface_flags_changed(OBACT, 0); } #ifdef __APPLE__ diff --git a/source/blender/src/imagepaint.c b/source/blender/src/imagepaint.c index 3ec4205d9cf..b71000237d0 100644 --- a/source/blender/src/imagepaint.c +++ b/source/blender/src/imagepaint.c @@ -214,6 +214,7 @@ typedef struct ProjPaintState { DerivedMesh *dm; int dm_totface; int dm_totvert; + int dm_release; MVert *dm_mvert; MFace *dm_mface; @@ -2913,12 +2914,26 @@ static void project_paint_begin(ProjPaintState *ps, short mval[2]) /* ---- 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 @@ static void project_paint_end(ProjPaintState *ps) 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() |