From 3d7012da1d581bbe9a22d03090eeafd8a8516c4e Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Tue, 20 Apr 2004 18:55:36 +0000 Subject: [PATCH] - allow to draw geometry tangents/normals even if the actual lines/surfaces are not - cleaned up draw_nonplane_surface --- Graphics/Geom.cpp | 125 ++++++++++++++++------------------------------ 1 file changed, 44 insertions(+), 81 deletions(-) diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp index 36b5f723d4..636d23fe79 100644 --- a/Graphics/Geom.cpp +++ b/Graphics/Geom.cpp @@ -1,4 +1,4 @@ -// $Id: Geom.cpp,v 1.53 2004-04-20 01:26:13 geuzaine Exp $ +// $Id: Geom.cpp,v 1.54 2004-04-20 18:55:36 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -409,15 +409,12 @@ void Draw_Plane_Surface(Surface * s) k = 0; for(i = 0; i < 100; i++) { t = (double)i / (double)(100); - vv.Pos.X = - t * .5 * (V[0].Pos.X + V[3].Pos.X) + (1. - t) * .5 * (V[2].Pos.X + - V[1].Pos.X); - vv.Pos.Y = - t * .5 * (V[0].Pos.Y + V[3].Pos.Y) + (1. - t) * .5 * (V[2].Pos.Y + - V[1].Pos.Y); - vv.Pos.Z = - t * .5 * (V[0].Pos.Z + V[3].Pos.Z) + (1. - t) * .5 * (V[2].Pos.Z + - V[1].Pos.Z); + vv.Pos.X = t * .5 * (V[0].Pos.X + V[3].Pos.X) + + (1. - t) * .5 * (V[2].Pos.X + V[1].Pos.X); + vv.Pos.Y = t * .5 * (V[0].Pos.Y + V[3].Pos.Y) + + (1. - t) * .5 * (V[2].Pos.Y + V[1].Pos.Y); + vv.Pos.Z = t * .5 * (V[0].Pos.Z + V[3].Pos.Z) + + (1. - t) * .5 * (V[2].Pos.Z + V[1].Pos.Z); if(isPointOnPlanarSurface(s, vv.Pos.X, vv.Pos.Y, vv.Pos.Z, n)) { if(!k) { List_Add(s->Orientations, &vv); @@ -484,81 +481,47 @@ void Draw_Plane_Surface(Surface * s) void Draw_NonPlane_Surface(Surface * s) { - Vertex v, n1, n2, n3; - int i, NbTics, N = 0; - double u, n[3], nx[3], ny[3]; - double tics[20]; - double u0, un, v0, vn; - int kk; - char Num[100]; - - u0 = v0 = 0; - un = vn = 1; - - if(s->Typ == MSH_SURF_NURBS) { - NbTics = 5; - u0 = s->ku[0]; - un = s->ku[s->OrderU + s->Nu]; - v0 = s->kv[0]; - vn = s->kv[s->OrderV + s->Nv]; - for(i = 0; i < NbTics; i++) - tics[i] = v0 + ((double)(i + 1) / (double)NbTics) * (vn - v0); - if(CTX.geom.light) glEnable(GL_LIGHTING); - glEnable(GL_POLYGON_OFFSET_FILL); - GLUnurbsObj *nurb; - nurb = gluNewNurbsRenderer(); + if(CTX.geom.surfaces) { + if(s->Typ == MSH_SURF_NURBS) { + if(CTX.geom.light) glEnable(GL_LIGHTING); + glEnable(GL_POLYGON_OFFSET_FILL); + GLUnurbsObj *nurb; + nurb = gluNewNurbsRenderer(); #if defined(GLU_VERSION_1_3) - gluNurbsProperty(nurb, (GLenum) GLU_SAMPLING_TOLERANCE, 50.0); - gluNurbsProperty(nurb, (GLenum) GLU_DISPLAY_MODE, GLU_FILL); + gluNurbsProperty(nurb, (GLenum) GLU_SAMPLING_TOLERANCE, 50.0); + gluNurbsProperty(nurb, (GLenum) GLU_DISPLAY_MODE, GLU_FILL); #endif - gluBeginSurface(nurb); - gluNurbsSurface(nurb, s->Nu + s->OrderU + 1, s->ku, - s->Nv + s->OrderV + 1, s->kv, 4, 4 * s->Nu, s->cp, - s->OrderU + 1, s->OrderV + 1, GL_MAP2_VERTEX_4); - gluEndSurface(nurb); - gluDeleteNurbsRenderer(nurb); - glDisable(GL_POLYGON_OFFSET_FILL); - glDisable(GL_LIGHTING); - return; - } - else { - NbTics = 1; - tics[0] = 0.5; - } - - if(CTX.geom.surfaces) { - for(kk = 0; kk < NbTics; kk++) { - N = 50; + gluBeginSurface(nurb); + gluNurbsSurface(nurb, s->Nu + s->OrderU + 1, s->ku, + s->Nv + s->OrderV + 1, s->kv, 4, 4 * s->Nu, s->cp, + s->OrderU + 1, s->OrderV + 1, GL_MAP2_VERTEX_4); + gluEndSurface(nurb); + gluDeleteNurbsRenderer(nurb); + glDisable(GL_POLYGON_OFFSET_FILL); + glDisable(GL_LIGHTING); + } + else{ + int N = 50; glBegin(GL_LINE_STRIP); - for(i = 0; i < N + 1; i++) { - u = u0 + (un - u0) * (double)i / (double)N; - v = InterpolateSurface(s, u, tics[kk], 0, 0); - glVertex3d(v.Pos.X, v.Pos.Y, v.Pos.Z); + for(int i = 0; i < N + 1; i++) { + double u = (double)i / (double)N; + Vertex v = InterpolateSurface(s, u, 0.5, 0, 0); + glVertex3d(v.Pos.X, v.Pos.Y, v.Pos.Z); } glEnd(); - } - } - - if(s->Typ == MSH_SURF_NURBS) { - for(i = 0; i < NbTics; i++) { - tics[i] = u0 + ((double)(i + 1) / (double)NbTics) * (un - u0); - } - } - - if(CTX.geom.surfaces) { - for(kk = 0; kk < NbTics; kk++) { glBegin(GL_LINE_STRIP); - for(i = 0; i < N + 1; i++) { - u = v0 + (vn - v0) * (double)i / (double)N; - v = InterpolateSurface(s, tics[kk], u, 0, 0); - glVertex3d(v.Pos.X, v.Pos.Y, v.Pos.Z); + for(int i = 0; i < N + 1; i++) { + double u = (double)i / (double)N; + Vertex v = InterpolateSurface(s, 0.5, u, 0, 0); + glVertex3d(v.Pos.X, v.Pos.Y, v.Pos.Z); } glEnd(); } } if(CTX.geom.surfaces_num) { - v = InterpolateSurface(s, 0.5, 0.5, 0, 0); + Vertex v = InterpolateSurface(s, 0.5, 0.5, 0, 0); + char Num[100]; sprintf(Num, "%d", s->Num); double offset = 0.5 * CTX.gl_fontsize * CTX.pixel_equiv_x; glRasterPos3d(v.Pos.X + offset / CTX.s[0], @@ -569,9 +532,10 @@ void Draw_NonPlane_Surface(Surface * s) if(CTX.geom.normals) { glDisable(GL_LINE_STIPPLE); - n1 = InterpolateSurface(s, 0.5, 0.5, 0, 0); - n2 = InterpolateSurface(s, 0.6, 0.5, 0, 0); - n3 = InterpolateSurface(s, 0.5, 0.6, 0, 0); + Vertex n1 = InterpolateSurface(s, 0.5, 0.5, 0, 0); + Vertex n2 = InterpolateSurface(s, 0.6, 0.5, 0, 0); + Vertex n3 = InterpolateSurface(s, 0.5, 0.6, 0, 0); + double nx[3], ny[3], n[3]; nx[0] = n2.Pos.X - n1.Pos.X; nx[1] = n2.Pos.Y - n1.Pos.Y; nx[2] = n2.Pos.Z - n1.Pos.Z; @@ -653,7 +617,6 @@ void Draw_Curve_For_Volume(void *a, void *b) { int i, N; Curve *c; - Vertex v; glLineWidth(CTX.geom.line_width); gl2psLineWidth(CTX.geom.line_width * CTX.print.eps_line_width_factor); @@ -672,14 +635,14 @@ void Draw_Curve_For_Volume(void *a, void *b) glBegin(GL_LINE_STRIP); for(i = 0; i < N; i++) { - v = InterpolateCurve(c, 0.2 * (double)i / (double)(N - 1), 0); + Vertex v = InterpolateCurve(c, 0.2 * (double)i / (double)(N - 1), 0); glVertex3d(v.Pos.X, v.Pos.Y, v.Pos.Z); } glEnd(); glBegin(GL_LINE_STRIP); for(i = N - 1; i >= 0; i--) { - v = InterpolateCurve(c, 1. - 0.2 * (double)i / (double)(N - 1), 0); + Vertex v = InterpolateCurve(c, 1. - 0.2 * (double)i / (double)(N - 1), 0); glVertex3d(v.Pos.X, v.Pos.Y, v.Pos.Z); } glEnd(); @@ -704,9 +667,9 @@ void Draw_Geom(Mesh * m) if(CTX.geom.points || CTX.geom.points_num) Tree_Action(m->Points, Draw_GeoPoint); - if(CTX.geom.lines || CTX.geom.lines_num) + if(CTX.geom.lines || CTX.geom.lines_num || CTX.geom.tangents) Tree_Action(m->Curves, Draw_Curve); - if(CTX.geom.surfaces || CTX.geom.surfaces_num) + if(CTX.geom.surfaces || CTX.geom.surfaces_num || CTX.geom.normals) Tree_Action(m->Surfaces, Draw_Surface); if(CTX.geom.volumes || CTX.geom.volumes_num) DrawVolumes(m); -- GitLab