diff --git a/examples/osgkeyboardmouse/osgkeyboardmouse.cpp b/examples/osgkeyboardmouse/osgkeyboardmouse.cpp index 4aad0d668..f772e898e 100644 --- a/examples/osgkeyboardmouse/osgkeyboardmouse.cpp +++ b/examples/osgkeyboardmouse/osgkeyboardmouse.cpp @@ -349,7 +349,9 @@ public: if (picker->containsIntersections()) { osgUtil::LineSegmentIntersector::Intersection intersection = picker->getFirstIntersection(); - osg::notify(osg::NOTICE)<<"Picked "<=1)?nodePath[nodePath.size()-1]:0; diff --git a/include/osg/KdTree b/include/osg/KdTree index 12279334e..33f90ac98 100644 --- a/include/osg/KdTree +++ b/include/osg/KdTree @@ -69,41 +69,45 @@ class OSG_EXPORT KdTree : public osg::Shape inline unsigned int addPoint(unsigned int p0) { unsigned int i = _vertexIndices.size(); - _primitiveIndices.push_back(i); + _vertexIndices.push_back(_primitiveIndices.size() + _degenerateCount); _vertexIndices.push_back(1); _vertexIndices.push_back(p0); + _primitiveIndices.push_back(i); return i; } inline unsigned int addLine(unsigned int p0, unsigned int p1) { unsigned int i = _vertexIndices.size(); - _primitiveIndices.push_back(i); + _vertexIndices.push_back(_primitiveIndices.size() + _degenerateCount); _vertexIndices.push_back(2); _vertexIndices.push_back(p0); _vertexIndices.push_back(p1); + _primitiveIndices.push_back(i); return i; } inline unsigned int addTriangle(unsigned int p0, unsigned int p1, unsigned int p2) { unsigned int i = _vertexIndices.size(); - _primitiveIndices.push_back(i); + _vertexIndices.push_back(_primitiveIndices.size() + _degenerateCount); _vertexIndices.push_back(3); _vertexIndices.push_back(p0); _vertexIndices.push_back(p1); _vertexIndices.push_back(p2); + _primitiveIndices.push_back(i); return i; } inline unsigned int addQuad(unsigned int p0, unsigned int p1, unsigned int p2, unsigned int p3) { unsigned int i = _vertexIndices.size(); - _primitiveIndices.push_back(i); + _vertexIndices.push_back(_primitiveIndices.size() + _degenerateCount); _vertexIndices.push_back(4); _vertexIndices.push_back(p0); _vertexIndices.push_back(p1); _vertexIndices.push_back(p2); _vertexIndices.push_back(p3); + _primitiveIndices.push_back(i); return i; } @@ -154,13 +158,14 @@ class OSG_EXPORT KdTree : public osg::Shape for(int i=istart; i_kdTree._degenerateCount++; return; } @@ -111,6 +112,7 @@ struct PrimitiveIndicesCollector if (v0==v1 || v1==v2 || v2==v0) { //OSG_NOTICE<<"Disgarding degenerate triangle"<_kdTree._degenerateCount++; return; } @@ -138,6 +140,7 @@ struct PrimitiveIndicesCollector if (v0==v1 || v1==v2 || v2==v0 || v3==v0 || v3==v1 || v3==v2) { //OSG_NOTICE<<"Disgarding degenerate quad"<_kdTree._degenerateCount++; return; } @@ -287,6 +290,7 @@ int BuildKdTree::divide(KdTree::BuildOptions& options, osg::BoundingBox& bb, int for(int i=istart; i<=iend; ++i) { unsigned int primitiveIndex = _kdTree.getPrimitiveIndices()[_primitiveIndices[i]]; + primitiveIndex++; //skip original Primitive index unsigned int numPoints = _kdTree.getVertexIndices()[primitiveIndex++]; for(; numPoints>0; --numPoints) @@ -480,12 +484,13 @@ KdTree::BuildOptions::BuildOptions(): // // KdTree -KdTree::KdTree() +KdTree::KdTree() : _degenerateCount(0) { } KdTree::KdTree(const KdTree& rhs, const osg::CopyOp& copyop): Shape(rhs, copyop), + _degenerateCount(rhs._degenerateCount), _vertices(rhs._vertices), _kdNodes(rhs._kdNodes) { diff --git a/src/osgUtil/LineSegmentIntersector.cpp b/src/osgUtil/LineSegmentIntersector.cpp index 22dd74d2c..63cb30366 100644 --- a/src/osgUtil/LineSegmentIntersector.cpp +++ b/src/osgUtil/LineSegmentIntersector.cpp @@ -357,15 +357,15 @@ struct IntersectFunctor // handle triangles void operator()(const osg::Vec3& v0, const osg::Vec3& v1, const osg::Vec3& v2, bool /*treatVertexDataAsTemporary*/) { - ++_primitiveIndex; intersect(v0,v1,v2); + ++_primitiveIndex; } void operator()(const osg::Vec3& v0, const osg::Vec3& v1, const osg::Vec3& v2, const osg::Vec3& v3, bool /*treatVertexDataAsTemporary*/) { - ++_primitiveIndex; intersect(v0,v1,v3); intersect(v1,v2,v3); + ++_primitiveIndex; } void intersect(const osg::Vec3Array*, int , unsigned int) diff --git a/src/osgUtil/PolytopeIntersector.cpp b/src/osgUtil/PolytopeIntersector.cpp index 12c680145..ae0debacb 100644 --- a/src/osgUtil/PolytopeIntersector.cpp +++ b/src/osgUtil/PolytopeIntersector.cpp @@ -256,9 +256,11 @@ struct IntersectFunctor { if (_settings->_limitOneIntersection && _hit) return; - ++_primitiveIndex; - - if ((_settings->_primitiveMask&PolytopeIntersector::POINT_PRIMITIVES)==0) return; + if ((_settings->_primitiveMask&PolytopeIntersector::POINT_PRIMITIVES)==0) + { + ++_primitiveIndex; + return; + } // initialize the set of vertices to test. src.clear(); @@ -278,7 +280,11 @@ struct IntersectFunctor { const osg::Plane& plane=*pitr; double d1=plane.distance(v0); - if (d1<0.0) return; // point outside + if (d1<0.0) // point outside + { + ++_primitiveIndex; + return; + } } } } @@ -286,6 +292,8 @@ struct IntersectFunctor src.push_back(v0); addIntersection(); + + ++_primitiveIndex; } // handle lines @@ -293,9 +301,11 @@ struct IntersectFunctor { if (_settings->_limitOneIntersection && _hit) return; - ++_primitiveIndex; - - if ((_settings->_primitiveMask&PolytopeIntersector::LINE_PRIMITIVES)==0) return; + if ((_settings->_primitiveMask&PolytopeIntersector::LINE_PRIMITIVES)==0) + { + ++_primitiveIndex; + return; + } src.clear(); src.push_back(v0); @@ -305,6 +315,7 @@ struct IntersectFunctor { addIntersection(); } + ++_primitiveIndex; } // handle triangles @@ -312,9 +323,11 @@ struct IntersectFunctor { if (_settings->_limitOneIntersection && _hit) return; - ++_primitiveIndex; - - if ((_settings->_primitiveMask&PolytopeIntersector::TRIANGLE_PRIMITIVES)==0) return; + if ((_settings->_primitiveMask&PolytopeIntersector::TRIANGLE_PRIMITIVES)==0) + { + ++_primitiveIndex; + return; + } src.clear(); src.push_back(v0); @@ -326,15 +339,18 @@ struct IntersectFunctor { addIntersection(); } + ++_primitiveIndex; } void operator()(const osg::Vec3& v0, const osg::Vec3& v1, const osg::Vec3& v2, const osg::Vec3& v3, bool /*treatVertexDataAsTemporary*/) { if (_settings->_limitOneIntersection && _hit) return; - ++_primitiveIndex; - - if ((_settings->_primitiveMask&PolytopeIntersector::TRIANGLE_PRIMITIVES)==0) return; + if ((_settings->_primitiveMask&PolytopeIntersector::TRIANGLE_PRIMITIVES)==0) + { + ++_primitiveIndex; + return; + } src.clear(); @@ -348,6 +364,7 @@ struct IntersectFunctor { addIntersection(); } + ++_primitiveIndex; } void intersect(const osg::Vec3Array* vertices, int primitiveIndex, unsigned int p0)