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
No related branches found
No related tags found
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 // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
// //
...@@ -268,6 +268,9 @@ void Draw_Mesh_Points(void *a, void *b) ...@@ -268,6 +268,9 @@ void Draw_Mesh_Points(void *a, void *b)
glPushName(v->Num); glPushName(v->Num);
} }
if(v->Degree == 2)
glColor4ubv((GLubyte *) & CTX.color.mesh.vertex_deg2);
else
glColor4ubv((GLubyte *) & CTX.color.mesh.vertex); glColor4ubv((GLubyte *) & CTX.color.mesh.vertex);
if(CTX.mesh.points) { if(CTX.mesh.points) {
...@@ -295,14 +298,27 @@ void Draw_Mesh_Points(void *a, void *b) ...@@ -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) void Draw_Simplex_Volume(void *a, void *b)
{ {
Simplex *s; Simplex *s;
char Num[100]; char Num[100];
int fulldraw = 0; 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; s = *(Simplex **) a;
...@@ -365,37 +381,52 @@ void Draw_Simplex_Volume(void *a, void *b) ...@@ -365,37 +381,52 @@ void Draw_Simplex_Volume(void *a, void *b)
else else
glColor4ubv((GLubyte *) & CTX.color.mesh.line); glColor4ubv((GLubyte *) & CTX.color.mesh.line);
// this is killing us!!!
for(int i = 0; i < 4; i++) { for(int i = 0; i < 4; i++) {
X[i] = Xc + CTX.mesh.explode * (s->V[i]->Pos.X - Xc); X[i] = Xc + CTX.mesh.explode * (s->V[i]->Pos.X - Xc);
Y[i] = Yc + CTX.mesh.explode * (s->V[i]->Pos.Y - Yc); Y[i] = Yc + CTX.mesh.explode * (s->V[i]->Pos.Y - Yc);
Z[i] = Zc + CTX.mesh.explode * (s->V[i]->Pos.Z - Zc); 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(CTX.mesh.volumes) {
if(!s->VSUP){
glBegin(GL_LINES); glBegin(GL_LINES);
glVertex3d(X[1], Y[1], Z[1]); glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[0], Y[0], Z[0]); 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[1], Y[1], Z[1]); glVertex3d(X2[1], Y2[1], Z2[1]);
glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X2[1], Y2[1], Z2[1]); glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[2], Y[2], Z[2]); glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X2[2], Y2[2], Z2[2]); glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X2[3], Y2[3], Z2[3]);
glVertex3d(X[1], Y[1], Z[1]); glVertex3d(X2[3], Y2[3], Z2[3]); glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X2[4], Y2[4], Z2[4]);
glVertex3d(X[2], Y[2], Z[2]); glVertex3d(X2[4], Y2[4], Z2[4]); glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[1], Y[1], Z[1]); glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X2[5], Y2[5], Z2[5]);
glVertex3d(X[2], Y[2], Z[2]); glVertex3d(X2[5], Y2[5], Z2[5]); glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[3], Y[3], Z[3]);
glEnd(); glEnd();
} }
}
if(CTX.mesh.volumes_num) { if(CTX.mesh.volumes_num) {
sprintf(Num, "%d", s->Num); sprintf(Num, "%d", s->Num);
...@@ -429,8 +460,6 @@ void Draw_Simplex_Volume(void *a, void *b) ...@@ -429,8 +460,6 @@ void Draw_Simplex_Volume(void *a, void *b)
if(!fulldraw) if(!fulldraw)
return; return;
double n[4], x1x0, y1y0, z1z0, x2x0, y2y0, z2z0;
if(theColor.type) if(theColor.type)
glColor4ubv((GLubyte *) & theColor.mesh); glColor4ubv((GLubyte *) & theColor.mesh);
else if(CTX.mesh.color_carousel == 1) else if(CTX.mesh.color_carousel == 1)
...@@ -443,85 +472,27 @@ void Draw_Simplex_Volume(void *a, void *b) ...@@ -443,85 +472,27 @@ void Draw_Simplex_Volume(void *a, void *b)
glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron); glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron);
if(CTX.mesh.solid) { if(CTX.mesh.solid) {
double n[3];
// FIXME: should subdivide if s->VSUP
if(CTX.mesh.light) glEnable(GL_LIGHTING); 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); 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[0], Y[0], Z[0]);
glVertex3d(X[2], Y[2], Z[2]); glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[1], Y[1], Z[1]); glVertex3d(X[1], Y[1], Z[1]);
glEnd(); if(CTX.mesh.light) glNormal3verts(s->V[0], s->V[1], s->V[3], n);
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);
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[3], Y[3], Z[3]); glVertex3d(X[3], Y[3], Z[3]);
glEnd(); if(CTX.mesh.light) glNormal3verts(s->V[0], s->V[3], s->V[2], n);
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);
glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[2], Y[2], Z[2]); glVertex3d(X[2], Y[2], Z[2]);
glEnd(); if(CTX.mesh.light) glNormal3verts(s->V[3], s->V[1], s->V[2], n);
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);
glVertex3d(X[3], Y[3], Z[3]); glVertex3d(X[3], Y[3], Z[3]);
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]);
glEnd(); glEnd();
glDisable(GL_LIGHTING); glDisable(GL_LIGHTING);
} }
} }
...@@ -529,27 +500,15 @@ void Draw_Simplex_Volume(void *a, void *b) ...@@ -529,27 +500,15 @@ void Draw_Simplex_Volume(void *a, void *b)
void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY, void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
double *pZ, double n[3]) double *pZ, double n[3])
{ {
double x1x0, y1y0, z1z0, x2x0, y2y0, z2z0;
int i, K, L; int i, K, L;
L = (s->VSUP) ? 1 : 0; L = (s->VSUP) ? 1 : 0;
K = (s->V[3]) ? 4 : 3; K = (s->V[3]) ? 4 : 3;
if(CTX.mesh.normals || CTX.mesh.light) { if(CTX.mesh.normals || CTX.mesh.light)
x1x0 = s->V[1]->Pos.X - s->V[0]->Pos.X; glNormal3verts(s->V[0], s->V[1], s->V[2], n);
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.surfaces && CTX.mesh.lines) { if(CTX.mesh.surfaces && CTX.mesh.lines) {
if(!CTX.mesh.solid) { if(!CTX.mesh.solid) {
if(theColor.type) if(theColor.type)
glColor4ubv((GLubyte *) & theColor.mesh); glColor4ubv((GLubyte *) & theColor.mesh);
...@@ -612,11 +571,34 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY, ...@@ -612,11 +571,34 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
if(pX && pY && pZ) { // using precomputed vertices if(pX && pY && pZ) { // using precomputed vertices
if(L) { if(L) {
if(K == 4){
// FIXME: should subdivide...
glBegin(GL_POLYGON); glBegin(GL_POLYGON);
for(i = 0; i < K * (1 + L); i++) for(i = 0; i < K * (1 + L); i++)
glVertex3d(pX[i], pY[i], pZ[i]); glVertex3d(pX[i], pY[i], pZ[i]);
glEnd(); 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) { else if(K == 4) {
glBegin(GL_QUADS); glBegin(GL_QUADS);
glVertex3d(pX[0], pY[0], pZ[0]); glVertex3d(pX[0], pY[0], pZ[0]);
...@@ -635,6 +617,8 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY, ...@@ -635,6 +617,8 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
} }
else { // using the element's unmodified coordinates else { // using the element's unmodified coordinates
if(L) { if(L) {
if(K == 4) {
// FIXME: should subdivide...
glBegin(GL_POLYGON); glBegin(GL_POLYGON);
for(i = 0; i < K; i++) { for(i = 0; i < K; i++) {
glVertex3d(s->V[i]->Pos.X, s->V[i]->Pos.Y, s->V[i]->Pos.Z); 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, ...@@ -642,6 +626,27 @@ void Draw_Simplex_Surface_Common(Simplex * s, double *pX, double *pY,
} }
glEnd(); 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) { else if(K == 4) {
glBegin(GL_QUADS); glBegin(GL_QUADS);
glVertex3d(s->V[0]->Pos.X, s->V[0]->Pos.Y, s->V[0]->Pos.Z); 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