GCC Code Coverage Report


Directory: ./
File: src/node.cpp
Date: 2025-04-14 11:18:00
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