Graphite  Version 3
An experimental 3D geometry processing program
mesh_grob_shader.h
Go to the documentation of this file.
1 /*
2  * OGF/Graphite: Geometry and Graphics Programming Library + Utilities
3  * Copyright (C) 2000-2009 INRIA - Project ALICE
4  *
5  * This program is free software; you can redistribute it and/or modify
6  * it under the terms of the GNU General Public License as published by
7  * the Free Software Foundation; either version 2 of the License, or
8  * (at your option) any later version.
9  *
10  * This program is distributed in the hope that it will be useful,
11  * but WITHOUT ANY WARRANTY; without even the implied warranty of
12  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
13  * GNU General Public License for more details.
14  *
15  * You should have received a copy of the GNU General Public License
16  * along with this program; if not, write to the Free Software
17  * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
18  *
19  * If you modify this software, you should include a notice giving the
20  * name of the person performing the modification, the date of modification,
21  * and the reason for such modification.
22  *
23  * Contact: Bruno Levy - levy@loria.fr
24  *
25  * Project ALICE
26  * LORIA, INRIA Lorraine,
27  * Campus Scientifique, BP 239
28  * 54506 VANDOEUVRE LES NANCY CEDEX
29  * FRANCE
30  *
31  * Note that the GNU General Public License does not permit incorporating
32  * the Software into proprietary programs.
33  *
34  * As an exception to the GPL, Graphite can be linked with
35  * the following (non-GPL) libraries:
36  * Qt, SuperLU, WildMagic and CGAL
37  */
38 
39 
40 #ifndef H_OGF_MESH_GFX_SHADERS_MESH_GROB_SHADER_H
41 #define H_OGF_MESH_GFX_SHADERS_MESH_GROB_SHADER_H
42 
43 #include <OGF/mesh_gfx/common/common.h>
47 
49 
50 
56 namespace GEO {
57  class Image;
58 }
59 
60 
61 namespace OGF {
62 
63  /**********************************************************/
64 
65  class Builder;
66  class Texture;
67 
68  enum CullingMode {NO_CULL, CULL_FRONT, CULL_BACK};
69 
70  enum PaintingMode {SOLID_COLOR, ATTRIBUTE, COLOR, TEXTURE};
71 
75  gom_attribute(abstract, "true")
76  gom_class MESH_GFX_API MeshGrobShader : public Shader {
77  public:
83 
87  ~MeshGrobShader() override;
88 
92  void draw() override;
93 
100  virtual void pick(MeshElementsFlags what);
101 
106  void pick_object(index_t object_id) override;
107 
111  void blink() override;
112 
116  virtual void show_vertices();
117 
121  virtual void hide_vertices();
122 
126  virtual void show_vertices_selection();
127 
132  virtual void hide_vertices_selection();
133 
137  virtual void show_mesh();
138 
142  virtual void hide_mesh();
143 
147  virtual void show_borders();
148 
152  virtual void hide_borders();
153 
154  gom_properties:
155 
163  bool get_has_edges() const {
164  return
165  mesh_grob() != nullptr &&
166  mesh_grob()->edges.nb() != 0;
167  }
168 
176  bool get_has_facets() const {
177  return
178  mesh_grob() != nullptr &&
179  mesh_grob()->facets.nb() != 0;
180  }
181 
189  bool get_has_cells() const {
190  return
191  mesh_grob() != nullptr &&
192  mesh_grob()->cells.nb() != 0;
193  }
194 
203  bool get_is_hybrid() const {
204  return
205  mesh_grob() != nullptr &&
206  mesh_grob()->cells.nb() != 0 &&
207  !mesh_grob()->cells.are_simplices();
208  }
209 
220  bool get_has_time() const {
221  return
222  mesh_grob() != nullptr &&
223  mesh_grob()->vertices.dimension() >= 6;
224  }
225 
226  bool get_has_vertices_selection() const {
227  return mesh_grob() != nullptr &&
228  mesh_grob()->vertices.attributes().is_defined("selection");
229  }
230 
231 
232  bool get_has_weird_cells() const {
233  return mesh_grob() != nullptr &&
234  mesh_grob()->cells.attributes().is_defined("weird");
235  }
236 
237  std::string get_scalar_attributes() const {
238  std::string result;
239  if(mesh_grob() != nullptr) {
240  result = mesh_grob()->get_scalar_attributes();
241  }
242  return result;
243  }
244 
245  std::string get_vector_attributes() const {
246  std::string result;
247  if(mesh_grob() != nullptr) {
248  result = mesh_grob()->get_vector_attributes(3);
249  }
250  return result;
251  }
252 
253  protected:
258  MeshGrob* mesh_grob() const {
259  return static_cast<MeshGrob*>(grob());
260  }
261  };
262 
263  /****************************************************************/
264 
268  gom_class MESH_GFX_API PlainMeshGrobShader : public MeshGrobShader {
269  public:
275 
280 
284  void draw() override;
285 
289  void pick(MeshElementsFlags what) override;
290 
294  void pick_object(index_t object_id) override;
295 
299  void blink() override;
300 
304  void show_vertices() override;
305 
309  void hide_vertices() override;
310 
314  void show_vertices_selection() override;
315 
319  void hide_vertices_selection() override;
320 
324  void show_mesh() override;
325 
329  void hide_mesh() override;
330 
334  void show_borders() override;
335 
339  void hide_borders() override;
340 
341  gom_properties:
342 
348  bool get_attributes() const {
349  return (painting_mode_ == ATTRIBUTE);
350  }
351 
352  gom_slots:
353 
357  gom_attribute(visible_if, "attributes")
358  void autorange();
359 
360 
367  void set_time_smooth(double x) {
368  time_ = x;
369  update();
370  }
371 
378  double get_time_smooth() const {
379  return time_;
380  }
381 
382  gom_properties:
383 
388  void set_painting(PaintingMode value);
389 
394  PaintingMode get_painting() const {
395  return painting_mode_;
396  }
397 
403  gom_attribute(visible_if, "attributes")
404  void set_attribute_min(double value) {
405  attribute_min_ = value;
406  update();
407  }
408 
414  double get_attribute_min() const {
415  return attribute_min_;
416  }
417 
423  gom_attribute(visible_if, "attributes")
424  void set_attribute_max(double value) {
425  attribute_max_ = value;
426  update();
427  }
428 
434  double get_attribute_max() const {
435  return attribute_max_;
436  }
437 
438 
443  gom_attribute(visible_if, "attributes")
444  gom_attribute(handler, "combo_box")
445  gom_attribute(values, "$scalar_attributes")
446  void set_attribute(const std::string& value);
447 
452  const std::string& get_attribute() const {
453  return attribute_;
454  }
455 
460  gom_attribute(visible_if, "attributes")
461  void set_colormap(const ColormapStyle& value) {
462  colormap_style_ = value;
463  colormap_texture_.reset();
464  update();
465  }
466 
467  const ColormapStyle& get_colormap() const {
468  return colormap_style_;
469  }
470 
476  bool get_texturing() const {
477  return (painting_mode_ == TEXTURE);
478  }
479 
485  bool get_coloring() const {
486  return (painting_mode_ == COLOR);
487  }
488 
489 
495  gom_attribute(visible_if, "texturing")
496  void set_tex_image(const ImageFileName& value) {
497  texture_filename_ = value;
498  texture_.reset();
499  update();
500  }
501 
507  const ImageFileName& get_tex_image() const {
508  return texture_filename_;
509  }
510 
515  gom_attribute(visible_if, "texturing")
516  gom_attribute(handler, "combo_box")
517  gom_attribute(values, "$vector_attributes")
518  void set_tex_coords(const std::string& value);
519 
524  const std::string& get_tex_coords() const {
525  return tex_coord_attribute_;
526  }
527 
528 
533  gom_attribute(visible_if, "coloring")
534  gom_attribute(handler, "combo_box")
535  gom_attribute(values, "$vector_attributes")
536  void set_colors(const std::string& value) {
537  // It is an alias of tex_coord, because we use
538  // 3D texturing internally to display colors
539  // (it is stupid, but makes code simpler for now.
540  set_tex_coords(value);
541  }
542 
547  const std::string& get_colors() const {
548  // It is an alias of tex_coord, because we use
549  // 3D texturing internally to display colors
550  // (it is stupid, but makes code simpler for now.
551  return get_tex_coords();
552  }
553 
559  gom_attribute(visible_if, "texturing")
560  void set_tex_repeat(index_t value) {
561  tex_coord_repeat_ = value;
562  update();
563  }
564 
571  return tex_coord_repeat_;
572  }
573 
574 
575 
581  gom_attribute(visible_if, "texturing")
582  void set_normal_map(bool value) {
583  tex_normal_mapping_ = value;
584  update();
585  }
586 
592  bool get_normal_map() const {
593  return tex_normal_mapping_;
594  }
595 
601  void set_lighting(bool value) {
602  gfx_.set_lighting(value);
603  update();
604  }
605 
611  bool get_lighting() const {
612  return gfx_.get_lighting();
613  }
614 
615 
622  void set_clipping(bool value) {
623  clipping_ = value;
624  update();
625  }
626 
633  bool get_clipping() const {
634  return clipping_;
635  }
636 
637 
642  gom_attribute(visible_if, "has_facets")
643  void set_surface_style(const SurfaceStyle& value) {
644  surface_style_ = value;
645  update();
646  }
647 
653  return surface_style_;
654  }
655 
660  gom_attribute(visible_if, "has_facets")
661  void set_facets_filter(bool value) {
662  facets_filter_ = value;
663  gfx_.set_filter(
664  MESH_FACETS, value ? "filter" : ""
665  );
666  update();
667  }
668 
669  bool get_facets_filter() const {
670  return facets_filter_;
671  }
672 
677  gom_attribute(visible_if, "has_facets")
678  void set_culling_mode(const CullingMode value) {
679  culling_mode_ = value;
680  update();
681  }
682 
687  CullingMode get_culling_mode() const {
688  return culling_mode_;
689  }
690 
696  gom_attribute(visible_if, "has_facets or has_cells")
697  void set_specular(index_t x) {
698  specular_ = x;
699  update();
700  }
701 
707  return specular_;
708  }
709 
721  gom_attribute(visible_if, "has_facets")
722  void set_two_sided(bool value) {
723  two_sided_ = value;
724  update();
725  }
726 
732  bool get_two_sided() const {
733  return two_sided_;
734  }
735 
741  gom_attribute(visible_if, "has_cells")
742  void set_volume_style(const SurfaceStyle& value) {
743  volume_style_ = value;
744  update();
745  }
746 
754  return volume_style_;
755  }
756 
757 
762  gom_attribute(visible_if, "has_cells")
763  void set_cells_filter(bool value) {
764  gfx_.set_filter(
765  MESH_CELLS, value ? "filter" : ""
766  );
767  cells_filter_ = value;
768  update();
769  }
770 
771  bool get_cells_filter() const {
772  return cells_filter_;
773  }
774 
775 
782  gom_attribute(visible_if, "is_hybrid")
783  void set_colored_cells(bool value) {
784  colored_cells_ = value;
785  update();
786  }
787 
793  bool get_colored_cells() const {
794  return colored_cells_;
795  }
796 
797 
803  gom_attribute(visible_if, "is_hybrid")
804  void set_tets(bool value) {
805  tets_ = value;
806  update();
807  }
808 
814  bool get_tets() const {
815  return tets_;
816  }
817 
823  gom_attribute(visible_if, "is_hybrid")
824  void set_hexes(bool value) {
825  hexes_ = value;
826  update();
827  }
828 
834  bool get_hexes() const {
835  return hexes_;
836  }
837 
838 
844  gom_attribute(visible_if, "is_hybrid")
845  void set_prisms(bool value) {
846  prisms_ = value;
847  update();
848  }
849 
855  bool get_prisms() const {
856  return prisms_;
857  }
858 
859 
865  gom_attribute(visible_if, "is_hybrid")
866  void set_pyramids(bool value) {
867  pyramids_ = value;
868  update();
869  }
870 
876  bool get_pyramids() const {
877  return pyramids_;
878  }
879 
880 
886  gom_attribute(visible_if, "is_hybrid")
887  void set_connectors(bool value) {
888  connectors_ = value;
889  update();
890  }
891 
897  bool get_connectors() const {
898  return connectors_;
899  }
900 
906  gom_attribute(visible_if, "has_edges")
907  void set_edges_style(const EdgeStyle& value) {
908  edges_style_ = value;
909  update();
910  }
911 
917  const EdgeStyle& get_edges_style() const {
918  return edges_style_;
919  }
920 
921 
929  gom_attribute(visible_if, "has_facets or has_cells")
930  void set_mesh_style(const EdgeStyle& value) {
931  mesh_style_ = value;
932  update();
933  }
934 
942  const EdgeStyle& get_mesh_style() const {
943  return mesh_style_;
944  }
945 
946 
953  gom_attribute(visible_if, "has_facets")
954  void set_border_style(const EdgeStyle& value) {
955  border_style_ = value;
956  update();
957  }
958 
965  const EdgeStyle& get_border_style() const {
966  return border_style_;
967  }
968 
974  void set_vertices_style(const PointStyle& value) {
975  vertices_style_ = value;
976  update();
977  }
978 
985  return vertices_style_;
986  }
987 
988 
993  void set_vertices_filter(bool value) {
994  gfx_.set_filter(
995  MESH_VERTICES, value ? "filter" : ""
996  );
997  vertices_filter_ = value;
998  update();
999  }
1000 
1001  bool get_vertices_filter() const {
1002  return vertices_filter_;
1003  }
1004 
1011  void set_vertices_transparency(double value) {
1012  vertices_transparency_ = value;
1013  update();
1014  }
1015 
1021  double get_vertices_transparency() const {
1022  return vertices_transparency_;
1023  }
1024 
1030  gom_attribute(visible_if, "has_vertices_selection")
1031  void set_vert_select_style(const PointStyle& value) {
1032  vertices_selection_style_ = value;
1033  update();
1034  }
1035 
1041  return vertices_selection_style_;
1042  }
1043 
1050  gom_attribute(visible_if, "has_cells")
1051  void set_shrink(index_t value) {
1052  gfx_.set_shrink(double(value)/10.0);
1053  update();
1054  }
1055 
1063  return index_t(gfx_.get_shrink()*10.0);
1064  }
1065 
1066 
1077  gom_attribute(visible_if, "has_time")
1078  void set_animate(bool value) {
1079  animate_ = value;
1080  update();
1081  }
1082 
1093  bool get_animate() const {
1094  return animate_;
1095  }
1096 
1102  gom_attribute(visible_if, "has_time and animate")
1103  gom_attribute(handler, "slider_int")
1104  gom_attribute(min, "0")
1105  gom_attribute(max, "20")
1106  void set_time(index_t value) {
1107  time_ = double(value) / 20.0;
1108  update();
1109  }
1110 
1115  index_t get_time() const {
1116  return index_t(time_ * 20.0);
1117  }
1118 
1119 
1120  gom_attribute(visible_if, "has_cells")
1121  void set_slivers(double value) {
1122  slivers_ = value;
1123  update();
1124  }
1125 
1126  double get_slivers() const {
1127  return slivers_;
1128  }
1129 
1130  gom_attribute(visible_if, "has_weird_cells")
1131  void set_weird_cells(bool x) {
1132  weird_cells_ = x;
1133  update();
1134  }
1135 
1136  bool get_weird_cells() const {
1137  return weird_cells_;
1138  }
1139 
1140  bool get_glsl_source_visible() const {
1141  return false;
1142  }
1143 
1144  gom_attribute(visible_if, "glsl_source_visible")
1145  void set_glsl_source(const std::string& value) {
1146  glsl_source_ = value;
1147  update_glsl_program();
1148  }
1149 
1150  const std::string& get_glsl_source() const {
1151  return glsl_source_;
1152  }
1153 
1154  protected:
1155  void draw_slivers();
1156  void draw_weird_cells();
1157  void draw_surface_with_glsl_shader();
1158  void update_glsl_program();
1159 
1160  protected:
1161  GEO::MeshGfx gfx_;
1162 
1163  PaintingMode painting_mode_;
1164 
1165  std::string attribute_;
1166  MeshElementsFlags attribute_subelements_;
1167  std::string attribute_name_;
1168  double attribute_min_;
1169  double attribute_max_;
1170  ColormapStyle colormap_style_;
1171  Texture_var colormap_texture_;
1172 
1173  MeshElementsFlags tex_coord_subelements_;
1174  std::string tex_coord_attribute_;
1175  std::string tex_coord_name_;
1176  index_t tex_coord_repeat_;
1177  bool tex_normal_mapping_;
1178  Texture_var texture_;
1179  ImageFileName texture_filename_;
1180 
1181  SurfaceStyle surface_style_;
1182  bool facets_filter_;
1183  CullingMode culling_mode_;
1184 
1185  index_t specular_;
1186  bool two_sided_;
1187  SurfaceStyle volume_style_;
1188  bool cells_filter_;
1189  bool colored_cells_;
1190  bool tets_;
1191  bool hexes_;
1192  bool prisms_;
1193  bool pyramids_;
1194  bool connectors_;
1195  index_t shrink_;
1196  EdgeStyle edges_style_;
1197  EdgeStyle mesh_style_;
1198  EdgeStyle border_style_;
1199  PointStyle vertices_style_;
1200  bool vertices_filter_;
1201  double vertices_transparency_;
1202  PointStyle vertices_selection_style_;
1203  bool animate_;
1204  double time_;
1205  bool picking_;
1206  double slivers_;
1207  bool weird_cells_;
1208  bool clipping_;
1209 
1210  bool glsl_program_changed_;
1211  double glsl_start_time_;
1212  index_t glsl_frame_;
1213  std::string glsl_source_;
1214  GLuint glsl_program_;
1215  };
1216 
1217  /**********************************************************/
1218 
1222  gom_class MESH_GFX_API ExplodedViewMeshGrobShader :
1223  public PlainMeshGrobShader {
1224  public:
1230 
1235 
1236  gom_properties:
1237 
1238  gom_attribute(handler, "combo_box")
1239  gom_attribute(values, "$scalar_attributes")
1240  void set_region(const std::string& value) {
1241  region_ = value;
1242  dirty_ = true;
1243  update();
1244  }
1245 
1246  const std::string& get_region() const {
1247  return region_;
1248  }
1249 
1250  void set_amount(index_t value) {
1251  amount_ = value;
1252  update();
1253  }
1254 
1255  index_t get_amount() const {
1256  return amount_;
1257  }
1258 
1259  public:
1260  void draw() override;
1261 
1262  protected:
1263  bool dirty_;
1264  std::string region_;
1265  index_t amount_;
1266  int rgn_min_;
1267  int rgn_max_;
1268  vec3 bary_;
1269  vector<vec3> region_bary_;
1270  };
1271 
1272  /**********************************************************/
1273 
1274 }
1275 
1276 #endif
Draws a mesh using OpenGL.
Definition: mesh_gfx.h:60
Exploded view, moves regions apart.
void draw() override
Draws the Grob.
~ExplodedViewMeshGrobShader() override
PlainMeshGrobShader destructor.
ExplodedViewMeshGrobShader(MeshGrob *grob)
PlainMeshGrobShader constructor.
Base class for drawing and picking MeshGrob.
virtual void hide_borders()
Makes surface borders invisible and triggers a drawing event.
virtual void hide_vertices()
Makes vertices invisible and triggers a drawing event.
virtual void show_borders()
Makes surface borders visible and triggers a drawing event.
void pick_object(index_t object_id) override
Draws the Grob in picking mode.
MeshGrobShader(MeshGrob *grob)
MeshGrobShader constructor.
bool get_has_cells() const
Tests whether the MeshGrob attached to this shader has cells.
virtual void hide_mesh()
Makes the mesh invisible and triggers a drawing event.
virtual void show_mesh()
Makes the mesh visible and triggers a drawing event.
virtual void show_vertices()
Makes vertices visible and triggers a drawing event.
virtual void show_vertices_selection()
Makes vertices selection visible and triggers a drawing event.
virtual void pick(MeshElementsFlags what)
Picks an element of a mesh.
void blink() override
Draws the current object several times, while chaning the value of one graphic attribute (e....
bool get_has_time() const
Tests whether the MeshGrob attached to this shader stores a time evolution.
virtual void hide_vertices_selection()
Makes vertices selection invisible and triggers a drawing event.
bool get_is_hybrid() const
Tests whether the MeshGrob attached to this shader is a volumetric hybrid mesh.
void draw() override
Draws the Grob.
~MeshGrobShader() override
MeshGrobShader destructor.
bool get_has_facets() const
Tests whether the MeshGrob attached to this shader has facets.
MeshGrob * mesh_grob() const
Gets the MeshGrob.
A Grob wrapper around Geogram's Mesh class.
Definition: mesh_grob.h:56
The default implementation of MeshGrobShader.
~PlainMeshGrobShader() override
PlainMeshGrobShader destructor.
void blink() override
Draws the current object several times, while chaning the value of one graphic attribute (e....
bool get_clipping() const
Gets whether clipping should be used.
index_t get_specular() const
Gets the current surface specular factor.
void hide_mesh() override
Makes the mesh invisible and triggers a drawing event.
bool get_tets() const
Tests whether tetrahedra are displayed.
const ImageFileName & get_tex_image() const
Gets the image used for texturing.
const PointStyle & get_vert_select_style() const
Gets the vertices selection style.
void hide_borders() override
Makes surface borders invisible and triggers a drawing event.
bool get_texturing() const
Tests whether texturing is active.
const PointStyle & get_vertices_style() const
Gets the style used to draw the vertices.
void show_mesh() override
Makes the mesh visible and triggers a drawing event.
bool get_coloring() const
Tests whether coloring is active.
bool get_hexes() const
Tests whether hexahedra are displayed.
const EdgeStyle & get_mesh_style() const
Gets the style used to draw the mesh in the facets and in the cells.
PlainMeshGrobShader(MeshGrob *grob)
PlainMeshGrobShader constructor.
PaintingMode get_painting() const
Gets painting mode.
void hide_vertices() override
Makes vertices invisible and triggers a drawing event.
index_t get_time() const
Gets the time parameter used for time interpolation.
bool get_colored_cells() const
Tests whether volumetric cells are colored by type.
void show_borders() override
Makes surface borders visible and triggers a drawing event.
double get_attribute_min() const
Gets the minimum of the displayed range for attribute values.
void set_lighting(bool value)
Sets whether lighting should be used.
const std::string & get_colors() const
Gets the name of the displayed attribute.
void show_vertices() override
Makes vertices visible and triggers a drawing event.
void draw() override
Draws the Grob.
const EdgeStyle & get_edges_style() const
Gets the style used to draw the edges.
const SurfaceStyle & get_volume_style() const
Gets the style used to draw the volumetric cells.
bool get_lighting() const
Gets whether lighting is used.
index_t get_shrink() const
Gets the shrinking coefficient of the volumetric cells.
const SurfaceStyle & get_surface_style() const
Gets the current surface drawing style.
bool get_normal_map() const
Gets normal mapping mode.
void show_vertices_selection() override
Makes vertices selection visible and triggers a drawing event.
bool get_two_sided() const
Tests whether different colors are used for inside/outside.
void pick(MeshElementsFlags what) override
Picks an element of a mesh.
bool get_animate() const
Tests whether time interpolation should be used.
bool get_pyramids() const
Tests whether pyramids are displayed.
const EdgeStyle & get_border_style() const
Gets the style used to draw the border of the surface.
double get_attribute_max() const
Gets the maximum of the displayed range for attribute values.
void pick_object(index_t object_id) override
Draws the Grob in picking mode.
bool get_prisms() const
Tests whether prisms are displayed.
void set_vertices_transparency(double value)
Sets the transparency of the vertices (use with dark background).
CullingMode get_culling_mode() const
Gets the current culling mode.
bool get_connectors() const
Tests whether connectors are displayed.
double get_time_smooth() const
Gets the time as floating point parameter.
void set_vertices_filter(bool value)
Sets vertices filtering.
index_t get_tex_repeat() const
Gets the texture repeat factor.
void set_vertices_style(const PointStyle &value)
Sets the style used to draw the vertices.
void hide_vertices_selection() override
Makes vertices selection invisible and triggers a drawing event.
double get_vertices_transparency() const
Gets the transparency of the vertices.
void set_clipping(bool value)
Sets whether clipping should be active.
Base class for Grob shader.
Definition: shader.h:64
A class to display a mesh using OpenGL/GLUP.
the MeshGrob class.
Global Vorpaline namespace.
geo_index_t index_t
The type for storing and manipulating indices.
Definition: numeric.h:329
Global Graphite namespace.
Definition: common.h:76
Name< File< Image * > > ImageFileName
The name of an existing file that contains an Image.
Definition: properties.h:399
The base class for all object shaders.
The style used to display colormapped colors.
Definition: properties.h:493
Drawing style for mesh edges.
Definition: properties.h:115
Drawing style for points.
Definition: properties.h:64
Drawing style for polygons.
Definition: properties.h:167