// Documented in superclass. Overridden to add highlighting after the // "ordinary" rendering. void SoLineHighlightRenderAction::apply(SoNode * node) { SoGLRenderAction::apply(node); if (this->hlVisible) { if (PRIVATE(this)->searchaction == NULL) { PRIVATE(this)->searchaction = new SoSearchAction; } // Coin, and SGI Inventor, only supports one Selection node in a // graph, so just search for the first one to avoid that the whole // scene graph is searched const SbBool searchall = FALSE; PRIVATE(this)->searchaction->setType(SoSelection::getClassTypeId()); PRIVATE(this)->searchaction->setInterest(searchall ? SoSearchAction::ALL : SoSearchAction::FIRST); PRIVATE(this)->searchaction->apply(node); if (searchall) { const SoPathList & pathlist = PRIVATE(this)->searchaction->getPaths(); if (pathlist.getLength() > 0) { int i; for (i = 0; i < pathlist.getLength(); i++) { SoFullPath * path = static_cast<SoFullPath *>(pathlist[i]); assert(path); SoSelection * selection = static_cast<SoSelection *>(path->getTail()); if (selection->getNumSelected() > 0) PRIVATE(this)->drawBoxes(path, selection->getList()); } } } else { SoFullPath * path = static_cast<SoFullPath *>(PRIVATE(this)->searchaction->getPath()); if (path) { SoSelection * selection = static_cast<SoSelection *>(path->getTail()); assert(selection->getTypeId().isDerivedFrom(SoSelection::getClassTypeId())); if (selection->getNumSelected() > 0) { PRIVATE(this)->drawBoxes(path, selection->getList()); } } } // reset action to clear path PRIVATE(this)->searchaction->reset(); } }
// Documented in superclass. Overridden to add highlighting after the // "ordinary" rendering. void SoBoxHighlightRenderAction::apply(SoNode * node) { SoGLRenderAction::apply(node); if (this->hlVisible) { if (PRIVATE(this)->searchaction == NULL) { PRIVATE(this)->searchaction = new SoSearchAction; } const SbBool searchall = FALSE; PRIVATE(this)->searchaction->setType(SoSelection::getClassTypeId()); PRIVATE(this)->searchaction->setInterest(searchall ? SoSearchAction::ALL : SoSearchAction::FIRST); PRIVATE(this)->searchaction->apply(node); if (searchall) { const SoPathList & pathlist = PRIVATE(this)->searchaction->getPaths(); if (pathlist.getLength() > 0) { int i; for (i = 0; i < pathlist.getLength(); i++) { SoFullPath * path = static_cast<SoFullPath *>(pathlist[i]); assert(path); SoSelection * selection = static_cast<SoSelection *>(path->getTail()); if (selection->getNumSelected() > 0) this->drawBoxes(path, selection->getList()); } } } else { SoFullPath * path = static_cast<SoFullPath *>(PRIVATE(this)->searchaction->getPath()); if (path) { SoSelection * selection = static_cast<SoSelection *>(path->getTail()); if (selection->getNumSelected()) { this->drawBoxes(path, selection->getList()); } } } PRIVATE(this)->searchaction->reset(); } }