56 assert(
m_d->nodes2extrasep.find(
node)==
m_d->nodes2extrasep.end());
58 if (
m_d->nodes2extrasep.find(
node)!=
m_d->nodes2extrasep.end())
59 VP1Msg::message(
"VP1ExtraSepLayerHelper::addNode ERROR: Node already added!");
62 if (
m_d->topsep->getNumChildren()==0) {
63 SoSeparator * sep =
new SoSeparator;
65 sep->setName(
"SepHelperInternalSep");
66 sep->renderCaching.setValue(SoSeparator::ON);
67 sep->boundingBoxCaching.setValue(SoSeparator::ON);
69 m_d->topsep->addChild(sep);
75 assert(
m_d->topsep->getChild(
m_d->topsep->getNumChildren()-1)->getTypeId().isDerivedFrom(SoSeparator::getClassTypeId()));
76 SoSeparator * lastsep =
static_cast<SoSeparator*
>(
m_d->topsep->getChild(
m_d->topsep->getNumChildren()-1));
77 if (lastsep->getNumChildren()<
m_d->limitpersep) {
78 lastsep->addChild(
node);
79 m_d->nodes2extrasep[
node]=lastsep;
84 SoSeparator * sep =
new SoSeparator;
86 sep->setName(
"SepHelperInternalSep");
87 sep->renderCaching.setValue(SoSeparator::ON);
88 sep->boundingBoxCaching.setValue(SoSeparator::ON);
90 m_d->topsep->addChild(sep);
97 assert(
m_d->nodes2extrasep.find(
node)!=
m_d->nodes2extrasep.end());
99 if (
m_d->nodes2extrasep.find(
node)==
m_d->nodes2extrasep.end())
100 VP1Msg::message(
"VP1ExtraSepLayerHelper::removeNode ERROR: Node not added previously!");
104 SoSeparator * extrasep =
m_d->nodes2extrasep[
node];
105 assert(extrasep->findChild(
node)>-1);
106 assert(
m_d->topsep->getChild(
m_d->topsep->getNumChildren()-1)->getTypeId()==SoSeparator::getClassTypeId());
107 SoSeparator * lastsep =
static_cast<SoSeparator*
>(
m_d->topsep->getChild(
m_d->topsep->getNumChildren()-1));
108 assert(lastsep->getNumChildren()>0);
112 extrasep->removeChild(
node);
114 m_d->nodes2extrasep.erase(
m_d->nodes2extrasep.find(
node));
117 if (lastsep!=extrasep&&lastsep->getNumChildren()>0) {
118 SoNode * othernode = lastsep->getChild(lastsep->getNumChildren()-1);
120 lastsep->removeChild(othernode);
121 extrasep->addChild(othernode);
123 m_d->nodes2extrasep[othernode] = extrasep;
127 if (lastsep->getNumChildren()==0) {
129 m_d->topsep->removeChild(lastsep);
137 ++(
m_d->largechangessave);
138 m_d->topsep->enableNotify(
false);
145 int n =
m_d->topsep->getNumChildren();
146 for (
int i = 0; i < n; ++i)
147 m_d->topsep->getChild(i)->enableNotify(
false);
149 std::map<SoMaterial*,std::pair<SoSeparator*,VP1ExtraSepLayerHelper*> >
::iterator it, itE =
m_d->mat2sepandhelper.end();
150 for (it =
m_d->mat2sepandhelper.begin(); it!=itE;++it)
151 it->second.second->largeChangesBegin();
158 if (
m_d->largechangessave<=0)
160 if (--(
m_d->largechangessave)!=0)
163 std::map<SoMaterial*,std::pair<SoSeparator*,VP1ExtraSepLayerHelper*> >
::iterator it, itE =
m_d->mat2sepandhelper.end();
164 for (it =
m_d->mat2sepandhelper.begin(); it!=itE;++it)
165 it->second.second->largeChangesEnd();
167 int n =
m_d->topsep->getNumChildren();
168 for (
int i = 0; i < n; ++i) {
169 m_d->topsep->getChild(i)->enableNotify(
true);
170 m_d->topsep->getChild(i)->touch();
173 m_d->topsep->enableNotify(
true);
174 m_d->topsep->touch();
194 std::map<SoMaterial*,std::pair<SoSeparator*,VP1ExtraSepLayerHelper*> >
::iterator it =
m_d->mat2sepandhelper.find(mat);
195 if (it==
m_d->mat2sepandhelper.end()) {
197 SoSeparator * matsep =
new SoSeparator;
199 matsep->setName(
"SepHelperInternalSep_MatSep");
201 matsep->addChild(mat);
202 SoSeparator * sep =
new SoSeparator;
204 sep->setName(
"SepHelperInternalSep_InternalSepHelperTop");
205 matsep->addChild(sep);
207 m_d->mat2sepandhelper[mat] = std::pair<SoSeparator*,VP1ExtraSepLayerHelper*>(matsep,mathelper);
211 it->second.second->addNode(
node);
218 std::map<SoMaterial*,std::pair<SoSeparator*,VP1ExtraSepLayerHelper*> >
::iterator it =
m_d->mat2sepandhelper.find(mat);
219 if (it==
m_d->mat2sepandhelper.end())
221 it->second.second->removeNode(
node);
222 if (it->second.second->topSeparator()->getNumChildren()==0) {
225 it->second.first->unref();
226 m_d->mat2sepandhelper.erase(it);