- removed mface->puno flags, was only used to flip normals in display

and this is better left to user (whee this was a fun commit! so
   much deleting!)
 - removed mesh_calculate_vertex_normals (replaced by mesh_calc_normals)
This commit is contained in:
2005-07-23 16:09:08 +00:00
parent 16b76eb0ec
commit 42da62679f
12 changed files with 25 additions and 194 deletions

View File

@@ -82,12 +82,6 @@ void mesh_get_texspace(struct Mesh *me, float *loc_r, float *rot_r, float *size_
void make_edges(struct Mesh *me); void make_edges(struct Mesh *me);
/** Generate the mesh vertex normals by averaging over connected faces.
*
* @param me The mesh to update.
*/
void mesh_calculate_vertex_normals (struct Mesh *me);
/* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL /* Calculate vertex and face normals, face normals are returned in *faceNors_r if non-NULL
* and vertex normals are stored in actual mverts. * and vertex normals are stored in actual mverts.
*/ */

View File

@@ -239,14 +239,10 @@ static void meshDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int))
int a; int a;
int glmode=-1, shademodel=-1, matnr=-1, drawCurrentMat=1; int glmode=-1, shademodel=-1, matnr=-1, drawCurrentMat=1;
#define PASSVERT(index, punoBit) { \ #define PASSVERT(index) { \
if (shademodel==GL_SMOOTH) { \ if (shademodel==GL_SMOOTH) { \
short *no = mvert[index].no; \ short *no = mvert[index].no; \
if (mface->puno&punoBit) { \ glNormal3sv(no); \
glNormal3s(-no[0], -no[1], -no[2]); \
} else { \
glNormal3sv(no); \
} \
} \ } \
glVertex3fv(mvert[index].co); \ glVertex3fv(mvert[index].co); \
} }
@@ -273,11 +269,11 @@ static void meshDM_drawFacesSolid(DerivedMesh *dm, int (*setMaterial)(int))
if(shademodel==GL_FLAT) if(shademodel==GL_FLAT)
glNormal3fv(nors); glNormal3fv(nors);
PASSVERT(mface->v1, ME_FLIPV1); PASSVERT(mface->v1);
PASSVERT(mface->v2, ME_FLIPV2); PASSVERT(mface->v2);
PASSVERT(mface->v3, ME_FLIPV3); PASSVERT(mface->v3);
if (mface->v4) { if (mface->v4) {
PASSVERT(mface->v4, ME_FLIPV4); PASSVERT(mface->v4);
} }
} }
} }

View File

@@ -168,7 +168,6 @@ void displistmesh_to_mesh(DispListMesh *dlm, Mesh *me)
mf->v4= oldmf->v4; mf->v4= oldmf->v4;
mf->flag= oldmf->flag; mf->flag= oldmf->flag;
mf->mat_nr= oldmf->mat_nr; mf->mat_nr= oldmf->mat_nr;
mf->puno= 0;
mf->edcode= ME_V1V2|ME_V2V3|ME_V3V4|ME_V4V1; mf->edcode= ME_V1V2|ME_V2V3|ME_V3V4|ME_V4V1;
} }
} }

View File

@@ -543,12 +543,6 @@ void test_index_mface(MFace *mface, int nr)
if(a & ME_V1V2) mface->edcode |= ME_V3V1; if(a & ME_V1V2) mface->edcode |= ME_V3V1;
if(a & ME_V2V3) mface->edcode |= ME_V1V2; if(a & ME_V2V3) mface->edcode |= ME_V1V2;
if(a & ME_V3V1) mface->edcode |= ME_V2V3; if(a & ME_V3V1) mface->edcode |= ME_V2V3;
a= mface->puno;
mface->puno &= ~15;
if(a & ME_FLIPV1) mface->puno |= ME_FLIPV2;
if(a & ME_FLIPV2) mface->puno |= ME_FLIPV3;
if(a & ME_FLIPV3) mface->puno |= ME_FLIPV1;
} }
} }
else if(nr==4) { else if(nr==4) {
@@ -561,13 +555,6 @@ void test_index_mface(MFace *mface, int nr)
if(a & ME_V2V3) mface->edcode |= ME_V2V3; if(a & ME_V2V3) mface->edcode |= ME_V2V3;
if(a & ME_V3V4) mface->edcode |= ME_V1V2; if(a & ME_V3V4) mface->edcode |= ME_V1V2;
if(a & ME_V4V1) mface->edcode |= ME_V4V1; if(a & ME_V4V1) mface->edcode |= ME_V4V1;
a= mface->puno;
mface->puno &= ~15;
if(a & ME_FLIPV1) mface->puno |= ME_FLIPV3;
if(a & ME_FLIPV2) mface->puno |= ME_FLIPV4;
if(a & ME_FLIPV3) mface->puno |= ME_FLIPV1;
if(a & ME_FLIPV4) mface->puno |= ME_FLIPV2;
} }
} }
} }
@@ -631,12 +618,6 @@ void test_index_face(MFace *mface, TFace *tface, int nr)
if(a & ME_V1V2) mface->edcode |= ME_V3V1; if(a & ME_V1V2) mface->edcode |= ME_V3V1;
if(a & ME_V2V3) mface->edcode |= ME_V1V2; if(a & ME_V2V3) mface->edcode |= ME_V1V2;
if(a & ME_V3V1) mface->edcode |= ME_V2V3; if(a & ME_V3V1) mface->edcode |= ME_V2V3;
a= mface->puno;
mface->puno &= ~15;
if(a & ME_FLIPV1) mface->puno |= ME_FLIPV2;
if(a & ME_FLIPV2) mface->puno |= ME_FLIPV3;
if(a & ME_FLIPV3) mface->puno |= ME_FLIPV1;
} }
} }
else if(nr==4) { else if(nr==4) {
@@ -664,13 +645,6 @@ void test_index_face(MFace *mface, TFace *tface, int nr)
if(a & ME_V2V3) mface->edcode |= ME_V2V3; if(a & ME_V2V3) mface->edcode |= ME_V2V3;
if(a & ME_V3V4) mface->edcode |= ME_V1V2; if(a & ME_V3V4) mface->edcode |= ME_V1V2;
if(a & ME_V4V1) mface->edcode |= ME_V4V1; if(a & ME_V4V1) mface->edcode |= ME_V4V1;
a= mface->puno;
mface->puno &= ~15;
if(a & ME_FLIPV1) mface->puno |= ME_FLIPV3;
if(a & ME_FLIPV2) mface->puno |= ME_FLIPV4;
if(a & ME_FLIPV3) mface->puno |= ME_FLIPV1;
if(a & ME_FLIPV4) mface->puno |= ME_FLIPV2;
} }
} }
} }
@@ -679,7 +653,7 @@ void flipnorm_mesh(Mesh *me)
{ {
MFace *mface; MFace *mface;
MVert *mvert; MVert *mvert;
int a, temp; int a;
mvert= me->mvert; mvert= me->mvert;
a= me->totvert; a= me->totvert;
@@ -698,21 +672,10 @@ void flipnorm_mesh(Mesh *me)
SWAP(int, mface->v4, mface->v1); SWAP(int, mface->v4, mface->v1);
SWAP(int, mface->v3, mface->v2); SWAP(int, mface->v3, mface->v2);
test_index_mface(mface, 4); test_index_mface(mface, 4);
temp= mface->puno;
mface->puno &= ~15;
if(temp & ME_FLIPV1) mface->puno |= ME_FLIPV4;
if(temp & ME_FLIPV2) mface->puno |= ME_FLIPV3;
if(temp & ME_FLIPV3) mface->puno |= ME_FLIPV2;
if(temp & ME_FLIPV4) mface->puno |= ME_FLIPV1;
} }
else { else {
SWAP(int, mface->v3, mface->v1); SWAP(int, mface->v3, mface->v1);
test_index_mface(mface, 3); test_index_mface(mface, 3);
temp= mface->puno;
mface->puno &= ~15;
if(temp & ME_FLIPV1) mface->puno |= ME_FLIPV3;
if(temp & ME_FLIPV2) mface->puno |= ME_FLIPV2;
if(temp & ME_FLIPV3) mface->puno |= ME_FLIPV1;
} }
} }
mface++; mface++;
@@ -894,7 +857,6 @@ void mball_to_mesh(ListBase *lb, Mesh *me)
mface->v3= index[2]; mface->v3= index[2];
mface->v4= index[3]; mface->v4= index[3];
mface->puno= 0;
mface->edcode= ME_V1V2+ME_V2V3; mface->edcode= ME_V1V2+ME_V2V3;
mface->flag = ME_SMOOTH; mface->flag = ME_SMOOTH;
@@ -1041,7 +1003,6 @@ void nurbs_to_mesh(Object *ob)
mface->v3= startvert+index[2]; mface->v3= startvert+index[2];
mface->v4= 0; mface->v4= 0;
mface->puno= 7;
mface->edcode= ME_V1V2+ME_V2V3; mface->edcode= ME_V1V2+ME_V2V3;
test_index_mface(mface, 3); test_index_mface(mface, 3);
@@ -1177,43 +1138,6 @@ void mcol_to_tface(Mesh *me, int freedata)
} }
} }
void mesh_calculate_vertex_normals(Mesh *me)
{
float (*tempNorms)[3]= MEM_callocN(me->totvert*sizeof(*tempNorms), "tempNorms");
int i;
for (i=0; i<me->totface; i++) {
MFace *mf= &((MFace*) me->mface)[i];
float f_no[3];
if (!mf->v3)
continue;
if (mf->v4) {
CalcNormFloat4(me->mvert[mf->v1].co, me->mvert[mf->v2].co, me->mvert[mf->v3].co, me->mvert[mf->v4].co, f_no);
} else {
CalcNormFloat(me->mvert[mf->v1].co, me->mvert[mf->v2].co, me->mvert[mf->v3].co, f_no);
}
VecAddf(tempNorms[mf->v1], tempNorms[mf->v1], f_no);
VecAddf(tempNorms[mf->v2], tempNorms[mf->v2], f_no);
VecAddf(tempNorms[mf->v3], tempNorms[mf->v3], f_no);
if (mf->v4)
VecAddf(tempNorms[mf->v4], tempNorms[mf->v4], f_no);
}
for (i=0; i<me->totvert; i++) {
MVert *mv= &me->mvert[i];
float *no= tempNorms[i];
Normalise(no);
mv->no[0]= (short)(no[0]*32767.0);
mv->no[1]= (short)(no[1]*32767.0);
mv->no[2]= (short)(no[2]*32767.0);
}
MEM_freeN(tempNorms);
}
void mesh_delete_material_index(Mesh *me, int index) { void mesh_delete_material_index(Mesh *me, int index) {
int i; int i;

View File

@@ -85,7 +85,7 @@ typedef struct EditFace
short xs, ys; /* selection */ short xs, ys; /* selection */
struct TFace tf; /* a copy of original tface. */ struct TFace tf; /* a copy of original tface. */
unsigned char mat_nr, flag; unsigned char mat_nr, flag;
unsigned char f, f1, h, puno; unsigned char f, f1, h;
unsigned char fast; /* only 0 or 1, for editmesh_fastmalloc */ unsigned char fast; /* only 0 or 1, for editmesh_fastmalloc */
unsigned char fgonf; /* flag for fgon options */ unsigned char fgonf; /* flag for fgon options */
} EditFace; } EditFace;

View File

@@ -36,7 +36,7 @@ struct Bone;
typedef struct MFace { typedef struct MFace {
unsigned int v1, v2, v3, v4; unsigned int v1, v2, v3, v4;
char puno, mat_nr; char pad, mat_nr;
char edcode, flag; char edcode, flag;
} MFace; } MFace;

View File

@@ -2337,7 +2337,6 @@ static void mface_from_data( MFace * mf, TFace * tf, MCol * col,
test_index_mface( mf, i ); test_index_mface( mf, i );
} }
mf->puno = 0;
mf->mat_nr = from->mat_nr; mf->mat_nr = from->mat_nr;
mf->edcode = 0; mf->edcode = 0;
mf->flag = from->mf_flag; mf->flag = from->mf_flag;

View File

@@ -727,7 +727,6 @@ ConvertCSGDescriptorsToMeshObject(
mface->v4 = 0; mface->v4 = 0;
mface->edcode = ME_V1V2|ME_V2V3|ME_V3V4|ME_V4V1; mface->edcode = ME_V1V2|ME_V2V3|ME_V3V4|ME_V4V1;
mface->puno = 0;
mface->mat_nr = 0; mface->mat_nr = 0;
mface->flag = fdata->faceflag; mface->flag = fdata->faceflag;
@@ -781,7 +780,7 @@ ConvertCSGDescriptorsToMeshObject(
me->totface = face_it->num_elements; me->totface = face_it->num_elements;
mesh_calculate_vertex_normals(me); mesh_calc_normals(me->mvert, me->totvert, me->mface, me->totface, NULL);
// thats it! // thats it!
if (user_face_vertex_data) { if (user_face_vertex_data) {

View File

@@ -2224,19 +2224,20 @@ static void editing_panel_mesh_tools1(Object *ob, Mesh *me)
uiBlockBeginAlign(block); uiBlockBeginAlign(block);
uiDefButF(block, NUM, REDRAWVIEW3D, "NSize:", 955, 131, 150, 19, &G.scene->editbutsize, 0.001, 2.0, 10, 0, "Sets the length to use when displaying face normals"); uiDefButF(block, NUM, REDRAWVIEW3D, "NSize:", 955, 131, 150, 19, &G.scene->editbutsize, 0.001, 2.0, 10, 0, "Sets the length to use when displaying face normals");
uiDefButI(block, TOG|BIT|6, REDRAWVIEW3D, "Draw Normals", 955,110,150,19, &G.f, 0, 0, 0, 0, "Displays face normals as lines"); uiDefButBitI(block, TOG, G_DRAWNORMALS, REDRAWVIEW3D, "Draw Normals", 955,110,150,19, &G.f, 0, 0, 0, 0, "Displays face normals as lines");
uiDefButI(block, TOG|BIT|7, REDRAWVIEW3D, "Draw Faces", 955,88,150,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades"); uiDefButBitI(block, TOG, G_DRAWFACES, REDRAWVIEW3D, "Draw Faces", 955,88,150,19, &G.f, 0, 0, 0, 0, "Displays all faces as shades");
uiDefButI(block, TOG|BIT|18, REDRAWVIEW3D, "Draw Edges", 955,66,150,19, &G.f, 0, 0, 0, 0, "Displays selected edges using hilights"); uiDefButBitI(block, TOG, G_DRAWEDGES, REDRAWVIEW3D, "Draw Edges", 955,66,150,19, &G.f, 0, 0, 0, 0, "Displays selected edges using hilights");
uiDefButI(block, TOG|BIT|19, REDRAWVIEW3D, "Draw Creases", 955,44,150,19, &G.f, 0, 0, 0, 0, "Displays creases created for subsurf weighting"); uiDefButBitI(block, TOG, G_DRAWCREASES, REDRAWVIEW3D, "Draw Creases", 955,44,150,19, &G.f, 0, 0, 0, 0, "Displays creases created for subsurf weighting");
uiDefButI(block, TOG|BIT|20, REDRAWVIEW3D, "Draw Seams", 955,22,150,19, &G.f, 0, 0, 0, 0, "Displays UV unwrapping seams"); uiDefButBitI(block, TOG, G_DRAWSEAMS, REDRAWVIEW3D, "Draw Seams", 955,22,150,19, &G.f, 0, 0, 0, 0, "Displays UV unwrapping seams");
uiDefButI(block, TOG|BIT|11, 0, "All Edges", 955, 0,150,19, &G.f, 0, 0, 0, 0, "Displays all edges in object mode without optimization"); uiDefButBitI(block, TOG, G_ALLEDGES, 0, "All Edges", 955, 0,150,19, &G.f, 0, 0, 0, 0, "Displays all edges in object mode without optimization");
uiBlockEndAlign(block); uiBlockEndAlign(block);
/* Measurement drawing options */ /* Measurement drawing options */
uiBlockBeginAlign(block); uiBlockBeginAlign(block);
uiDefButI(block, TOG|BIT|22, REDRAWVIEW3D, "Edge Length", 1125,131,150,19, &G.f, 0, 0, 0, 0, "Displays selected edge lengths"); uiDefButBitI(block, TOG, G_DRAW_VNORMALS, REDRAWVIEW3D, "Draw VNormals",1125,110,150,19, &G.f, 0, 0, 0, 0, "Displays vertex normals as lines");
uiDefButI(block, TOG|BIT|24, REDRAWVIEW3D, "Edge Angles", 1125,110,150,19, &G.f, 0, 0, 0, 0, "Displays the angles in the selected edges in degrees"); uiDefButBitI(block, TOG, G_DRAW_EDGELEN, REDRAWVIEW3D, "Edge Length", 1125,88,150,19, &G.f, 0, 0, 0, 0, "Displays selected edge lengths");
uiDefButI(block, TOG|BIT|23, REDRAWVIEW3D, "Face Area", 1125,88,150,19, &G.f, 0, 0, 0, 0, "Displays the area of selected faces"); uiDefButBitI(block, TOG, G_DRAW_EDGEANG, REDRAWVIEW3D, "Edge Angles", 1125,66,150,19, &G.f, 0, 0, 0, 0, "Displays the angles in the selected edges in degrees");
uiDefButBitI(block, TOG, G_DRAW_FACEAREA, REDRAWVIEW3D, "Face Area", 1125,44,150,19, &G.f, 0, 0, 0, 0, "Displays the area of selected faces");
uiBlockEndAlign(block); uiBlockEndAlign(block);
} }

View File

@@ -857,13 +857,6 @@ static void fix_faceindices(MFace *mface, EditFace *efa, int nr)
if(a & ME_V1V2) mface->edcode |= ME_V3V1; if(a & ME_V1V2) mface->edcode |= ME_V3V1;
if(a & ME_V2V3) mface->edcode |= ME_V1V2; if(a & ME_V2V3) mface->edcode |= ME_V1V2;
if(a & ME_V3V1) mface->edcode |= ME_V2V3; if(a & ME_V3V1) mface->edcode |= ME_V2V3;
a= mface->puno;
mface->puno &= ~15;
if(a & ME_FLIPV1) mface->puno |= ME_FLIPV2;
if(a & ME_FLIPV2) mface->puno |= ME_FLIPV3;
if(a & ME_FLIPV3) mface->puno |= ME_FLIPV1;
} }
} }
else if(nr==4) { else if(nr==4) {
@@ -891,14 +884,6 @@ static void fix_faceindices(MFace *mface, EditFace *efa, int nr)
if(a & ME_V2V3) mface->edcode |= ME_V2V3; if(a & ME_V2V3) mface->edcode |= ME_V2V3;
if(a & ME_V3V4) mface->edcode |= ME_V1V2; if(a & ME_V3V4) mface->edcode |= ME_V1V2;
if(a & ME_V4V1) mface->edcode |= ME_V4V1; if(a & ME_V4V1) mface->edcode |= ME_V4V1;
a= mface->puno;
mface->puno &= ~15;
if(a & ME_FLIPV1) mface->puno |= ME_FLIPV3;
if(a & ME_FLIPV2) mface->puno |= ME_FLIPV4;
if(a & ME_FLIPV3) mface->puno |= ME_FLIPV1;
if(a & ME_FLIPV4) mface->puno |= ME_FLIPV2;
} }
} }
} }
@@ -1051,7 +1036,6 @@ void load_editMesh(void)
if(efa->v4) mface->v4= (unsigned int) efa->v4->vn; if(efa->v4) mface->v4= (unsigned int) efa->v4->vn;
mface->mat_nr= efa->mat_nr; mface->mat_nr= efa->mat_nr;
mface->puno= efa->puno;
mface->flag= efa->flag; mface->flag= efa->flag;
/* bit 0 of flag is already taken for smooth... */ /* bit 0 of flag is already taken for smooth... */
@@ -1613,7 +1597,7 @@ typedef struct EditEdgeC
typedef struct EditFaceC typedef struct EditFaceC
{ {
int v1, v2, v3, v4; int v1, v2, v3, v4;
unsigned char mat_nr, flag, f, h, puno, fgonf; unsigned char mat_nr, flag, f, h, fgonf;
short pad1; short pad1;
} EditFaceC; } EditFaceC;
@@ -1713,7 +1697,6 @@ static void *editMesh_to_undoMesh(void)
efac->flag= efa->flag; efac->flag= efa->flag;
efac->f= efa->f; efac->f= efa->f;
efac->h= efa->h; efac->h= efa->h;
efac->puno= efa->puno;
efac->fgonf= efa->fgonf; efac->fgonf= efa->fgonf;
if(tface) { if(tface) {
@@ -1782,7 +1765,6 @@ static void undoMesh_to_editMesh(void *umv)
efa->flag= efac->flag; efa->flag= efac->flag;
efa->f= efac->f; efa->f= efac->f;
efa->h= efac->h; efa->h= efac->h;
efa->puno= efac->puno;
efa->fgonf= efac->fgonf; efa->fgonf= efac->fgonf;
if(tface) { if(tface) {

View File

@@ -1312,8 +1312,8 @@ void vertexnormals(int testflip)
Mesh *me; Mesh *me;
EditVert *eve; EditVert *eve;
EditFace *efa; EditFace *efa;
float n1[3], n2[3], n3[3], n4[3], co[4], fac1, fac2, fac3, fac4, *temp; float n1[3], n2[3], n3[3], n4[3], co[4], *temp;
float *f1, *f2, *f3, *f4, xn, yn, zn; float xn, yn, zn;
float len, area; float len, area;
if(G.obedit && G.obedit->type==OB_MESH) { if(G.obedit && G.obedit->type==OB_MESH) {
@@ -1440,42 +1440,11 @@ void vertexnormals(int testflip)
/* vertex normal flip-flags for shade (render) */ /* vertex normal flip-flags for shade (render) */
efa= em->faces.first; efa= em->faces.first;
while(efa) { while(efa) {
efa->puno=0;
if(testflip) {
f1= efa->v1->no;
f2= efa->v2->no;
f3= efa->v3->no;
fac1= efa->n[0]*f1[0] + efa->n[1]*f1[1] + efa->n[2]*f1[2];
if(fac1<0.0) {
efa->puno = ME_FLIPV1;
}
fac2= efa->n[0]*f2[0] + efa->n[1]*f2[1] + efa->n[2]*f2[2];
if(fac2<0.0) {
efa->puno += ME_FLIPV2;
}
fac3= efa->n[0]*f3[0] + efa->n[1]*f3[1] + efa->n[2]*f3[2];
if(fac3<0.0) {
efa->puno += ME_FLIPV3;
}
if(efa->v4) {
f4= efa->v4->no;
fac4= efa->n[0]*f4[0] + efa->n[1]*f4[1] + efa->n[2]*f4[2];
if(fac4<0.0) {
efa->puno += ME_FLIPV4;
}
}
}
/* projection for cubemap! */ /* projection for cubemap! */
xn= fabs(efa->n[0]); xn= fabs(efa->n[0]);
yn= fabs(efa->n[1]); yn= fabs(efa->n[1]);
zn= fabs(efa->n[2]); zn= fabs(efa->n[2]);
if(zn>xn && zn>yn) efa->puno += ME_PROJXY;
else if(yn>xn && yn>zn) efa->puno += ME_PROJXZ;
else efa->puno += ME_PROJYZ;
efa= efa->next; efa= efa->next;
} }
} }

View File

@@ -561,8 +561,8 @@ void vertexnormals_mesh(Mesh *me)
{ {
MVert *mvert; MVert *mvert;
MFace *mface; MFace *mface;
float n1[3], n2[3], n3[3], n4[3], co[4], fac1, fac2, fac3, fac4, *temp; float n1[3], n2[3], n3[3], n4[3], co[4], *temp;
float *f1, *f2, *f3, *f4, xn, yn, zn, *normals; float xn, yn, zn, *normals;
float *v1, *v2, *v3, *v4, len, vnor[3]; float *v1, *v2, *v3, *v4, len, vnor[3];
int a, testflip; int a, testflip;
@@ -671,8 +671,6 @@ void vertexnormals_mesh(Mesh *me)
mface= me->mface; mface= me->mface;
mvert= me->mvert; mvert= me->mvert;
for(a=0; a<me->totface; a++, mface++) { for(a=0; a<me->totface; a++, mface++) {
mface->puno=0;
if(mface->v3==0) continue; if(mface->v3==0) continue;
v1= (mvert+mface->v1)->co; v1= (mvert+mface->v1)->co;
@@ -681,40 +679,10 @@ void vertexnormals_mesh(Mesh *me)
CalcNormFloat(v1, v2, v3, vnor); CalcNormFloat(v1, v2, v3, vnor);
if(testflip) {
f1= normals + 3*mface->v1;
f2= normals + 3*mface->v2;
f3= normals + 3*mface->v3;
fac1= vnor[0]*f1[0] + vnor[1]*f1[1] + vnor[2]*f1[2];
if(fac1<0.0) {
mface->puno = ME_FLIPV1;
}
fac2= vnor[0]*f2[0] + vnor[1]*f2[1] + vnor[2]*f2[2];
if(fac2<0.0) {
mface->puno += ME_FLIPV2;
}
fac3= vnor[0]*f3[0] + vnor[1]*f3[1] + vnor[2]*f3[2];
if(fac3<0.0) {
mface->puno += ME_FLIPV3;
}
if(mface->v4) {
f4= normals + 3*mface->v4;
fac4= vnor[0]*f4[0] + vnor[1]*f4[1] + vnor[2]*f4[2];
if(fac4<0.0) {
mface->puno += ME_FLIPV4;
}
}
}
/* proj for cubemap! */ /* proj for cubemap! */
xn= fabs(vnor[0]); xn= fabs(vnor[0]);
yn= fabs(vnor[1]); yn= fabs(vnor[1]);
zn= fabs(vnor[2]); zn= fabs(vnor[2]);
if(zn>xn && zn>yn) mface->puno += ME_PROJXY;
else if(yn>xn && yn>zn) mface->puno += ME_PROJXZ;
else mface->puno += ME_PROJYZ;
} }
MEM_freeN(normals); MEM_freeN(normals);