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

added drawing code for faces of haxahedra, prisms and pyramids
parent 1c2024b7
No related branches found
No related tags found
No related merge requests found
// $Id: Mesh.cpp,v 1.74 2004-04-20 21:47:36 geuzaine Exp $ // $Id: Mesh.cpp,v 1.75 2004-04-20 22:36:39 geuzaine Exp $
// //
// Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle
// //
...@@ -304,74 +304,43 @@ void Draw_Mesh_Points(void *a, void *b) ...@@ -304,74 +304,43 @@ void Draw_Mesh_Points(void *a, void *b)
} }
} }
void glNormal3verts(Vertex *v0, Vertex *v1, Vertex *v2, double n[3]) void Draw_Simplex_Curves(void *a, void *b)
{
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; Simplex *s;
double Xc = 0.0, Yc = 0.0, Zc = 0.0, m[3];
char Num[100]; char Num[100];
double tmp, X[4], Y[4], Z[4], X2[6], Y2[6], Z2[6];
s = *(Simplex **) a; s = *(Simplex **) a;
if(!s->V[3] || !(s->Visible & VIS_MESH)) if(!(s->Visible & VIS_MESH))
return; return;
MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, s->iPart); MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, s->iPart);
if(part && !(*part)->Visible) if(part && !(*part)->Visible)
return; return;
// FIXME: move this in Draw_Mesh_Volumes as soon as a coherent Xc = 0.5 * (s->V[0]->Pos.X + s->V[1]->Pos.X);
// structure exists for volumes Yc = 0.5 * (s->V[0]->Pos.Y + s->V[1]->Pos.Y);
Volume *v = FindVolume(s->iEnt, THEM); Zc = 0.5 * (s->V[0]->Pos.Z + s->V[1]->Pos.Z);
if(v){
if(!(v->Visible & VIS_MESH))
return;
theColor = v->Color;
}
if(CTX.mesh.color_carousel == 2)
thePhysical = getFirstPhysical(MSH_PHYSICAL_VOLUME, s->iEnt);
if(CTX.mesh.gamma_sup) { double X[3], Y[3], Z[3];
tmp = s->GammaShapeMeasure(); int N = s->VSUP ? 3 : 2;
if(tmp < CTX.mesh.gamma_inf || tmp > CTX.mesh.gamma_sup)
return;
}
if(CTX.mesh.radius_sup) { for(int i = 0; i < 2; i++) {
if(s->Radius < CTX.mesh.radius_inf || s->Radius > CTX.mesh.radius_sup) X[i] = Xc + CTX.mesh.explode * (s->V[i]->Pos.X - Xc);
return; Y[i] = Yc + CTX.mesh.explode * (s->V[i]->Pos.Y - Yc);
Z[i] = Zc + CTX.mesh.explode * (s->V[i]->Pos.Z - Zc);
} }
double Xc = .25 * (s->V[0]->Pos.X + s->V[1]->Pos.X + if(N == 3){
s->V[2]->Pos.X + s->V[3]->Pos.X); X[2] = X[1];
double Yc = .25 * (s->V[0]->Pos.Y + s->V[1]->Pos.Y + Y[2] = Y[1];
s->V[2]->Pos.Y + s->V[3]->Pos.Y); Z[2] = Z[1];
double Zc = .25 * (s->V[0]->Pos.Z + s->V[1]->Pos.Z + X[1] = Xc + CTX.mesh.explode * (s->VSUP[0]->Pos.X - Xc);
s->V[2]->Pos.Z + s->V[3]->Pos.Z); Y[1] = Yc + CTX.mesh.explode * (s->VSUP[0]->Pos.Y - Yc);
Z[1] = Zc + CTX.mesh.explode * (s->VSUP[0]->Pos.Z - Zc);
if(CTX.mesh.use_cut_plane) {
if(CTX.mesh.evalCutPlane(Xc, Yc, Zc) < 0)
return;
} }
if(CTX.mesh.surfaces_faces || CTX.mesh.volumes_faces){
glColor4ubv((GLubyte *) & CTX.color.mesh.line);
}
else{
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)
...@@ -381,195 +350,53 @@ void Draw_Simplex_Volume(void *a, void *b) ...@@ -381,195 +350,53 @@ void Draw_Simplex_Volume(void *a, void *b)
else if(CTX.mesh.color_carousel == 3) else if(CTX.mesh.color_carousel == 3)
ColorSwitch(s->iPart); ColorSwitch(s->iPart);
else else
glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron); glColor4ubv((GLubyte *) & CTX.color.mesh.line);
}
for(int i = 0; i < 4; i++) { if(CTX.mesh.lines) {
X[i] = Xc + CTX.mesh.explode * (s->V[i]->Pos.X - Xc); glBegin(GL_LINE_STRIP);
Y[i] = Yc + CTX.mesh.explode * (s->V[i]->Pos.Y - Yc); for(int i = 0; i < N; i++){
Z[i] = Zc + CTX.mesh.explode * (s->V[i]->Pos.Z - Zc); glVertex3d(X[i], Y[i], Z[i]);
}
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_edges) {
if(!s->VSUP){
glBegin(GL_LINES);
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(); 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[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[2], Y[2], Z[2]); glVertex3d(X2[2], Y2[2], Z2[2]); if(CTX.mesh.lines_num) {
glVertex3d(X2[2], Y2[2], Z2[2]); glVertex3d(X[0], Y[0], Z[0]);
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(X2[4], Y2[4], Z2[4]);
glVertex3d(X2[4], Y2[4], Z2[4]); glVertex3d(X[2], Y[2], Z[2]);
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); sprintf(Num, "%d", s->Num);
glRasterPos3d(Xc, Yc, Zc); double offset = 0.5 * (CTX.mesh.line_width + CTX.gl_fontsize) * CTX.pixel_equiv_x;
glRasterPos3d(Xc + offset / CTX.s[0],
Yc + offset / CTX.s[1],
Zc + offset / CTX.s[2]);
Draw_String(Num); Draw_String(Num);
} }
if(CTX.mesh.dual) { if(CTX.mesh.tangents) {
glColor4ubv((GLubyte *) & CTX.color.fg); glColor4ubv((GLubyte *) & CTX.color.mesh.tangents);
glEnable(GL_LINE_STIPPLE); m[0] = X[1] - X[0];
glLineStipple(1, 0x0F0F); m[1] = Y[1] - Y[0];
gl2psEnable(GL2PS_LINE_STIPPLE); m[2] = Z[1] - Z[0];
glBegin(GL_LINES); norme(m);
glVertex3d(Xc, Yc, Zc); m[0] *= CTX.mesh.tangents * CTX.pixel_equiv_x / CTX.s[0];
glVertex3d((X[0] + X[1] + X[2]) / 3., (Y[0] + Y[1] + Y[2]) / 3., m[1] *= CTX.mesh.tangents * CTX.pixel_equiv_x / CTX.s[1];
(Z[0] + Z[1] + Z[2]) / 3.); m[2] *= CTX.mesh.tangents * CTX.pixel_equiv_x / CTX.s[2];
glVertex3d(Xc, Yc, Zc); Draw_Vector(CTX.vector_type, 0, CTX.arrow_rel_head_radius,
glVertex3d((X[0] + X[1] + X[3]) / 3., (Y[0] + Y[1] + Y[3]) / 3., CTX.arrow_rel_stem_length, CTX.arrow_rel_stem_radius,
(Z[0] + Z[1] + Z[3]) / 3.); Xc, Yc, Zc, m[0], m[1], m[2], NULL, CTX.mesh.light);
glVertex3d(Xc, Yc, Zc);
glVertex3d((X[0] + X[2] + X[3]) / 3., (Y[0] + Y[2] + Y[3]) / 3.,
(Z[0] + Z[2] + Z[3]) / 3.);
glVertex3d(Xc, Yc, Zc);
glVertex3d((X[1] + X[2] + X[3]) / 3., (Y[1] + Y[2] + Y[3]) / 3.,
(Z[1] + Z[2] + Z[3]) / 3.);
glEnd();
glDisable(GL_LINE_STIPPLE);
gl2psDisable(GL2PS_LINE_STIPPLE);
}
if(CTX.mesh.volumes_faces){
if(theColor.type)
glColor4ubv((GLubyte *) & theColor.mesh);
else if(CTX.mesh.color_carousel == 1)
ColorSwitch(s->iEnt);
else if(CTX.mesh.color_carousel == 2)
ColorSwitch(thePhysical);
else if(CTX.mesh.color_carousel == 3)
ColorSwitch(s->iPart);
else
glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron);
double n[3];
if(CTX.mesh.light) glEnable(GL_LIGHTING);
glEnable(GL_POLYGON_OFFSET_FILL);
if(!s->VSUP){
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]);
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]);
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]);
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();
}
else{
glBegin(GL_TRIANGLES);
// face 1
if(CTX.mesh.light) glNormal3verts(s->V[0], s->VSUP[2], s->VSUP[0], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X2[0], Y2[0], Z2[0]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[0], s->VSUP[1], s->V[1], n);
glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X2[1], Y2[1], Z2[1]);
glVertex3d(X[1], Y[1], Z[1]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[2], s->V[2], s->VSUP[1], n);
glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X2[1], Y2[1], Z2[1]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[0], s->VSUP[2], s->VSUP[1], n);
glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X2[1], Y2[1], Z2[1]);
// face 2
if(CTX.mesh.light) glNormal3verts(s->V[0], s->VSUP[0], s->VSUP[3], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X2[3], Y2[3], Z2[3]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[0], s->V[1], s->VSUP[5], n);
glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X2[5], Y2[5], Z2[5]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[3], s->VSUP[5], s->V[3], n);
glVertex3d(X2[3], Y2[3], Z2[3]);
glVertex3d(X2[5], Y2[5], Z2[5]);
glVertex3d(X[3], Y[3], Z[3]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[0], s->VSUP[5], s->VSUP[3], n);
glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X2[5], Y2[5], Z2[5]);
glVertex3d(X2[3], Y2[3], Z2[3]);
// face 3
if(CTX.mesh.light) glNormal3verts(s->V[0], s->VSUP[3], s->VSUP[2], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X2[3], Y2[3], Z2[3]);
glVertex3d(X2[2], Y2[2], Z2[2]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[3], s->V[3], s->VSUP[4], n);
glVertex3d(X2[3], Y2[3], Z2[3]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X2[4], Y2[4], Z2[4]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[2], s->VSUP[4], s->V[2], n);
glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X2[4], Y2[4], Z2[4]);
glVertex3d(X[2], Y[2], Z[2]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[2], s->VSUP[3], s->VSUP[4], n);
glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X2[3], Y2[3], Z2[3]);
glVertex3d(X2[4], Y2[4], Z2[4]);
// face 4
if(CTX.mesh.light) glNormal3verts(s->V[3], s->VSUP[5], s->VSUP[4], n);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X2[5], Y2[5], Z2[5]);
glVertex3d(X2[4], Y2[4], Z2[4]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[5], s->V[1], s->VSUP[1], n);
glVertex3d(X2[5], Y2[5], Z2[5]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X2[1], Y2[1], Z2[1]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[4], s->VSUP[1], s->V[2], n);
glVertex3d(X2[4], Y2[4], Z2[4]);
glVertex3d(X2[1], Y2[1], Z2[1]);
glVertex3d(X[2], Y[2], Z[2]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[1], s->VSUP[4], s->VSUP[5], n);
glVertex3d(X2[1], Y2[1], Z2[1]);
glVertex3d(X2[4], Y2[4], Z2[4]);
glVertex3d(X2[5], Y2[5], Z2[5]);
glEnd();
} }
glDisable(GL_POLYGON_OFFSET_FILL);
glDisable(GL_LIGHTING);
} }
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_Surface_Common(Simplex * s, int L, int K, void Draw_Simplex_Surface_Common(Simplex * s, int L, int K,
...@@ -810,44 +637,148 @@ void Draw_Simplex_Surface(void *a, void *b) ...@@ -810,44 +637,148 @@ void Draw_Simplex_Surface(void *a, void *b)
} }
} }
void Draw_Simplex_Volume(void *a, void *b)
void Draw_Simplex_Curves(void *a, void *b)
{ {
Simplex *s; Simplex *s;
double Xc = 0.0, Yc = 0.0, Zc = 0.0, m[3];
char Num[100]; char Num[100];
double tmp, X[4], Y[4], Z[4], X2[6], Y2[6], Z2[6];
s = *(Simplex **) a; s = *(Simplex **) a;
if(!(s->Visible & VIS_MESH)) if(!s->V[3] || !(s->Visible & VIS_MESH))
return; return;
MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, s->iPart); MeshPartition **part = (MeshPartition**)List_Pointer_Test(THEM->Partitions, s->iPart);
if(part && !(*part)->Visible) if(part && !(*part)->Visible)
return; return;
Xc = 0.5 * (s->V[0]->Pos.X + s->V[1]->Pos.X); // FIXME: move this in Draw_Mesh_Volumes as soon as a coherent
Yc = 0.5 * (s->V[0]->Pos.Y + s->V[1]->Pos.Y); // structure exists for volumes
Zc = 0.5 * (s->V[0]->Pos.Z + s->V[1]->Pos.Z); Volume *v = FindVolume(s->iEnt, THEM);
if(v){
if(!(v->Visible & VIS_MESH))
return;
theColor = v->Color;
}
if(CTX.mesh.color_carousel == 2)
thePhysical = getFirstPhysical(MSH_PHYSICAL_VOLUME, s->iEnt);
double X[3], Y[3], Z[3]; if(CTX.mesh.gamma_sup) {
int N = s->VSUP ? 3 : 2; tmp = s->GammaShapeMeasure();
if(tmp < CTX.mesh.gamma_inf || tmp > CTX.mesh.gamma_sup)
return;
}
for(int i = 0; i < 2; i++) { if(CTX.mesh.radius_sup) {
if(s->Radius < CTX.mesh.radius_inf || s->Radius > CTX.mesh.radius_sup)
return;
}
double Xc = .25 * (s->V[0]->Pos.X + s->V[1]->Pos.X +
s->V[2]->Pos.X + s->V[3]->Pos.X);
double Yc = .25 * (s->V[0]->Pos.Y + s->V[1]->Pos.Y +
s->V[2]->Pos.Y + s->V[3]->Pos.Y);
double Zc = .25 * (s->V[0]->Pos.Z + s->V[1]->Pos.Z +
s->V[2]->Pos.Z + s->V[3]->Pos.Z);
if(CTX.mesh.use_cut_plane) {
if(CTX.mesh.evalCutPlane(Xc, Yc, Zc) < 0)
return;
}
if(CTX.mesh.surfaces_faces || CTX.mesh.volumes_faces){
glColor4ubv((GLubyte *) & CTX.color.mesh.line);
}
else{
if(theColor.type)
glColor4ubv((GLubyte *) & theColor.mesh);
else if(CTX.mesh.color_carousel == 1)
ColorSwitch(s->iEnt);
else if(CTX.mesh.color_carousel == 2)
ColorSwitch(thePhysical);
else if(CTX.mesh.color_carousel == 3)
ColorSwitch(s->iPart);
else
glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron);
}
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(N == 3){ if(CTX.mesh.volumes_edges) {
X[2] = X[1]; if(!s->VSUP){
Y[2] = Y[1]; glBegin(GL_LINES);
Z[2] = Z[1]; glVertex3d(X[0], Y[0], Z[0]); glVertex3d(X[1], Y[1], Z[1]);
X[1] = Xc + CTX.mesh.explode * (s->VSUP[0]->Pos.X - Xc); glVertex3d(X[1], Y[1], Z[1]); glVertex3d(X[2], Y[2], Z[2]);
Y[1] = Yc + CTX.mesh.explode * (s->VSUP[0]->Pos.Y - Yc); glVertex3d(X[2], Y[2], Z[2]); glVertex3d(X[0], Y[0], Z[0]);
Z[1] = Zc + CTX.mesh.explode * (s->VSUP[0]->Pos.Z - Zc); 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[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[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(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(X2[4], Y2[4], Z2[4]);
glVertex3d(X2[4], Y2[4], Z2[4]); glVertex3d(X[2], Y[2], Z[2]);
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);
glRasterPos3d(Xc, Yc, Zc);
Draw_String(Num);
}
if(CTX.mesh.dual) {
glColor4ubv((GLubyte *) & CTX.color.fg);
glEnable(GL_LINE_STIPPLE);
glLineStipple(1, 0x0F0F);
gl2psEnable(GL2PS_LINE_STIPPLE);
glBegin(GL_LINES);
glVertex3d(Xc, Yc, Zc);
glVertex3d((X[0] + X[1] + X[2]) / 3., (Y[0] + Y[1] + Y[2]) / 3.,
(Z[0] + Z[1] + Z[2]) / 3.);
glVertex3d(Xc, Yc, Zc);
glVertex3d((X[0] + X[1] + X[3]) / 3., (Y[0] + Y[1] + Y[3]) / 3.,
(Z[0] + Z[1] + Z[3]) / 3.);
glVertex3d(Xc, Yc, Zc);
glVertex3d((X[0] + X[2] + X[3]) / 3., (Y[0] + Y[2] + Y[3]) / 3.,
(Z[0] + Z[2] + Z[3]) / 3.);
glVertex3d(Xc, Yc, Zc);
glVertex3d((X[1] + X[2] + X[3]) / 3., (Y[1] + Y[2] + Y[3]) / 3.,
(Z[1] + Z[2] + Z[3]) / 3.);
glEnd();
glDisable(GL_LINE_STIPPLE);
gl2psDisable(GL2PS_LINE_STIPPLE);
} }
if(CTX.mesh.volumes_faces){
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)
...@@ -857,37 +788,105 @@ void Draw_Simplex_Curves(void *a, void *b) ...@@ -857,37 +788,105 @@ void Draw_Simplex_Curves(void *a, void *b)
else if(CTX.mesh.color_carousel == 3) else if(CTX.mesh.color_carousel == 3)
ColorSwitch(s->iPart); ColorSwitch(s->iPart);
else else
glColor4ubv((GLubyte *) & CTX.color.mesh.line); glColor4ubv((GLubyte *) & CTX.color.mesh.tetrahedron);
if(CTX.mesh.lines) { double n[3];
glBegin(GL_LINE_STRIP); if(CTX.mesh.light) glEnable(GL_LIGHTING);
for(int i = 0; i < N; i++){ glEnable(GL_POLYGON_OFFSET_FILL);
glVertex3d(X[i], Y[i], Z[i]); if(!s->VSUP){
} 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]);
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]);
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]);
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(); glEnd();
} }
else{
if(CTX.mesh.lines_num) { glBegin(GL_TRIANGLES);
sprintf(Num, "%d", s->Num); // face 1
double offset = 0.5 * (CTX.mesh.line_width + CTX.gl_fontsize) * CTX.pixel_equiv_x; if(CTX.mesh.light) glNormal3verts(s->V[0], s->VSUP[2], s->VSUP[0], n);
glRasterPos3d(Xc + offset / CTX.s[0], glVertex3d(X[0], Y[0], Z[0]);
Yc + offset / CTX.s[1], glVertex3d(X2[2], Y2[2], Z2[2]);
Zc + offset / CTX.s[2]); glVertex3d(X2[0], Y2[0], Z2[0]);
Draw_String(Num); if(CTX.mesh.light) glNormal3verts(s->VSUP[0], s->VSUP[1], s->V[1], n);
glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X2[1], Y2[1], Z2[1]);
glVertex3d(X[1], Y[1], Z[1]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[2], s->V[2], s->VSUP[1], n);
glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X2[1], Y2[1], Z2[1]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[0], s->VSUP[2], s->VSUP[1], n);
glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X2[1], Y2[1], Z2[1]);
// face 2
if(CTX.mesh.light) glNormal3verts(s->V[0], s->VSUP[0], s->VSUP[3], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X2[3], Y2[3], Z2[3]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[0], s->V[1], s->VSUP[5], n);
glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X2[5], Y2[5], Z2[5]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[3], s->VSUP[5], s->V[3], n);
glVertex3d(X2[3], Y2[3], Z2[3]);
glVertex3d(X2[5], Y2[5], Z2[5]);
glVertex3d(X[3], Y[3], Z[3]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[0], s->VSUP[5], s->VSUP[3], n);
glVertex3d(X2[0], Y2[0], Z2[0]);
glVertex3d(X2[5], Y2[5], Z2[5]);
glVertex3d(X2[3], Y2[3], Z2[3]);
// face 3
if(CTX.mesh.light) glNormal3verts(s->V[0], s->VSUP[3], s->VSUP[2], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X2[3], Y2[3], Z2[3]);
glVertex3d(X2[2], Y2[2], Z2[2]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[3], s->V[3], s->VSUP[4], n);
glVertex3d(X2[3], Y2[3], Z2[3]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X2[4], Y2[4], Z2[4]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[2], s->VSUP[4], s->V[2], n);
glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X2[4], Y2[4], Z2[4]);
glVertex3d(X[2], Y[2], Z[2]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[2], s->VSUP[3], s->VSUP[4], n);
glVertex3d(X2[2], Y2[2], Z2[2]);
glVertex3d(X2[3], Y2[3], Z2[3]);
glVertex3d(X2[4], Y2[4], Z2[4]);
// face 4
if(CTX.mesh.light) glNormal3verts(s->V[3], s->VSUP[5], s->VSUP[4], n);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X2[5], Y2[5], Z2[5]);
glVertex3d(X2[4], Y2[4], Z2[4]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[5], s->V[1], s->VSUP[1], n);
glVertex3d(X2[5], Y2[5], Z2[5]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X2[1], Y2[1], Z2[1]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[4], s->VSUP[1], s->V[2], n);
glVertex3d(X2[4], Y2[4], Z2[4]);
glVertex3d(X2[1], Y2[1], Z2[1]);
glVertex3d(X[2], Y[2], Z[2]);
if(CTX.mesh.light) glNormal3verts(s->VSUP[1], s->VSUP[4], s->VSUP[5], n);
glVertex3d(X2[1], Y2[1], Z2[1]);
glVertex3d(X2[4], Y2[4], Z2[4]);
glVertex3d(X2[5], Y2[5], Z2[5]);
glEnd();
} }
glDisable(GL_POLYGON_OFFSET_FILL);
if(CTX.mesh.tangents) { glDisable(GL_LIGHTING);
glColor4ubv((GLubyte *) & CTX.color.mesh.tangents);
m[0] = X[1] - X[0];
m[1] = Y[1] - Y[0];
m[2] = Z[1] - Z[0];
norme(m);
m[0] *= CTX.mesh.tangents * CTX.pixel_equiv_x / CTX.s[0];
m[1] *= CTX.mesh.tangents * CTX.pixel_equiv_x / CTX.s[1];
m[2] *= CTX.mesh.tangents * CTX.pixel_equiv_x / CTX.s[2];
Draw_Vector(CTX.vector_type, 0, CTX.arrow_rel_head_radius,
CTX.arrow_rel_stem_length, CTX.arrow_rel_stem_radius,
Xc, Yc, Zc, m[0], m[1], m[2], NULL, CTX.mesh.light);
} }
} }
...@@ -954,8 +953,7 @@ void Draw_Hexahedron_Volume(void *a, void *b) ...@@ -954,8 +953,7 @@ void Draw_Hexahedron_Volume(void *a, void *b)
Z[i] = Zc + CTX.mesh.explode * (h->V[i]->Pos.Z - Zc); Z[i] = Zc + CTX.mesh.explode * (h->V[i]->Pos.Z - Zc);
} }
// FIXME: change this when we add the face drawing code if(CTX.mesh.volumes_edges){
if(CTX.mesh.volumes_edges || CTX.mesh.volumes_faces){
glBegin(GL_LINE_LOOP); glBegin(GL_LINE_LOOP);
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]);
...@@ -994,56 +992,90 @@ void Draw_Hexahedron_Volume(void *a, void *b) ...@@ -994,56 +992,90 @@ void Draw_Hexahedron_Volume(void *a, void *b)
glBegin(GL_LINES); glBegin(GL_LINES);
glVertex3d(Xc, Yc, Zc); glVertex3d(Xc, Yc, Zc);
glVertex3d glVertex3d
((h->V[0]->Pos.X + h->V[1]->Pos.X + h->V[5]->Pos.X + ((h->V[0]->Pos.X + h->V[1]->Pos.X + h->V[5]->Pos.X + h->V[4]->Pos.X) / 4.,
h->V[4]->Pos.X) / 4., (h->V[0]->Pos.Y + h->V[1]->Pos.Y + h->V[5]->Pos.Y + h->V[4]->Pos.Y) / 4.,
(h->V[0]->Pos.Y + h->V[1]->Pos.Y + h->V[5]->Pos.Y + (h->V[0]->Pos.Z + h->V[1]->Pos.Z + h->V[5]->Pos.Z + h->V[4]->Pos.Z) / 4.);
h->V[4]->Pos.Y) / 4.,
(h->V[0]->Pos.Z + h->V[1]->Pos.Z + h->V[5]->Pos.Z +
h->V[4]->Pos.Z) / 4.);
glVertex3d(Xc, Yc, Zc); glVertex3d(Xc, Yc, Zc);
glVertex3d glVertex3d
((h->V[0]->Pos.X + h->V[3]->Pos.X + h->V[2]->Pos.X + ((h->V[0]->Pos.X + h->V[3]->Pos.X + h->V[2]->Pos.X + h->V[1]->Pos.X) / 4.,
h->V[1]->Pos.X) / 4., (h->V[0]->Pos.Y + h->V[3]->Pos.Y + h->V[2]->Pos.Y + h->V[1]->Pos.Y) / 4.,
(h->V[0]->Pos.Y + h->V[3]->Pos.Y + h->V[2]->Pos.Y + (h->V[0]->Pos.Z + h->V[3]->Pos.Z + h->V[2]->Pos.Z + h->V[1]->Pos.Z) / 4.);
h->V[1]->Pos.Y) / 4.,
(h->V[0]->Pos.Z + h->V[3]->Pos.Z + h->V[2]->Pos.Z +
h->V[1]->Pos.Z) / 4.);
glVertex3d(Xc, Yc, Zc); glVertex3d(Xc, Yc, Zc);
glVertex3d glVertex3d
((h->V[0]->Pos.X + h->V[4]->Pos.X + h->V[7]->Pos.X + ((h->V[0]->Pos.X + h->V[4]->Pos.X + h->V[7]->Pos.X + h->V[3]->Pos.X) / 4.,
h->V[3]->Pos.X) / 4., (h->V[0]->Pos.Y + h->V[4]->Pos.Y + h->V[7]->Pos.Y + h->V[3]->Pos.Y) / 4.,
(h->V[0]->Pos.Y + h->V[4]->Pos.Y + h->V[7]->Pos.Y + (h->V[0]->Pos.Z + h->V[4]->Pos.Z + h->V[7]->Pos.Z + h->V[3]->Pos.Z) / 4.);
h->V[3]->Pos.Y) / 4.,
(h->V[0]->Pos.Z + h->V[4]->Pos.Z + h->V[7]->Pos.Z +
h->V[3]->Pos.Z) / 4.);
glVertex3d(Xc, Yc, Zc); glVertex3d(Xc, Yc, Zc);
glVertex3d glVertex3d
((h->V[1]->Pos.X + h->V[2]->Pos.X + h->V[6]->Pos.X + ((h->V[1]->Pos.X + h->V[2]->Pos.X + h->V[6]->Pos.X + h->V[5]->Pos.X) / 4.,
h->V[5]->Pos.X) / 4., (h->V[1]->Pos.Y + h->V[2]->Pos.Y + h->V[6]->Pos.Y + h->V[5]->Pos.Y) / 4.,
(h->V[1]->Pos.Y + h->V[2]->Pos.Y + h->V[6]->Pos.Y + (h->V[1]->Pos.Z + h->V[2]->Pos.Z + h->V[6]->Pos.Z + h->V[5]->Pos.Z) / 4.);
h->V[5]->Pos.Y) / 4.,
(h->V[1]->Pos.Z + h->V[2]->Pos.Z + h->V[6]->Pos.Z +
h->V[5]->Pos.Z) / 4.);
glVertex3d(Xc, Yc, Zc); glVertex3d(Xc, Yc, Zc);
glVertex3d glVertex3d
((h->V[2]->Pos.X + h->V[3]->Pos.X + h->V[7]->Pos.X + ((h->V[2]->Pos.X + h->V[3]->Pos.X + h->V[7]->Pos.X + h->V[6]->Pos.X) / 4.,
h->V[6]->Pos.X) / 4., (h->V[2]->Pos.Y + h->V[3]->Pos.Y + h->V[7]->Pos.Y + h->V[6]->Pos.Y) / 4.,
(h->V[2]->Pos.Y + h->V[3]->Pos.Y + h->V[7]->Pos.Y + (h->V[2]->Pos.Z + h->V[3]->Pos.Z + h->V[7]->Pos.Z + h->V[6]->Pos.Z) / 4.);
h->V[6]->Pos.Y) / 4.,
(h->V[2]->Pos.Z + h->V[3]->Pos.Z + h->V[7]->Pos.Z +
h->V[6]->Pos.Z) / 4.);
glVertex3d(Xc, Yc, Zc); glVertex3d(Xc, Yc, Zc);
glVertex3d glVertex3d
((h->V[4]->Pos.X + h->V[5]->Pos.X + h->V[6]->Pos.X + ((h->V[4]->Pos.X + h->V[5]->Pos.X + h->V[6]->Pos.X + h->V[7]->Pos.X) / 4.,
h->V[7]->Pos.X) / 4., (h->V[4]->Pos.Y + h->V[5]->Pos.Y + h->V[6]->Pos.Y + h->V[7]->Pos.Y) / 4.,
(h->V[4]->Pos.Y + h->V[5]->Pos.Y + h->V[6]->Pos.Y + (h->V[4]->Pos.Z + h->V[5]->Pos.Z + h->V[6]->Pos.Z + h->V[7]->Pos.Z) / 4.);
h->V[7]->Pos.Y) / 4.,
(h->V[4]->Pos.Z + h->V[5]->Pos.Z + h->V[6]->Pos.Z +
h->V[7]->Pos.Z) / 4.);
glEnd(); glEnd();
glDisable(GL_LINE_STIPPLE); glDisable(GL_LINE_STIPPLE);
gl2psDisable(GL2PS_LINE_STIPPLE); gl2psDisable(GL2PS_LINE_STIPPLE);
} }
if(CTX.mesh.volumes_faces){
if(theColor.type)
glColor4ubv((GLubyte *) & theColor.mesh);
else if(CTX.mesh.color_carousel == 1)
ColorSwitch(h->iEnt);
else if(CTX.mesh.color_carousel == 2)
ColorSwitch(thePhysical);
else if(CTX.mesh.color_carousel == 3)
ColorSwitch(h->iPart);
else
glColor4ubv((GLubyte *) & CTX.color.mesh.hexahedron);
double n[3];
if(CTX.mesh.light) glEnable(GL_LIGHTING);
glEnable(GL_POLYGON_OFFSET_FILL);
glBegin(GL_QUADS);
if(CTX.mesh.light) glNormal3verts(h->V[0], h->V[2], h->V[1], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[1], Y[1], Z[1]);
if(CTX.mesh.light) glNormal3verts(h->V[4], h->V[5], h->V[6], n);
glVertex3d(X[4], Y[4], Z[4]);
glVertex3d(X[5], Y[5], Z[5]);
glVertex3d(X[6], Y[6], Z[6]);
glVertex3d(X[7], Y[7], Z[7]);
if(CTX.mesh.light) glNormal3verts(h->V[0], h->V[1], h->V[5], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[5], Y[5], Z[5]);
glVertex3d(X[4], Y[4], Z[4]);
if(CTX.mesh.light) glNormal3verts(h->V[1], h->V[2], h->V[6], n);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[6], Y[6], Z[6]);
glVertex3d(X[5], Y[5], Z[5]);
if(CTX.mesh.light) glNormal3verts(h->V[2], h->V[3], h->V[7], n);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[7], Y[7], Z[7]);
glVertex3d(X[6], Y[6], Z[6]);
if(CTX.mesh.light) glNormal3verts(h->V[0], h->V[4], h->V[7], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[4], Y[4], Z[4]);
glVertex3d(X[7], Y[7], Z[7]);
glVertex3d(X[3], Y[3], Z[3]);
glEnd();
glDisable(GL_POLYGON_OFFSET_FILL);
glDisable(GL_LIGHTING);
}
} }
void Draw_Prism_Volume(void *a, void *b) void Draw_Prism_Volume(void *a, void *b)
...@@ -1109,8 +1141,7 @@ void Draw_Prism_Volume(void *a, void *b) ...@@ -1109,8 +1141,7 @@ void Draw_Prism_Volume(void *a, void *b)
Z[i] = Zc + CTX.mesh.explode * (p->V[i]->Pos.Z - Zc); Z[i] = Zc + CTX.mesh.explode * (p->V[i]->Pos.Z - Zc);
} }
// FIXME: change this when we add the face drawing code if(CTX.mesh.volumes_edges){
if(CTX.mesh.volumes_edges || CTX.mesh.volumes_faces){
glBegin(GL_LINE_LOOP); glBegin(GL_LINE_LOOP);
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]);
...@@ -1155,32 +1186,69 @@ void Draw_Prism_Volume(void *a, void *b) ...@@ -1155,32 +1186,69 @@ void Draw_Prism_Volume(void *a, void *b)
(p->V[3]->Pos.Z + p->V[4]->Pos.Z + p->V[5]->Pos.Z) / 3.); (p->V[3]->Pos.Z + p->V[4]->Pos.Z + p->V[5]->Pos.Z) / 3.);
glVertex3d(Xc, Yc, Zc); glVertex3d(Xc, Yc, Zc);
glVertex3d glVertex3d
((p->V[0]->Pos.X + p->V[1]->Pos.X + p->V[4]->Pos.X + ((p->V[0]->Pos.X + p->V[1]->Pos.X + p->V[4]->Pos.X + p->V[3]->Pos.X) / 4.,
p->V[3]->Pos.X) / 4., (p->V[0]->Pos.Y + p->V[1]->Pos.Y + p->V[4]->Pos.Y + p->V[3]->Pos.Y) / 4.,
(p->V[0]->Pos.Y + p->V[1]->Pos.Y + p->V[4]->Pos.Y + (p->V[0]->Pos.Z + p->V[1]->Pos.Z + p->V[4]->Pos.Z + p->V[3]->Pos.Z) / 4.);
p->V[3]->Pos.Y) / 4.,
(p->V[0]->Pos.Z + p->V[1]->Pos.Z + p->V[4]->Pos.Z +
p->V[3]->Pos.Z) / 4.);
glVertex3d(Xc, Yc, Zc); glVertex3d(Xc, Yc, Zc);
glVertex3d glVertex3d
((p->V[0]->Pos.X + p->V[3]->Pos.X + p->V[5]->Pos.X + ((p->V[0]->Pos.X + p->V[3]->Pos.X + p->V[5]->Pos.X + p->V[2]->Pos.X) / 4.,
p->V[2]->Pos.X) / 4., (p->V[0]->Pos.Y + p->V[3]->Pos.Y + p->V[5]->Pos.Y + p->V[2]->Pos.Y) / 4.,
(p->V[0]->Pos.Y + p->V[3]->Pos.Y + p->V[5]->Pos.Y + (p->V[0]->Pos.Z + p->V[3]->Pos.Z + p->V[5]->Pos.Z + p->V[2]->Pos.Z) / 4.);
p->V[2]->Pos.Y) / 4.,
(p->V[0]->Pos.Z + p->V[3]->Pos.Z + p->V[5]->Pos.Z +
p->V[2]->Pos.Z) / 4.);
glVertex3d(Xc, Yc, Zc); glVertex3d(Xc, Yc, Zc);
glVertex3d glVertex3d
((p->V[1]->Pos.X + p->V[2]->Pos.X + p->V[5]->Pos.X + ((p->V[1]->Pos.X + p->V[2]->Pos.X + p->V[5]->Pos.X + p->V[4]->Pos.X) / 4.,
p->V[4]->Pos.X) / 4., (p->V[1]->Pos.Y + p->V[2]->Pos.Y + p->V[5]->Pos.Y + p->V[4]->Pos.Y) / 4.,
(p->V[1]->Pos.Y + p->V[2]->Pos.Y + p->V[5]->Pos.Y + (p->V[1]->Pos.Z + p->V[2]->Pos.Z + p->V[5]->Pos.Z + p->V[4]->Pos.Z) / 4.);
p->V[4]->Pos.Y) / 4.,
(p->V[1]->Pos.Z + p->V[2]->Pos.Z + p->V[5]->Pos.Z +
p->V[4]->Pos.Z) / 4.);
glEnd(); glEnd();
glDisable(GL_LINE_STIPPLE); glDisable(GL_LINE_STIPPLE);
gl2psDisable(GL2PS_LINE_STIPPLE); gl2psDisable(GL2PS_LINE_STIPPLE);
} }
if(CTX.mesh.volumes_faces){
if(theColor.type)
glColor4ubv((GLubyte *) & theColor.mesh);
else if(CTX.mesh.color_carousel == 1)
ColorSwitch(p->iEnt);
else if(CTX.mesh.color_carousel == 2)
ColorSwitch(thePhysical);
else if(CTX.mesh.color_carousel == 3)
ColorSwitch(p->iPart);
else
glColor4ubv((GLubyte *) & CTX.color.mesh.prism);
double n[3];
if(CTX.mesh.light) glEnable(GL_LIGHTING);
glEnable(GL_POLYGON_OFFSET_FILL);
glBegin(GL_TRIANGLES);
if(CTX.mesh.light) glNormal3verts(p->V[0], p->V[2], p->V[1], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[1], Y[1], Z[1]);
if(CTX.mesh.light) glNormal3verts(p->V[3], p->V[4], p->V[5], n);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[4], Y[4], Z[4]);
glVertex3d(X[5], Y[5], Z[5]);
glEnd();
glBegin(GL_QUADS);
if(CTX.mesh.light) glNormal3verts(p->V[0], p->V[1], p->V[4], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[4], Y[4], Z[4]);
glVertex3d(X[3], Y[3], Z[3]);
if(CTX.mesh.light) glNormal3verts(p->V[1], p->V[2], p->V[5], n);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[5], Y[5], Z[5]);
glVertex3d(X[4], Y[4], Z[4]);
if(CTX.mesh.light) glNormal3verts(p->V[0], p->V[3], p->V[5], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[5], Y[5], Z[5]);
glVertex3d(X[2], Y[2], Z[2]);
glEnd();
glDisable(GL_POLYGON_OFFSET_FILL);
glDisable(GL_LIGHTING);
}
} }
void Draw_Pyramid_Volume(void *a, void *b) void Draw_Pyramid_Volume(void *a, void *b)
...@@ -1246,8 +1314,7 @@ void Draw_Pyramid_Volume(void *a, void *b) ...@@ -1246,8 +1314,7 @@ void Draw_Pyramid_Volume(void *a, void *b)
Z[i] = Zc + CTX.mesh.explode * (p->V[i]->Pos.Z - Zc); Z[i] = Zc + CTX.mesh.explode * (p->V[i]->Pos.Z - Zc);
} }
// FIXME: change this when we add the face drawing code if(CTX.mesh.volumes_edges){
if(CTX.mesh.volumes_edges || CTX.mesh.volumes_faces){
glBegin(GL_LINE_LOOP); glBegin(GL_LINE_LOOP);
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]);
...@@ -1271,4 +1338,49 @@ void Draw_Pyramid_Volume(void *a, void *b) ...@@ -1271,4 +1338,49 @@ void Draw_Pyramid_Volume(void *a, void *b)
glRasterPos3d(Xc, Yc, Zc); glRasterPos3d(Xc, Yc, Zc);
Draw_String(Num); Draw_String(Num);
} }
if(CTX.mesh.volumes_faces){
if(theColor.type)
glColor4ubv((GLubyte *) & theColor.mesh);
else if(CTX.mesh.color_carousel == 1)
ColorSwitch(p->iEnt);
else if(CTX.mesh.color_carousel == 2)
ColorSwitch(thePhysical);
else if(CTX.mesh.color_carousel == 3)
ColorSwitch(p->iPart);
else
glColor4ubv((GLubyte *) & CTX.color.mesh.pyramid);
double n[3];
if(CTX.mesh.light) glEnable(GL_LIGHTING);
glEnable(GL_POLYGON_OFFSET_FILL);
glBegin(GL_QUADS);
if(CTX.mesh.light) glNormal3verts(p->V[0], p->V[3], p->V[2], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[1], Y[1], Z[1]);
glEnd();
glBegin(GL_TRIANGLES);
if(CTX.mesh.light) glNormal3verts(p->V[1], p->V[2], p->V[4], n);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[4], Y[4], Z[4]);
if(CTX.mesh.light) glNormal3verts(p->V[2], p->V[3], p->V[4], n);
glVertex3d(X[2], Y[2], Z[2]);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[4], Y[4], Z[4]);
if(CTX.mesh.light) glNormal3verts(p->V[3], p->V[0], p->V[4], n);
glVertex3d(X[3], Y[3], Z[3]);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[4], Y[4], Z[4]);
if(CTX.mesh.light) glNormal3verts(p->V[0], p->V[1], p->V[4], n);
glVertex3d(X[0], Y[0], Z[0]);
glVertex3d(X[1], Y[1], Z[1]);
glVertex3d(X[4], Y[4], Z[4]);
glEnd();
glDisable(GL_POLYGON_OFFSET_FILL);
glDisable(GL_LIGHTING);
}
} }
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment