diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp index 8ed97290398d33a2e782cb786dac1f015f040c1b..21c1d73d9e6d46946981814a2bb6616817433745 100644 --- a/Graphics/Mesh.cpp +++ b/Graphics/Mesh.cpp @@ -1,4 +1,4 @@ -// $Id: Mesh.cpp,v 1.70 2004-04-19 21:59:14 geuzaine Exp $ +// $Id: Mesh.cpp,v 1.71 2004-04-19 23:52:12 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -493,13 +493,10 @@ void Draw_Simplex_Volume(void *a, void *b) } } -void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY, - double *pZ, double n[3]) +void Draw_Simplex_Surface_Common(Simplex * s, int L, int K, + double *pX, double *pY, double *pZ, double n[3]) { - int i, K, L; - - L = (s->VSUP) ? 1 : 0; - K = (s->V[3]) ? 4 : 3; + int i; if(CTX.mesh.normals || CTX.mesh.light) glNormal3verts(s->V[0], s->V[1], s->V[2], n); @@ -523,30 +520,11 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY, } if(CTX.mesh.surfaces_edges){ - if(pX && pY && pZ) { // using precomputed vertices - glBegin(GL_LINE_LOOP); - for(i = 0; i < K * (1 + L); i++) { - glVertex3d(pX[i], pY[i], pZ[i]); - } - glEnd(); - } - else { // using the element's unmodified coordinates - if(!L) { - glBegin(GL_LINE_LOOP); - for(i = 0; i < K; i++) { - glVertex3d(s->V[i]->Pos.X, s->V[i]->Pos.Y, s->V[i]->Pos.Z); - } - glEnd(); - } - else { - glBegin(GL_LINE_LOOP); - for(i = 0; i < K; i++) { - glVertex3d(s->V[i]->Pos.X, s->V[i]->Pos.Y, s->V[i]->Pos.Z); - glVertex3d(s->VSUP[i]->Pos.X, s->VSUP[i]->Pos.Y, s->VSUP[i]->Pos.Z); - } - glEnd(); - } + glBegin(GL_LINE_LOOP); + for(i = 0; i < K * (1 + L); i++) { + glVertex3d(pX[i], pY[i], pZ[i]); } + glEnd(); } if(CTX.mesh.surfaces_faces && CTX.mesh.solid) { @@ -566,101 +544,52 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY, if(CTX.mesh.light) glEnable(GL_LIGHTING); - if(pX && pY && pZ) { // using precomputed vertices - if(L) { - if(K == 4){ - // FIXME: should subdivide... - glBegin(GL_POLYGON); - for(i = 0; i < K * (1 + L); i++) - glVertex3d(pX[i], pY[i], pZ[i]); - glEnd(); - } - else{ - glBegin(GL_TRIANGLES); - glNormal3verts(s->V[0], s->VSUP[0], s->VSUP[2], n); - glVertex3d(pX[0], pY[0], pZ[0]); - glVertex3d(pX[1], pY[1], pZ[1]); - glVertex3d(pX[5], pY[5], pZ[5]); - glNormal3verts(s->VSUP[0], s->V[1], s->VSUP[1], n); - glVertex3d(pX[1], pY[1], pZ[1]); - glVertex3d(pX[2], pY[2], pZ[2]); - glVertex3d(pX[3], pY[3], pZ[3]); - glNormal3verts(s->VSUP[1], s->V[2], s->VSUP[2], n); - glVertex3d(pX[3], pY[3], pZ[3]); - glVertex3d(pX[4], pY[4], pZ[4]); - glVertex3d(pX[5], pY[5], pZ[5]); - glNormal3verts(s->VSUP[0], s->VSUP[1], s->VSUP[2], n); - glVertex3d(pX[1], pY[1], pZ[1]); - glVertex3d(pX[3], pY[3], pZ[3]); - glVertex3d(pX[5], pY[5], pZ[5]); - glEnd(); - } - } - else if(K == 4) { - glBegin(GL_QUADS); - glVertex3d(pX[0], pY[0], pZ[0]); - glVertex3d(pX[1], pY[1], pZ[1]); - glVertex3d(pX[2], pY[2], pZ[2]); - glVertex3d(pX[3], pY[3], pZ[3]); - glEnd(); + if(!L) { // first order elements + if(K == 3) { + glBegin(GL_TRIANGLES); + glVertex3d(pX[0], pY[0], pZ[0]); + glVertex3d(pX[1], pY[1], pZ[1]); + glVertex3d(pX[2], pY[2], pZ[2]); + glEnd(); } else { - glBegin(GL_TRIANGLES); - glVertex3d(pX[0], pY[0], pZ[0]); - glVertex3d(pX[1], pY[1], pZ[1]); - glVertex3d(pX[2], pY[2], pZ[2]); - glEnd(); + glBegin(GL_QUADS); + glVertex3d(pX[0], pY[0], pZ[0]); + glVertex3d(pX[1], pY[1], pZ[1]); + glVertex3d(pX[2], pY[2], pZ[2]); + glVertex3d(pX[3], pY[3], pZ[3]); + glEnd(); } } - else { // using the element's unmodified coordinates - if(L) { - if(K == 4) { - // FIXME: should subdivide... - glBegin(GL_POLYGON); - for(i = 0; i < K; i++) { - glVertex3d(s->V[i]->Pos.X, s->V[i]->Pos.Y, s->V[i]->Pos.Z); - glVertex3d(s->VSUP[i]->Pos.X, s->VSUP[i]->Pos.Y, s->VSUP[i]->Pos.Z); - } - glEnd(); - } - else{ - glBegin(GL_TRIANGLES); - glNormal3verts(s->V[0], s->VSUP[0], s->VSUP[2], n); - glVertex3d(s->V[0]->Pos.X, s->V[0]->Pos.Y, s->V[0]->Pos.Z); - glVertex3d(s->VSUP[0]->Pos.X, s->VSUP[0]->Pos.Y, s->VSUP[0]->Pos.Z); - glVertex3d(s->VSUP[2]->Pos.X, s->VSUP[2]->Pos.Y, s->VSUP[2]->Pos.Z); - glNormal3verts(s->VSUP[0], s->V[1], s->VSUP[1], n); - glVertex3d(s->VSUP[0]->Pos.X, s->VSUP[0]->Pos.Y, s->VSUP[0]->Pos.Z); - glVertex3d(s->V[1]->Pos.X, s->V[1]->Pos.Y, s->V[1]->Pos.Z); - glVertex3d(s->VSUP[1]->Pos.X, s->VSUP[1]->Pos.Y, s->VSUP[1]->Pos.Z); - glNormal3verts(s->VSUP[1], s->V[2], s->VSUP[2], n); - glVertex3d(s->VSUP[1]->Pos.X, s->VSUP[1]->Pos.Y, s->VSUP[1]->Pos.Z); - glVertex3d(s->V[2]->Pos.X, s->V[2]->Pos.Y, s->V[2]->Pos.Z); - glVertex3d(s->VSUP[2]->Pos.X, s->VSUP[2]->Pos.Y, s->VSUP[2]->Pos.Z); - glNormal3verts(s->VSUP[0], s->VSUP[1], s->VSUP[2], n); - glVertex3d(s->VSUP[0]->Pos.X, s->VSUP[0]->Pos.Y, s->VSUP[0]->Pos.Z); - glVertex3d(s->VSUP[1]->Pos.X, s->VSUP[1]->Pos.Y, s->VSUP[1]->Pos.Z); - glVertex3d(s->VSUP[2]->Pos.X, s->VSUP[2]->Pos.Y, s->VSUP[2]->Pos.Z); - glEnd(); - } - } - else if(K == 4) { - glBegin(GL_QUADS); - glVertex3d(s->V[0]->Pos.X, s->V[0]->Pos.Y, s->V[0]->Pos.Z); - glVertex3d(s->V[1]->Pos.X, s->V[1]->Pos.Y, s->V[1]->Pos.Z); - glVertex3d(s->V[2]->Pos.X, s->V[2]->Pos.Y, s->V[2]->Pos.Z); - glVertex3d(s->V[3]->Pos.X, s->V[3]->Pos.Y, s->V[3]->Pos.Z); - glEnd(); + else { + if(K == 3) { + glBegin(GL_TRIANGLES); + glNormal3verts(s->V[0], s->VSUP[0], s->VSUP[2], n); + glVertex3d(pX[0], pY[0], pZ[0]); + glVertex3d(pX[1], pY[1], pZ[1]); + glVertex3d(pX[5], pY[5], pZ[5]); + glNormal3verts(s->VSUP[0], s->V[1], s->VSUP[1], n); + glVertex3d(pX[1], pY[1], pZ[1]); + glVertex3d(pX[2], pY[2], pZ[2]); + glVertex3d(pX[3], pY[3], pZ[3]); + glNormal3verts(s->VSUP[1], s->V[2], s->VSUP[2], n); + glVertex3d(pX[3], pY[3], pZ[3]); + glVertex3d(pX[4], pY[4], pZ[4]); + glVertex3d(pX[5], pY[5], pZ[5]); + glNormal3verts(s->VSUP[0], s->VSUP[1], s->VSUP[2], n); + glVertex3d(pX[1], pY[1], pZ[1]); + glVertex3d(pX[3], pY[3], pZ[3]); + glVertex3d(pX[5], pY[5], pZ[5]); + glEnd(); } else { - glBegin(GL_TRIANGLES); - glVertex3d(s->V[0]->Pos.X, s->V[0]->Pos.Y, s->V[0]->Pos.Z); - glVertex3d(s->V[1]->Pos.X, s->V[1]->Pos.Y, s->V[1]->Pos.Z); - glVertex3d(s->V[2]->Pos.X, s->V[2]->Pos.Y, s->V[2]->Pos.Z); - glEnd(); + // FIXME: should subdivide... + glBegin(GL_POLYGON); + for(i = 0; i < K * (1 + L); i++) + glVertex3d(pX[i], pY[i], pZ[i]); + glEnd(); } } - glDisable(GL_LIGHTING); } } @@ -668,7 +597,8 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY, void Draw_Simplex_Surface_Simple(void *a, void *b) { Simplex *s; - double n[3]; + int L, K; + double n[3], pX[8], pY[8], pZ[8]; s = *(Simplex **) a; @@ -679,7 +609,28 @@ void Draw_Simplex_Surface_Simple(void *a, void *b) if(part && !(*part)->Visible) return; - Draw_Simplex_Surface_Common(s, NULL, NULL, NULL, n); + L = (s->VSUP) ? 1 : 0; + K = (s->V[3]) ? 4 : 3; + + if(!L) { + for(int i = 0; i < K; i++) { + pX[i] = s->V[i]->Pos.X; + pY[i] = s->V[i]->Pos.Y; + pZ[i] = s->V[i]->Pos.Z; + } + } + else { + for(int i = 0; i < K; i++) { + pX[2*i] = s->V[i]->Pos.X; + pY[2*i] = s->V[i]->Pos.Y; + pZ[2*i] = s->V[i]->Pos.Z; + pX[2*i+1] = s->VSUP[i]->Pos.X; + pY[2*i+1] = s->VSUP[i]->Pos.Y; + pZ[2*i+1] = s->VSUP[i]->Pos.Z; + } + } + + Draw_Simplex_Surface_Common(s, L, K, pX, pY, pZ, n); } void Draw_Simplex_Surface(void *a, void *b) @@ -756,9 +707,11 @@ void Draw_Simplex_Surface(void *a, void *b) gl2psDisable(GL2PS_LINE_STIPPLE); } - Draw_Simplex_Surface_Common(s, pX, pY, pZ, n); + Draw_Simplex_Surface_Common(s, L, K, pX, pY, pZ, n); if(CTX.mesh.surfaces_num) { + if(CTX.mesh.solid) + glColor4ubv((GLubyte *) & CTX.color.mesh.line); sprintf(Num, "%d", s->Num); glRasterPos3d(Xc, Yc, Zc); Draw_String(Num);