void SoVRMLShape::GLRender(SoGLRenderAction * action) { SoState * state = action->getState(); state->push(); if ((this->appearance.getValue() == NULL) || (((SoVRMLAppearance*)this->appearance.getValue())->material.getValue() == NULL)) { SoLazyElement::setLightModel(state, SoLazyElement::BASE_COLOR); } int numindices; const int * indices; SoAction::PathCode pathcode = action->getPathCode(numindices, indices); SoNode ** childarray = (SoNode**) this->getChildren()->getArrayPtr(); if (pathcode == SoAction::IN_PATH) { int lastchild = indices[numindices - 1]; for (int i = 0; i <= lastchild && !action->hasTerminated(); i++) { SoNode * child = childarray[i]; action->pushCurPath(i, child); if (action->getCurPathCode() != SoAction::OFF_PATH || child->affectsState()) { if (!action->abortNow()) { SoNodeProfiling profiling; profiling.preTraversal(action); child->GLRender(action); profiling.postTraversal(action); } else { SoCacheElement::invalidate(state); } } action->popCurPath(pathcode); } } else { action->pushCurPath(); int n = this->getChildren()->getLength(); for (int i = 0; i < n && !action->hasTerminated(); i++) { action->popPushCurPath(i, childarray[i]); if (action->abortNow()) { // only cache if we do a full traversal SoCacheElement::invalidate(state); break; } SoNodeProfiling profiling; profiling.preTraversal(action); childarray[i]->GLRender(action); profiling.postTraversal(action); } action->popCurPath(); } state->pop(); }
// Doc in parent void SoVRMLGroup::GLRenderInPath(SoGLRenderAction * action) { int numindices; const int * indices; SoAction::PathCode pathcode = action->getPathCode(numindices, indices); if (pathcode == SoAction::IN_PATH) { SoState * state = action->getState(); SoNode ** childarray = (SoNode**) this->getChildren()->getArrayPtr(); state->push(); int childidx = 0; for (int i = 0; i < numindices; i++) { for (; childidx < indices[i] && !action->hasTerminated(); childidx++) { SoNode * offpath = childarray[childidx]; if (offpath->affectsState()) { action->pushCurPath(childidx, offpath); if (!action->abortNow()) { SoNodeProfiling profiling; profiling.preTraversal(action); offpath->GLRenderOffPath(action); profiling.postTraversal(action); } else { SoCacheElement::invalidate(state); } action->popCurPath(pathcode); } } SoNode * inpath = childarray[childidx]; action->pushCurPath(childidx, inpath); if (!action->abortNow()) { SoNodeProfiling profiling; profiling.preTraversal(action); inpath->GLRenderInPath(action); profiling.postTraversal(action); } else { SoCacheElement::invalidate(state); } action->popCurPath(pathcode); childidx++; } state->pop(); } else { // we got to the end of the path assert(action->getCurPathCode() == SoAction::BELOW_PATH); this->GLRenderBelowPath(action); } }