dont use tface hide or select anymore, since maintaining 2 sets of hide/select data for each face is annoying.
using mface->flag for both. Also found that the cdDM_drawMappedFaces and cdDM_drawFacesTex_common could get normals mixed up when rendering hidden faces. because hidden/invisible faces used continue without advancing to the next normal.
This commit is contained in:
@@ -191,7 +191,7 @@ static void uv_calc_center_vector(float *result, Object *ob, Mesh *me)
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
for(a=0; a<me->totface; a++, mface++, tface++) {
|
||||
if(tface->flag & TF_SELECT) {
|
||||
if(mface->flag & ME_FACE_SEL) {
|
||||
DO_MINMAX((me->mvert+mface->v1)->co, min, max);
|
||||
DO_MINMAX((me->mvert+mface->v2)->co, min, max);
|
||||
DO_MINMAX((me->mvert+mface->v3)->co, min, max);
|
||||
@@ -373,7 +373,7 @@ void calculate_uv_map(unsigned short mapmode)
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
for(a=0; a<me->totface; a++, mface++, tface++) {
|
||||
if(tface->flag & TF_SELECT) {
|
||||
if(mface->flag & ME_FACE_SEL) {
|
||||
uv_calc_shift_project(tface->uv[0],cent,rotatematrix,3,(me->mvert+mface->v1)->co,min,max);
|
||||
uv_calc_shift_project(tface->uv[1],cent,rotatematrix,3,(me->mvert+mface->v2)->co,min,max);
|
||||
uv_calc_shift_project(tface->uv[2],cent,rotatematrix,3,(me->mvert+mface->v3)->co,min,max);
|
||||
@@ -389,7 +389,7 @@ void calculate_uv_map(unsigned short mapmode)
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
for(a=0; a<me->totface; a++, mface++, tface++) {
|
||||
if(tface->flag & TF_SELECT) {
|
||||
if(mface->flag & ME_FACE_SEL) {
|
||||
if(mface->v4) b= 3; else b= 2;
|
||||
for(; b>=0; b--) {
|
||||
tface->uv[b][0]= ((tface->uv[b][0]-min[0])*fac)/dx;
|
||||
@@ -406,7 +406,7 @@ void calculate_uv_map(unsigned short mapmode)
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
for(a=0; a<me->totface; a++, mface++, tface++) {
|
||||
if(tface->flag & TF_SELECT) {
|
||||
if(mface->flag & ME_FACE_SEL) {
|
||||
uv_calc_shift_project(tface->uv[0],cent,rotatematrix,4,(me->mvert+mface->v1)->co,NULL,NULL);
|
||||
uv_calc_shift_project(tface->uv[1],cent,rotatematrix,4,(me->mvert+mface->v2)->co,NULL,NULL);
|
||||
uv_calc_shift_project(tface->uv[2],cent,rotatematrix,4,(me->mvert+mface->v3)->co,NULL,NULL);
|
||||
@@ -419,7 +419,7 @@ void calculate_uv_map(unsigned short mapmode)
|
||||
case B_UVAUTO_RESET:
|
||||
tface= me->mtface;
|
||||
for(a=0; a<me->totface; a++, tface++)
|
||||
if(tface->flag & TF_SELECT)
|
||||
if(mface->flag & ME_FACE_SEL)
|
||||
default_uv(tface->uv, 1.0);
|
||||
break;
|
||||
|
||||
@@ -438,7 +438,7 @@ void calculate_uv_map(unsigned short mapmode)
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
for(a=0; a<me->totface; a++, mface++, tface++) {
|
||||
if(tface->flag & TF_SELECT) {
|
||||
if(mface->flag & ME_FACE_SEL) {
|
||||
uv_calc_shift_project(tface->uv[0],cent,rotatematrix,mapmode,(me->mvert+mface->v1)->co,NULL,NULL);
|
||||
uv_calc_shift_project(tface->uv[1],cent,rotatematrix,mapmode,(me->mvert+mface->v2)->co,NULL,NULL);
|
||||
uv_calc_shift_project(tface->uv[2],cent,rotatematrix,mapmode,(me->mvert+mface->v3)->co,NULL,NULL);
|
||||
@@ -476,7 +476,7 @@ void calculate_uv_map(unsigned short mapmode)
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
for(a=0; a<me->totface; a++, mface++, tface++) {
|
||||
if(tface->flag & TF_SELECT) {
|
||||
if(mface->flag & ME_FACE_SEL) {
|
||||
CalcNormFloat((mv+mface->v1)->co, (mv+mface->v2)->co, (mv+mface->v3)->co, no);
|
||||
|
||||
no[0]= fabs(no[0]);
|
||||
@@ -521,7 +521,7 @@ void calculate_uv_map(unsigned short mapmode)
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
for(a=0; a<me->totface; a++, mface++, tface++) {
|
||||
if(!(tface->flag & TF_SELECT)) continue;
|
||||
if(!(mface->flag & ME_FACE_SEL)) continue;
|
||||
|
||||
dx= dy= 0;
|
||||
if(mface->v4) b= 3; else b= 2;
|
||||
@@ -555,6 +555,7 @@ MTFace *get_active_tface(MCol **mcol)
|
||||
{
|
||||
Mesh *me;
|
||||
MTFace *tf;
|
||||
MTFace *mf;
|
||||
int a;
|
||||
|
||||
if(OBACT==NULL || OBACT->type!=OB_MESH)
|
||||
@@ -571,15 +572,16 @@ MTFace *get_active_tface(MCol **mcol)
|
||||
}
|
||||
}
|
||||
|
||||
for(a=0, tf=me->mtface; a < me->totface; a++, tf++) {
|
||||
if(tf->flag & TF_SELECT) {
|
||||
|
||||
for(a=0, tf=me->mtface, mf=me->mface; a < me->totface; a++, tf++, mf++) {
|
||||
if(mf->flag & ME_FACE_SEL) {
|
||||
if(mcol) *mcol = (me->mcol)? &me->mcol[a*4]: NULL;
|
||||
return tf;
|
||||
}
|
||||
}
|
||||
|
||||
for(a=0, tf=me->mtface; a < me->totface; a++, tf++) {
|
||||
if((tf->flag & TF_HIDE)==0) {
|
||||
for(a=0, tf=me->mtface, mf=me->mface; a < me->totface; a++, tf++, mf++) {
|
||||
if((mf->flag & ME_HIDE)==0) {
|
||||
if(mcol) *mcol = (me->mcol)? &me->mcol[a*4]: NULL;
|
||||
return tf;
|
||||
}
|
||||
@@ -627,20 +629,20 @@ void make_tfaces(Mesh *me)
|
||||
void reveal_tface()
|
||||
{
|
||||
Mesh *me;
|
||||
MTFace *tface;
|
||||
MFace *mface;
|
||||
int a;
|
||||
|
||||
me= get_mesh(OBACT);
|
||||
if(me==0 || me->mtface==0 || me->totface==0) return;
|
||||
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
a= me->totface;
|
||||
while(a--) {
|
||||
if(tface->flag & TF_HIDE) {
|
||||
tface->flag |= TF_SELECT;
|
||||
tface->flag -= TF_HIDE;
|
||||
if(mface->flag & ME_HIDE) {
|
||||
mface->flag |= ME_FACE_SEL;
|
||||
mface->flag -= ME_HIDE;
|
||||
}
|
||||
tface++;
|
||||
mface++;
|
||||
}
|
||||
|
||||
BIF_undo_push("Reveal UV face");
|
||||
@@ -651,7 +653,7 @@ void reveal_tface()
|
||||
void hide_tface()
|
||||
{
|
||||
Mesh *me;
|
||||
MTFace *tface;
|
||||
MFace *mface;
|
||||
int a;
|
||||
|
||||
me= get_mesh(OBACT);
|
||||
@@ -662,21 +664,21 @@ void hide_tface()
|
||||
return;
|
||||
}
|
||||
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
a= me->totface;
|
||||
while(a--) {
|
||||
if(tface->flag & TF_HIDE);
|
||||
if(mface->flag & ME_HIDE);
|
||||
else {
|
||||
if(G.qual & LR_SHIFTKEY) {
|
||||
if( (tface->flag & TF_SELECT)==0) tface->flag |= TF_HIDE;
|
||||
if( (mface->flag & ME_FACE_SEL)==0) mface->flag |= ME_HIDE;
|
||||
}
|
||||
else {
|
||||
if( (tface->flag & TF_SELECT)) tface->flag |= TF_HIDE;
|
||||
if( (mface->flag & ME_FACE_SEL)) mface->flag |= ME_HIDE;
|
||||
}
|
||||
}
|
||||
if(tface->flag & TF_HIDE) tface->flag &= ~TF_SELECT;
|
||||
if(mface->flag & ME_HIDE) mface->flag &= ~ME_FACE_SEL;
|
||||
|
||||
tface++;
|
||||
mface++;
|
||||
}
|
||||
|
||||
BIF_undo_push("Hide UV face");
|
||||
@@ -709,30 +711,30 @@ void select_linked_tfaces(int mode)
|
||||
void deselectall_tface()
|
||||
{
|
||||
Mesh *me;
|
||||
MTFace *tface;
|
||||
MFace *mface;
|
||||
int a, sel;
|
||||
|
||||
me= get_mesh(OBACT);
|
||||
if(me==0 || me->mtface==0) return;
|
||||
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
a= me->totface;
|
||||
sel= 0;
|
||||
while(a--) {
|
||||
if(tface->flag & TF_HIDE);
|
||||
else if(tface->flag & TF_SELECT) sel= 1;
|
||||
tface++;
|
||||
if(mface->flag & ME_HIDE);
|
||||
else if(mface->flag & ME_FACE_SEL) sel= 1;
|
||||
mface++;
|
||||
}
|
||||
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
a= me->totface;
|
||||
while(a--) {
|
||||
if(tface->flag & TF_HIDE);
|
||||
if(mface->flag & ME_HIDE);
|
||||
else {
|
||||
if(sel) tface->flag &= ~TF_SELECT;
|
||||
else tface->flag |= TF_SELECT;
|
||||
if(sel) mface->flag &= ~ME_FACE_SEL;
|
||||
else mface->flag |= ME_FACE_SEL;
|
||||
}
|
||||
tface++;
|
||||
mface++;
|
||||
}
|
||||
|
||||
BIF_undo_push("(De)select all UV face");
|
||||
@@ -743,21 +745,21 @@ void deselectall_tface()
|
||||
void selectswap_tface(void)
|
||||
{
|
||||
Mesh *me;
|
||||
MTFace *tface;
|
||||
MFace *mface;
|
||||
int a;
|
||||
|
||||
me= get_mesh(OBACT);
|
||||
if(me==0 || me->mtface==0) return;
|
||||
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
a= me->totface;
|
||||
while(a--) {
|
||||
if(tface->flag & TF_HIDE);
|
||||
if(mface->flag & ME_HIDE);
|
||||
else {
|
||||
if(tface->flag & TF_SELECT) tface->flag &= ~TF_SELECT;
|
||||
else tface->flag |= TF_SELECT;
|
||||
if(mface->flag & ME_FACE_SEL) mface->flag &= ~ME_FACE_SEL;
|
||||
else mface->flag |= ME_FACE_SEL;
|
||||
}
|
||||
tface++;
|
||||
mface++;
|
||||
}
|
||||
|
||||
BIF_undo_push("Select inverse UV face");
|
||||
@@ -783,7 +785,7 @@ void rotate_uv_tface()
|
||||
tf= me->mtface;
|
||||
mf= me->mface;
|
||||
for(a=0; a<me->totface; a++, tf++, mf++) {
|
||||
if(tf->flag & TF_SELECT) {
|
||||
if(mf->flag & ME_FACE_SEL) {
|
||||
float u1= tf->uv[0][0];
|
||||
float v1= tf->uv[0][1];
|
||||
|
||||
@@ -815,7 +817,7 @@ void rotate_uv_tface()
|
||||
mcol= me->mcol;
|
||||
mf= me->mface;
|
||||
for(a=0; a<me->totface; a++, tf++, mf++, mcol+=4) {
|
||||
if(tf->flag & TF_SELECT) {
|
||||
if(mf->flag & ME_FACE_SEL) {
|
||||
MCol tmpcol= mcol[0];
|
||||
|
||||
mcol[0]= mcol[1];
|
||||
@@ -854,7 +856,7 @@ void mirror_uv_tface()
|
||||
tf= me->mtface;
|
||||
|
||||
for (a=0; a<me->totface; a++, tf++, mf++) {
|
||||
if(tf->flag & TF_SELECT) {
|
||||
if(mf->flag & ME_FACE_SEL) {
|
||||
float u1= tf->uv[0][0];
|
||||
float v1= tf->uv[0][1];
|
||||
if(mf->v4) {
|
||||
@@ -888,7 +890,7 @@ void mirror_uv_tface()
|
||||
mcol= me->mcol;
|
||||
|
||||
for (a=0; a<me->totface; a++, tf++, mf++, mcol+=4) {
|
||||
if(tf->flag & TF_SELECT) {
|
||||
if(mf->flag & ME_FACE_SEL) {
|
||||
MCol tmpcol= mcol[0];
|
||||
|
||||
if(mf->v4) {
|
||||
@@ -933,7 +935,7 @@ int minmax_tface(float *min, float *max)
|
||||
mf= me->mface;
|
||||
tf= me->mtface;
|
||||
for (a=me->totface; a>0; a--, mf++, tf++) {
|
||||
if (tf->flag & TF_HIDE || !(tf->flag & TF_SELECT))
|
||||
if (mf->flag & ME_HIDE || !(mf->flag & ME_FACE_SEL))
|
||||
continue;
|
||||
|
||||
VECCOPY(vec, (mv+mf->v1)->co);
|
||||
@@ -1012,14 +1014,13 @@ static int seam_shortest_path(Mesh *me, int source, int target)
|
||||
float *cost;
|
||||
MEdge *med;
|
||||
int a, *nedges, *edges, *prevedge, mednum = -1, nedgeswap = 0;
|
||||
MTFace *tf;
|
||||
MFace *mf;
|
||||
|
||||
/* mark hidden edges as done, so we don't use them */
|
||||
ehash = BLI_edgehash_new();
|
||||
|
||||
for (a=0, mf=me->mface, tf=me->mtface; a<me->totface; a++, tf++, mf++) {
|
||||
if (!(tf->flag & TF_HIDE)) {
|
||||
for (a=0, mf=me->mface; a<me->totface; a++, mf++) {
|
||||
if (!(mf->flag & ME_HIDE)) {
|
||||
BLI_edgehash_insert(ehash, mf->v1, mf->v2, NULL);
|
||||
BLI_edgehash_insert(ehash, mf->v2, mf->v3, NULL);
|
||||
if (mf->v4) {
|
||||
@@ -1175,7 +1176,6 @@ void seam_edgehash_insert_face(EdgeHash *ehash, MFace *mf)
|
||||
void seam_mark_clear_tface(short mode)
|
||||
{
|
||||
Mesh *me;
|
||||
MTFace *tf;
|
||||
MFace *mf;
|
||||
MEdge *med;
|
||||
int a;
|
||||
@@ -1192,8 +1192,8 @@ void seam_mark_clear_tface(short mode)
|
||||
if (mode == 2) {
|
||||
EdgeHash *ehash = BLI_edgehash_new();
|
||||
|
||||
for (a=0, mf=me->mface, tf=me->mtface; a<me->totface; a++, tf++, mf++)
|
||||
if (!(tf->flag & TF_HIDE) && (tf->flag & TF_SELECT))
|
||||
for (a=0, mf=me->mface; a<me->totface; a++, mf++)
|
||||
if (!(mf->flag & ME_HIDE) && (mf->flag & ME_FACE_SEL))
|
||||
seam_edgehash_insert_face(ehash, mf);
|
||||
|
||||
for (a=0, med=me->medge; a<me->totedge; a++, med++)
|
||||
@@ -1207,8 +1207,8 @@ void seam_mark_clear_tface(short mode)
|
||||
EdgeHash *ehash1 = BLI_edgehash_new();
|
||||
EdgeHash *ehash2 = BLI_edgehash_new();
|
||||
|
||||
for (a=0, mf=me->mface, tf=me->mtface; a<me->totface; a++, tf++, mf++) {
|
||||
if ((tf->flag & TF_HIDE) || !(tf->flag & TF_SELECT))
|
||||
for (a=0, mf=me->mface; a<me->totface; a++, mf++) {
|
||||
if ((mf->flag & ME_HIDE) || !(mf->flag & ME_FACE_SEL))
|
||||
seam_edgehash_insert_face(ehash1, mf);
|
||||
else
|
||||
seam_edgehash_insert_face(ehash2, mf);
|
||||
@@ -1237,7 +1237,7 @@ void face_select()
|
||||
Object *ob;
|
||||
Mesh *me;
|
||||
MTFace *tface, *tsel;
|
||||
MFace *msel;
|
||||
MFace *mface, *msel;
|
||||
short mval[2];
|
||||
unsigned int a, index;
|
||||
|
||||
@@ -1259,28 +1259,32 @@ void face_select()
|
||||
tsel= (((MTFace*)me->mtface)+index);
|
||||
msel= (((MFace*)me->mface)+index);
|
||||
|
||||
if (tsel->flag & TF_HIDE) return;
|
||||
if (msel->flag & ME_HIDE) return;
|
||||
|
||||
/* clear flags */
|
||||
tface = me->mtface;
|
||||
mface = me->mface;
|
||||
a = me->totface;
|
||||
while (a--) {
|
||||
if (G.qual & LR_SHIFTKEY)
|
||||
tface->flag &= ~TF_ACTIVE;
|
||||
else
|
||||
tface->flag &= ~(TF_ACTIVE+TF_SELECT);
|
||||
else {
|
||||
tface->flag &= ~TF_ACTIVE;
|
||||
mface->flag &= ~ME_FACE_SEL;
|
||||
}
|
||||
tface++;
|
||||
mface++;
|
||||
}
|
||||
|
||||
tsel->flag |= TF_ACTIVE;
|
||||
|
||||
if (G.qual & LR_SHIFTKEY) {
|
||||
if (tsel->flag & TF_SELECT)
|
||||
tsel->flag &= ~TF_SELECT;
|
||||
if (msel->flag & ME_FACE_SEL)
|
||||
msel->flag &= ~ME_FACE_SEL;
|
||||
else
|
||||
tsel->flag |= TF_SELECT;
|
||||
msel->flag |= ME_FACE_SEL;
|
||||
}
|
||||
else tsel->flag |= TF_SELECT;
|
||||
else msel->flag |= ME_FACE_SEL;
|
||||
|
||||
/* image window redraw */
|
||||
|
||||
@@ -1293,6 +1297,7 @@ void face_borderselect()
|
||||
{
|
||||
Mesh *me;
|
||||
MTFace *tface;
|
||||
MFace *mface;
|
||||
rcti rect;
|
||||
struct ImBuf *ibuf;
|
||||
unsigned int *rt;
|
||||
@@ -1332,13 +1337,13 @@ void face_borderselect()
|
||||
rt++;
|
||||
}
|
||||
|
||||
tface= me->mtface;
|
||||
mface= me->mface;
|
||||
for(a=1; a<=me->totface; a++, tface++) {
|
||||
if(selar[a]) {
|
||||
if(tface->flag & TF_HIDE);
|
||||
if(mface->flag & ME_HIDE);
|
||||
else {
|
||||
if(val==LEFTMOUSE) tface->flag |= TF_SELECT;
|
||||
else tface->flag &= ~TF_SELECT;
|
||||
if(val==LEFTMOUSE) mface->flag |= ME_FACE_SEL;
|
||||
else mface->flag &= ~ME_FACE_SEL;
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1441,15 +1446,11 @@ void set_faceselect() /* toggle */
|
||||
setcursor_space(SPACE_VIEW3D, CURSOR_STD);
|
||||
BIF_undo_push("End UV Faceselect");
|
||||
}
|
||||
|
||||
if(me)
|
||||
select_mface_from_tface(me);
|
||||
}
|
||||
else if (me && (ob->lay & G.vd->lay)) {
|
||||
G.f |= G_FACESELECT;
|
||||
if(me->mtface==NULL)
|
||||
make_tfaces(me);
|
||||
select_tface_from_mface(me);
|
||||
|
||||
setcursor_space(SPACE_VIEW3D, CURSOR_FACESEL);
|
||||
BIF_undo_push("Set UV Faceselect");
|
||||
@@ -1462,49 +1463,6 @@ void set_faceselect() /* toggle */
|
||||
allqueue(REDRAWIMAGE, 0);
|
||||
}
|
||||
|
||||
void select_tface_from_mface(Mesh *me)
|
||||
{
|
||||
MFace *mf;
|
||||
MTFace *tf;
|
||||
int a, hasactive=0;
|
||||
|
||||
if(!me->mtface) return;
|
||||
|
||||
mf= me->mface;
|
||||
tf= me->mtface;
|
||||
for(a=0; a<me->totface; a++, mf++, tf++) {
|
||||
if(mf->flag & ME_FACE_SEL) tf->flag |= TF_SELECT;
|
||||
else tf->flag &= ~TF_SELECT;
|
||||
|
||||
if(mf->flag & ME_HIDE) tf->flag |= TF_HIDE;
|
||||
else tf->flag &= ~TF_HIDE;
|
||||
|
||||
if(tf->flag & TF_ACTIVE) {
|
||||
if(hasactive) tf->flag &= ~TF_ACTIVE;
|
||||
else hasactive= 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void select_mface_from_tface(Mesh *me)
|
||||
{
|
||||
MFace *mf;
|
||||
MTFace *tf;
|
||||
int a;
|
||||
|
||||
if(!me->mtface) return;
|
||||
|
||||
mf= me->mface;
|
||||
tf= me->mtface;
|
||||
for(a=0; a<me->totface; a++, mf++, tf++) {
|
||||
if(tf->flag & TF_SELECT) mf->flag |= ME_FACE_SEL;
|
||||
else mf->flag &= ~ME_FACE_SEL;
|
||||
|
||||
if(tf->flag & TF_HIDE) mf->flag |= ME_HIDE;
|
||||
else mf->flag &= ~ME_HIDE;
|
||||
}
|
||||
}
|
||||
|
||||
/* Texture Paint */
|
||||
|
||||
void set_texturepaint() /* toggle */
|
||||
@@ -1683,7 +1641,8 @@ void get_same_uv(void)
|
||||
{
|
||||
Object *ob;
|
||||
Mesh *me;
|
||||
MTFace *tface;
|
||||
MTFace *tface;
|
||||
MFace *mface;
|
||||
short a, foundtex=0;
|
||||
Image *ima;
|
||||
char uvname[160];
|
||||
@@ -1718,17 +1677,19 @@ void get_same_uv(void)
|
||||
|
||||
/* select everything with the same texture */
|
||||
tface = me->mtface;
|
||||
mface = me->mface;
|
||||
a = me->totface;
|
||||
while (a--) {
|
||||
ima=tface->tpage;
|
||||
if(ima && ima->name){
|
||||
if(!(mface->flag & ME_HIDE) && ima && ima->name){
|
||||
if(!strcmp(ima->name, uvname)){
|
||||
tface->flag |= TF_SELECT;
|
||||
mface->flag |= ME_FACE_SEL;
|
||||
}
|
||||
else tface->flag &= ~TF_SELECT;
|
||||
else mface->flag &= ~ME_FACE_SEL;
|
||||
}
|
||||
else tface->flag &= ~TF_SELECT;
|
||||
else mface->flag &= ~ME_FACE_SEL;
|
||||
tface++;
|
||||
mface++;
|
||||
}
|
||||
|
||||
/* image window redraw */
|
||||
|
||||
Reference in New Issue
Block a user