ATLAS Offline Software
Loading...
Searching...
No Matches
VP1HEPVisUtils.cxx
Go to the documentation of this file.
1/*
2 Copyright (C) 2002-2017 CERN for the benefit of the ATLAS collaboration
3*/
4
5
7// //
8// Implementation of class VP1HEPVisUtils //
9// //
10// Author: Thomas H. Kittelmann (Thomas.Kittelmann@cern.ch) //
11// Initial version: November 2008 //
12// Update: Giorgi Gvaberidze (ggvaberi@cern.ch) //
13// Update version: November 2010 //
14// //
16
18
19#include <Inventor/C/errors/debugerror.h>
20#include <Inventor/nodes/SoSelection.h>
21#include <Inventor/nodes/SoSeparator.h>
22#include <Inventor/nodes/SoSwitch.h>
23//---
24#include <Inventor/nodes/SoSphere.h>
25
34
35#include <Inventor/nodes/SoIndexedFaceSet.h>
36#include <Inventor/nodes/SoVertexProperty.h>
38
39#include <iostream>//fixme
40
41//____________________________________________________________________
43public:
44 template <class T>
45 static SoNode * convertToAlternateRep(SoNode *);
46
47 template <class T>
48 static void clearAlternateRep(SoNode *);
49
50 template <class T>
51 static void updateAlternateRepIfNull(SoNode *);
52
53 static bool isGroup(SoNode* n);
54 static bool isNonCustomTree(SoGroup* g);
55 static SoGroup * convertToStandardGroupNode(SoGroup* g,bool transferChildren);
56 static SoGroup * convertToStandardScene(SoGroup* g);
57 static void updateAllNullAlternativeReps(SoGroup*g);
58};
59
60//____________________________________________________________________
62{
63 if (!g)
64 return true;//well...
65
66 if (isCustomNode(g))
67 return false;
68
69 for (int i = 0; i<g->getNumChildren();++i) {
70 SoNode * n = g->getChild(i);
71 if ( Imp::isGroup(n) ) {
72 if (!isNonCustomTree(static_cast<SoGroup*>(n)))
73 return false;
74 } else {
75 if (isCustomNode(n))
76 return false;
77 }
78 }
79 return true;
80}
81
82//____________________________________________________________________
83SoGroup * VP1HEPVisUtils::Imp::convertToStandardGroupNode(SoGroup* g,bool transferChildren)
84{
85 //Create new non-custom node and transfer relevant fields:
86 SoGroup * newgroup(0);
87 if ( g->getTypeId().isDerivedFrom(SoSeparator::getClassTypeId()) &&
88 ! g->getTypeId().isDerivedFrom(SoSelection::getClassTypeId()) ) {
89 SoSeparator * sep = new SoSeparator;
90 SoSeparator * origsep = static_cast<SoSeparator*>(g);
91 sep->renderCaching.setValue(origsep->renderCaching.getValue());
92 sep->boundingBoxCaching.setValue(origsep->boundingBoxCaching.getValue());
93 sep->renderCulling.setValue(origsep->renderCulling.getValue());
94 sep->pickCulling.setValue(origsep->pickCulling.getValue());
95 newgroup = sep;
96 } else if ( g->getTypeId().isDerivedFrom(SoSelection::getClassTypeId()) ) {
97 SoSelection * sel = new SoSelection;
98 SoSelection * origsel = static_cast<SoSelection*>(g);
99 sel->renderCaching.setValue(origsel->renderCaching.getValue());
100 sel->boundingBoxCaching.setValue(origsel->boundingBoxCaching.getValue());
101 sel->renderCulling.setValue(origsel->renderCulling.getValue());
102 sel->pickCulling.setValue(origsel->pickCulling.getValue());
103 sel->policy.setValue(origsel->policy.getValue());
104 newgroup = sel;
105 } else if ( g->getTypeId().isDerivedFrom(SoSwitch::getClassTypeId()) ) {
106 SoSwitch *sw = new SoSwitch;
107 sw->whichChild.setValue(static_cast<SoSwitch*>(g)->whichChild.getValue());
108 newgroup = sw;
109 } else {
110 //Everything else is just treated like a group (we could add more specialisations):
111 newgroup = new SoGroup;
112 }
113
114 //Transfer name:
115 newgroup->setName(g->getName());
116
117 //Transfer children:
118 if (transferChildren)
119 for (int i = 0; i<g->getNumChildren();++i)
120 newgroup->addChild(g->getChild(i));
121
122 return newgroup;
123}
124
125//____________________________________________________________________
127{
129 return g;
130
131 //We have to change something underneath, so we must get a new (and non-custom) group node:
132 SoGroup * thegroup = convertToStandardGroupNode(g,false/*don't transfer children*/);
133 if (!thegroup)
134 std::cout <<"BAAAAAAAAAD!"<<std::endl;
135 for (int i = 0; i<g->getNumChildren();++i) {
136 SoNode * n = g->getChild(i);
137 if (isGroup(n)) {
138 SoGroup * standard = convertToStandardScene(static_cast<SoGroup*>(n));
139 if (standard)
140 thegroup->addChild(standard);
141 else
142 std::cout <<"BAD 1"<<std::endl;
143 } else {
144 SoNode * ntoadd = isCustomNode(n)?convertCustomNodeToAlternateRep(n):n;
145 if (ntoadd)
146 thegroup->addChild(isCustomNode(n)?convertCustomNodeToAlternateRep(n):n);
147 else
148 std::cout <<"BAD 2"<<std::endl;
149 }
150 }
151
152 return thegroup;
153}
154
155
156//____________________________________________________________________
158{
159 if (!g)
160 return 0;
161
163
165 return g;
166
167
168 g->ref();
169
171
172 SoGroup* thegroup = Imp::convertToStandardScene(g);
173 thegroup->ref();
174
176
177 g->unrefNoDelete();
178 thegroup->unrefNoDelete();
179 return thegroup;
180}
181
182//____________________________________________________________________
184{
185 if (!n)
186 return false;
187
188 return n->getNodeType() & SoNode::EXTENSION;
189}
190
191//____________________________________________________________________
192template <class T>
194{
195 if (!n)
196 return 0;
197 T * t = static_cast<T*>(n);
198 SoNode * n_alt = t->alternateRep.getValue();
199 if (n_alt) {
200 //Don't clear the alternateRep, since it was there before.
201 } else {
202 t->generateAlternateRep();
203 n_alt = t->alternateRep.getValue();
204 if (n_alt) {
205 //Clear the alternateRep, since it was not there before.
206 n_alt->ref();
207 t->clearAlternateRep();
208 n_alt->unrefNoDelete();
209 } else {
210 return 0;
211 }
212 }
213 n_alt->setName(n->getName());
214 return n_alt;
215}
216
217//____________________________________________________________________
218template <class T>
220{
221 T * t = static_cast<T*>(n);
222 if (t&&t->alternateRep.getValue())
223 t->clearAlternateRep();
224}
225
226//____________________________________________________________________
227template <class T>
229{
230 T * t = static_cast<T*>(n);
231 if (t&&!t->alternateRep.getValue()) {
232 t->generateAlternateRep();
233 t->clearAlternateRep();
234 }
235}
236
237//____________________________________________________________________
239{
240 if (!n)
241 return 0;
242
244
245 if ( n->getTypeId().isDerivedFrom(SoCons::getClassTypeId()) ) return Imp::convertToAlternateRep<SoCons>(n);
246 if ( n->getTypeId().isDerivedFrom(SoLAr::getClassTypeId()) ) return Imp::convertToAlternateRep<SoLAr>(n);
247//NOT IMPLEMENTED if ( n->getTypeId().isDerivedFrom(SoPcons::getClassTypeId()) ) return Imp::convertToAlternateRep<SoPcons>(n);
248 if ( n->getTypeId().isDerivedFrom(SoPcons::getClassTypeId()) ) return Imp::convertToAlternateRep<SoPcons>(n);
249 if ( n->getTypeId().isDerivedFrom(SoGenericBox::getClassTypeId()) ) return Imp::convertToAlternateRep<SoGenericBox>(n);
250 if ( n->getTypeId().isDerivedFrom(SoTubs::getClassTypeId()) ) return Imp::convertToAlternateRep<SoTubs>(n);
251 if ( n->getTypeId().isDerivedFrom(SoPolyhedron::getClassTypeId()) ) return Imp::convertToAlternateRep<SoPolyhedron>(n);
252 if ( n->getTypeId().isDerivedFrom(SoTessellated::getClassTypeId()) ) return Imp::convertToAlternateRep<SoTessellated>(n);
253
254 //A bit special. Probably should not get called here.
255 if ( Imp::isGroup(n) ) return Imp::convertToStandardGroupNode(static_cast<SoGroup*>(n),false /*transferChildren*/);
256 SoGroup * g = new SoGroup;
257 return g;//fixme: share this
258}
259
260//____________________________________________________________________
262{
263 return n->getTypeId().isDerivedFrom(SoGroup::getClassTypeId());
264}
265
266//____________________________________________________________________
268{
269 for (int i = 0; i<g->getNumChildren();++i) {
270 SoNode * n = g->getChild(i);
271 if ( Imp::isGroup(n) ) {
272 updateAllNullAlternativeReps(static_cast<SoGroup*>(n));
273 } else if (VP1HEPVisUtils::isCustomNode(n)) {
274 if ( n->getTypeId().isDerivedFrom(SoCons::getClassTypeId()) ) return Imp::updateAlternateRepIfNull<SoCons>(n);
275 if ( n->getTypeId().isDerivedFrom(SoLAr::getClassTypeId()) ) return Imp::updateAlternateRepIfNull<SoLAr>(n);
276 //NOT IMPLEMENTED if ( n->getTypeId().isDerivedFrom(SoPcons::getClassTypeId()) ) return Imp::updateAlternateRepIfNull<SoPcons>(n);
277 if ( n->getTypeId().isDerivedFrom(SoPcons::getClassTypeId()) ) return Imp::updateAlternateRepIfNull<SoPcons>(n);
278 if ( n->getTypeId().isDerivedFrom(SoGenericBox::getClassTypeId()) ) return Imp::updateAlternateRepIfNull<SoGenericBox>(n);
279 if ( n->getTypeId().isDerivedFrom(SoTubs::getClassTypeId()) ) return Imp::updateAlternateRepIfNull<SoTubs>(n);
280 if ( n->getTypeId().isDerivedFrom(SoPolyhedron::getClassTypeId()) ) return Imp::updateAlternateRepIfNull<SoPolyhedron>(n);
281 if ( n->getTypeId().isDerivedFrom(SoTessellated::getClassTypeId()) ) return Imp::updateAlternateRepIfNull<SoTessellated>(n);
282 }
283 }
284}
285
286//____________________________________________________________________
288{
289 clearAllAlternativeReps(g);//To make sure all altReps. are NULL
290 //(thus, we only update those with null,
291 //avoiding repeated updates on shared
292 //instances)
294}
295
296//____________________________________________________________________
298{
299 for (int i = 0; i<g->getNumChildren();++i) {
300 SoNode * n = g->getChild(i);
301 if ( Imp::isGroup(n) ) {
302 clearAllAlternativeReps(static_cast<SoGroup*>(n));
303 } else if (isCustomNode(n)) {
304 if ( n->getTypeId().isDerivedFrom(SoCons::getClassTypeId()) ) return Imp::clearAlternateRep<SoCons>(n);
305 if ( n->getTypeId().isDerivedFrom(SoLAr::getClassTypeId()) ) return Imp::clearAlternateRep<SoLAr>(n);
306 //NOT IMPLEMENTED if ( n->getTypeId().isDerivedFrom(SoPcons::getClassTypeId()) ) return Imp::clearAlternateRep<SoPcons>(n);
307 if ( n->getTypeId().isDerivedFrom(SoPcons::getClassTypeId()) ) return Imp::clearAlternateRep<SoPcons>(n);
308 if ( n->getTypeId().isDerivedFrom(SoGenericBox::getClassTypeId()) ) return Imp::clearAlternateRep<SoGenericBox>(n);
309 if ( n->getTypeId().isDerivedFrom(SoTubs::getClassTypeId()) ) return Imp::clearAlternateRep<SoTubs>(n);
310 if ( n->getTypeId().isDerivedFrom(SoPolyhedron::getClassTypeId()) ) return Imp::clearAlternateRep<SoPolyhedron>(n);
311 if ( n->getTypeId().isDerivedFrom(SoTessellated::getClassTypeId()) ) return Imp::clearAlternateRep<SoTessellated>(n);
312 }
313 }
314}
315
316//____________________________________________________________________
static void initClass()
Class Initializer, required.
Definition SoCons.cxx:59
static void initClass()
static void initClass()
Class Initializer, required.
Definition SoLAr.cxx:62
static void initClass()
Class Initializer, required.
Definition SoPcons.cxx:67
static void initClass()
static void initClass()
static void initClass()
static void initClass()
Class Initializer, required.
Definition SoTubs.cxx:63
static SoGroup * convertToStandardScene(SoGroup *g)
static SoNode * convertToAlternateRep(SoNode *)
static void updateAlternateRepIfNull(SoNode *)
static void clearAlternateRep(SoNode *)
static SoGroup * convertToStandardGroupNode(SoGroup *g, bool transferChildren)
static bool isGroup(SoNode *n)
static bool isNonCustomTree(SoGroup *g)
static void updateAllNullAlternativeReps(SoGroup *g)
static void clearAllAlternativeReps(SoGroup *)
static bool isCustomNode(SoNode *)
static SoNode * convertCustomNodeToAlternateRep(SoNode *)
static SoGroup * convertToStandardScene(SoGroup *)
static void initAllCustomClasses()
static void updateAllAlternativeReps(SoGroup *)