Skip to content
Snippets Groups Projects
Commit a48f052d authored by Christophe Geuzaine's avatar Christophe Geuzaine
Browse files

- Fixed drawing of 2nd order triangles and tets
- Restored drawing of 2nd odrer vertices in different color
parent 750cea65
Branches
Tags
No related merge requests found
// $Id: Mesh.cpp,v 1.67 2004-03-04 23:08:31 geuzaine Exp $
// $Id: Mesh.cpp,v 1.68 2004-04-18 03:12:00 geuzaine Exp $
//
// Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
//
......@@ -268,6 +268,9 @@ void Draw_Mesh_Points(void *a, void *b)
glPushName(v->Num);
}
if(v->Degree == 2)
glColor4ubv((GLubyte *) & CTX.color.mesh.vertex_deg2);
else
glColor4ubv((GLubyte *) & CTX.color.mesh.vertex);
if(CTX.mesh.points) {
......@@ -295,14 +298,27 @@ void Draw_Mesh_Points(void *a, void *b)
}
}
// Draw simplex
void glNormal3verts(Vertex *v0, Vertex *v1, Vertex *v2, double n[3])
{
double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0;
x1x0 = v1->Pos.X - v0->Pos.X;
y1y0 = v1->Pos.Y - v0->Pos.Y;
z1z0 = v1->Pos.Z - v0->Pos.Z;
x2x0 = v2->Pos.X - v0->Pos.X;
y2y0 = v2->Pos.Y - v0->Pos.Y;
z2z0 = v2->Pos.Z - v0->Pos.Z;
n[0] = y1y0 * z2z0 - z1z0 * y2y0;
n[1] = z1z0 * x2x0 - x1x0 * z2z0;
n[2] = x1x0 * y2y0 - y1y0 * x2x0;
glNormal3dv(n);
}
void Draw_Simplex_Volume(void *a, void *b)
{
Simplex *s;
char Num[100];
int fulldraw = 0;
double tmp, X[4], Y[4], Z[4];
double tmp, X[4], Y[4], Z[4], X2[6], Y2[6], Z2[6];
s = *(Simplex **) a;
......@@ -365,37 +381,52 @@ void Draw_Simplex_Volume(void *a, void *b)
else
glColor4ubv((GLubyte *) & CTX.color.mesh.line);
// this is killing us!!!
for(int i = 0; i < 4; i++) {
X[i] = Xc + CTX.mesh.explode * (s->V[i]->Pos.X - Xc);
Y[i] = Yc + CTX.mesh.explode * (s->V[i]->Pos.Y - Yc);
Z[i] = Zc + CTX.mesh.explode * (s->V[i]->Pos.Z - Zc);
}
if(s->VSUP){
for(int i = 0; i < 6; i++) {
X2[i] = Xc + CTX.mesh.explode * (s->VSUP[i]->Pos.X - Xc);
Y2[i] = Yc + CTX.mesh.explode * (s->VSUP[i]->Pos.Y - Yc);
Z2[i] = Zc + CTX.mesh.explode * (s->VSUP[i]->Pos.Z - Zc);
}
}
if(CTX.mesh.volumes) {
if(!s->VSUP){
glBegin(GL_LINES);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[1], Y[1], Z[1]); glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[2], Y[2], Z[2]); glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[1], Y[1], Z[1]);
glEnd();
}
else{
glBegin(GL_LINES);
glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X2[0], Y2[0], Z2[0]); glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[1], Y[1], Z[1]); glVertex3d(X2[1], Y2[1], Z2[1]);
glVertex3d(X2[1], Y2[1], Z2[1]); glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[2], Y[2], Z[2]); glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X2[2], Y2[2], Z2[2]); glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X2[3], Y2[3], Z2[3]);
glVertex3d(X2[3], Y2[3], Z2[3]); glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X2[4], Y2[4], Z2[4]);
glVertex3d(X2[4], Y2[4], Z2[4]); glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X2[5], Y2[5], Z2[5]);
glVertex3d(X2[5], Y2[5], Z2[5]); glVertex3d(X[1], Y[1], Z[1]);
glEnd();
}
}
if(CTX.mesh.volumes_num) {
sprintf(Num, "%d", s->Num);
......@@ -429,8 +460,6 @@ void Draw_Simplex_Volume(void *a, void *b)
if(!fulldraw)
return;
double n[4], x1x0, y1y0, z1z0, x2x0, y2y0, z2z0;
if(theColor.type)
glColor4ubv((GLubyte *) & theColor.mesh);
else if(CTX.mesh.color_carousel == 1)
......@@ -443,85 +472,27 @@ void Draw_Simplex_Volume(void *a, void *b)
glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron);
if(CTX.mesh.solid) {
double n[3];
// FIXME: should subdivide if s->VSUP
if(CTX.mesh.light) glEnable(GL_LIGHTING);
if(CTX.mesh.light) {
x1x0 = X[2] - X[0];
y1y0 = Y[2] - Y[0];
z1z0 = Z[2] - Z[0];
x2x0 = X[1] - X[0];
y2y0 = Y[1] - Y[0];
z2z0 = Z[1] - Z[0];
n[0] = y1y0 * z2z0 - z1z0 * y2y0;
n[1] = z1z0 * x2x0 - x1x0 * z2z0;
n[2] = x1x0 * y2y0 - y1y0 * x2x0;
glNormal3dv(n);
}
glBegin(GL_TRIANGLES);
if(CTX.mesh.light) glNormal3verts(s->V[0], s->V[2], s->V[1], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[1], Y[1], Z[1]);
glEnd();
if(CTX.mesh.light) {
x1x0 = X[1] - X[0];
y1y0 = Y[1] - Y[0];
z1z0 = Z[1] - Z[0];
x2x0 = X[3] - X[0];
y2y0 = Y[3] - Y[0];
z2z0 = Z[3] - Z[0];
n[0] = y1y0 * z2z0 - z1z0 * y2y0;
n[1] = z1z0 * x2x0 - x1x0 * z2z0;
n[2] = x1x0 * y2y0 - y1y0 * x2x0;
glNormal3dv(n);
}
glBegin(GL_TRIANGLES);
if(CTX.mesh.light) glNormal3verts(s->V[0], s->V[1], s->V[3], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[3], Y[3], Z[3]);
glEnd();
if(CTX.mesh.light) {
x1x0 = X[3] - X[0];
y1y0 = Y[3] - Y[0];
z1z0 = Z[3] - Z[0];
x2x0 = X[2] - X[0];
y2y0 = Y[2] - Y[0];
z2z0 = Z[2] - Z[0];
n[0] = y1y0 * z2z0 - z1z0 * y2y0;
n[1] = z1z0 * x2x0 - x1x0 * z2z0;
n[2] = x1x0 * y2y0 - y1y0 * x2x0;
glNormal3dv(n);
}
glBegin(GL_TRIANGLES);
if(CTX.mesh.light) glNormal3verts(s->V[0], s->V[3], s->V[2], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[2], Y[2], Z[2]);
glEnd();
if(CTX.mesh.light) {
x1x0 = X[3] - X[1];
y1y0 = Y[3] - Y[1];
z1z0 = Z[3] - Z[1];
x2x0 = X[2] - X[1];
y2y0 = Y[2] - Y[1];
z2z0 = Z[2] - Z[1];
n[0] = y1y0 * z2z0 - z1z0 * y2y0;
n[1] = z1z0 * x2x0 - x1x0 * z2z0;
n[2] = x1x0 * y2y0 - y1y0 * x2x0;
glNormal3dv(n);
}
glBegin(GL_TRIANGLES);
if(CTX.mesh.light) glNormal3verts(s->V[3], s->V[1], s->V[2], n);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[2], Y[2], Z[2]);
glEnd();
glDisable(GL_LIGHTING);
}
}
......@@ -529,27 +500,15 @@ void Draw_Simplex_Volume(void *a, void *b)
void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
double *pZ, double n[3])
{
double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0;
int i, K, L;
L = (s->VSUP) ? 1 : 0;
K = (s->V[3]) ? 4 : 3;
if(CTX.mesh.normals || CTX.mesh.light) {
x1x0 = s->V[1]->Pos.X - s->V[0]->Pos.X;
y1y0 = s->V[1]->Pos.Y - s->V[0]->Pos.Y;
z1z0 = s->V[1]->Pos.Z - s->V[0]->Pos.Z;
x2x0 = s->V[2]->Pos.X - s->V[0]->Pos.X;
y2y0 = s->V[2]->Pos.Y - s->V[0]->Pos.Y;
z2z0 = s->V[2]->Pos.Z - s->V[0]->Pos.Z;
n[0] = y1y0 * z2z0 - z1z0 * y2y0;
n[1] = z1z0 * x2x0 - x1x0 * z2z0;
n[2] = x1x0 * y2y0 - y1y0 * x2x0;
glNormal3dv(n);
}
if(CTX.mesh.normals || CTX.mesh.light)
glNormal3verts(s->V[0], s->V[1], s->V[2], n);
if(CTX.mesh.surfaces && CTX.mesh.lines) {
if(!CTX.mesh.solid) {
if(theColor.type)
glColor4ubv((GLubyte *) & theColor.mesh);
......@@ -612,11 +571,34 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
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]);
......@@ -635,6 +617,8 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
}
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);
......@@ -642,6 +626,27 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
}
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);
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment