GCC Code Coverage Report


Directory: ./
File: src/node.cpp
Date: 2024-08-14 11:04:57
Exec Total Coverage
Lines: 242 457 53.0%
Branches: 223 650 34.3%

Line Branch Exec Source
1 //
2 // node.cpp
3 // gepetto-viewer
4 //
5 // Created by Justin Carpentier, Mathieu Geisert in November 2014.
6 // Copyright (c) 2014 LAAS-CNRS. All rights reserved.
7 //
8
9 #include <gepetto/viewer/node-visitor.h>
10 #include <gepetto/viewer/node.h>
11 #include <gepetto/viewer/window-manager.h>
12
13 #include <climits>
14 #include <osg/LineWidth>
15 #include <osg/Material>
16 #include <osgFX/Outline>
17 #include <osgFX/Scribe>
18
19 #include "log.hh"
20
21 namespace gepetto {
22 namespace viewer {
23 namespace {
24 const osg::StateSetRefPtr& getVisibleStateSet(const LightingMode& mode) {
25 static osg::StateSetRefPtr ssOn, ssOff;
26 switch (mode) {
27 case LIGHT_INFLUENCE_ON:
28 if (false && !ssOn) { // Disable because this is the default.
29 ssOn = osg::StateSetRefPtr(new osg::StateSet());
30 ssOn->setRenderBinToInherit();
31 ssOn->setMode(GL_DEPTH_TEST, ::osg::StateAttribute::ON |
32 ::osg::StateAttribute::PROTECTED);
33 ssOn->setMode(GL_CULL_FACE, ::osg::StateAttribute::OFF |
34 ::osg::StateAttribute::PROTECTED);
35 ssOn->setMode(GL_LIGHTING, ::osg::StateAttribute::ON |
36 ::osg::StateAttribute::PROTECTED);
37 }
38 return ssOn;
39 case LIGHT_INFLUENCE_OFF:
40 if (!ssOff) {
41 ssOff = osg::StateSetRefPtr(new osg::StateSet());
42 ssOff->setRenderBinToInherit();
43 ssOff->setMode(GL_DEPTH_TEST, ::osg::StateAttribute::ON |
44 ::osg::StateAttribute::PROTECTED);
45 ssOff->setMode(GL_CULL_FACE, ::osg::StateAttribute::OFF |
46 ::osg::StateAttribute::PROTECTED);
47 ssOff->setMode(GL_LIGHTING, ::osg::StateAttribute::OFF |
48 ::osg::StateAttribute::PROTECTED);
49 }
50 return ssOff;
51 default:
52 ASSERT(false, "LightingMode is not well defined");
53 break;
54 };
55 }
56
57 const osg::StateSetRefPtr& getAlwaysOnTopStateSet(const LightingMode& mode) {
58 static osg::StateSetRefPtr ssOn, ssOff;
59 switch (mode) {
60 case LIGHT_INFLUENCE_ON:
61 if (!ssOn) { // Disable because this is the default.
62 ssOn = osg::StateSetRefPtr(new osg::StateSet());
63 ssOn->setRenderBinDetails(INT_MAX, "DepthSortedBin");
64 ssOn->setMode(GL_DEPTH_TEST, ::osg::StateAttribute::OFF |
65 ::osg::StateAttribute::PROTECTED);
66 ssOn->setMode(GL_CULL_FACE, ::osg::StateAttribute::ON |
67 ::osg::StateAttribute::PROTECTED);
68 ssOn->setMode(GL_LIGHTING, ::osg::StateAttribute::ON |
69 ::osg::StateAttribute::PROTECTED);
70 }
71 return ssOn;
72 case LIGHT_INFLUENCE_OFF:
73 if (!ssOff) {
74 ssOff = osg::StateSetRefPtr(new osg::StateSet());
75 ssOff->setRenderBinDetails(INT_MAX, "DepthSortedBin");
76 ssOff->setMode(GL_DEPTH_TEST, ::osg::StateAttribute::OFF |
77 ::osg::StateAttribute::PROTECTED);
78 ssOff->setMode(GL_CULL_FACE, ::osg::StateAttribute::ON |
79 ::osg::StateAttribute::PROTECTED);
80 ssOff->setMode(GL_LIGHTING, ::osg::StateAttribute::OFF |
81 ::osg::StateAttribute::PROTECTED);
82 }
83 return ssOff;
84 default:
85 ASSERT(false, "LightingMode is not well defined");
86 break;
87 };
88 }
89
90 1 const osg::StateSetRefPtr& getWireframeStateSet() {
91
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 static osg::StateSetRefPtr ss;
92
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 if (!ss) {
93
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 ss = osg::StateSetRefPtr(new osg::StateSet());
94
95 /* Allowing wireframe mode */
96
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 osg::PolygonModeRefPtr polygon_mode_ptr = new ::osg::PolygonMode;
97
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 polygon_mode_ptr->setMode(::osg::PolygonMode::FRONT_AND_BACK,
98 ::osg::PolygonMode::LINE);
99 1 polygon_mode_ptr->setDataVariance(osg::Object::STATIC);
100
101
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 ::osg::MaterialRefPtr material_wireframe_ptr = new osg::Material;
102 1 material_wireframe_ptr->setColorMode(osg::Material::DIFFUSE);
103
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 material_wireframe_ptr->setDiffuse(osg::Material::FRONT_AND_BACK,
104 1 osgVector4(1., 1., 1., 1.));
105 1 material_wireframe_ptr->setDataVariance(osg::Object::STATIC);
106
107
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 ss->setMode(
108 GL_BLEND,
109 ::osg::StateAttribute::OFF |
110 ::osg::StateAttribute::PROTECTED); // PROTECTED attribut allows
111 // wireframe node to not be
112 // influenced by alpha
113
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 ss->setAttributeAndModes(
114 polygon_mode_ptr,
115 ::osg::StateAttribute::PROTECTED | ::osg::StateAttribute::ON);
116
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 ss->setAttributeAndModes(
117 material_wireframe_ptr,
118 ::osg::StateAttribute::ON | ::osg::StateAttribute::PROTECTED);
119 1 }
120 1 return ss;
121 }
122
123 template <unsigned int state>
124 12 const osg::StateSetRefPtr& getHighlightStateSet() {
125
2/4
✓ Branch 0 taken 6 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 6 times.
✗ Branch 4 not taken.
12 static osg::StateSetRefPtr ss;
126 if (state == 0) return ss;
127
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
12 if (!ss) {
128
3/6
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 6 times.
✗ Branch 9 not taken.
12 ss = osg::StateSetRefPtr(new osg::StateSet());
129
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
12 ::osg::MaterialRefPtr material_switch_ptr = new osg::Material;
130 12 int glModeValue = ::osg::StateAttribute::INHERIT;
131 /// Some color codes are taken from
132 /// http://devernay.free.fr/cours/opengl/materials.html
133 switch (state) {
134 case 1: /// collision
135 2 glModeValue =
136 ::osg::StateAttribute::ON | ::osg::StateAttribute::OVERRIDE;
137 2 material_switch_ptr->setColorMode(osg::Material::AMBIENT);
138
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setDiffuse(osg::Material::FRONT_AND_BACK,
139 2 osgVector4(1.0f, 0.f, 0.f, 1.f));
140
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 material_switch_ptr->setTransparency(osg::Material::FRONT_AND_BACK,
141 0.5f);
142 2 break;
143 case 2: /// selection
144 2 glModeValue = ::osg::StateAttribute::ON |
145 ::osg::StateAttribute::OVERRIDE |
146 ::osg::StateAttribute::PROTECTED;
147 /// Blue
148
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setAmbient(osg::Material::FRONT_AND_BACK,
149 2 osgVector4(0.f, 0.f, 0.f, 1.f));
150
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setDiffuse(osg::Material::FRONT_AND_BACK,
151 2 osgVector4(0.f, 0.f, 1.f, 1.f));
152
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setSpecular(osg::Material::FRONT_AND_BACK,
153 2 osgVector4(0.6f, 0.6f, 0.7f, 1.f));
154
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 material_switch_ptr->setShininess(osg::Material::FRONT_AND_BACK, 128.f);
155 2 break;
156 case 3: /// selection
157 2 glModeValue = ::osg::StateAttribute::ON |
158 ::osg::StateAttribute::OVERRIDE |
159 ::osg::StateAttribute::PROTECTED;
160 /// Red
161
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setAmbient(osg::Material::FRONT_AND_BACK,
162 2 osgVector4(0.f, 0.f, 0.f, 1.f));
163
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setDiffuse(osg::Material::FRONT_AND_BACK,
164 2 osgVector4(1.0f, 0.f, 0.f, 1.f));
165
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setSpecular(osg::Material::FRONT_AND_BACK,
166 2 osgVector4(0.7f, 0.6f, 0.6f, 1.f));
167
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 material_switch_ptr->setShininess(osg::Material::FRONT_AND_BACK, 96.f);
168 2 break;
169 case 4: /// selection
170 2 glModeValue = ::osg::StateAttribute::ON |
171 ::osg::StateAttribute::OVERRIDE |
172 ::osg::StateAttribute::PROTECTED;
173 /// Red plastic
174
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setAmbient(osg::Material::FRONT_AND_BACK,
175 2 osgVector4(0.f, 0.f, 0.f, 1.f));
176
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setDiffuse(osg::Material::FRONT_AND_BACK,
177 2 osgVector4(0.5f, 0.f, 0.f, 1.f));
178
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setSpecular(osg::Material::FRONT_AND_BACK,
179 2 osgVector4(0.7f, 0.6f, 0.6f, 1.f));
180
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 material_switch_ptr->setShininess(osg::Material::FRONT_AND_BACK, 32.f);
181 2 break;
182 case 5: /// selection
183 2 glModeValue = ::osg::StateAttribute::ON |
184 ::osg::StateAttribute::OVERRIDE |
185 ::osg::StateAttribute::PROTECTED;
186 /// Bronze
187
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setAmbient(
188 osg::Material::FRONT_AND_BACK,
189 2 osgVector4(0.2125f, 0.1275f, 0.054f, 1.f));
190
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setDiffuse(
191 osg::Material::FRONT_AND_BACK,
192 2 osgVector4(0.714f, 0.4284f, 0.18144f, 1.f));
193
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setSpecular(
194 osg::Material::FRONT_AND_BACK,
195 2 osgVector4(0.393548f, 0.271906f, 0.166721f, 1.f));
196
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 material_switch_ptr->setShininess(osg::Material::FRONT_AND_BACK, 26.f);
197 2 break;
198 case 6: /// selection
199 2 glModeValue = ::osg::StateAttribute::ON |
200 ::osg::StateAttribute::OVERRIDE |
201 ::osg::StateAttribute::PROTECTED;
202 /// Red rubber
203
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setAmbient(osg::Material::FRONT_AND_BACK,
204 2 osgVector4(0.05f, 0.f, 0.f, 1.f));
205
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setDiffuse(osg::Material::FRONT_AND_BACK,
206 2 osgVector4(0.5f, 0.5f, 0.4f, 1.f));
207
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
4 material_switch_ptr->setSpecular(osg::Material::FRONT_AND_BACK,
208 2 osgVector4(0.7f, 0.04f, 0.04f, 1.f));
209
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
2 material_switch_ptr->setShininess(osg::Material::FRONT_AND_BACK, 10.f);
210 2 break;
211 default:
212 ASSERT(false, "HighlightState is not well defined");
213 break;
214 }
215 12 material_switch_ptr->setDataVariance(osg::Object::STATIC);
216
1/2
✓ Branch 2 taken 6 times.
✗ Branch 3 not taken.
12 ss->setAttributeAndModes(material_switch_ptr, glModeValue);
217 12 }
218 12 return ss;
219 }
220
221 int getNodeVisibilityMode(Node* node) { return node->getVisibilityMode(); }
222 void setNodeVisibilityMode(Node* node, const int& v) {
223 node->setVisibilityMode((VisibilityMode)v);
224 }
225
226 int getNodeWireFrameMode(Node* node) { return node->getWireFrameMode(); }
227 void setNodeWireFrameMode(Node* node, const int& v) {
228 node->setWireFrameMode((WireFrameMode)v);
229 }
230
231 int getNodeLightingMode(Node* node) { return node->getLightingMode(); }
232 void setNodeLightingMode(Node* node, const int& v) {
233 node->setLightingMode((LightingMode)v);
234 }
235
236 void setNodeLandmark(Node* node, bool enable) {
237 if (enable)
238 node->addLandmark(0.05f);
239 else
240 node->deleteLandmark();
241 }
242
243 int getNodeHighlightState(Node* node) { return (int)node->getHighlightState(); }
244 void setNodeHighlightState(Node* node, const int& v) {
245 node->setHighlightState(v);
246 }
247
248 void setFlag(::osg::Node* node, osg::Node::NodeMask bit, bool on) {
249 if (on)
250 node->setNodeMask(node->getNodeMask() | bit);
251 else
252 node->setNodeMask(node->getNodeMask() & ~bit);
253 }
254
255 1 MetaEnum* highlightStateEnum() {
256
2/4
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 static MetaEnum hs;
257
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 if (hs.type.size() == 0) {
258 1 hs.type = "HighlightState";
259
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 hs.names.push_back("None");
260
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 hs.values.push_back(0);
261
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 hs.names.push_back("1");
262
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 hs.values.push_back(1);
263
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 hs.names.push_back("2");
264
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 hs.values.push_back(2);
265
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 hs.names.push_back("3");
266
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 hs.values.push_back(3);
267
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 hs.names.push_back("4");
268
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 hs.values.push_back(4);
269
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 hs.names.push_back("5");
270
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 hs.values.push_back(5);
271
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 hs.names.push_back("6");
272
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 hs.values.push_back(6);
273
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 hs.names.push_back("7");
274
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 hs.values.push_back(7);
275
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
1 hs.names.push_back("8");
276
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 hs.values.push_back(8);
277 }
278 1 return &hs;
279 }
280 } // namespace
281 using ::osg::Matrix;
282
283 const float Node::TransparencyRenderingBinThreshold = 0.99f;
284
285 /* Declaration of private function members */
286 1 void Node::init() {
287 /* Build local conformation
288 <- wireframe_node_ptr_
289 connected to the parent <- switch_node_ptr_ <-
290 auto_transform_ptr_ <- connection of children here
291 <- normal_node_ptr_
292 */
293 1 scale_.value = osgVector3(1, 1, 1);
294 1 scale_.min = 0.f;
295 1 scale_.step = 0.1f;
296 1 scale_.adaptiveDecimal = true;
297
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 scale_.callback(boost::bind(&Node::updateTransform, this));
298
299
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 M_.callback(scale_.callback());
300
301
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 switch_node_ptr_ = new ::osg::Group;
302
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 hl_switch_node_ptr_ = new ::osg::Group;
303
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
1 transform_ptr_ = new ::osg::MatrixTransform;
304
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 transform_ptr_->setName("positionInParentNode");
305
306 1 switch_node_ptr_->setNodeMask(VisibilityBit | NodeBit | IntersectionBit);
307
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 switch_node_ptr_->setName(id_name_);
308
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 wireframe_modes_.resize(2);
309
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 wireframe_modes_[FILL] = new ::osg::Group;
310
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 wireframe_modes_[FILL]->setName("wireframe: FILL");
311
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 wireframe_modes_[WIREFRAME] = new ::osg::Group;
312
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 wireframe_modes_[WIREFRAME]->setName("wireframe: WIREFRAME");
313
314 /* Building hierarchie */
315 1 selected_wireframe_ = FILL;
316
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 switch_node_ptr_->addChild(wireframe_modes_[FILL]);
317
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 wireframe_modes_[FILL]->addChild(hl_switch_node_ptr_);
318 1 wireframe_modes_[FILL]->setDataVariance(osg::Object::STATIC);
319
320 // Setup highlight states
321
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 highlight_nodes_.resize(9);
322 1 selected_highlight_ = 0;
323 1 highlight_enabled_ = true;
324
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 highlight_nodes_[0] = transform_ptr_;
325
2/2
✓ Branch 0 taken 8 times.
✓ Branch 1 taken 1 times.
9 for (unsigned int i = 1; i < 9; ++i) {
326
2/4
✓ Branch 1 taken 8 times.
✗ Branch 2 not taken.
✓ Branch 5 taken 8 times.
✗ Branch 6 not taken.
8 highlight_nodes_[i] = setupHighlightState(i);
327
1/2
✓ Branch 3 taken 8 times.
✗ Branch 4 not taken.
8 highlight_nodes_[i]->addChild(transform_ptr_);
328 }
329 // setHighlightState(0);
330
1/2
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
1 hl_switch_node_ptr_->addChild(highlight_nodes_[selected_highlight_]);
331
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 hl_switch_node_ptr_->setName("highlight switch");
332
333
2/4
✓ Branch 3 taken 1 times.
✗ Branch 4 not taken.
✓ Branch 6 taken 1 times.
✗ Branch 7 not taken.
1 wireframe_modes_[WIREFRAME]->setStateSet(getWireframeStateSet());
334 1 wireframe_modes_[WIREFRAME]->setDataVariance(osg::Object::STATIC);
335
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 geode_ptr_ = NULL;
336 1 alpha_ = 1.;
337
338 1 visibilityMode_ = VISIBILITY_ON;
339 1 lightingMode_ = LIGHT_INFLUENCE_ON;
340
341
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 addProperty(EnumProperty::create(
342
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 "Highlight/State", highlightStateEnum(),
343
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 EnumProperty::Getter_t(boost::bind(getNodeHighlightState, this)),
344
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 EnumProperty::Setter_t(boost::bind(setNodeHighlightState, this, _1))));
345
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 addProperty(BoolProperty::create("Highlight/Enable", this,
346 &Node::getHighlightEnabled,
347 &Node::setHighlightEnabled));
348
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 addProperty(EnumProperty::create(
349
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 "Visibility", visibilityModeEnum(),
350
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 EnumProperty::Getter_t(boost::bind(getNodeVisibilityMode, this)),
351
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 EnumProperty::Setter_t(boost::bind(setNodeVisibilityMode, this, _1))));
352
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 addProperty(EnumProperty::create(
353
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 "WireframeMode", wireFrameModeEnum(),
354
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 EnumProperty::Getter_t(boost::bind(getNodeWireFrameMode, this)),
355
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 EnumProperty::Setter_t(boost::bind(setNodeWireFrameMode, this, _1))));
356
3/6
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
✓ Branch 8 taken 1 times.
✗ Branch 9 not taken.
1 addProperty(EnumProperty::create(
357
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 "LightingMode", lightingModeEnum(),
358
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 EnumProperty::Getter_t(boost::bind(getNodeLightingMode, this)),
359
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 EnumProperty::Setter_t(boost::bind(setNodeLightingMode, this, _1))));
360
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 addProperty(BoolProperty::create(
361 "Landmark",
362
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
2 BoolProperty::getterFromMemberFunction(this, &Node::hasLandmark),
363
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
2 BoolProperty::Setter_t(boost::bind(setNodeLandmark, this, _1))));
364
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 addProperty(BoolProperty::create("Selectable", this, &Node::isSelectable,
365 &Node::setSelectable));
366
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 addProperty(StringProperty::createRO("Name", this, &Node::getID));
367
3/6
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
✓ Branch 9 taken 1 times.
✗ Branch 10 not taken.
1 addProperty(Vector4Property::createWO("Color", this, &Node::setColor));
368
369 RangedFloatProperty::Ptr_t alphaProp = RangedFloatProperty::create(
370
2/4
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 1 times.
✗ Branch 6 not taken.
2 "Alpha", this, &Node::getAlpha, &Node::setAlpha);
371 1 alphaProp->setRange(0.f, 1.f, 0.1f);
372
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 addProperty(alphaProp);
373
374
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 addProperty(&scale_);
375
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 addProperty(&M_);
376 1 }
377
378 1 Node::Node(const std::string& name)
379
6/12
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
✓ Branch 10 taken 1 times.
✗ Branch 11 not taken.
✓ Branch 15 taken 1 times.
✗ Branch 16 not taken.
✓ Branch 19 taken 1 times.
✗ Branch 20 not taken.
✓ Branch 22 taken 1 times.
✗ Branch 23 not taken.
1 : id_name_(name), dirty_(true), scale_("Scale"), M_("Transform") {
380
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 init();
381 1 }
382
383 Node::Node(const Node& other)
384 : id_name_(other.getID()), dirty_(true), scale_("Scale"), M_("Transform") {
385 init();
386 }
387
388 void Node::setSelectable(bool selectable) {
389 setFlag(transform_ptr_.get(), IntersectionBit, selectable);
390 }
391
392 5 void Node::updateTransform() {
393
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 osg::Matrixf M;
394
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 M.setRotate(M_.value.quat);
395
1/2
✓ Branch 1 taken 5 times.
✗ Branch 2 not taken.
5 M.setTrans(M_.value.position);
396
397
6/12
✓ Branch 2 taken 5 times.
✗ Branch 3 not taken.
✓ Branch 5 taken 5 times.
✗ Branch 6 not taken.
✓ Branch 8 taken 5 times.
✗ Branch 9 not taken.
✓ Branch 11 taken 5 times.
✗ Branch 12 not taken.
✓ Branch 14 taken 5 times.
✗ Branch 15 not taken.
✓ Branch 17 taken 5 times.
✗ Branch 18 not taken.
5 transform_ptr_->setMatrix(::osg::Matrix::scale(scale_.value) * Ms_ * M);
398 5 dirty_ = true;
399 5 }
400
401 2 void Node::setStaticTransform(const osgVector3& position, const osgQuat& quat) {
402 2 Ms_.setRotate(quat);
403 2 Ms_.setTrans(position);
404
405 2 updateTransform();
406 2 }
407
408 2 osgQuat Node::getStaticRotation() const {
409 2 osgQuat q, so;
410 2 osgVector3 t, s;
411
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 Ms_.decompose(t, q, s, so);
412 4 return q;
413 }
414
415 2 osgVector3 Node::getStaticPosition() const {
416 2 osgQuat q, so;
417 2 osgVector3 t, s;
418
1/2
✓ Branch 1 taken 2 times.
✗ Branch 2 not taken.
2 Ms_.decompose(t, q, s, so);
419 2 return t;
420 }
421
422 void Node::setVisibilityMode(const VisibilityMode& mode) {
423 if (visibilityMode_ == mode) return;
424 visibilityMode_ = mode;
425 switch (mode) {
426 case VISIBILITY_ON:
427 setFlag(transform_ptr_.get(), VisibilityBit, true);
428 transform_ptr_->setStateSet(getVisibleStateSet(lightingMode_));
429 break;
430 case VISIBILITY_OFF:
431 setFlag(transform_ptr_.get(), VisibilityBit, false);
432 transform_ptr_->setStateSet(getVisibleStateSet(lightingMode_));
433 break;
434 case ALWAYS_ON_TOP:
435 setFlag(transform_ptr_.get(), VisibilityBit, true);
436 transform_ptr_->setStateSet(getAlwaysOnTopStateSet(lightingMode_));
437 break;
438
439 default:
440 ASSERT(false, "mode is not well defined");
441 break;
442 }
443 dirty_ = true;
444 }
445
446 void Node::setLightingMode(const LightingMode& mode) {
447 if (mode == lightingMode_) return;
448 lightingMode_ = mode;
449 switch (visibilityMode_) {
450 case VISIBILITY_ON:
451 case VISIBILITY_OFF:
452 transform_ptr_->setStateSet(getVisibleStateSet(lightingMode_));
453 break;
454 case ALWAYS_ON_TOP:
455 transform_ptr_->setStateSet(getAlwaysOnTopStateSet(lightingMode_));
456 break;
457 default:
458 ASSERT(false, "mode is not well defined");
459 break;
460 }
461 dirty_ = true;
462 }
463
464 LightingMode Node::getLightingMode() const { return lightingMode_; }
465
466 void Node::setWireFrameMode(const WireFrameMode& mode) {
467 if (mode == selected_wireframe_) return;
468 bool fillSelected = (selected_wireframe_ == FILL) ||
469 (selected_wireframe_ == FILL_AND_WIREFRAME);
470 bool wireSelected = (selected_wireframe_ == WIREFRAME) ||
471 (selected_wireframe_ == FILL_AND_WIREFRAME);
472 // 0: keep as it is
473 // 1: select
474 // 2: deselect
475 int selectFill = 0, selectWire = 0;
476 switch (mode) {
477 case FILL:
478 if (wireSelected) selectWire = 2;
479 if (!fillSelected) selectFill = 1;
480 break;
481 case WIREFRAME:
482 if (!wireSelected) selectWire = 1;
483 if (fillSelected) selectFill = 2;
484 break;
485 case FILL_AND_WIREFRAME:
486 if (!wireSelected) selectWire = 1;
487 if (!fillSelected) selectFill = 1;
488 break;
489 default:
490 ASSERT(false, "WireFrameMode set with bad option");
491 break;
492 }
493 switch (selectFill) {
494 case 0:
495 break;
496 case 1:
497 wireframe_modes_[FILL]->addChild(hl_switch_node_ptr_);
498 switch_node_ptr_->addChild(wireframe_modes_[FILL]);
499 break;
500 case 2:
501 wireframe_modes_[FILL]->removeChild(hl_switch_node_ptr_);
502 switch_node_ptr_->removeChild(wireframe_modes_[FILL]);
503 break;
504 default:
505 assert(false && "Wrong action");
506 };
507 switch (selectWire) {
508 case 0:
509 break;
510 case 1:
511 wireframe_modes_[WIREFRAME]->addChild(hl_switch_node_ptr_);
512 switch_node_ptr_->addChild(wireframe_modes_[WIREFRAME]);
513 break;
514 case 2:
515 wireframe_modes_[WIREFRAME]->removeChild(hl_switch_node_ptr_);
516 switch_node_ptr_->removeChild(wireframe_modes_[WIREFRAME]);
517 break;
518 default:
519 assert(false && "Wrong action");
520 };
521 selected_wireframe_ = mode;
522 dirty_ = true;
523 }
524
525 void Node::addLandmark(const float& size) {
526 ::osg::GeometryRefPtr geom_ptr = new ::osg::Geometry();
527
528 /* Define points of the beam */
529 ::osg::Vec3ArrayRefPtr points_ptr = new ::osg::Vec3Array(6);
530 points_ptr->at(0) = osgVector3(0., 0., 0.);
531 points_ptr->at(1) = osgVector3(size, 0., 0.);
532 points_ptr->at(2) = osgVector3(0., 0., 0.);
533 points_ptr->at(3) = osgVector3(0., size, 0.);
534 points_ptr->at(4) = osgVector3(0., 0., 0.);
535 points_ptr->at(5) = osgVector3(0., 0., size);
536
537 /* Define the color */
538 ::osg::Vec4ArrayRefPtr color_ptr = new ::osg::Vec4Array(3);
539 color_ptr->at(0) = osgVector4(1., 0., 0., 1.);
540 color_ptr->at(1) = osgVector4(0., 1., 0., 1.);
541 color_ptr->at(2) = osgVector4(0., 0., 1., 1.);
542
543 geom_ptr->setVertexArray(points_ptr.get());
544 geom_ptr->setColorArray(color_ptr.get());
545 geom_ptr->setColorBinding(::osg::Geometry::BIND_PER_PRIMITIVE_SET);
546 geom_ptr->addPrimitiveSet(new osg::DrawArrays(GL_LINES, 0, 2));
547 geom_ptr->addPrimitiveSet(new osg::DrawArrays(GL_LINES, 2, 2));
548 geom_ptr->addPrimitiveSet(new osg::DrawArrays(GL_LINES, 4, 2));
549
550 transform_ptr_->removeChild(landmark_geode_ptr_);
551 landmark_geode_ptr_ = new osg::Geode();
552 landmark_geode_ptr_->addDrawable(geom_ptr);
553
554 // set Landmark as ALWAYS ON TOP
555 setFlag(landmark_geode_ptr_.get(), VisibilityBit, true);
556 landmark_geode_ptr_->setStateSet(getAlwaysOnTopStateSet(LIGHT_INFLUENCE_OFF));
557
558 transform_ptr_->addChild(landmark_geode_ptr_);
559 dirty_ = true;
560 }
561
562 bool Node::hasLandmark() const { return landmark_geode_ptr_; }
563
564 void Node::deleteLandmark() {
565 if (landmark_geode_ptr_) {
566 transform_ptr_->removeChild(landmark_geode_ptr_);
567 landmark_geode_ptr_.release();
568 dirty_ = true;
569 }
570 }
571
572 8 ::osg::Group* Node::setupHighlightState(unsigned int state) {
573 8 osg::StateSetRefPtr ss;
574
8/9
✓ Branch 0 taken 1 times.
✓ Branch 1 taken 1 times.
✓ Branch 2 taken 1 times.
✓ Branch 3 taken 1 times.
✓ Branch 4 taken 1 times.
✓ Branch 5 taken 1 times.
✓ Branch 6 taken 1 times.
✓ Branch 7 taken 1 times.
✗ Branch 8 not taken.
8 switch (state) {
575 1 case 1: /// collision
576
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 ss = getHighlightStateSet<1>();
577 1 break;
578 1 case 2: /// selection
579
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 ss = getHighlightStateSet<2>();
580 1 break;
581 1 case 3: /// selection
582
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 ss = getHighlightStateSet<3>();
583 1 break;
584 1 case 4: /// selection
585
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 ss = getHighlightStateSet<4>();
586 1 break;
587 1 case 5: /// selection
588
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 ss = getHighlightStateSet<5>();
589 1 break;
590 1 case 6: /// selection
591
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 ss = getHighlightStateSet<6>();
592 1 break;
593 1 case 7: /// Selection through osgFX::Outline
594 {
595
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 osgFX::Outline* outline = new osgFX::Outline;
596
597
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 outline->setWidth(8);
598
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 outline->setColor(osg::Vec4(1, 1, 0, 1));
599 1 outline->setDataVariance(osg::Object::STATIC);
600 1 return outline;
601 } break;
602 1 case 8: /// Selection through osgFX::Outline
603 {
604
2/4
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 1 times.
✗ Branch 5 not taken.
1 osgFX::Scribe* scribe = new osgFX::Scribe;
605
606
1/2
✓ Branch 1 taken 1 times.
✗ Branch 2 not taken.
1 scribe->setWireframeLineWidth(1);
607
1/2
✓ Branch 2 taken 1 times.
✗ Branch 3 not taken.
1 scribe->setWireframeColor(osg::Vec4(1, 1, 0, 1));
608 1 scribe->setDataVariance(osg::Object::STATIC);
609 1 return scribe;
610 } break;
611 case 0:
612 default:
613 break;
614 }
615
2/4
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
✓ Branch 4 taken 6 times.
✗ Branch 5 not taken.
6 osg::Group* node = new ::osg::Group;
616
1/2
✓ Branch 1 taken 6 times.
✗ Branch 2 not taken.
6 node->setStateSet(ss);
617 6 node->setDataVariance(osg::Object::STATIC);
618 6 return node;
619 8 }
620
621 void Node::setHighlightState(unsigned int state) {
622 if (!highlight_enabled_) return;
623 if (state != selected_highlight_ && state < highlight_nodes_.size()) {
624 hl_switch_node_ptr_->replaceChild(highlight_nodes_[selected_highlight_],
625 highlight_nodes_[state]);
626 // Update the child
627 selected_highlight_ = state;
628 dirty_ = true;
629 }
630 }
631
632 void Node::setAlpha(const float& alpha) {
633 if (geode_ptr_.get() == NULL) {
634 log() << "You must initialize a Geode on " << id_name_ << " to use Alpha"
635 << std::endl;
636 return;
637 }
638 osg::StateSet* ss = geode_ptr_.get()->getStateSet();
639 if (ss) {
640 alpha_ = alpha;
641 osg::Material* mat;
642 if (ss->getAttribute(osg::StateAttribute::MATERIAL))
643 mat = dynamic_cast<osg::Material*>(
644 ss->getAttribute(osg::StateAttribute::MATERIAL));
645 else {
646 mat = new osg::Material;
647 ss->setAttribute(mat, osg::StateAttribute::OFF);
648 }
649 mat->setAlpha(osg::Material::FRONT_AND_BACK, alpha);
650 setTransparentRenderingBin(alpha_ < TransparencyRenderingBinThreshold);
651 dirty_ = true;
652 }
653 }
654
655 float Node::getAlpha() const { return alpha_; }
656
657 void Node::setTransparency(const float& transparency) {
658 setAlpha(1.f - transparency);
659 }
660
661 float Node::getTransparency() const { return 1.f - getAlpha(); }
662
663 1 void Node::setTransparentRenderingBin(bool transparent, osg::StateSet* ss) {
664
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (ss == NULL) {
665
1/2
✗ Branch 1 not taken.
✓ Branch 2 taken 1 times.
1 if (geode_ptr_.get() == NULL) {
666 log() << "You must initialize a Geode on " << id_name_ << " to use Alpha"
667 << std::endl;
668 return;
669 }
670 1 ss = geode_ptr_.get()->getStateSet();
671
1/2
✗ Branch 0 not taken.
✓ Branch 1 taken 1 times.
1 if (ss == NULL) return;
672 }
673 bool isTransparent =
674 1 (ss->getRenderingHint() == osg::StateSet::TRANSPARENT_BIN);
675
1/2
✓ Branch 0 taken 1 times.
✗ Branch 1 not taken.
1 if (transparent == isTransparent) return;
676 if (transparent)
677 ss->setRenderingHint(osg::StateSet::TRANSPARENT_BIN);
678 else
679 ss->setRenderingHint(osg::StateSet::DEFAULT_BIN);
680 dirty_ = true;
681 }
682
683 2 Node::~Node() {
684 /* Proper deletion */
685 /* deleting the top most node (switch_node_ptr_) will delete everything else.
686 * Loop over the parents of switch_node_ptr_ and remove references to it.
687 */
688 typedef ::osg::Node::ParentList PL_t;
689 2 PL_t parents = switch_node_ptr_->getParents();
690
1/2
✗ Branch 5 not taken.
✓ Branch 6 taken 1 times.
2 for (PL_t::const_iterator _p = parents.begin(); _p != parents.end(); ++_p)
691 (*_p)->removeChild(switch_node_ptr_);
692 }
693
694 2 const Configuration& Node::getGlobalTransform() const { return M_.value; }
695
696 void Node::traverse(NodeVisitor& /*visitor*/) {}
697
698 osg::ref_ptr<osg::Node> Node::getOsgNode() const { return geode_ptr_.get(); }
699
700 /* End of declaration of public function members */
701
702 } /* namespace viewer */
703
704 } /* namespace gepetto */
705