void Node::getWorldVolume(BoxVolume &result) { Matrix m; if(getParent() != NULL) { getParent()->getToWorld(m); } else { m.setIdentity(); } updateVolume(); result = getVolume(); result.transform(m); }
// test a single node bool RenderPartition::isVisible(Node *pNode) { if(getFrustumCulling() == false) return true; if(_oDrawEnv.getStatCollector() != NULL) { _oDrawEnv.getStatCollector()->getElem(statCullTestedNodes)->inc(); } // _oDrawEnv.getRTAction()->getStatistics()->getElem(statCullTestedNodes)->inc(); if(pNode->getVolume().isInfinite() == true) return true; BoxVolume vol; pNode->updateVolume(); vol = pNode->getVolume(); vol.transform(topMatrix()); if(_oFrustum.intersect(vol)) { // fprintf(stderr,"%p: node 0x%p vis\n", Thread::getCurrent(), node); return true; } if(_oDrawEnv.getStatCollector() != NULL) { _oDrawEnv.getStatCollector()->getElem(statCulledNodes)->inc(); } // _oDrawEnv.getRTAction()->getStatistics()->getElem(statCulledNodes)->inc(); // fprintf(stderr,"%p: node 0x%p invis\n", Thread::getCurrent(), node); // _frustum.dump(); return false; }
// visibility levels bool RenderPartition::pushVisibility(Node * const pNode) { if(getFrustumCulling() == false) return true; FrustumVolume::PlaneSet inplanes = _visibilityStack.back(); if(inplanes == FrustumVolume::P_ALL) { _visibilityStack.push_back(inplanes); return true; } Color3f col; bool result = true; FrustumVolume frustum = _oFrustum; BoxVolume vol = pNode->getVolume(); // don't mess with infinite volumes if(vol.isInfinite() == false) { pNode->updateVolume(); vol = pNode->getVolume(); #if 1 vol.transform(topMatrix()); #else // not quite working Matrix m = topMatrix(); m.invert(); frustum.transform(m); #endif } if(_oDrawEnv.getStatCollector() != NULL) { _oDrawEnv.getStatCollector()->getElem(statCullTestedNodes)->inc(); } if(intersect(frustum, vol, inplanes) == false) { result = false; col.setValuesRGB(1,0,0); if(_oDrawEnv.getStatCollector() != NULL) { _oDrawEnv.getStatCollector()->getElem(statCulledNodes)->inc(); } } else { if(inplanes == FrustumVolume::P_ALL) { col.setValuesRGB(0,1,0); } else { col.setValuesRGB(0,0,1); } } if(getVolumeDrawing()) { dropVolume(this, pNode, col); } _visibilityStack.push_back(inplanes); return result; }