diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp index f54f2dda09c6e1ba3385e3cb7cbbadfa8302bb1a..4968c88b819c96153c19602580f0c0934948c9bc 100644 --- a/Graphics/Mesh.cpp +++ b/Graphics/Mesh.cpp @@ -1,4 +1,4 @@ -// $Id: Mesh.cpp,v 1.76 2004-04-21 04:26:45 geuzaine Exp $ +// $Id: Mesh.cpp,v 1.77 2004-04-21 06:31:23 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -255,6 +255,31 @@ void Draw_Mesh_Curves(void *a, void *b) Tree_Action(c->Simplexes, Draw_Simplex_Curves); } +double intersectCutPlane(int num, Vertex **v, int *edges, int *faces) +{ + if(!CTX.mesh.use_cut_plane) + return 0; + + double val = CTX.mesh.evalCutPlane(v[0]->Pos.X, v[0]->Pos.Y, v[0]->Pos.Z); + for(int i = 1; i < num; i++){ + if(val * CTX.mesh.evalCutPlane(v[i]->Pos.X, v[i]->Pos.Y, v[i]->Pos.Z) <= 0){ + // the element intersects the cut plane + if(CTX.mesh.cut_plane_as_surface){ + *edges = CTX.mesh.surfaces_edges; + *faces = CTX.mesh.surfaces_faces; + } + return 1.; + } + } + return val; +} + +double intersectCutPlane(int num, Vertex **v) +{ + int dummy; + return intersectCutPlane(num, v, &dummy, &dummy); +} + void Draw_Mesh_Points(void *a, void *b) { Vertex *v; @@ -265,10 +290,8 @@ void Draw_Mesh_Points(void *a, void *b) if(!(v->Visible & VIS_MESH)) return; - if(CTX.mesh.use_cut_plane) { - if(CTX.mesh.evalCutPlane(v->Pos.X, v->Pos.Y, v->Pos.Z) < 0) - return; - } + if(intersectCutPlane(1, &v) < 0) + return; if(CTX.render_mode == GMSH_SELECT) { glLoadName(0); @@ -321,6 +344,9 @@ void Draw_Simplex_Curves(void *a, void *b) if(part && !(*part)->Visible) return; + if(intersectCutPlane(2, s->V) < 0) + return; + Xc = 0.5 * (s->V[0]->Pos.X + s->V[1]->Pos.X); Yc = 0.5 * (s->V[0]->Pos.Y + s->V[1]->Pos.Y); Zc = 0.5 * (s->V[0]->Pos.Z + s->V[1]->Pos.Z); @@ -560,6 +586,9 @@ void Draw_Simplex_Surface(void *a, void *b) if(part && !(*part)->Visible) return; + if(intersectCutPlane(3, s->V) < 0) + return; + L = (s->VSUP) ? 1 : 0; K = (s->V[3]) ? 4 : 3; @@ -577,11 +606,6 @@ void Draw_Simplex_Surface(void *a, void *b) Zc = (s->V[0]->Pos.Z + s->V[1]->Pos.Z + s->V[2]->Pos.Z) / 3.; } - if(CTX.mesh.use_cut_plane) { - if(CTX.mesh.evalCutPlane(Xc, Yc, Zc) < 0) - return; - } - k = 0; for(i = 0; i < K; i++) { pX[k] = Xc + CTX.mesh.explode * (s->V[i]->Pos.X - Xc); @@ -639,22 +663,6 @@ void Draw_Simplex_Surface(void *a, void *b) } } -int intersectCutPlane(int num, Vertex **v, int *edges, int *faces) -{ - if(CTX.mesh.cut_plane_as_surface && - (CTX.mesh.surfaces_edges || CTX.mesh.surfaces_faces)){ - double val = CTX.mesh.evalCutPlane(v[0]->Pos.X, v[0]->Pos.Y, v[0]->Pos.Z); - for(int i = 1; i < num; i++){ - if(val * CTX.mesh.evalCutPlane(v[i]->Pos.X, v[i]->Pos.Y, v[i]->Pos.Z) < 0){ - *edges = CTX.mesh.surfaces_edges; - *faces = CTX.mesh.surfaces_faces; - return 1; - } - } - } - return 0; -} - void Draw_Simplex_Volume(void *a, void *b) { Simplex *s; @@ -692,6 +700,12 @@ void Draw_Simplex_Volume(void *a, void *b) return; } + int edges = CTX.mesh.volumes_edges; + int faces = CTX.mesh.volumes_faces; + + if(intersectCutPlane(3, s->V, &edges, &faces) < 0) + 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 + @@ -699,15 +713,6 @@ void Draw_Simplex_Volume(void *a, void *b) double Zc = .25 * (s->V[0]->Pos.Z + s->V[1]->Pos.Z + s->V[2]->Pos.Z + s->V[3]->Pos.Z); - int edges = CTX.mesh.volumes_edges; - int faces = CTX.mesh.volumes_faces; - - if(CTX.mesh.use_cut_plane) { - if(!intersectCutPlane(3, s->V, &edges, &faces)) - if(CTX.mesh.evalCutPlane(Xc, Yc, Zc) < 0) - return; - } - if(CTX.mesh.surfaces_faces || faces){ glColor4ubv((GLubyte *) & CTX.color.mesh.line); } @@ -939,6 +944,12 @@ void Draw_Hexahedron_Volume(void *a, void *b) if(CTX.mesh.color_carousel == 2) thePhysical = getFirstPhysical(MSH_PHYSICAL_VOLUME, h->iEnt); + int edges = CTX.mesh.volumes_edges; + int faces = CTX.mesh.volumes_faces; + + if(intersectCutPlane(8, h->V, &edges, &faces) < 0) + return; + for(i = 0; i < 8; i++) { Xc += h->V[i]->Pos.X; Yc += h->V[i]->Pos.Y; @@ -948,15 +959,6 @@ void Draw_Hexahedron_Volume(void *a, void *b) Zc *= .125; Yc *= .125; - int edges = CTX.mesh.volumes_edges; - int faces = CTX.mesh.volumes_faces; - - if(CTX.mesh.use_cut_plane) { - if(!intersectCutPlane(8, h->V, &edges, &faces)) - if(CTX.mesh.evalCutPlane(Xc, Yc, Zc) < 0) - return; - } - if(CTX.mesh.surfaces_faces || faces){ glColor4ubv((GLubyte *) & CTX.color.mesh.line); } @@ -1131,6 +1133,12 @@ void Draw_Prism_Volume(void *a, void *b) if(CTX.mesh.color_carousel == 2) thePhysical = getFirstPhysical(MSH_PHYSICAL_VOLUME, p->iEnt); + int edges = CTX.mesh.volumes_edges; + int faces = CTX.mesh.volumes_faces; + + if(intersectCutPlane(6, p->V, &edges, &faces) < 0) + return; + for(i = 0; i < 6; i++) { Xc += p->V[i]->Pos.X; Yc += p->V[i]->Pos.Y; @@ -1140,15 +1148,6 @@ void Draw_Prism_Volume(void *a, void *b) Zc /= 6.; Yc /= 6.; - int edges = CTX.mesh.volumes_edges; - int faces = CTX.mesh.volumes_faces; - - if(CTX.mesh.use_cut_plane) { - if(!intersectCutPlane(6, p->V, &edges, &faces)) - if(CTX.mesh.evalCutPlane(Xc, Yc, Zc) < 0) - return; - } - if(CTX.mesh.surfaces_faces || faces){ glColor4ubv((GLubyte *) & CTX.color.mesh.line); } @@ -1308,6 +1307,12 @@ void Draw_Pyramid_Volume(void *a, void *b) if(CTX.mesh.color_carousel == 2) thePhysical = getFirstPhysical(MSH_PHYSICAL_VOLUME, p->iEnt); + int edges = CTX.mesh.volumes_edges; + int faces = CTX.mesh.volumes_faces; + + if(intersectCutPlane(5, p->V, &edges, &faces) < 0) + return; + for(i = 0; i < 5; i++) { Xc += p->V[i]->Pos.X; Yc += p->V[i]->Pos.Y; @@ -1317,15 +1322,6 @@ void Draw_Pyramid_Volume(void *a, void *b) Zc /= 5.; Yc /= 5.; - int edges = CTX.mesh.volumes_edges; - int faces = CTX.mesh.volumes_faces; - - if(CTX.mesh.use_cut_plane) { - if(!intersectCutPlane(5, p->V, &edges, &faces)) - if(CTX.mesh.evalCutPlane(Xc, Yc, Zc) < 0) - return; - } - if(CTX.mesh.surfaces_faces || faces){ glColor4ubv((GLubyte *) & CTX.color.mesh.line); }