VisualizationPolygon.h
Go to the documentation of this file.
1 #pragma once
2 
4 
5 #include <RobotAPI/interface/ArViz/Elements.h>
6 
7 #include "ElementVisualizer.h"
8 #include <Inventor/nodes/SoCoordinate3.h>
9 #include <Inventor/nodes/SoDrawStyle.h>
10 #include <Inventor/nodes/SoFaceSet.h>
11 #include <Inventor/nodes/SoLineSet.h>
12 #include <Inventor/nodes/SoMaterial.h>
13 
14 namespace armarx::viz::coin
15 {
17  {
18  using ElementType = data::ElementPolygon;
19 
21  {
22  coordinate3 = new SoCoordinate3;
23 
24  faceSet = new SoFaceSet;
25 
26  // create line around polygon
27  SoSeparator* lineSep = new SoSeparator;
28 
29  lineMaterial = new SoMaterial;
30  lineSep->addChild(lineMaterial);
31  lineSep->addChild(coordinate3);
32 
33  lineStyle = new SoDrawStyle();
34  lineSep->addChild(lineStyle);
35 
36  lineSet = new SoLineSet;
37  lineSep->addChild(lineSet);
38 
39  node->addChild(coordinate3);
40  node->addChild(faceSet);
41  node->addChild(lineSep);
42  }
43 
44  bool
45  update(ElementType const& element)
46  {
47  if (element.points.size() < 3)
48  {
49  // A polygon with < 3 points is invalid.
50  ARMARX_WARNING << deactivateSpam(1000) << "Ignoring polygon '" << element.id << "' "
51  << "with " << element.points.size() << " points "
52  << "(a polygon requires >= 3 points).";
53  return true;
54  }
55 
56  int pointSize = (int)element.points.size();
57 
58  int i = 0;
59  coordinate3->point.setNum(pointSize + 1);
60  for (auto& point : element.points)
61  {
62  SbVec3f pt(point.e0, point.e1, point.e2);
63  coordinate3->point.set1Value(i, pt);
64  i += 1;
65  }
66 
67  if (pointSize > 0)
68  {
69  // Add the first element as last element to close the loop
70  auto& first = element.points.front();
71  SbVec3f pt0(first.e0, first.e1, first.e2);
72  coordinate3->point.set1Value(pointSize, pt0);
73  }
74 
75  faceSet->numVertices.set1Value(0, pointSize);
76 
77  // Line around polygon
78  const float conv = 1.0f / 255.0f;
79  float r = element.lineColor.r * conv;
80  float g = element.lineColor.g * conv;
81  float b = element.lineColor.b * conv;
82  float a = element.lineColor.a * conv;
83  lineMaterial->diffuseColor.setValue(r, g, b);
84  lineMaterial->ambientColor.setValue(r, g, b);
85  lineMaterial->transparency.setValue(1.0f - a);
86 
87  if (element.lineWidth > 0.0f)
88  {
89  lineStyle->lineWidth.setValue(element.lineWidth);
90  }
91  else
92  {
93  lineStyle->style = SoDrawStyleElement::INVISIBLE;
94  }
95 
96  lineSet->numVertices.set1Value(0, pointSize + 1);
97 
98  return true;
99  }
100 
101  SoCoordinate3* coordinate3;
102  SoFaceSet* faceSet;
103  SoDrawStyle* lineStyle;
104  SoLineSet* lineSet;
105  SoMaterial* lineMaterial;
106  };
107 } // namespace armarx::viz::coin
ElementVisualizer.h
armarx::viz::coin::TypedElementVisualization
Definition: ElementVisualizer.h:52
deactivateSpam
SpamFilterDataPtr deactivateSpam(SpamFilterDataPtr const &spamFilter, float deactivationDurationSec, const std::string &identifier, bool deactivate)
Definition: Logging.cpp:75
armarx::viz::coin::VisualizationPolygon::lineSet
SoLineSet * lineSet
Definition: VisualizationPolygon.h:104
armarx::ctrlutil::a
double a(double t, double a0, double j)
Definition: CtrlUtil.h:45
armarx::viz::coin::TypedElementVisualization< SoSeparator >::node
NodeType * node
Definition: ElementVisualizer.h:67
armarx::viz::coin::VisualizationPolygon::lineStyle
SoDrawStyle * lineStyle
Definition: VisualizationPolygon.h:103
armarx::viz::coin
Definition: ElementVisualizer.cpp:11
armarx::viz::coin::VisualizationPolygon::faceSet
SoFaceSet * faceSet
Definition: VisualizationPolygon.h:102
armarx::viz::coin::VisualizationPolygon
Definition: VisualizationPolygon.h:16
armarx::viz::coin::VisualizationPolygon::VisualizationPolygon
VisualizationPolygon()
Definition: VisualizationPolygon.h:20
armarx::viz::coin::VisualizationPolygon::ElementType
data::ElementPolygon ElementType
Definition: VisualizationPolygon.h:18
Logging.h
armarx::viz::coin::VisualizationPolygon::update
bool update(ElementType const &element)
Definition: VisualizationPolygon.h:45
ARMARX_WARNING
#define ARMARX_WARNING
Definition: Logging.h:193
armarx::viz::coin::VisualizationPolygon::lineMaterial
SoMaterial * lineMaterial
Definition: VisualizationPolygon.h:105
armarx::viz::coin::VisualizationPolygon::coordinate3
SoCoordinate3 * coordinate3
Definition: VisualizationPolygon.h:101