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 11:03:58 +0400
committerCampbell Barton <ideasman42@gmail.com>2009-10-02 11:03:58 +0400
commitba2f052a374779d301aab501f9c909c6a59612f8 (patch)
tree32ae0e7f19252dfc27c9be991eb83aa6b4d98fe8 /source/blender/editors/mesh/editface.c
parenta9ef985b320363890a96c755bea4966d413ef9f1 (diff)
projection painting changes from 2.4x r23600
Diffstat (limited to 'source/blender/editors/mesh/editface.c')
-rw-r--r--source/blender/editors/mesh/editface.c64
1 files changed, 53 insertions, 11 deletions
diff --git a/source/blender/editors/mesh/editface.c b/source/blender/editors/mesh/editface.c
index a6c5e5beccf..f65ab7ddd67 100644
--- a/source/blender/editors/mesh/editface.c
+++ b/source/blender/editors/mesh/editface.c
@@ -89,6 +89,34 @@ static int pupmenu() {return 0;}
/* ***************** XXX **************** */
+/* 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(View3D *v3d, Mesh *me, short *mval, unsigned int *index, short rect)
{
@@ -163,6 +191,7 @@ void reveal_tface(Scene *scene)
mface++;
}
+ object_facesel_flush_dm(OBACT);
// XXX notifier! object_tface_flags_changed(OBACT, 0);
}
@@ -197,7 +226,8 @@ void hide_tface(Scene *scene)
mface++;
}
-
+
+ object_facesel_flush_dm(OBACT);
// XXX notifier! object_tface_flags_changed(OBACT, 0);
}
@@ -237,7 +267,10 @@ void deselectall_tface(Scene *scene)
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++;
}
@@ -252,6 +285,7 @@ void deselectall_tface(Scene *scene)
mface++;
}
+ object_facesel_flush_dm(OBACT);
// XXX notifier! object_tface_flags_changed(OBACT, 0);
}
@@ -274,7 +308,8 @@ void selectswap_tface(Scene *scene)
}
mface++;
}
-
+
+ object_facesel_flush_dm(OBACT);
// XXX notifier! object_tface_flags_changed(OBACT, 0);
}
@@ -655,11 +690,11 @@ void face_select(Scene *scene, View3D *v3d)
/* image window redraw */
-
+ object_facesel_flush_dm(OBACT);
// XXX notifier! object_tface_flags_changed(OBACT, 1);
}
-void face_borderselect(Scene *scene, ARegion *ar)
+void face_borderselect(Scene *scene, ScrArea *sa, ARegion *ar)
{
Mesh *me;
MFace *mface;
@@ -675,13 +710,18 @@ void face_borderselect(Scene *scene, ARegion *ar)
// XXX 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) {
+ View3D *v3d= sa->spacedata.first;
+ RegionView3D *rv3d= ar->regiondata;
+
+ /* without this border select often fails */
+#if 0 /* XXX untested in 2.5 */
+ if (v3d->flag & V3D_NEEDBACKBUFDRAW) {
+ check_backbuf();
+ persp(PERSP_VIEW);
+ }
+#endif
+
selar= MEM_callocN(me->totface+1, "selar");
sx= (rect.xmax-rect.xmin+1);
@@ -722,6 +762,8 @@ void face_borderselect(Scene *scene, ARegion *ar)
#ifdef __APPLE__
glReadBuffer(GL_BACK);
#endif
+
+ object_facesel_flush_dm(OBACT);
}