diff --git a/include/osg/LineSegment b/include/osg/LineSegment index b6b9224b0..8fe2545a7 100644 --- a/include/osg/LineSegment +++ b/include/osg/LineSegment @@ -44,45 +44,48 @@ class OSG_EXPORT LineSegment : public Referenced inline bool valid() const { return _s.valid() && _e.valid() && _s!=_e; } + /** return true if segment intersects BoundingBox. */ bool intersect(const BoundingBox& bb) const; - /** return true if segment intersects BoundingBox - * and return the intersection ratios. + /** return true if segment intersects BoundingBox and + * set float ratios for the first and second intersections, where the ratio is 0.0 at the segment start point, and 1.0 at the segment end point. */ - bool intersect(const BoundingBox& bb,float& r1,float& r2) const; + bool intersectAndComputeRatios(const BoundingBox& bb, float& ratioFromStartToEnd1, float& ratioFromStartToEnd2) const; - /** return true if segment intersects BoundingBox - * and return the intersection ratios. + /** return true if segment intersects BoundingBox and + * set double ratios for the first and second intersections, where the ratio is 0.0 at the segment start point, and 1.0 at the segment end point. */ - bool intersect(const BoundingBox& bb,double& r1,double& r2) const; + bool intersectAndComputeRatios(const BoundingBox& bb, double& ratioFromStartToEnd1, double& ratioFromStartToEnd2) const; + /** return true if segment intersects BoundingSphere. */ bool intersect(const BoundingSphere& bs) const; - /** return true if segment intersects BoundingSphere and return the - * intersection ratio. + /** return true if segment intersects BoundingSphere and + * set float ratios for the first and second intersections, where the ratio is 0.0 at the segment start point, and 1.0 at the segment end point. */ - bool intersect(const BoundingSphere& bs,float& r1,float& r2) const; + bool intersectAndComputeRatios(const BoundingSphere& bs, float& ratioFromStartToEnd1, float& ratioFromStartToEnd2) const; - /** return true if segment intersects BoundingSphere and return the - * intersection ratio. + /** return true if segment intersects BoundingSphere and + * set double ratios for the first and second intersections, where the ratio is 0.0 at the segment start point, and 1.0 at the segment end point. */ - bool intersect(const BoundingSphere& bs,double& r1,double& r2) const; + bool intersectAndComputeRatios(const BoundingSphere& bs,double& ratioFromStartToEnd1, double& ratioFromStartToEnd2) const; - /** return true if segment intersects triangle - * and set ratio long segment. + /** return true if segment intersects triangle and + * set float ratios where the ratio is 0.0 at the segment start point, and 1.0 at the segment end point. */ - bool intersect(const Vec3f& v1,const Vec3f& v2,const Vec3f& v3,float& r); + bool intersect(const Vec3f& v1,const Vec3f& v2,const Vec3f& v3,float& ratioFromStartToEnd); - /** return true if segment intersects triangle - * and set ratio long segment. + /** return true if segment intersects triangle and + * set double ratios where the ratio is 0.0 at the segment start point, and 1.0 at the segment end point. */ - bool intersect(const Vec3d& v1,const Vec3d& v2,const Vec3d& v3,double& r); + bool intersect(const Vec3d& v1,const Vec3d& v2,const Vec3d& v3,double& ratioFromStartToEnd); /** post multiply a segment by matrix.*/ inline void mult(const LineSegment& seg,const Matrix& m) { _s = seg._s*m; _e = seg._e*m; } + /** pre multiply a segment by matrix.*/ inline void mult(const Matrix& m,const LineSegment& seg) { _s = m*seg._s; _e = m*seg._e; } diff --git a/src/osg/LineSegment.cpp b/src/osg/LineSegment.cpp index feb675d6d..97f44065c 100644 --- a/src/osg/LineSegment.cpp +++ b/src/osg/LineSegment.cpp @@ -11,6 +11,8 @@ * OpenSceneGraph Public License for more details. */ #include +#include +#include using namespace osg; @@ -137,7 +139,6 @@ bool LineSegment::intersectAndClip(vec_type& s,vec_type& e,const BoundingBox& bb return true; } - bool LineSegment::intersect(const BoundingBox& bb) const { if (!bb.valid()) return false; @@ -147,7 +148,7 @@ bool LineSegment::intersect(const BoundingBox& bb) const } -bool LineSegment::intersect(const BoundingBox& bb,float& r1,float& r2) const +bool LineSegment::intersectAndComputeRatios(const BoundingBox& bb,float& r1,float& r2) const { if (!bb.valid()) return false; @@ -160,7 +161,7 @@ bool LineSegment::intersect(const BoundingBox& bb,float& r1,float& r2) const { value_type inv_len = 1.0f/len; r1 = (float)((s-_s).length()*inv_len); - r2 = (float)((e-_e).length()*inv_len); + r2 = (float)((e-_s).length()*inv_len); } else { @@ -171,7 +172,7 @@ bool LineSegment::intersect(const BoundingBox& bb,float& r1,float& r2) const return result; } -bool LineSegment::intersect(const BoundingBox& bb,double& r1,double& r2) const +bool LineSegment::intersectAndComputeRatios(const BoundingBox& bb,double& r1,double& r2) const { if (!bb.valid()) return false; @@ -184,7 +185,10 @@ bool LineSegment::intersect(const BoundingBox& bb,double& r1,double& r2) const { double inv_len = 1.0/len; r1 = ((s-_s).length()*inv_len); - r2 = ((e-_e).length()*inv_len); + r2 = ((e-_s).length()*inv_len); + + OSG_NOTICE<<"s = ("<