void SoBoxHighlightRenderAction::drawBoxes(SoPath * pathtothis, const SoPathList * pathlist) { int i; int thispos = reclassify_cast<SoFullPath *>(pathtothis)->getLength()-1; assert(thispos >= 0); PRIVATE(this)->postprocpath->setHead(pathtothis->getHead()); // reset for (i = 1; i < thispos; i++) { PRIVATE(this)->postprocpath->append(pathtothis->getIndex(i)); } // we need to disable accumulation buffer antialiasing while // rendering selected objects int oldnumpasses = this->getNumPasses(); this->setNumPasses(1); SoState * thestate = this->getState(); thestate->push(); for (i = 0; i < pathlist->getLength(); i++) { SoFullPath * path = reclassify_cast<SoFullPath *>((*pathlist)[i]); PRIVATE(this)->postprocpath->append(path->getHead()); for (int j = 1; j < path->getLength(); j++) { PRIVATE(this)->postprocpath->append(path->getIndex(j)); } // Previously SoGLRenderAction was used to draw the bounding boxes // of shapes in selection paths, by overriding renderstyle state // elements to lines drawstyle and simply doing: // // SoGLRenderAction::apply(PRIVATE(this)->postprocpath); // Bug // // This could have the unwanted side effect of rendering // non-selected shapes, as they could be part of the path (due to // being placed below SoGroup nodes (instead of SoSeparator // nodes)) up to the selected shape. // // // A better approach turned out to be to soup up and draw only the // bounding boxes of the selected shapes: PRIVATE(this)->drawHighlightBox(PRIVATE(this)->postprocpath); // Remove temporary path from path buffer PRIVATE(this)->postprocpath->truncate(thispos); } this->setNumPasses(oldnumpasses); thestate->pop(); }
void SoLineHighlightRenderActionP::drawBoxes(SoPath * pathtothis, const SoPathList * pathlist) { int i; int thispos = reclassify_cast<SoFullPath *>(pathtothis)->getLength()-1; assert(thispos >= 0); this->postprocpath->setHead(pathtothis->getHead()); // reset for (i = 1; i < thispos; i++) { this->postprocpath->append(pathtothis->getIndex(i)); } SoState * state = PUBLIC(this)->getState(); state->push(); // we need to disable accumulation buffer antialiasing while // rendering selected objects int oldnumpasses = PUBLIC(this)->getNumPasses(); PUBLIC(this)->setNumPasses(1); SoLazyElement::setLightModel(state, SoLazyElement::BASE_COLOR); SoColorPacker ** cptr = static_cast<SoColorPacker **>(this->colorpacker_storage.get()); SoLazyElement::setDiffuse(state, pathtothis->getHead(), 1, &this->color, *cptr); // FIXME: we should check this versus the actual max line width // supported by the underlying OpenGL context. 20050610 mortene. SoLineWidthElement::set(state, this->linewidth); SoLinePatternElement::set(state, this->linepattern); SoTextureQualityElement::set(state, 0.0f); SoDrawStyleElement::set(state, SoDrawStyleElement::LINES); SoPolygonOffsetElement::set(state, NULL, -1.0f, -1.0f, SoPolygonOffsetElement::LINES, TRUE); SoMaterialBindingElement::set(state, NULL, SoMaterialBindingElement::OVERALL); SoNormalElement::set(state, NULL, 0, NULL, FALSE); SoOverrideElement::setNormalVectorOverride(state, NULL, TRUE); SoOverrideElement::setMaterialBindingOverride(state, NULL, TRUE); SoOverrideElement::setLightModelOverride(state, NULL, TRUE); SoOverrideElement::setDiffuseColorOverride(state, NULL, TRUE); SoOverrideElement::setLineWidthOverride(state, NULL, TRUE); SoOverrideElement::setLinePatternOverride(state, NULL, TRUE); SoOverrideElement::setDrawStyleOverride(state, NULL, TRUE); SoOverrideElement::setPolygonOffsetOverride(state, NULL, TRUE); SoTextureOverrideElement::setQualityOverride(state, TRUE); for (i = 0; i < pathlist->getLength(); i++) { SoFullPath * path = reclassify_cast<SoFullPath *>((*pathlist)[i]); this->postprocpath->append(path->getHead()); for (int j = 1; j < path->getLength(); j++) { this->postprocpath->append(path->getIndex(j)); } PUBLIC(this)->SoGLRenderAction::apply(this->postprocpath); this->postprocpath->truncate(thispos); } PUBLIC(this)->setNumPasses(oldnumpasses); state->pop(); }