From Farshid Lashkari, "Another update. I added a LIMIT_NEAREST enum which implements your previous suggestion of rejecting bounding volumes further from the nearest existing intersection. I only implemented this for LineSegmentIntersector. I'd appreciate it if you could double check the math I added to LineSegmentIntersector::intersects() for checking if the bounding sphere is further away. The results of this are promising. I'm getting noticeable performance increase for line intersections with scenes containing many drawables.
"
This commit is contained in:
@@ -41,17 +41,29 @@ class Intersector : public osg::Referenced
|
||||
VIEW,
|
||||
MODEL
|
||||
};
|
||||
|
||||
|
||||
enum IntersectionLimit
|
||||
{
|
||||
NO_LIMIT,
|
||||
LIMIT_ONE_PER_DRAWABLE,
|
||||
LIMIT_ONE,
|
||||
LIMIT_NEAREST
|
||||
};
|
||||
|
||||
Intersector(CoordinateFrame cf=MODEL):
|
||||
_coordinateFrame(cf),
|
||||
_intersectionLimit(NO_LIMIT),
|
||||
_disabledCount(0) {}
|
||||
|
||||
|
||||
void setCoordinateFrame(CoordinateFrame cf) { _coordinateFrame = cf; }
|
||||
|
||||
CoordinateFrame getCoordinateFrame() const { return _coordinateFrame; }
|
||||
|
||||
|
||||
|
||||
void setIntersectionLimit(IntersectionLimit limit) { _intersectionLimit = limit; }
|
||||
|
||||
IntersectionLimit getIntersectionLimit() const { return _intersectionLimit; }
|
||||
|
||||
virtual Intersector* clone(osgUtil::IntersectionVisitor& iv) = 0;
|
||||
|
||||
virtual bool enter(const osg::Node& node) = 0;
|
||||
@@ -70,9 +82,12 @@ class Intersector : public osg::Referenced
|
||||
|
||||
inline void decrementDisabledCount() { if (_disabledCount>0) --_disabledCount; }
|
||||
|
||||
inline bool reachedLimit() { return _intersectionLimit == LIMIT_ONE && containsIntersections(); }
|
||||
|
||||
protected:
|
||||
|
||||
CoordinateFrame _coordinateFrame;
|
||||
IntersectionLimit _intersectionLimit;
|
||||
unsigned int _disabledCount;
|
||||
|
||||
};
|
||||
|
||||
@@ -91,7 +91,7 @@ class OSGUTIL_EXPORT LineSegmentIntersector : public Intersector
|
||||
|
||||
virtual void reset();
|
||||
|
||||
virtual bool containsIntersections() { return !_intersections.empty(); }
|
||||
virtual bool containsIntersections() { return !getIntersections().empty(); }
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ class OSGUTIL_EXPORT PlaneIntersector : public Intersector
|
||||
|
||||
virtual void reset();
|
||||
|
||||
virtual bool containsIntersections() { return !_intersections.empty(); }
|
||||
virtual bool containsIntersections() { return !getIntersections().empty(); }
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@ class OSGUTIL_EXPORT PolytopeIntersector : public Intersector
|
||||
|
||||
virtual void reset();
|
||||
|
||||
virtual bool containsIntersections() { return !_intersections.empty(); }
|
||||
virtual bool containsIntersections() { return !getIntersections().empty(); }
|
||||
|
||||
protected:
|
||||
|
||||
|
||||
Reference in New Issue
Block a user