ElementVisualizer.h
Go to the documentation of this file.
1#pragma once
2
3#include <memory>
4
5#include <RobotAPI/interface/ArViz/Elements.h>
6
7#include <Inventor/nodes/SoSeparator.h>
8#include <Inventor/nodes/SoSwitch.h>
9
10namespace armarx::viz::data
11{
12 class Element;
13}
14
15class SoUnits;
16class SoTransform;
17class SoMaterial;
18
19namespace armarx::viz::coin
20{
22 {
24
25 virtual ~ElementVisualization() = default;
26
27 void updateBase(data::Element const& element);
28
29 SoSeparator* separator;
30 SoUnits* units;
31 SoTransform* transform;
32 SoMaterial* material;
33 SoSwitch* switch_;
34 // TODO: Transform to flag system
35 bool wasUpdated = true;
36 bool visible = true;
37 };
38
40 {
41 public:
42 virtual ~ElementVisualizer() = default;
43
44 std::unique_ptr<ElementVisualization> create(data::Element const& element);
45 bool update(data::Element const& element, ElementVisualization* visu);
46
48 virtual bool updateDerived(data::Element const& element, ElementVisualization* data) = 0;
49 };
50
51 template <typename NodeT>
53 {
54 using NodeType = NodeT;
55
57 {
58 node = new NodeType;
59 node->ref();
60 }
61
63 {
64 node->unref();
65 }
66
68 };
69
70 template <typename DataT>
72 {
73 public:
74 using DataType = DataT;
75 using ElementType = typename DataType::ElementType;
76
79 {
80 DataType* result = new DataType;
81 result->switch_->addChild(result->node);
82 return result;
83 }
84
85 bool
86 updateDerived(data::Element const& element_, ElementVisualization* data_) final
87 {
88 auto const& element = static_cast<ElementType const&>(element_);
89 auto* data = dynamic_cast<DataType*>(data_);
90
91 if (data)
92 {
93 bool hidden = (element.flags & armarx::viz::data::ElementFlags::HIDDEN);
94 if (hidden)
95 {
96 if (data->visible)
97 {
98 data->separator->removeChild(data->node);
99 data->visible = false;
100 }
101 }
102 else if (!data->visible)
103 {
104 data->visible = true;
105 data->separator->addChild(data->node);
106 }
107
108 // We want to call update with the correctly downcasted arguments
109 return data->update(element);
110 }
111 return false;
112 }
113 };
114} // namespace armarx::viz::coin
virtual ElementVisualization * createDerived()=0
virtual bool updateDerived(data::Element const &element, ElementVisualization *data)=0
std::unique_ptr< ElementVisualization > create(data::Element const &element)
bool update(data::Element const &element, ElementVisualization *visu)
typename DataType::ElementType ElementType
bool updateDerived(data::Element const &element_, ElementVisualization *data_) final
void updateBase(data::Element const &element)