From a7728d3e0064a3a4dbba6d3d38ec03e9e2fb1a8b Mon Sep 17 00:00:00 2001 From: Christophe Geuzaine <cgeuzaine@ulg.ac.be> Date: Fri, 31 Dec 2004 21:12:40 +0000 Subject: [PATCH] Added 2 options to control polygon offset. Instead of trying to guess when a polygon offset is useful (it's no that simple when we combine geo+mesh+some views), we just apply it conditionally to all surface drawings. --- Common/Context.h | 1 + Common/DefaultOptions.h | 4 ++++ Common/Options.cpp | 24 ++++++++++++++++++++- Common/Options.h | 2 ++ Fltk/Callbacks.cpp | 4 +++- Fltk/GUI.cpp | 28 ++++++++++++++++++------- Graphics/CreateFile.cpp | 4 ++-- Graphics/Draw.cpp | 9 ++++++-- Graphics/Geom.cpp | 14 ++++++++----- Graphics/Mesh.cpp | 42 ++++++++++++++++++++++++------------- Graphics/Post.cpp | 5 +++-- Graphics/PostElement.cpp | 20 +++++++++++------- Plugin/StructuralSolver.cpp | 13 +++++++----- 13 files changed, 122 insertions(+), 48 deletions(-) diff --git a/Common/Context.h b/Common/Context.h index f5182934e4..1be0f9e5b1 100644 --- a/Common/Context.h +++ b/Common/Context.h @@ -132,6 +132,7 @@ public : int render_mode; // GMSH_RENDER, GMSH_SELECT, GMSH_FEEDBACK int clip[6]; // status of clip planes (bit arrays) double clip_plane[6][4]; // clip planes + double polygon_offset_factor, polygon_offset_units; // params for glPolygonOffset double pixel_equiv_x, pixel_equiv_y ; // approximative equivalent model length of a pixel int color_scheme ; // general color scheme diff --git a/Common/DefaultOptions.h b/Common/DefaultOptions.h index 46ec58a726..65bed6af2e 100644 --- a/Common/DefaultOptions.h +++ b/Common/DefaultOptions.h @@ -594,6 +594,10 @@ StringXNumber GeneralOptions_Number[] = { { F|O, "PointSize" , opt_general_point_size , 3. , "Display size of points (in pixels)" }, + { F|O, "PolygonOffsetFactor" , opt_general_polygon_offset_factor , 1. , + "Polygon offset factor (offset = factor * DZ + r * units)" }, + { F|O, "PolygonOffsetUnits" , opt_general_polygon_offset_units , 1. , + "Polygon offset units (offset = factor * DZ + r * units)" }, { F|O, "QuadricSubdivisions" , opt_general_quadric_subdivisions, 8. , "Number of subdivisions used to draw points or lines as spheres or cylinders" }, diff --git a/Common/Options.cpp b/Common/Options.cpp index 9ef0d66883..7fb46e30e4 100644 --- a/Common/Options.cpp +++ b/Common/Options.cpp @@ -1,4 +1,4 @@ -// $Id: Options.cpp,v 1.220 2004-12-30 22:43:21 geuzaine Exp $ +// $Id: Options.cpp,v 1.221 2004-12-31 21:12:40 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -1954,6 +1954,28 @@ double opt_general_viewport3(OPT_ARGS_NUM) return CTX.viewport[3]; } +double opt_general_polygon_offset_factor(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX.polygon_offset_factor = val; +#if defined(HAVE_FLTK) + if(WID && (action & GMSH_GUI)) + WID->gen_value[15]->value(CTX.polygon_offset_factor); +#endif + return CTX.polygon_offset_factor; +} + +double opt_general_polygon_offset_units(OPT_ARGS_NUM) +{ + if(action & GMSH_SET) + CTX.polygon_offset_units = val; +#if defined(HAVE_FLTK) + if(WID && (action & GMSH_GUI)) + WID->gen_value[16]->value(CTX.polygon_offset_units); +#endif + return CTX.polygon_offset_units; +} + double opt_general_graphics_position0(OPT_ARGS_NUM) { if(action & GMSH_SET) diff --git a/Common/Options.h b/Common/Options.h index 17f2c3b507..13b430a93b 100644 --- a/Common/Options.h +++ b/Common/Options.h @@ -216,6 +216,8 @@ double opt_general_file_chooser_position0(OPT_ARGS_NUM); double opt_general_file_chooser_position1(OPT_ARGS_NUM); double opt_general_viewport2(OPT_ARGS_NUM); double opt_general_viewport3(OPT_ARGS_NUM); +double opt_general_polygon_offset_factor(OPT_ARGS_NUM); +double opt_general_polygon_offset_units(OPT_ARGS_NUM); double opt_general_menu_position0(OPT_ARGS_NUM); double opt_general_menu_position1(OPT_ARGS_NUM); double opt_general_system_menu_bar(OPT_ARGS_NUM); diff --git a/Fltk/Callbacks.cpp b/Fltk/Callbacks.cpp index 2942726149..576114c6f0 100644 --- a/Fltk/Callbacks.cpp +++ b/Fltk/Callbacks.cpp @@ -1,4 +1,4 @@ -// $Id: Callbacks.cpp,v 1.322 2004-12-31 17:50:34 geuzaine Exp $ +// $Id: Callbacks.cpp,v 1.323 2004-12-31 21:12:40 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -667,6 +667,8 @@ void general_options_ok_cb(CALLBACK_ARGS) opt_general_quadric_subdivisions(0, GMSH_SET, WID->gen_value[11]->value()); opt_general_graphics_fontsize(0, GMSH_SET, WID->gen_value[12]->value()); opt_general_clip_factor(0, GMSH_SET, WID->gen_value[14]->value()); + opt_general_polygon_offset_factor(0, GMSH_SET, WID->gen_value[15]->value()); + opt_general_polygon_offset_units(0, GMSH_SET, WID->gen_value[16]->value()); opt_general_default_filename(0, GMSH_SET, (char *)WID->gen_input[0]->value()); opt_general_editor(0, GMSH_SET, (char *)WID->gen_input[1]->value()); diff --git a/Fltk/GUI.cpp b/Fltk/GUI.cpp index 04c2a95b1b..180d5cd92e 100644 --- a/Fltk/GUI.cpp +++ b/Fltk/GUI.cpp @@ -1,4 +1,4 @@ -// $Id: GUI.cpp,v 1.405 2004-12-31 16:19:20 geuzaine Exp $ +// $Id: GUI.cpp,v 1.406 2004-12-31 21:12:40 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -1743,19 +1743,31 @@ void GUI::create_option_window() gen_value[14]->step(0.1); gen_value[14]->align(FL_ALIGN_RIGHT); - gen_value[11] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 3 * BH, IW, BH, "Number of quadric subdivisions"); + gen_value[15] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 3 * BH, IW/2, BH); + gen_value[15]->minimum(0.); + gen_value[15]->maximum(10.); + gen_value[15]->step(0.01); + gen_value[15]->align(FL_ALIGN_RIGHT); + + gen_value[16] = new Fl_Value_Input(L + 2 * WB + IW/2, 2 * WB + 3 * BH, IW/2, BH, "Polygon offset factor and units"); + gen_value[16]->minimum(0.); + gen_value[16]->maximum(10.); + gen_value[16]->step(0.01); + gen_value[16]->align(FL_ALIGN_RIGHT); + + gen_value[11] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 4 * BH, IW, BH, "Number of quadric subdivisions"); gen_value[11]->minimum(3); gen_value[11]->maximum(30); gen_value[11]->step(1); gen_value[11]->align(FL_ALIGN_RIGHT); - gen_value[6] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 4 * BH, IW, BH, "Point size"); + gen_value[6] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 5 * BH, IW, BH, "Point size"); gen_value[6]->minimum(0.1); gen_value[6]->maximum(50); gen_value[6]->step(0.1); gen_value[6]->align(FL_ALIGN_RIGHT); - gen_value[7] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 5 * BH, IW, BH, "Line width"); + gen_value[7] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 6 * BH, IW, BH, "Line width"); gen_value[7]->minimum(0.1); gen_value[7]->maximum(50); gen_value[7]->step(0.1); @@ -1768,18 +1780,18 @@ void GUI::create_option_window() {"3D arrow", 0, 0, 0}, {0} }; - gen_choice[0] = new Fl_Choice(L + 2 * WB, 2 * WB + 6 * BH, IW, BH, "Vector display"); + gen_choice[0] = new Fl_Choice(L + 2 * WB, 2 * WB + 7 * BH, IW, BH, "Vector display"); gen_choice[0]->menu(menu_genvectype); gen_choice[0]->align(FL_ALIGN_RIGHT); - Fl_Button *b = new Fl_Button(L + 2 * IW - 2 * WB, 2 * WB + 6 * BH, (int)(1.5*BB), BH, "Edit arrow shape"); + Fl_Button *b = new Fl_Button(L + 2 * IW - 2 * WB, 2 * WB + 7 * BH, (int)(1.5*BB), BH, "Edit arrow shape"); b->callback(general_arrow_param_cb); - gen_choice[1] = new Fl_Choice(L + 2 * WB, 2 * WB + 7 * BH, IW, BH, "Font"); + gen_choice[1] = new Fl_Choice(L + 2 * WB, 2 * WB + 8 * BH, IW, BH, "Font"); gen_choice[1]->menu(menu_font_names); gen_choice[1]->align(FL_ALIGN_RIGHT); - gen_value[12] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 8 * BH, IW, BH, "Font size"); + gen_value[12] = new Fl_Value_Input(L + 2 * WB, 2 * WB + 9 * BH, IW, BH, "Font size"); gen_value[12]->minimum(5); gen_value[12]->maximum(40); gen_value[12]->step(1); diff --git a/Graphics/CreateFile.cpp b/Graphics/CreateFile.cpp index 7c8bf33f97..f7af8a7915 100644 --- a/Graphics/CreateFile.cpp +++ b/Graphics/CreateFile.cpp @@ -1,4 +1,4 @@ -// $Id: CreateFile.cpp,v 1.63 2004-12-31 17:50:34 geuzaine Exp $ +// $Id: CreateFile.cpp,v 1.64 2004-12-31 21:12:40 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -105,7 +105,7 @@ void CreateOutputFile(char *name, int format) break; case FORMAT_OPT: - Print_Options(0, GMSH_FULLRC, false, name); + Print_Options(0, GMSH_FULLRC, true, name); break; case FORMAT_MSH: diff --git a/Graphics/Draw.cpp b/Graphics/Draw.cpp index 8e174a6759..44a4ed553f 100644 --- a/Graphics/Draw.cpp +++ b/Graphics/Draw.cpp @@ -1,4 +1,4 @@ -// $Id: Draw.cpp,v 1.69 2004-12-29 22:30:09 geuzaine Exp $ +// $Id: Draw.cpp,v 1.70 2004-12-31 21:12:40 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -36,7 +36,12 @@ extern Mesh M; void Draw3d(void) { - glPolygonOffset(1.0, 1.0); + // offset = factor*DZ+r*units, where DZ is a measurement of the + // change in depth relative to the screen area of the polygon, and r + // is the smallest value that is guaranteed to produce a resolvable + // offset for a given implementation: + glPolygonOffset(CTX.polygon_offset_factor, CTX.polygon_offset_units); + glDepthFunc(GL_LESS); glEnable(GL_DEPTH_TEST); diff --git a/Graphics/Geom.cpp b/Graphics/Geom.cpp index 404f35d488..f220852536 100644 --- a/Graphics/Geom.cpp +++ b/Graphics/Geom.cpp @@ -1,4 +1,4 @@ -// $Id: Geom.cpp,v 1.76 2004-12-21 04:51:37 geuzaine Exp $ +// $Id: Geom.cpp,v 1.77 2004-12-31 21:12:40 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -324,8 +324,10 @@ void Draw_Triangulated_Surface(Surface * s) double *points, *p1, *p2, *p3; if(CTX.geom.surfaces) { - if(CTX.geom.light) glEnable(GL_LIGHTING); - glEnable(GL_POLYGON_OFFSET_FILL); + if(CTX.geom.light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); glBegin(GL_TRIANGLES); while (k < List_Nbr(s->thePolyRep->polygons)){ points = (double*)List_Pointer(s->thePolyRep->polygons,k); @@ -512,8 +514,10 @@ void Draw_NonPlane_Surface(Surface * s) { if(CTX.geom.surfaces) { if(s->Typ == MSH_SURF_NURBS) { - if(CTX.geom.light) glEnable(GL_LIGHTING); - glEnable(GL_POLYGON_OFFSET_FILL); + if(CTX.geom.light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); GLUnurbsObj *nurb; nurb = gluNewNurbsRenderer(); #if defined(GLU_VERSION_1_3) diff --git a/Graphics/Mesh.cpp b/Graphics/Mesh.cpp index b700803ba2..168ef035c0 100644 --- a/Graphics/Mesh.cpp +++ b/Graphics/Mesh.cpp @@ -1,4 +1,4 @@ -// $Id: Mesh.cpp,v 1.115 2004-12-28 17:24:25 geuzaine Exp $ +// $Id: Mesh.cpp,v 1.116 2004-12-31 21:12:40 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -703,12 +703,12 @@ void Draw_Mesh_Array(VertexArray *va, int faces, int edges) glEnableClientState(GL_NORMAL_ARRAY); if(faces){ - if(edges) - glEnable(GL_POLYGON_OFFSET_FILL); if(CTX.mesh.light) glEnable(GL_LIGHTING); else glDisableClientState(GL_NORMAL_ARRAY); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); glDrawArrays((va->type == 3) ? GL_TRIANGLES : GL_QUADS, 0, va->type * va->num); glDisable(GL_POLYGON_OFFSET_FILL); glDisable(GL_LIGHTING); @@ -835,8 +835,10 @@ void Draw_Mesh_Triangle(void *a, void *b) if(CTX.mesh.surfaces_faces) { glColor4ubv((GLubyte *) & col); - if(CTX.mesh.light) glEnable(GL_LIGHTING); - if(CTX.mesh.surfaces_edges) glEnable(GL_POLYGON_OFFSET_FILL); + if(CTX.mesh.light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); if(!s->VSUP) { glBegin(GL_TRIANGLES); _triFace(X[0], Y[0], Z[0], X[1], Y[1], Z[1], X[2], Y[2], Z[2]); @@ -997,8 +999,10 @@ void Draw_Mesh_Quadrangle(void *a, void *b) if(CTX.mesh.surfaces_faces) { glColor4ubv((GLubyte *) & col); - if(CTX.mesh.light) glEnable(GL_LIGHTING); - if(CTX.mesh.surfaces_edges) glEnable(GL_POLYGON_OFFSET_FILL); + if(CTX.mesh.light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); if(!q->VSUP) { glBegin(GL_QUADS); _quadFace(X, Y, Z, 0, 1, 2, 3); @@ -1169,8 +1173,10 @@ void Draw_Mesh_Tetrahedron(void *a, void *b) if(faces){ glColor4ubv((GLubyte *) & col); - if(CTX.mesh.light) glEnable(GL_LIGHTING); - if(CTX.mesh.surfaces_edges || edges) glEnable(GL_POLYGON_OFFSET_FILL); + if(CTX.mesh.light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); if(!s->VSUP){ glBegin(GL_TRIANGLES); _triFace(X[0], Y[0], Z[0], X[2], Y[2], Z[2], X[1], Y[1], Z[1]); @@ -1340,8 +1346,10 @@ void Draw_Mesh_Hexahedron(void *a, void *b) if(faces){ glColor4ubv((GLubyte *) & col); - if(CTX.mesh.light) glEnable(GL_LIGHTING); - if(CTX.mesh.surfaces_edges || edges) glEnable(GL_POLYGON_OFFSET_FILL); + if(CTX.mesh.light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); if(!h->VSUP){ glBegin(GL_QUADS); _quadFace(X, Y, Z, 0, 3, 2, 1); @@ -1539,8 +1547,10 @@ void Draw_Mesh_Prism(void *a, void *b) if(faces){ glColor4ubv((GLubyte *) & col); - if(CTX.mesh.light) glEnable(GL_LIGHTING); - if(CTX.mesh.surfaces_edges || edges) glEnable(GL_POLYGON_OFFSET_FILL); + if(CTX.mesh.light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); if(!p->VSUP){ glBegin(GL_TRIANGLES); _triFace(X[0], Y[0], Z[0], X[2], Y[2], Z[2], X[1], Y[1], Z[1]); @@ -1733,8 +1743,10 @@ void Draw_Mesh_Pyramid(void *a, void *b) if(faces){ glColor4ubv((GLubyte *) & col); - if(CTX.mesh.light) glEnable(GL_LIGHTING); - if(CTX.mesh.surfaces_edges || edges) glEnable(GL_POLYGON_OFFSET_FILL); + if(CTX.mesh.light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); if(!p->VSUP){ glBegin(GL_QUADS); _quadFace(X, Y, Z, 0, 3, 2, 1); diff --git a/Graphics/Post.cpp b/Graphics/Post.cpp index 8d7594652e..d3343f64a4 100644 --- a/Graphics/Post.cpp +++ b/Graphics/Post.cpp @@ -1,4 +1,4 @@ -// $Id: Post.cpp,v 1.88 2004-12-28 20:37:19 geuzaine Exp $ +// $Id: Post.cpp,v 1.89 2004-12-31 21:12:40 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -717,7 +717,8 @@ void Draw_Post(void) glEnable(GL_LIGHTING); else glDisableClientState(GL_NORMAL_ARRAY); - if(v->ShowElement) glEnable(GL_POLYGON_OFFSET_FILL); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); glDrawArrays(GL_TRIANGLES, 0, 3 * v->TriVertexArray->num); glDisable(GL_POLYGON_OFFSET_FILL); glDisable(GL_LIGHTING); diff --git a/Graphics/PostElement.cpp b/Graphics/PostElement.cpp index abfc5c19de..976e45d2e2 100644 --- a/Graphics/PostElement.cpp +++ b/Graphics/PostElement.cpp @@ -1,4 +1,4 @@ -// $Id: PostElement.cpp,v 1.57 2004-12-24 23:10:27 geuzaine Exp $ +// $Id: PostElement.cpp,v 1.58 2004-12-31 21:12:40 geuzaine Exp $ // // Copyright (C) 1997-2004 C. Geuzaine, J.-F. Remacle // @@ -440,8 +440,10 @@ void Draw_ScalarTriangle(Post_View * View, int preproNormals, View->TriVertexArray->num++; } else{ - if(View->Light) glEnable(GL_LIGHTING); - if(View->ShowElement) glEnable(GL_POLYGON_OFFSET_FILL); + if(View->Light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); glBegin(GL_TRIANGLES); for(int i = 0; i < 3; i++){ PaletteContinuous(View, ValMin, ValMax, Val[i]); @@ -487,8 +489,10 @@ void Draw_ScalarTriangle(Post_View * View, int preproNormals, } } else{ - if(View->Light) glEnable(GL_LIGHTING); - if(View->ShowElement) glEnable(GL_POLYGON_OFFSET_FILL); + if(View->Light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); glBegin(GL_POLYGON); for(int i = 0; i < nb; i++) { PaletteContinuous(View, ValMin, ValMax, Vp[i]); @@ -542,8 +546,10 @@ void Draw_ScalarTriangle(Post_View * View, int preproNormals, } } else{ - if(View->Light) glEnable(GL_LIGHTING); - if(View->ShowElement) glEnable(GL_POLYGON_OFFSET_FILL); + if(View->Light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); glBegin(GL_POLYGON); for(int i = 0; i < nb; i++){ if(View->Light) glNormal3dv(&norms[3*i]); diff --git a/Plugin/StructuralSolver.cpp b/Plugin/StructuralSolver.cpp index 92b976139b..b34af7355f 100644 --- a/Plugin/StructuralSolver.cpp +++ b/Plugin/StructuralSolver.cpp @@ -184,8 +184,10 @@ void Structural_BeamSection :: GL_DrawBeam (double pinit[3], double dir[3], con List_T *surfaces = Tree2List (m.Surfaces); List_T *curves = Tree2List (m.Curves); List_T *points = Tree2List (m.Points); - glEnable(GL_POLYGON_OFFSET_FILL); - if(CTX.geom.light) glEnable(GL_LIGHTING); + if(CTX.geom.light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); glEnable( GL_TEXTURE_2D ); @@ -773,10 +775,11 @@ void Draw_Kinematic_Constraint ( const int type [3], return; } - if(CTX.geom.light) glEnable(GL_LIGHTING); + if(CTX.geom.light) + glEnable(GL_LIGHTING); + if(CTX.polygon_offset_factor || CTX.polygon_offset_units) + glEnable(GL_POLYGON_OFFSET_FILL); - glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); - glEnable(GL_POLYGON_OFFSET_FILL); glColor3f (0.8,0.8,0.8); glBegin(GL_QUADS); -- GitLab