diff --git a/doc/Doxyfiles/doxyfile.cmake b/doc/Doxyfiles/doxyfile.cmake index 07f08b056..d3d17271c 100644 --- a/doc/Doxyfiles/doxyfile.cmake +++ b/doc/Doxyfiles/doxyfile.cmake @@ -84,21 +84,22 @@ WARN_LOGFILE = # configuration options related to the input files #--------------------------------------------------------------------------- INPUT = "${OpenSceneGraph_SOURCE_DIR}/include/osg" \ + "${OpenSceneGraph_SOURCE_DIR}/include/osgAnimation" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgDB" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgFX" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgGA" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgManipulator" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgParticle" \ + "${OpenSceneGraph_SOURCE_DIR}/include/osgQt" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgShadow" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgSim" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgTerrain" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgText" \ + "${OpenSceneGraph_SOURCE_DIR}/include/osgUI" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgUtil" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgViewer" \ "${OpenSceneGraph_SOURCE_DIR}/include/osgVolume" \ - "${OpenSceneGraph_SOURCE_DIR}/include/osgWidget" \ - "${OpenSceneGraph_SOURCE_DIR}/include/osgQt" \ - "${OpenSceneGraph_SOURCE_DIR}/include/osgAnimation" + "${OpenSceneGraph_SOURCE_DIR}/include/osgWidget" INPUT_ENCODING = UTF-8 FILE_PATTERNS = *include* \ *.cpp 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) @@ -361,8 +365,6 @@ int BuildKdTree::divide(KdTree::BuildOptions& options, osg::BoundingBox& bb, int while(leftmid)) { --right; } - while(leftmid)) { --right; } - if (leftesplison) + const value_type epsilon = 1e-10; + if (det>epsilon) { value_type u = (P*T); if (u<0.0 || u>det) return; @@ -271,7 +271,7 @@ struct IntersectFunctor r2 = v; r = t * _inverse_length; } - else if (det<-esplison) + else if (det<-epsilon) { value_type u = (P*T); if (u>0.0 || u_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)