Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCampbell Barton <ideasman42@gmail.com>2009-10-02 10:06:09 +0400
committerCampbell Barton <ideasman42@gmail.com>2009-10-02 10:06:09 +0400
commit624d26e0a8e89126b8e5f31d8d0e612407a1d803 (patch)
treeb79cbe50399e06ba30d8825f27798e76738a5889
parent9f23a0c08130a298a89a132679577f54c3caeea2 (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.c59
-rw-r--r--source/blender/src/imagepaint.c20
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()