diff --git a/src/osgUtil/PolytopeIntersector.cpp b/src/osgUtil/PolytopeIntersector.cpp index 14ed5e3a9..64c286d6c 100644 --- a/src/osgUtil/PolytopeIntersector.cpp +++ b/src/osgUtil/PolytopeIntersector.cpp @@ -32,13 +32,15 @@ struct Settings : public osg::Referenced _polytopeIntersector(0), _iv(0), _drawable(0), - _limitOneIntersection(false) {} + _limitOneIntersection(false), + _dimensionMask( PolytopeIntersector::AllDims ) {} osgUtil::PolytopeIntersector* _polytopeIntersector; osgUtil::IntersectionVisitor* _iv; osg::Drawable* _drawable; osg::ref_ptr _vertices; bool _limitOneIntersection; + unsigned int _dimensionMask; }; template @@ -256,6 +258,8 @@ struct IntersectFunctor ++_primitiveIndex; + if ((_settings->_dimensionMask&PolytopeIntersector::DimZero)==0) return; + // initialize the set of vertices to test. src.clear(); @@ -291,6 +295,8 @@ struct IntersectFunctor ++_primitiveIndex; + if ((_settings->_dimensionMask&PolytopeIntersector::DimOne)==0) return; + src.clear(); src.push_back(v0); src.push_back(v1); @@ -308,6 +314,8 @@ struct IntersectFunctor ++_primitiveIndex; + if ((_settings->_dimensionMask&PolytopeIntersector::DimTwo)==0) return; + src.clear(); src.push_back(v0); src.push_back(v1); @@ -325,6 +333,9 @@ struct IntersectFunctor if (_settings->_limitOneIntersection && _hit) return; ++_primitiveIndex; + + if ((_settings->_dimensionMask&PolytopeIntersector::DimTwo)==0) return; + src.clear(); src.push_back(v0); @@ -343,6 +354,8 @@ struct IntersectFunctor { if (_settings->_limitOneIntersection && _hit) return; + if ((_settings->_dimensionMask&PolytopeIntersector::DimZero)==0) return; + if (contains((*vertices)[p0])) { _primitiveIndex = primitiveIndex; @@ -355,6 +368,8 @@ struct IntersectFunctor { if (_settings->_limitOneIntersection && _hit) return; + if ((_settings->_dimensionMask&PolytopeIntersector::DimOne)==0) return; + if (contains((*vertices)[p0], (*vertices)[p1])) { _primitiveIndex = primitiveIndex; @@ -367,6 +382,8 @@ struct IntersectFunctor { if (_settings->_limitOneIntersection && _hit) return; + if ((_settings->_dimensionMask&PolytopeIntersector::DimTwo)==0) return; + if (contains((*vertices)[p0], (*vertices)[p1], (*vertices)[p2])) { _primitiveIndex = primitiveIndex; @@ -379,6 +396,8 @@ struct IntersectFunctor { if (_settings->_limitOneIntersection && _hit) return; + if ((_settings->_dimensionMask&PolytopeIntersector::DimTwo)==0) return; + if (contains((*vertices)[p0], (*vertices)[p1], (*vertices)[p2], (*vertices)[p3])) { _primitiveIndex = primitiveIndex; @@ -519,6 +538,7 @@ void PolytopeIntersector::intersect(osgUtil::IntersectionVisitor& iv, osg::Drawa settings->_iv = &iv; settings->_drawable = drawable; settings->_limitOneIntersection = (_intersectionLimit == LIMIT_ONE_PER_DRAWABLE || _intersectionLimit == LIMIT_ONE); + settings->_dimensionMask = _dimensionMask; osg::KdTree* kdTree = iv.getUseKdTreeWhenAvailable() ? dynamic_cast(drawable->getShape()) : 0;