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 |