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:
-rw-r--r--release/scripts/uvcalc_follow_active_coords.py12
-rw-r--r--release/scripts/uvcalc_from_adjacent.py129
-rw-r--r--release/scripts/uvcalc_lightmap.py9
-rw-r--r--release/scripts/uvcalc_quad_clickproj.py11
-rw-r--r--release/scripts/uvcalc_smart_project.py3
-rw-r--r--source/blender/blenkernel/intern/image.c1
-rw-r--r--source/blender/blenkernel/intern/subsurf_ccg.c36
-rw-r--r--source/blender/blenlib/BLI_editVert.h7
-rw-r--r--source/blender/include/BIF_editmesh.h3
-rw-r--r--source/blender/makesdna/DNA_mesh_types.h9
-rw-r--r--source/blender/makesdna/DNA_meshdata_types.h2
-rw-r--r--source/blender/python/api2_2x/Mesh.c46
-rw-r--r--source/blender/python/api2_2x/NMesh.c13
-rw-r--r--source/blender/src/drawimage.c1
-rw-r--r--source/blender/src/drawmesh.c6
-rw-r--r--source/blender/src/editface.c43
-rw-r--r--source/blender/src/editmesh.c13
-rw-r--r--source/blender/src/editmesh_lib.c11
-rw-r--r--source/blender/src/editmesh_mods.c2
-rw-r--r--source/blender/src/editsima.c15
20 files changed, 142 insertions, 230 deletions
diff --git a/release/scripts/uvcalc_follow_active_coords.py b/release/scripts/uvcalc_follow_active_coords.py
index c97e7168d2f..2a79d0d05df 100644
--- a/release/scripts/uvcalc_follow_active_coords.py
+++ b/release/scripts/uvcalc_follow_active_coords.py
@@ -51,6 +51,11 @@ def extend():
Draw.PupMenu('ERROR: No mesh object.')
return
+ # Toggle Edit mode
+ is_editmode = Window.EditMode()
+ if is_editmode:
+ Window.EditMode(0)
+
me = ob.getData(mesh=1)
me_verts = me.verts
@@ -233,7 +238,12 @@ def extend():
face_modes[i] = 2 # dont search again
print sys.time() - t
- me.update()
+
+ if is_editmode:
+ Window.EditMode(1)
+ else:
+ me.update()
+
Window.RedrawAll()
Window.WaitCursor(0)
diff --git a/release/scripts/uvcalc_from_adjacent.py b/release/scripts/uvcalc_from_adjacent.py
deleted file mode 100644
index 32bbd9e08e6..00000000000
--- a/release/scripts/uvcalc_from_adjacent.py
+++ /dev/null
@@ -1,129 +0,0 @@
-#!BPY
-"""
-Name: 'UVs from unselected adjacent'
-Blender: 242
-Group: 'UVCalculation'
-Tooltip: 'Assign UVs to selected faces from surrounding unselected faces.'
-"""
-__author__ = "Campbell Barton"
-__url__ = ("blender", "elysiun")
-__version__ = "1.0 2006/02/07"
-
-__bpydoc__ = """\
-This script sets the UV mapping and image of selected faces from adjacent unselected faces.
-
-Use this script in face select mode for texturing between textured faces.
-"""
-
-# ***** BEGIN GPL LICENSE BLOCK *****
-#
-# Script copyright (C) Campbell J Barton
-#
-# This program is free software; you can redistribute it and/or
-# modify it under the terms of the GNU General Public License
-# as published by the Free Software Foundation; either version 2
-# of the License, or (at your option) any later version.
-#
-# This program is distributed in the hope that it will be useful,
-# but WITHOUT ANY WARRANTY; without even the implied warranty of
-# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
-# GNU General Public License for more details.
-#
-# You should have received a copy of the GNU General Public License
-# along with this program; if not, write to the Free Software Foundation,
-# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
-#
-# ***** END GPL LICENCE BLOCK *****
-# --------------------------------------------------------------------------
-
-
-from Blender import *
-import bpy
-
-def mostUsedImage(imageList): # Returns the image most used in the list.
- if not imageList:
- return None
- elif len(imageList) < 3:
- return imageList[0]
-
- # 3+ Images, Get the most used image for surrounding faces.
- imageCount = {}
- for image in imageList:
- if image:
- image_key= image.name
- else:
- image_key = None
-
- try:
- imageCount[image_key]['imageCount'] +=1 # an extra user of this image
- except:
- imageCount[image_key] = {'imageCount':1, 'blenderImage':image} # start with 1 user.
-
- # Now a list of tuples, (imageName, {imageCount, image})
- imageCount = imageCount.items()
-
- try: imageCount.sort(key=lambda a: a[1])
- except: imageCount.sort(lambda a,b: cmp(a[1], b[1]))
-
-
- return imageCount[-1][1]['blenderImage']
-
-
-def main():
- scn = bpy.data.scenes.active
- ob = scn.objects.active
- if ob == None or ob.type != 'Mesh':
- Draw.PupMenu('ERROR: No mesh object in face select mode.')
- return
- me = ob.getData(mesh=1)
-
- if not me.faceUV:
- Draw.PupMenu('ERROR: No mesh object in face select mode.')
- return
-
- selfaces = [f for f in me.faces if f.sel]
- unselfaces = [f for f in me.faces if not f.sel if not f.hide]
-
- # Gather per Vert UV and Image, store in vertUvAverage
- vertUvAverage = [[[],[]] for i in xrange(len(me.verts))]
-
- for f in unselfaces: # Unselected faces only.
- fuv = f.uv
- for i,v in enumerate(f):
- vertUvAverage[v.index][0].append(fuv[i])
- vertUvAverage[v.index][1].append(f.image)
-
- # Average per vectex UV coords
- for vertUvData in vertUvAverage:
- uvList = vertUvData[0]
- if uvList:
- # Convert from a list of vectors into 1 vector.
- vertUvData[0] = reduce(lambda a,b: a+b, uvList, Mathutils.Vector(0,0)) * (1.0/len(uvList))
- else:
- vertUvData[0] = None
-
-
-
- # Assign to selected faces
- TEX_FLAG = Mesh.FaceModes['TEX']
- for f in selfaces:
- uvlist = []
- imageList = []
- for i,v in enumerate(f):
- uv, vImages = vertUvAverage[v.index]
- uvlist.append( uv )
- imageList.extend(vImages)
-
- if None not in uvlist:
- # all the faces images used by this faces vert. some faces will be added twice but thats ok.
- # Get the most used image and assign to the face.
- image = mostUsedImage(imageList)
- f.uv = uvlist
-
- if image:
- f.image = image
- f.mode |= TEX_FLAG
- Window.RedrawAll()
-
-if __name__ == '__main__':
- main() \ No newline at end of file
diff --git a/release/scripts/uvcalc_lightmap.py b/release/scripts/uvcalc_lightmap.py
index a4b176bdb79..af9acb09e17 100644
--- a/release/scripts/uvcalc_lightmap.py
+++ b/release/scripts/uvcalc_lightmap.py
@@ -544,6 +544,12 @@ def main():
Draw.PupMenu('Error%t|No mesh objects selected.')
return
+ # Toggle Edit mode
+ is_editmode = Window.EditMode()
+ if is_editmode:
+ Window.EditMode(0)
+
+
Window.WaitCursor(1)
lightmap_uvpack(meshes,\
PREF_SEL_ONLY.val,\
@@ -554,6 +560,9 @@ def main():
PREF_BOX_DIV.val,\
int(1/(PREF_MARGIN_DIV.val/100)))
+ if is_editmode:
+ Window.EditMode(1)
+
Window.WaitCursor(0)
if __name__ == '__main__':
diff --git a/release/scripts/uvcalc_quad_clickproj.py b/release/scripts/uvcalc_quad_clickproj.py
index 67b58885f9d..791fd661cc9 100644
--- a/release/scripts/uvcalc_quad_clickproj.py
+++ b/release/scripts/uvcalc_quad_clickproj.py
@@ -80,6 +80,10 @@ def main():
if not ob or ob.type!='Mesh':
return
+ is_editmode = Window.EditMode()
+ if is_editmode:
+ Window.EditMode(0)
+
mousedown_wait() # so the menu items clicking dosnt trigger the mouseclick
Window.DrawProgressBar (0.0, '')
@@ -100,10 +104,8 @@ def main():
mouse_buttons = Window.GetMouseButtons()
-
Window.DrawProgressBar (0.2, '(2 of 3 ) Click confirms the U coords')
-
mousedown_wait()
obmat= ob.matrixWorld
@@ -112,7 +114,7 @@ def main():
if not mouseInView or not OriginA:
return
-
+
me = ob.getData(mesh=1)
# Get the face under the mouse
@@ -255,6 +257,9 @@ def main():
Window.Redraw(Window.Types.VIEW3D)
Window.SetCursorPos(*orig_cursor)
+ if is_editmode:
+ Window.EditMode(1)
+
Window.RedrawAll()
if __name__=='__main__':
diff --git a/release/scripts/uvcalc_smart_project.py b/release/scripts/uvcalc_smart_project.py
index b10b69285e0..49d52d12d47 100644
--- a/release/scripts/uvcalc_smart_project.py
+++ b/release/scripts/uvcalc_smart_project.py
@@ -1121,6 +1121,9 @@ def main():
print "Smart Projection time: %.2f" % (sys.time() - time1)
# Window.DrawProgressBar(0.9, "Smart Projections done, time: %.2f sec." % (sys.time() - time1))
+ if is_editmode:
+ Window.EditMode(1)
+
Window.DrawProgressBar(1.0, "")
Window.WaitCursor(0)
Window.RedrawAll()
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c
index 3a64c3504cb..ff84b3c08f8 100644
--- a/source/blender/blenkernel/intern/image.c
+++ b/source/blender/blenkernel/intern/image.c
@@ -243,6 +243,7 @@ static Image *image_alloc(const char *name, short source, short type)
ima->ok= IMA_OK;
ima->xrep= ima->yrep= 1;
+ ima->aspx= ima->aspy= 1.0;
ima->gen_x= 256; ima->gen_y= 256;
ima->gen_type= 1; /* no defines yet? */
diff --git a/source/blender/blenkernel/intern/subsurf_ccg.c b/source/blender/blenkernel/intern/subsurf_ccg.c
index 39674c9796f..646157991bb 100644
--- a/source/blender/blenkernel/intern/subsurf_ccg.c
+++ b/source/blender/blenkernel/intern/subsurf_ccg.c
@@ -1881,28 +1881,30 @@ static void ccgDM_drawUVEdges(DerivedMesh *dm)
MTFace *tf = DM_get_face_data_layer(dm, CD_MTFACE);
int i;
- glBegin(GL_LINES);
- for(i = 0; i < dm->numFaceData; i++, mf++, tf++) {
- if(!(mf->flag&ME_HIDE)) {
- glVertex2fv(tf->uv[0]);
- glVertex2fv(tf->uv[1]);
-
- glVertex2fv(tf->uv[1]);
- glVertex2fv(tf->uv[2]);
-
- if(!mf->v4) {
- glVertex2fv(tf->uv[2]);
+ if (tf) {
+ glBegin(GL_LINES);
+ for(i = 0; i < dm->numFaceData; i++, mf++, tf++) {
+ if(!(mf->flag&ME_HIDE)) {
glVertex2fv(tf->uv[0]);
- } else {
+ glVertex2fv(tf->uv[1]);
+
+ glVertex2fv(tf->uv[1]);
glVertex2fv(tf->uv[2]);
- glVertex2fv(tf->uv[3]);
-
- glVertex2fv(tf->uv[3]);
- glVertex2fv(tf->uv[0]);
+
+ if(!mf->v4) {
+ glVertex2fv(tf->uv[2]);
+ glVertex2fv(tf->uv[0]);
+ } else {
+ glVertex2fv(tf->uv[2]);
+ glVertex2fv(tf->uv[3]);
+
+ glVertex2fv(tf->uv[3]);
+ glVertex2fv(tf->uv[0]);
+ }
}
}
+ glEnd();
}
- glEnd();
}
static void ccgDM_drawMappedFaces(DerivedMesh *dm, int (*setDrawOptions)(void *userData, int index, int *drawSmooth_r), void *userData, int useColors) {
diff --git a/source/blender/blenlib/BLI_editVert.h b/source/blender/blenlib/BLI_editVert.h
index c05d33f2792..fd217e479ed 100644
--- a/source/blender/blenlib/BLI_editVert.h
+++ b/source/blender/blenlib/BLI_editVert.h
@@ -164,6 +164,13 @@ typedef struct EditMesh
/* DerivedMesh caches... note that derived cage can be equivalent
* to derived final, care should be taken on release.
*/
+
+ /* used for keeping track of the last clicked on face - so the space image
+ * when using the last selected face - (EditSelection) the space image flickered too much
+ *
+ * never access this directly, use EM_set_actFace and EM_get_actFace */
+ EditFace *act_face;
+
struct DerivedMesh *derivedCage, *derivedFinal;
/* the custom data layer mask that was last used to calculate
* derivedCage and derivedFinal
diff --git a/source/blender/include/BIF_editmesh.h b/source/blender/include/BIF_editmesh.h
index 6539fe00b80..7ad3fd480a3 100644
--- a/source/blender/include/BIF_editmesh.h
+++ b/source/blender/include/BIF_editmesh.h
@@ -259,4 +259,7 @@ void free_uv_vert_map_EM(UvVertMap *vmap);
int EM_texFaceCheck(void); /* can we edit UV's for this mesh?*/
int EM_vertColorCheck(void); /* can we edit colors for this mesh?*/
+void EM_set_actFace(struct EditFace *efa);
+struct EditFace * EM_get_actFace(void);
+
#endif
diff --git a/source/blender/makesdna/DNA_mesh_types.h b/source/blender/makesdna/DNA_mesh_types.h
index 953c8176962..59f3a64ba5e 100644
--- a/source/blender/makesdna/DNA_mesh_types.h
+++ b/source/blender/makesdna/DNA_mesh_types.h
@@ -74,7 +74,14 @@ typedef struct Mesh {
struct CustomData vdata, edata, fdata;
- int totvert, totedge, totface, totselect, pad2;
+ int totvert, totedge, totface, totselect;
+
+ /* the last selected vertex/edge/face are used for the active face however
+ * this means the active face must always be selected, this is to keep track
+ * of the last selected face and is similar to the old active face flag where
+ * the face does not need to be selected, -1 is inactive */
+ int act_face;
+
int texflag;
/* texture space, copied as one block in editobject.c */
diff --git a/source/blender/makesdna/DNA_meshdata_types.h b/source/blender/makesdna/DNA_meshdata_types.h
index 2cbe03ab4cc..68d9bb245cf 100644
--- a/source/blender/makesdna/DNA_meshdata_types.h
+++ b/source/blender/makesdna/DNA_meshdata_types.h
@@ -204,7 +204,7 @@ typedef struct PartialVisibility {
/* mtface->flag */
#define TF_SELECT 1 /* use MFace hide flag (after 2.43), should be able to reuse after 2.44 */
-#define TF_ACTIVE 2
+#define TF_ACTIVE 2 /* deprecated! */
#define TF_SEL1 4
#define TF_SEL2 8
#define TF_SEL3 16
diff --git a/source/blender/python/api2_2x/Mesh.c b/source/blender/python/api2_2x/Mesh.c
index d2cc1edf3c3..659ecd79d81 100644
--- a/source/blender/python/api2_2x/Mesh.c
+++ b/source/blender/python/api2_2x/Mesh.c
@@ -4077,7 +4077,7 @@ static int MFace_setImage( BPy_MFace *self, PyObject *value )
return 0;
}
-#define MFACE_FLAG_BITMASK ( TF_SELECT | TF_ACTIVE | TF_SEL1 | \
+#define MFACE_FLAG_BITMASK ( TF_SELECT | TF_SEL1 | \
TF_SEL2 | TF_SEL3 | TF_SEL4 | TF_HIDE )
/*
@@ -4086,6 +4086,7 @@ static int MFace_setImage( BPy_MFace *self, PyObject *value )
static PyObject *MFace_getFlag( BPy_MFace *self )
{
+ int flag;
if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
@@ -4093,8 +4094,13 @@ static PyObject *MFace_getFlag( BPy_MFace *self )
if( !MFace_get_pointer( self ) )
return NULL;
- return PyInt_FromLong( (long) ( self->mesh->mtface[self->index].flag
- & MFACE_FLAG_BITMASK ) );
+ flag = self->mesh->mtface[self->index].flag & MFACE_FLAG_BITMASK;
+
+ /* so old scripts still work */
+ if (self->index == self->mesh->act_face)
+ flag |= TF_ACTIVE;
+
+ return PyInt_FromLong( (long)( flag ) );
}
/*
@@ -4128,7 +4134,7 @@ static int MFace_setFlag( BPy_MFace *self, PyObject *value )
"invalid bit(s) set in mask" );
/* merge active setting with other new params */
- param |= (self->mesh->mtface[self->index].flag & TF_ACTIVE);
+ param |= (self->mesh->mtface[self->index].flag);
self->mesh->mtface[self->index].flag = (char)param;
return 0;
@@ -7869,27 +7875,19 @@ static PyObject *Mesh_getKey( BPy_Mesh * self )
static PyObject *Mesh_getActiveFace( BPy_Mesh * self )
{
- MTFace *face;
- int i, totface;
-
+ /* not needed but keep incase exceptions make use of it */
if( !self->mesh->mtface )
return EXPP_ReturnPyObjError( PyExc_ValueError,
"face has no texture values" );
- face = self->mesh->mtface;
- totface = self->mesh->totface;
-
- for( i = 0; i < totface; ++face, ++i )
- if( face->flag & TF_ACTIVE ) {
- return PyInt_FromLong( i );
- }
-
+ if (self->mesh->act_face != -1 && self->mesh->act_face <= self->mesh->totface)
+ return PyInt_FromLong( self->mesh->act_face );
+
Py_RETURN_NONE;
}
static int Mesh_setActiveFace( BPy_Mesh * self, PyObject * value )
{
- MTFace *face;
int param;
/* if no texture faces, error */
@@ -7910,18 +7908,8 @@ static int Mesh_setActiveFace( BPy_Mesh * self, PyObject * value )
if( param < 0 || param > self->mesh->totface )
return EXPP_ReturnIntError( PyExc_TypeError,
"face index out of range" );
-
- face = self->mesh->mtface;
-
- /* if requested face isn't already active, then inactivate all
- * faces and activate the requested one */
-
- if( !( face[param].flag & TF_ACTIVE ) ) {
- int i;
- for( i = self->mesh->totface; i > 0; ++face, --i )
- face->flag &= ~TF_ACTIVE;
- self->mesh->mtface[param].flag |= TF_ACTIVE;
- }
+
+ self->mesh->act_face = param;
return 0;
}
@@ -8500,7 +8488,7 @@ static PyObject *M_Mesh_FaceFlagsDict( void )
PyConstant_Insert( d, "SELECT", PyInt_FromLong( TF_SELECT ) );
PyConstant_Insert( d, "HIDE", PyInt_FromLong( TF_HIDE ) );
- PyConstant_Insert( d, "ACTIVE", PyInt_FromLong( TF_ACTIVE ) );
+ PyConstant_Insert( d, "ACTIVE", PyInt_FromLong( TF_ACTIVE ) ); /* deprecated */
}
return FF;
diff --git a/source/blender/python/api2_2x/NMesh.c b/source/blender/python/api2_2x/NMesh.c
index 51d6fc1a2b6..e50c9678606 100644
--- a/source/blender/python/api2_2x/NMesh.c
+++ b/source/blender/python/api2_2x/NMesh.c
@@ -1978,20 +1978,11 @@ static BPy_NMVert *nmvert_from_data( MVert * vert, MSticky * st, float *co,
static int get_active_faceindex( Mesh * me )
{
- MTFace *tf;
- int i;
-
if( me == NULL )
return -1;
- tf = me->mtface;
- if( tf == 0 )
- return -1;
-
- for( i = 0; i < me->totface; i++ )
- if( tf[i].flag & TF_ACTIVE )
- return i;
-
+ if (me->act_face != -1 && me->act_face < me->totface)
+ return me->act_face;
return -1;
}
diff --git a/source/blender/src/drawimage.c b/source/blender/src/drawimage.c
index d69ec6d1b05..7fb6604b2fc 100644
--- a/source/blender/src/drawimage.c
+++ b/source/blender/src/drawimage.c
@@ -490,6 +490,7 @@ void draw_uvs_sima(void)
cageDM = editmesh_get_derived_cage_and_final(&finalDM, CD_MASK_BAREMESH | CD_MASK_MTFACE);
if (finalDM->drawUVEdges &&
+ DM_get_face_data_layer(finalDM, CD_MTFACE) &&
/* When sync selection is enabled, all faces are drawn (except for hidden)
* so if cage is the same as the final, theres no point in drawing the shadowmesh. */
!((G.sima->flag & SI_SYNC_UVSEL && cageDM==finalDM))
diff --git a/source/blender/src/drawmesh.c b/source/blender/src/drawmesh.c
index f974e85293a..0c8132b3469 100644
--- a/source/blender/src/drawmesh.c
+++ b/source/blender/src/drawmesh.c
@@ -634,7 +634,7 @@ EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
if (!(mf->flag&ME_HIDE)) {
unsigned int flags = eEdge_Visible;
if (mf->flag&ME_FACE_SEL) flags |= eEdge_Select;
- if (tf && tf->flag&TF_ACTIVE) {
+ if (i==me->act_face) {
flags |= eEdge_Active;
if (mf->flag&ME_FACE_SEL) flags |= eEdge_SelectAndActive;
}
@@ -647,8 +647,8 @@ EdgeHash *get_tface_mesh_marked_edge_info(Mesh *me)
} else {
get_marked_edge_info__orFlags(eh, mf->v3, mf->v1, flags);
}
-
- if (tf && tf->flag&TF_ACTIVE) {
+
+ if (i==me->act_face) {
get_marked_edge_info__orFlags(eh, mf->v1, mf->v2, eEdge_ActiveFirst);
get_marked_edge_info__orFlags(eh, mf->v1, mf->v4?mf->v4:mf->v3, eEdge_ActiveLast);
}
diff --git a/source/blender/src/editface.c b/source/blender/src/editface.c
index 65e335ea6ab..516928af14e 100644
--- a/source/blender/src/editface.c
+++ b/source/blender/src/editface.c
@@ -569,13 +569,18 @@ MTFace *get_active_mtface(EditFace **act_efa, MCol **mcol, short partsel)
if(!EM_texFaceCheck())
return NULL;
-
- for (ese = em->selected.last; ese; ese=ese->prev){
- if(ese->type == EDITFACE) {
- efa = (EditFace *)ese->data;
-
- if (efa->h) efa= NULL;
- else break;
+
+ /* first check the active face */
+ if (em->act_face) {
+ efa = em->act_face;
+ } else {
+ for (ese = em->selected.last; ese; ese=ese->prev){
+ if(ese->type == EDITFACE) {
+ efa = (EditFace *)ese->data;
+
+ if (efa->h) efa= NULL;
+ else break;
+ }
}
}
@@ -1107,7 +1112,6 @@ void face_select()
{
Object *ob;
Mesh *me;
- MTFace *tface, *tsel;
MFace *mface, *msel;
short mval[2];
unsigned int a, index;
@@ -1127,33 +1131,20 @@ void face_select()
if (!facesel_face_pick(me, mval, &index, 1)) return;
- tsel= (((MTFace*)me->mtface)+index); /* check me->mtface before using */
msel= (((MFace*)me->mface)+index);
-
if (msel->flag & ME_HIDE) return;
/* clear flags */
- tface = me->mtface;
mface = me->mface;
a = me->totface;
- while (a--) {
- if (G.qual & LR_SHIFTKEY) {
- if (me->mtface) {
- tface->flag &= ~TF_ACTIVE;
- }
- } else {
- if (me->mtface) {
- tface->flag &= ~TF_ACTIVE;
- }
+ if ((G.qual & LR_SHIFTKEY)==0) {
+ while (a--) {
mface->flag &= ~ME_FACE_SEL;
+ mface++;
}
- if (me->mtface) {
- tface++;
- }
- mface++;
}
- if (me->mtface)
- tsel->flag |= TF_ACTIVE;
+
+ me->act_face = (int)index;
if (G.qual & LR_SHIFTKEY) {
if (msel->flag & ME_FACE_SEL)
diff --git a/source/blender/src/editmesh.c b/source/blender/src/editmesh.c
index fcfb1a5c40f..678178e6e5b 100644
--- a/source/blender/src/editmesh.c
+++ b/source/blender/src/editmesh.c
@@ -333,6 +333,10 @@ void free_editface(EditFace *efa)
}
#endif
EM_remove_selection(efa, EDITFACE);
+
+ if (G.editMesh->act_face==efa)
+ EM_set_actFace(NULL);
+
CustomData_em_free_block(&G.editMesh->fdata, &efa->data);
if(efa->fast==0)
free(efa);
@@ -809,10 +813,11 @@ void make_editMesh()
/* because of reload */
free_editMesh(em);
+ em->act_face = NULL;
G.totvert= tot= me->totvert;
G.totedge= me->totedge;
G.totface= me->totface;
-
+
if(tot==0) {
countall();
return;
@@ -906,6 +911,9 @@ void make_editMesh()
if((FACESEL_PAINT_TEST) && (efa->f & SELECT))
EM_select_face(efa, 1); /* flush down */
+
+ if (a==me->act_face)
+ em->act_face = efa;
}
}
}
@@ -1140,6 +1148,9 @@ void load_editMesh(void)
/* no index '0' at location 3 or 4 */
test_index_face(mface, &me->fdata, i, efa->v4?4:3);
+
+ if (a==me->act_face)
+ EM_set_actFace(efa);
#ifdef WITH_VERSE
if(efa->vface) {
diff --git a/source/blender/src/editmesh_lib.c b/source/blender/src/editmesh_lib.c
index d6781c8e430..c85efa609b1 100644
--- a/source/blender/src/editmesh_lib.c
+++ b/source/blender/src/editmesh_lib.c
@@ -72,6 +72,17 @@ editmesh_lib: generic (no UI, no menus) operations/evaluators for editmesh data
#include "editmesh.h"
+/* this replaces the active flag used in uv/face mode */
+void EM_set_actFace(EditFace *efa)
+{
+ G.editMesh->act_face = efa;
+}
+
+EditFace * EM_get_actFace(void)
+{
+ return G.editMesh->act_face;
+}
+
/* ********* Selection History ************ */
static int EM_check_selection(void *data)
{
diff --git a/source/blender/src/editmesh_mods.c b/source/blender/src/editmesh_mods.c
index 2af77f6e2dc..2a86c674f66 100644
--- a/source/blender/src/editmesh_mods.c
+++ b/source/blender/src/editmesh_mods.c
@@ -2067,6 +2067,8 @@ void mouse_mesh(void)
if((G.qual & LR_SHIFTKEY)==0) EM_clear_flag_all(SELECT);
if(efa) {
+ /* set the last selected face */
+ EM_set_actFace(efa);
if( (efa->f & SELECT)==0 ) {
EM_store_selection(efa, EDITFACE);
diff --git a/source/blender/src/editsima.c b/source/blender/src/editsima.c
index f809409b9f0..0daf468c253 100644
--- a/source/blender/src/editsima.c
+++ b/source/blender/src/editsima.c
@@ -575,8 +575,8 @@ void mouse_select_sima(void) /* TODO - SYNCSEL */
find_nearest_tface(&nearesttf, &nearestefa);
if(nearesttf==NULL)
return;
-
- nearesttf->flag |= TF_ACTIVE;
+
+ EM_set_actFace(nearestefa);
for (i=0; i<4; i++)
hituv[i]= nearesttf->uv[i];
@@ -660,10 +660,7 @@ void mouse_select_sima(void) /* TODO - SYNCSEL */
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
if (SIMA_FACEDRAW_CHECK(efa, tf)) {
- if(nearesttf && tf!=nearesttf)
- tf->flag &=~ TF_ACTIVE;
if (!sticky) continue;
-
if(msel_hit(limit, hitv, efa->v1->tmp.l, hituv, tf->uv[0], sticky))
SIMA_UVSEL_SET(efa, tf, 0);
if(msel_hit(limit, hitv, efa->v2->tmp.l, hituv, tf->uv[1], sticky))
@@ -675,6 +672,7 @@ void mouse_select_sima(void) /* TODO - SYNCSEL */
SIMA_UVSEL_SET(efa, tf, 3);
}
}
+ EM_set_actFace(nearestefa);
flush = 1;
}
}
@@ -685,11 +683,12 @@ void mouse_select_sima(void) /* TODO - SYNCSEL */
for (efa= em->faces.first; efa; efa= efa->next) {
tf= CustomData_em_get(&em->fdata, efa->data, CD_MTFACE);
SIMA_FACESEL_UNSET(efa, tf);
- //if(nearesttf && tf!=nearesttf) /* TODO - deal with editmesh active face */
- // tf->flag &= ~TF_ACTIVE;
}
- if(nearesttf)
+ if(nearesttf) {
SIMA_FACESEL_SET(nearestefa, nearesttf);
+ EM_set_actFace(nearestefa);
+ }
+
}
/* deselect uvs, and select sticky uvs */