Developer Documentation
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Properties Friends Macros Modules Pages
OMPropertyVisualizerVector2T.cc
1 /* ========================================================================= *
2  * *
3  * OpenFlipper *
4  * Copyright (c) 2001-2015, RWTH-Aachen University *
5  * Department of Computer Graphics and Multimedia *
6  * All rights reserved. *
7  * www.openflipper.org *
8  * *
9  *---------------------------------------------------------------------------*
10  * This file is part of OpenFlipper. *
11  *---------------------------------------------------------------------------*
12  * *
13  * Redistribution and use in source and binary forms, with or without *
14  * modification, are permitted provided that the following conditions *
15  * are met: *
16  * *
17  * 1. Redistributions of source code must retain the above copyright notice, *
18  * this list of conditions and the following disclaimer. *
19  * *
20  * 2. Redistributions in binary form must reproduce the above copyright *
21  * notice, this list of conditions and the following disclaimer in the *
22  * documentation and/or other materials provided with the distribution. *
23  * *
24  * 3. Neither the name of the copyright holder nor the names of its *
25  * contributors may be used to endorse or promote products derived from *
26  * this software without specific prior written permission. *
27  * *
28  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS *
29  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED *
30  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A *
31  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER *
32  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, *
33  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, *
34  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR *
35  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF *
36  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING *
37  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS *
38  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. *
39  * *
40  * ========================================================================= */
41 
42 /*===========================================================================*\
43 * *
44 * $Revision: 13620 $ *
45 * $LastChangedBy: moebius $ *
46 * $Date: 2012-02-01 14:51:25 +0100 (Mi, 01 Feb 2012) $ *
47 * *
48 \*===========================================================================*/
49 
50 #define OM_PROPERTY_VISUALIZER_VECTOR2_CC
51 
52 #include "OMPropertyVisualizerVector2.hh"
53 #include <OpenMesh/Core/Utils/Property.hh>
54 #include <ACG/Utils/ColorConversion.hh>
55 
56 template <typename MeshT, typename VectorType>
58  : OMPropertyVisualizer<MeshT>(_mesh, _propertyInfo)
59 {
60  if (PropertyVisualizer::widget) delete PropertyVisualizer::widget;
61  VectorWidget* w = new VectorWidget();
62  w->paramVector->setTitle(QString("2D Vector Parameters of ").append(PropertyVisualizer::propertyInfo.propName().c_str()));
63  PropertyVisualizer::widget = w;
64 
65  lineNode = new ACG::SceneGraph::LineNode( ACG::SceneGraph::LineNode::LineSegmentsMode, dynamic_cast < ACG::SceneGraph::SeparatorNode* >( PluginFunctions::getRootNode() ) );
66 
67  if (!_propertyInfo.isFaceProp())
68  {
69  w->vectors_edges_rb->hide();
70  }
71 }
72 
73 template <typename MeshT, typename VectorType>
75 {
76  lineNode->clear();
78 }
79 
80 template <typename MeshT, typename VectorType>
82 {
83  return OMPropertyVisualizer<MeshT>::template getPropertyText_<VectorType>(index);
84 }
85 
86 
87 namespace {
88 
89 template<typename PROPTYPE, typename VectorType, typename MeshT, typename ENTITY_IT, typename PROPINFO_TYPE>
90 void visualizeVectorAsColorForEntity2(MeshT *mesh, const ENTITY_IT e_begin, const ENTITY_IT e_end,
91  const PROPINFO_TYPE &propinfo) {
92  PROPTYPE prop;
93  if (!mesh->get_property_handle(prop, propinfo.propName()))
94  throw VizException("Getting PropHandle from mesh for selected property failed.");
95  for (ENTITY_IT e_it = e_begin; e_it != e_end; ++e_it) {
96  VectorType v = mesh->property(prop, *e_it).normalized() * .5 + VectorType(0.5);
97  mesh->set_color(*e_it, typename MeshT::Color(v[0], v[1], 0.0, 1.0));
98  }
99 }
100 
101 template<typename PROPTYPE, typename MeshT, typename ENTITY_IT, typename PROPINFO_TYPE>
102 void visualizeVectorLengthAsColorForEntity2(
103  MeshT *mesh, const ENTITY_IT e_begin, const ENTITY_IT e_end,
104  const PROPINFO_TYPE &propinfo) {
105  PROPTYPE prop;
106  if (!mesh->get_property_handle(prop, propinfo.propName()))
107  throw VizException("Getting PropHandle from mesh for selected "
108  "property failed.");
109 
110  double min = std::numeric_limits<double>::infinity();
111  double max = -std::numeric_limits<double>::infinity();
112 
113  for (ENTITY_IT e_it = e_begin; e_it != e_end; ++e_it) {
114  const double val = mesh->property(prop, *e_it).norm();
115  min = std::min(min, val);
116  max = std::max(max, val);
117  }
118 
119  ACG::ColorCoder color_coder(min, max);
120 
121  for (ENTITY_IT e_it = e_begin; e_it != e_end; ++e_it) {
122  mesh->set_color(*e_it, color_coder(mesh->property(prop, *e_it).norm()));
123  }
124 }
125 
126 template <typename VectorType> ACG::Vec3d generateVec3AtLocation(VectorType uv, ACG::Vec3d normal)
127 {
128  ACG::Vec3d tan;
129  if(std::abs(normal[0]) > std::abs(normal[1]))
130  tan = ACG::Vec3d(-normal[2], 0, normal[0]);
131  else tan = ACG::Vec3d(0, normal[2], -normal[1]);
132  ACG::Vec3d bi = normal % tan;
133  return double(uv[0]) * tan.normalize() + double(uv[1]) * bi.normalize();
134 }
135 
136 }
137 
138 template <typename MeshT, typename VectorType>
140 {
141  VectorWidget* const w = (VectorWidget*)PropertyVisualizer::widget;
142  if (w->vectors_edges_rb->isChecked()) {
143  visualizeFacePropOnEdges();
144  } else if (w->vectors_colors_rb->isChecked() ||
145  w->vectors_length_color_rb->isChecked()) {
146  if ( !OMPropertyVisualizer<MeshT>::mesh->has_face_colors() )
147  OMPropertyVisualizer<MeshT>::mesh->request_face_colors();
148 
149  if (w->vectors_colors_rb->isChecked()) {
150  visualizeVectorAsColorForEntity2<OpenMesh::FPropHandleT<VectorType>, VectorType >(
152  OMPropertyVisualizer<MeshT>::mesh->faces_begin(),
153  OMPropertyVisualizer<MeshT>::mesh->faces_end(),
154  PropertyVisualizer::propertyInfo);
155  } else {
156  visualizeVectorLengthAsColorForEntity2<OpenMesh::FPropHandleT<VectorType> >(
157  OMPropertyVisualizer<MeshT>::mesh,
158  OMPropertyVisualizer<MeshT>::mesh->faces_begin(),
159  OMPropertyVisualizer<MeshT>::mesh->faces_end(),
160  PropertyVisualizer::propertyInfo);
161  }
162  if (_setDrawMode)
164  }
165  else visualizeFacePropAsStrokes();
166 }
167 
168 template <typename MeshT, typename VectorType>
170 {
171  VectorWidget* const w = (VectorWidget*)PropertyVisualizer::widget;
172  if (w->vectors_colors_rb->isChecked() ||
173  w->vectors_length_color_rb->isChecked()) {
174  if ( !OMPropertyVisualizer<MeshT>::mesh->has_edge_colors() )
175  OMPropertyVisualizer<MeshT>::mesh->request_edge_colors();
176  MeshT* mesh = OMPropertyVisualizer<MeshT>::mesh;
177  if ( !mesh->has_edge_colors() )
178  mesh->request_edge_colors();
179  if (w->vectors_colors_rb->isChecked()) {
180  visualizeVectorAsColorForEntity2<
182  mesh,
183  mesh->edges_begin(),
184  mesh->edges_end(),
185  PropertyVisualizer::propertyInfo);
186  } else {
187  visualizeVectorLengthAsColorForEntity2<
188  OpenMesh::EPropHandleT<VectorType> >(
189  mesh,
190  mesh->edges_begin(),
191  mesh->edges_end(),
192  PropertyVisualizer::propertyInfo);
193  }
194  if (_setDrawMode)
196  }
197  else visualizeEdgePropAsStrokes();
198 }
199 
200 template <typename MeshT, typename VectorType>
202 {
203  VectorWidget* const w = (VectorWidget*)PropertyVisualizer::widget;
204  if (w->vectors_colors_rb->isChecked() ||
205  w->vectors_length_color_rb->isChecked()) {
206  if ( !OMPropertyVisualizer<MeshT>::mesh->has_halfedge_colors() )
207  OMPropertyVisualizer<MeshT>::mesh->request_halfedge_colors();
208  MeshT* mesh = OMPropertyVisualizer<MeshT>::mesh;
209  if ( ! mesh->has_halfedge_colors() )
210  mesh->request_halfedge_colors();
211 
212  if (w->vectors_colors_rb->isChecked()) {
213  visualizeVectorAsColorForEntity2<
215  mesh,
216  mesh->halfedges_begin(),
217  mesh->halfedges_end(),
218  PropertyVisualizer::propertyInfo);
219  } else {
220  visualizeVectorLengthAsColorForEntity2<
221  OpenMesh::HPropHandleT<VectorType> >(
222  mesh,
223  mesh->halfedges_begin(),
224  mesh->halfedges_end(),
225  PropertyVisualizer::propertyInfo);
226  }
227 
228  if (_setDrawMode)
231  }
232  else visualizeHalfedgePropAsStrokes();
233 }
234 
235 template <typename MeshT, typename VectorType>
237 {
238  VectorWidget* const w = (VectorWidget*)PropertyVisualizer::widget;
239  if (w->vectors_colors_rb->isChecked() ||
240  w->vectors_length_color_rb->isChecked()) {
241  if ( !OMPropertyVisualizer<MeshT>::mesh->has_vertex_colors() )
242  OMPropertyVisualizer<MeshT>::mesh->request_vertex_colors();
243 
244  if (w->vectors_colors_rb->isChecked()) {
245  visualizeVectorAsColorForEntity2<
247  OMPropertyVisualizer<MeshT>::mesh,
248  OMPropertyVisualizer<MeshT>::mesh->vertices_begin(),
249  OMPropertyVisualizer<MeshT>::mesh->vertices_end(),
250  PropertyVisualizer::propertyInfo);
251  } else {
252  visualizeVectorLengthAsColorForEntity2<
253  OpenMesh::VPropHandleT<VectorType> >(
254  OMPropertyVisualizer<MeshT>::mesh,
255  OMPropertyVisualizer<MeshT>::mesh->vertices_begin(),
256  OMPropertyVisualizer<MeshT>::mesh->vertices_end(),
257  PropertyVisualizer::propertyInfo);
258  }
259  if (_setDrawMode)
262  }
263  else visualizeVertexPropAsStrokes();
264 }
265 
266 template <typename MeshT, typename VectorType>
268  VectorWidget* w = (VectorWidget*)PropertyVisualizer::widget;
269  MeshT* _mesh = OMPropertyVisualizer<MeshT>::mesh;
270 
271 
272  const double thresh_1 = w->vectors_edges_alpha->value();
273  const double thresh_2 = std::min(thresh_1, w->vectors_edges_alpha->value());
274 
276  if (!_mesh->get_property_handle(prop, PropertyVisualizer::propertyInfo.propName()))
277  throw VizException("Getting PropHandle from mesh for selected property failed.");
278 
279  if (!_mesh->has_edge_colors())
280  _mesh->request_edge_colors();
281  const ACG::Vec4f cold(0, 0, 0, 1.0), hot(0, 1, 0, 1.0), degen(1, 1, 0, 1.0);
282  for (typename MeshT::EdgeIter e_it = _mesh->edges_begin(), e_end = _mesh->edges_end();
283  e_it != e_end; ++e_it) {
284  VectorType p1 = _mesh->property(prop, _mesh->face_handle(_mesh->halfedge_handle(*e_it, 0)));
285  VectorType p2 = _mesh->property(prop, _mesh->face_handle(_mesh->halfedge_handle(*e_it, 1)));
286 
287  ACG::Vec4f color;
288 
289  const char degenerate = ((p1.sqrnorm() < 1e-6) ? 1 : 0) | ((p2.sqrnorm() < 1e-6) ? 2 : 0);
290  if (degenerate == 3) {
291  color = cold;
292  } else if (degenerate == 0) {
293  p1.normalize(); p2.normalize();
294  const double alpha = std::min(1.0, double(std::abs(p1 | p2)));
295  if (alpha < thresh_1)
296  color = hot;
297  else if (alpha > thresh_2)
298  color = cold;
299  else {
300  const double beta = (alpha - thresh_1) / (thresh_2 - thresh_1);
301  color = cold * beta + hot * (1.0 - beta);
302  }
303  } else {
304  color = degen;
305  }
306  _mesh->set_color(*e_it, color);
307  }
309 }
310 
311 template <typename MeshT, typename VectorType>
313 {
314  VectorWidget* vectorWidget = static_cast<VectorWidget*>(PropertyVisualizer::widget);
315 
316  lineNode->clear();
317 
318  typename MeshT::Color color = ACG::to_Vec4f(vectorWidget->lineColor->color());
319 
321 
322  if ( !OMPropertyVisualizer<MeshT>::mesh->get_property_handle(prop, OMPropertyVisualizer<MeshT>::propertyInfo.propName() ) )
323  return;
324 
325  for (typename MeshT::FaceIter f_it = OMPropertyVisualizer<MeshT>::mesh->faces_begin() ; f_it != OMPropertyVisualizer<MeshT>::mesh->faces_end() ; ++f_it){
326 
327  typename MeshT::Point center(0.0, 0.0, 0.0);
328  int vCount = 0;
329 
330  for (typename MeshT::FaceVertexIter fv_it(*(OMPropertyVisualizer<MeshT>::mesh),*f_it); fv_it.is_valid(); ++fv_it){
331  vCount++;
332  center += OMPropertyVisualizer<MeshT>::mesh->point(*fv_it);
333  }
334 
335  center /= vCount;
336 
337  VectorType v = (OMPropertyVisualizer<MeshT>::mesh->property(prop, *f_it));
338  ACG::Vec3d normal = OMPropertyVisualizer<MeshT>::mesh->normal(*f_it);
339 
340  if (vectorWidget->normalize->isChecked() && v.sqrnorm() > 1e-12)
341  v.normalize();
342 
343  if(vectorWidget->scale->isChecked())
344  v *= vectorWidget->scaleBox->value();
345 
346  lineNode->add_line( center, (center+generateVec3AtLocation<VectorType>(v, normal)) );
347  lineNode->add_color(color);
348  }
349 }
350 
351 template <typename MeshT, typename VectorType>
353 {
354  VectorWidget* vectorWidget = static_cast<VectorWidget*>(PropertyVisualizer::widget);
355 
356  lineNode->clear();
357 
358  typename MeshT::Color color = ACG::to_Vec4f(vectorWidget->lineColor->color());
359 
360  //TODO check if this also works if the property is Vec3f
362 
363  if ( !OMPropertyVisualizer<MeshT>::mesh->get_property_handle(prop, OMPropertyVisualizer<MeshT>::propertyInfo.propName() ) )
364  return;
365 
366  for (typename MeshT::EdgeIter e_it = OMPropertyVisualizer<MeshT>::mesh->edges_begin() ; e_it != OMPropertyVisualizer<MeshT>::mesh->edges_end() ; ++e_it){
367 
368  typename MeshT::HalfedgeHandle hh = OMPropertyVisualizer<MeshT>::mesh->halfedge_handle( *e_it, 0 );
369 
370  typename MeshT::VertexHandle vh0 = OMPropertyVisualizer<MeshT>::mesh->from_vertex_handle( hh );
371  typename MeshT::VertexHandle vh1 = OMPropertyVisualizer<MeshT>::mesh->to_vertex_handle( hh );
372 
373  typename MeshT::Point v1 = OMPropertyVisualizer<MeshT>::mesh->point(vh0) + 0.5 * (OMPropertyVisualizer<MeshT>::mesh->point(vh1) - OMPropertyVisualizer<MeshT>::mesh->point(vh0));
374  VectorType v = OMPropertyVisualizer<MeshT>::mesh->property(prop, *e_it);
375  ACG::Vec3d normal = OMPropertyVisualizer<MeshT>::mesh->normal(OMPropertyVisualizer<MeshT>::mesh->halfedge_handle(*e_it, 0));
376 
377  if (vectorWidget->normalize->isChecked() && v.sqrnorm() > 1e-12)
378  v.normalize();
379 
380  if(vectorWidget->scale->isChecked())
381  v *= vectorWidget->scaleBox->value();
382 
383  lineNode->add_line( v1, (v1+generateVec3AtLocation<VectorType>(v, normal)) );
384  lineNode->add_color(color);
385  }
386 }
387 
388 template <typename MeshT, typename VectorType>
390 {
391  VectorWidget* vectorWidget = static_cast<VectorWidget*>(PropertyVisualizer::widget);
392 
393  lineNode->clear();
394 
395  typename MeshT::Color color = ACG::to_Vec4f(vectorWidget->lineColor->color());
396 
397  //TODO check if this also works if the property is Vec3f
399 
400  if ( !OMPropertyVisualizer<MeshT>::mesh->get_property_handle(prop, OMPropertyVisualizer<MeshT>::propertyInfo.propName() ) )
401  return;
402 
403  for (typename MeshT::HalfedgeIter he_it = OMPropertyVisualizer<MeshT>::mesh->halfedges_begin() ; he_it != OMPropertyVisualizer<MeshT>::mesh->halfedges_end() ; ++he_it){
404 
405  typename MeshT::VertexHandle vh0 = OMPropertyVisualizer<MeshT>::mesh->from_vertex_handle( *he_it );
406  typename MeshT::VertexHandle vh1 = OMPropertyVisualizer<MeshT>::mesh->to_vertex_handle( *he_it );
407 
408  typename MeshT::Point v1 = OMPropertyVisualizer<MeshT>::mesh->point(vh0) + 0.5 * (OMPropertyVisualizer<MeshT>::mesh->point(vh1) - OMPropertyVisualizer<MeshT>::mesh->point(vh0));
409  VectorType v = OMPropertyVisualizer<MeshT>::mesh->property(prop, *he_it);
410  ACG::Vec3d normal = OMPropertyVisualizer<MeshT>::mesh->normal(*he_it);
411 
412  if (vectorWidget->normalize->isChecked() && v.sqrnorm() > 1e-12)
413  v.normalize();
414 
415  if(vectorWidget->scale->isChecked())
416  v *= vectorWidget->scaleBox->value();
417 
418  lineNode->add_line( v1, (v1+generateVec3AtLocation<VectorType>(v, normal)) );
419  lineNode->add_color(color);
420  }
421 }
422 
423 template <typename MeshT, typename VectorType>
425 {
426  VectorWidget* vectorWidget = static_cast<VectorWidget*>(PropertyVisualizer::widget);
427 
428  lineNode->clear();
429 
430  typename MeshT::Color color = ACG::to_Vec4f(vectorWidget->lineColor->color());
431 
432  //TODO check if this also works if the property is Vec3f
434 
435  if ( !OMPropertyVisualizer<MeshT>::mesh->get_property_handle(prop, OMPropertyVisualizer<MeshT>::propertyInfo.propName() ) )
436  return;
437 
438  for (typename MeshT::VertexIter v_it = OMPropertyVisualizer<MeshT>::mesh->vertices_begin() ; v_it != OMPropertyVisualizer<MeshT>::mesh->vertices_end() ; ++v_it){
439 
440  typename MeshT::Point v1 = OMPropertyVisualizer<MeshT>::mesh->point( *v_it );
441  VectorType v = OMPropertyVisualizer<MeshT>::mesh->property(prop, *v_it);
442  ACG::Vec3d normal = OMPropertyVisualizer<MeshT>::mesh->normal(*v_it);
443 
444  if (vectorWidget->normalize->isChecked() && v.sqrnorm() > 1e-12)
445  v.normalize();
446 
447  if(vectorWidget->scale->isChecked())
448  v *= vectorWidget->scaleBox->value();
449 
450  lineNode->add_line( v1, (v1+generateVec3AtLocation<VectorType>(v, normal)) );
451  lineNode->add_color(color);
452  }
453 }
454 
455 template <typename MeshT, typename VectorType>
457 {
459  MeshT* mesh = OMPropertyVisualizer<MeshT>::mesh;
460 
461  if ( !mesh->get_property_handle(prop, PropertyVisualizer::propertyInfo.propName() ) )
462  emit this->log(LOGERR, QObject::tr("Error: No property with name ").append(PropertyVisualizer::propertyInfo.propName().c_str()));
463 
464 
465  typename MeshT::FaceHandle fh = mesh->face_handle(index);
466 
467  mesh->property(prop, fh) = this->strToVec2f(text);
468 }
469 
470 template <typename MeshT, typename VectorType>
472 {
474  MeshT* mesh = OMPropertyVisualizer<MeshT>::mesh;
475 
476  if ( !mesh->get_property_handle(prop, PropertyVisualizer::propertyInfo.propName() ) )
477  emit this->log(LOGERR, QObject::tr("Error: No property with name ").append(PropertyVisualizer::propertyInfo.propName().c_str()));
478 
479 
480  typename MeshT::EdgeHandle eh = mesh->edge_handle(index);
481 
482  mesh->property(prop, eh) = this->strToVec2f(text);
483 }
484 
485 template <typename MeshT, typename VectorType>
487 {
489  MeshT* mesh = OMPropertyVisualizer<MeshT>::mesh;
490 
491  if ( !mesh->get_property_handle(prop, PropertyVisualizer::propertyInfo.propName() ) )
492  emit this->log(LOGERR, QObject::tr("Error: No property with name ").append(PropertyVisualizer::propertyInfo.propName().c_str()));
493 
494 
495  typename MeshT::HalfedgeHandle heh = mesh->halfedge_handle(index);
496 
497  mesh->property(prop, heh) = this->strToVec2f(text);
498 }
499 
500 template <typename MeshT, typename VectorType>
502 {
504  MeshT* mesh = OMPropertyVisualizer<MeshT>::mesh;
505 
506  if ( !mesh->get_property_handle(prop, PropertyVisualizer::propertyInfo.propName() ) )
507  emit this->log(LOGERR, QObject::tr("Error: No property with name ").append(PropertyVisualizer::propertyInfo.propName().c_str()));
508 
509 
510  typename MeshT::VertexHandle vh = mesh->vertex_handle(index);
511 
512  mesh->property(prop, vh) = this->strToVec2f(text);
513 }
514 
515 
516 template <typename MeshT, typename VectorType>
518 {
519  OMPropertyVisualizer<MeshT>::template removeProperty_stage1<VectorType>();
520 }
521 
522 template <typename MeshT, typename VectorType>
524 {
525  OMPropertyVisualizer<MeshT>::template duplicateProperty_stage1<VectorType>();
526 }
527 
Class for generating nice colors for doubles.
Definition: ColorCoder.hh:76
void setDrawMode(const ACG::SceneGraph::DrawModes::DrawMode &_mode, int _viewer)
Set the draw Mode of a Viewer. .
virtual QString getPropertyText(unsigned int index)
Returns the value of a property in text form.
DrawMode SOLID_POINTS_COLORED
draw colored, but not lighted faces using interpolated vertex colors
Definition: DrawModes.cc:91
DrawMode EDGES_COLORED
draw edges with colors (without shading)
Definition: DrawModes.cc:83
ACG::SceneGraph::BaseNode * getRootNode()
Get the root node for data objects.
DrawMode HALFEDGES_COLORED
draw halfedges with colors (without shading)
Definition: DrawModes.cc:109
virtual void removeProperty()
Removes the property.
virtual void duplicateProperty()
Duplicates the property.
virtual void clear()
Clears the property.
DrawMode SOLID_FLAT_SHADED
draw flat shaded faces (requires face normals)
Definition: DrawModes.cc:87
virtual void clear()
Clears the property.
Add colors to mesh item (vertices/faces/edges)
Definition: Attributes.hh:88
VectorT< double, 3 > Vec3d
Definition: VectorT.hh:127
Cellection of information about a property.
Definition: Utils.hh:115
DrawMode SOLID_FACES_COLORED
draw colored, but not lighted faces using face colors
Definition: DrawModes.cc:90