From 7b370fcb57164a68103faa7db594ecabc0e30365 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Wed, 30 Jan 2002 12:09:18 +0000 Subject: [PATCH] Made the LineSegment destructor protected to force users to create segments on the stack thus ensure that they arn't created locally and have their memory deleted incorrectly. Also updated the IntersectVisitor so that it no used osg::ref_ptr<> internally for storing all data. Have also move the IntersectState helper class to inside the IntersectVisitor which simplifies the external interface to the class. --- include/osg/LineSegment | 3 +- include/osgUtil/IntersectVisitor | 95 +++++++------ src/Demos/osgcopy/Makedepend | 126 ------------------ src/osgGLUT/Viewer.cpp | 6 +- src/osgUtil/CullVisitor.cpp | 46 +++---- src/osgUtil/IntersectVisitor.cpp | 222 ++++++++++++------------------- 6 files changed, 171 insertions(+), 327 deletions(-) diff --git a/include/osg/LineSegment b/include/osg/LineSegment index cfa3a694e..e408b46ce 100644 --- a/include/osg/LineSegment +++ b/include/osg/LineSegment @@ -19,7 +19,6 @@ class SG_EXPORT LineSegment : public Referenced LineSegment() {}; LineSegment(const LineSegment& seg) : Referenced(),_s(seg._s),_e(seg._e) {} LineSegment(const Vec3& s,const Vec3& e) : _s(s),_e(e) {} - virtual ~LineSegment() {} LineSegment& operator = (const LineSegment& seg) { _s = seg._s; _e = seg._e; return *this; } @@ -55,6 +54,8 @@ class SG_EXPORT LineSegment : public Referenced protected: + virtual ~LineSegment() {} + static const bool intersectAndClip(Vec3& s,Vec3& e,const BoundingBox& bb); Vec3 _s; diff --git a/include/osgUtil/IntersectVisitor b/include/osgUtil/IntersectVisitor index 20d518d8b..78f99905d 100644 --- a/include/osgUtil/IntersectVisitor +++ b/include/osgUtil/IntersectVisitor @@ -19,34 +19,11 @@ namespace osgUtil { -class OSGUTIL_EXPORT IntersectState : public osg::Referenced + +class OSGUTIL_EXPORT Hit { public: - IntersectState(); - - osg::Matrix* _matrix; - osg::Matrix* _inverse; - - typedef std::vector< std::pair > LineSegmentList; - LineSegmentList _segList; - - typedef unsigned int LineSegmentmentMask; - typedef std::vector LineSegmentmentMaskStack; - LineSegmentmentMaskStack _segmentMaskStack; - - bool isCulled(const osg::BoundingSphere& bs,LineSegmentmentMask& segMaskOut); - bool isCulled(const osg::BoundingBox& bb,LineSegmentmentMask& segMaskOut); - - protected: - - ~IntersectState(); - -}; - -class OSGUTIL_EXPORT Hit : public osg::Referenced -{ - public: Hit(); Hit(const Hit& hit); ~Hit(); @@ -61,19 +38,29 @@ class OSGUTIL_EXPORT Hit : public osg::Referenced if (_originalLineSegment>hit._originalLineSegment) return false; return _ratio _originalLineSegment; + osg::ref_ptr _localLineSegment; + osg::NodePath _nodePath; + osg::ref_ptr _geode; + osg::ref_ptr _geoset; + osg::ref_ptr _matrix; + osg::ref_ptr _inverse; + + VecIndexList _vecIndexList; + int _primitiveIndex; + osg::Vec3 _intersectPoint; + osg::Vec3 _intersectNormal; + + }; @@ -123,6 +110,37 @@ class OSGUTIL_EXPORT IntersectVisitor : public osg::NodeVisitor protected: + class IntersectState : public osg::Referenced + { + public: + + IntersectState(); + + osg::ref_ptr _matrix; + osg::ref_ptr _inverse; + + typedef std::pair,osg::ref_ptr > LineSegmentPair; + typedef std::vector< LineSegmentPair > LineSegmentList; + LineSegmentList _segList; + + typedef unsigned int LineSegmentmentMask; + typedef std::vector LineSegmentmentMaskStack; + LineSegmentmentMaskStack _segmentMaskStack; + + bool isCulled(const osg::BoundingSphere& bs,LineSegmentmentMask& segMaskOut); + bool isCulled(const osg::BoundingBox& bb,LineSegmentmentMask& segMaskOut); + + void addLineSegmentPair(osg::LineSegment* first,osg::LineSegment* second) + { + _segList.push_back(LineSegmentPair(first,second)); + } + + protected: + + ~IntersectState(); + + }; + bool intersect(osg::GeoSet& gset); void pushMatrix(const osg::Matrix& matrix); @@ -132,7 +150,8 @@ class OSGUTIL_EXPORT IntersectVisitor : public osg::NodeVisitor void leaveNode(); typedef std::vector > IntersectStateStack; - IntersectStateStack _intersectStateStack; + + IntersectStateStack _intersectStateStack; osg::NodePath _nodePath; diff --git a/src/Demos/osgcopy/Makedepend b/src/Demos/osgcopy/Makedepend index 21e2cb06a..e69de29bb 100644 --- a/src/Demos/osgcopy/Makedepend +++ b/src/Demos/osgcopy/Makedepend @@ -1,126 +0,0 @@ -osgcopy.o: osgcopy.cpp /home/robert/OpenSceneGraph/include/osg/Transform \ - /home/robert/OpenSceneGraph/include/osg/Group \ - /home/robert/OpenSceneGraph/include/osg/Node \ - /home/robert/OpenSceneGraph/include/osg/Object \ - /home/robert/OpenSceneGraph/include/osg/Referenced \ - /home/robert/OpenSceneGraph/include/osg/Export /usr/include/g++-3/set \ - /usr/include/g++-3/stl_tree.h /usr/include/g++-3/stl_algobase.h \ - /usr/include/g++-3/stl_config.h /usr/include/_G_config.h \ - /usr/include/bits/types.h /usr/include/features.h \ - /usr/include/sys/cdefs.h /usr/include/gnu/stubs.h \ - /usr/lib/gcc-lib/i586-mandrake-linux/2.96/include/stddef.h \ - /usr/include/bits/pthreadtypes.h /usr/include/bits/sched.h \ - /usr/include/wchar.h /usr/include/bits/wchar.h /usr/include/gconv.h \ - /usr/include/g++-3/stl_relops.h /usr/include/g++-3/stl_pair.h \ - /usr/include/g++-3/type_traits.h /usr/include/string.h \ - /usr/lib/gcc-lib/i586-mandrake-linux/2.96/include/limits.h \ - /usr/lib/gcc-lib/i586-mandrake-linux/2.96/include/syslimits.h \ - /usr/include/limits.h /usr/include/bits/posix1_lim.h \ - /usr/include/bits/local_lim.h /usr/include/linux/limits.h \ - /usr/include/bits/posix2_lim.h /usr/include/stdlib.h \ - /usr/include/sys/types.h /usr/include/time.h /usr/include/endian.h \ - /usr/include/bits/endian.h /usr/include/sys/select.h \ - /usr/include/bits/select.h /usr/include/bits/sigset.h \ - /usr/include/bits/time.h /usr/include/sys/sysmacros.h \ - /usr/include/alloca.h \ - /usr/lib/gcc-lib/i586-mandrake-linux/2.96/include/new.h \ - /usr/lib/gcc-lib/i586-mandrake-linux/2.96/include/new \ - /usr/lib/gcc-lib/i586-mandrake-linux/2.96/include/exception \ - /usr/include/g++-3/iostream.h /usr/include/g++-3/streambuf.h \ - /usr/include/libio.h \ - /usr/lib/gcc-lib/i586-mandrake-linux/2.96/include/stdarg.h \ - /usr/include/g++-3/stl_iterator.h /usr/include/g++-3/stl_alloc.h \ - /usr/include/assert.h /usr/include/pthread.h /usr/include/sched.h \ - /usr/include/signal.h /usr/include/bits/initspin.h \ - /usr/include/bits/sigthread.h /usr/include/g++-3/stl_construct.h \ - /usr/include/g++-3/stl_function.h /usr/include/g++-3/stl_set.h \ - /usr/include/g++-3/stl_multiset.h \ - /home/robert/OpenSceneGraph/include/osg/CopyOp \ - /home/robert/OpenSceneGraph/include/osg/StateSet \ - /home/robert/OpenSceneGraph/include/osg/StateAttribute \ - /home/robert/OpenSceneGraph/include/osg/GL /usr/X11R6/include/GL/gl.h \ - /usr/X11R6/include/GL/glext.h \ - /usr/lib/gcc-lib/i586-mandrake-linux/2.96/include/typeinfo \ - /home/robert/OpenSceneGraph/include/osg/ref_ptr /usr/include/g++-3/map \ - /usr/include/g++-3/stl_map.h /usr/include/g++-3/stl_multimap.h \ - /usr/include/g++-3/vector /usr/include/g++-3/stl_uninitialized.h \ - /usr/include/g++-3/stl_vector.h /usr/include/g++-3/stl_bvector.h \ - /usr/include/g++-3/string /usr/include/g++-3/std/bastring.h \ - /usr/include/g++-3/cstddef /usr/include/g++-3/std/straits.h \ - /usr/include/g++-3/cctype /usr/include/ctype.h \ - /usr/include/g++-3/cstring /usr/include/g++-3/alloc.h \ - /usr/include/g++-3/iterator /usr/include/g++-3/cassert \ - /usr/include/g++-3/std/bastring.cc \ - /home/robert/OpenSceneGraph/include/osg/BoundingSphere \ - /home/robert/OpenSceneGraph/include/osg/Vec3 \ - /home/robert/OpenSceneGraph/include/osg/Math /usr/include/math.h \ - /usr/include/bits/huge_val.h /usr/include/bits/mathdef.h \ - /usr/include/bits/mathcalls.h /usr/include/bits/mathinline.h \ - /usr/include/g++-3/iostream \ - /home/robert/OpenSceneGraph/include/osg/NodeCallback \ - /home/robert/OpenSceneGraph/include/osg/NodeVisitor \ - /home/robert/OpenSceneGraph/include/osg/FrameStamp \ - /usr/include/g++-3/ctime /home/robert/OpenSceneGraph/include/osg/Matrix \ - /home/robert/OpenSceneGraph/include/osg/Vec4 \ - /home/robert/OpenSceneGraph/include/osg/Billboard \ - /home/robert/OpenSceneGraph/include/osg/Geode \ - /home/robert/OpenSceneGraph/include/osg/Drawable \ - /home/robert/OpenSceneGraph/include/osg/BoundingBox \ - /usr/lib/gcc-lib/i586-mandrake-linux/2.96/include/float.h \ - /home/robert/OpenSceneGraph/include/osg/State \ - /home/robert/OpenSceneGraph/include/osg/Camera \ - /home/robert/OpenSceneGraph/include/osg/Quat \ - /home/robert/OpenSceneGraph/include/osg/ClippingVolume \ - /home/robert/OpenSceneGraph/include/osg/Plane \ - /home/robert/OpenSceneGraph/include/osg/Viewport \ - /home/robert/OpenSceneGraph/include/osg/Types \ - /home/robert/OpenSceneGraph/include/osg/DisplaySettings \ - /home/robert/OpenSceneGraph/include/osg/Vec2 \ - /home/robert/OpenSceneGraph/include/osg/Notify \ - /usr/include/g++-3/fstream /usr/include/g++-3/fstream.h \ - /home/robert/OpenSceneGraph/include/osg/Texture \ - /home/robert/OpenSceneGraph/include/osg/Image \ - /home/robert/OpenSceneGraph/include/osgDB/Registry \ - /home/robert/OpenSceneGraph/include/osgDB/DynamicLibrary \ - /home/robert/OpenSceneGraph/include/osgDB/Export \ - /home/robert/OpenSceneGraph/include/osgDB/ReaderWriter \ - /home/robert/OpenSceneGraph/include/osgDB/DotOsgWrapper \ - /home/robert/OpenSceneGraph/include/osgDB/Input \ - /home/robert/OpenSceneGraph/include/osgDB/FieldReaderIterator \ - /home/robert/OpenSceneGraph/include/osgDB/Field \ - /home/robert/OpenSceneGraph/include/osgDB/FieldReader \ - /home/robert/OpenSceneGraph/include/osgDB/Output \ - /home/robert/OpenSceneGraph/include/osgDB/ReadFile \ - /home/robert/OpenSceneGraph/include/osgDB/WriteFile \ - /home/robert/OpenSceneGraph/include/osgUtil/TrackballManipulator \ - /home/robert/OpenSceneGraph/include/osgUtil/CameraManipulator \ - /home/robert/OpenSceneGraph/include/osgUtil/Export \ - /home/robert/OpenSceneGraph/include/osgUtil/GUIEventHandler \ - /home/robert/OpenSceneGraph/include/osgUtil/GUIEventAdapter \ - /home/robert/OpenSceneGraph/include/osgUtil/GUIActionAdapter \ - /home/robert/OpenSceneGraph/include/osgUtil/FlightManipulator \ - /home/robert/OpenSceneGraph/include/osgUtil/DriveManipulator \ - /home/robert/OpenSceneGraph/include/osgGLUT/glut \ - /usr/X11R6/include/GL/glut.h /usr/X11R6/include/GL/glu.h \ - /home/robert/OpenSceneGraph/include/osgGLUT/Viewer \ - /home/robert/OpenSceneGraph/include/osg/Light \ - /home/robert/OpenSceneGraph/include/osg/Timer /usr/include/sys/time.h \ - /home/robert/OpenSceneGraph/include/osgUtil/SceneView \ - /home/robert/OpenSceneGraph/include/osgUtil/CullVisitor \ - /home/robert/OpenSceneGraph/include/osg/Impostor \ - /home/robert/OpenSceneGraph/include/osg/LOD \ - /home/robert/OpenSceneGraph/include/osg/ImpostorSprite \ - /home/robert/OpenSceneGraph/include/osg/AlphaFunc \ - /home/robert/OpenSceneGraph/include/osg/TexEnv \ - /home/robert/OpenSceneGraph/include/osg/EarthSky \ - /home/robert/OpenSceneGraph/include/osgUtil/RenderGraph \ - /home/robert/OpenSceneGraph/include/osgUtil/RenderLeaf \ - /home/robert/OpenSceneGraph/include/osgUtil/RenderStage \ - /home/robert/OpenSceneGraph/include/osg/ColorMask \ - /home/robert/OpenSceneGraph/include/osgUtil/RenderBin \ - /home/robert/OpenSceneGraph/include/osg/Statistics \ - /home/robert/OpenSceneGraph/include/osgUtil/RenderStageLighting \ - /home/robert/OpenSceneGraph/include/osgUtil/CullViewState \ - /home/robert/OpenSceneGraph/include/osgGLUT/Window \ - /home/robert/OpenSceneGraph/include/osgGLUT/Export \ - /home/robert/OpenSceneGraph/include/osgUtil/Optimizer diff --git a/src/osgGLUT/Viewer.cpp b/src/osgGLUT/Viewer.cpp index c7a47662d..160ac847e 100644 --- a/src/osgGLUT/Viewer.cpp +++ b/src/osgGLUT/Viewer.cpp @@ -1055,9 +1055,9 @@ void Viewer::keyboard(unsigned char key, int x, int y) { osg::Vec3 ip = hitr->_intersectPoint; osg::Vec3 in = hitr->_intersectNormal; - osg::Geode* geode = hitr->_geode; + osg::Geode* geode = hitr->_geode.get(); osg::notify(osg::NOTICE) << " Itersection Point ("<_matrix) + if (hitr->_matrix.valid()) { osg::Vec3 ipEye = ip*(*(hitr->_matrix)); osg::Vec3 inEye = (in+ip)*(*(hitr->_matrix))-ipEye; @@ -1069,7 +1069,7 @@ void Viewer::keyboard(unsigned char key, int x, int y) if (key=='r' && geode) { // remove geoset.. - osg::GeoSet* gset = hitr->_geoset; + osg::GeoSet* gset = hitr->_geoset.get(); osg::notify(osg::NOTICE) << " geoset ("<removeDrawable(gset)<<")"<< std::endl; } diff --git a/src/osgUtil/CullVisitor.cpp b/src/osgUtil/CullVisitor.cpp index f8255883a..a56cb1649 100644 --- a/src/osgUtil/CullVisitor.cpp +++ b/src/osgUtil/CullVisitor.cpp @@ -294,84 +294,84 @@ void TriangleViewFrustumIntersect::intersect_triangle(const osg::Vec3& vert1, co //construct line segment of two triangle vertices and check if they intersect any clipping plane //but within correct clipping plane triangle - osg::LineSegment s12(v1, v2); + osg::ref_ptr s12 = new LineSegment(v1, v2); //left triangle - if(intersect_linesegment_and_triangle(returned, s12, _eye, UpLeft, DownLeft) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, UpLeft, DownLeft) == 0) _listVectors[returned] = true; //up triangle - if(intersect_linesegment_and_triangle(returned, s12, _eye, UpLeft, UpRight) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, UpLeft, UpRight) == 0) _listVectors[returned] = true; //right triangle - if(intersect_linesegment_and_triangle(returned, s12, _eye, UpRight, DownRight) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, UpRight, DownRight) == 0) _listVectors[returned] = true; //bottom triangled - if(intersect_linesegment_and_triangle(returned, s12, _eye, DownLeft, DownRight) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, DownLeft, DownRight) == 0) _listVectors[returned] = true; //now for second edge of triangle - s12.set(v2, v3); + s12->set(v2, v3); //left triangle - if(intersect_linesegment_and_triangle(returned, s12, _eye, UpLeft, DownLeft) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, UpLeft, DownLeft) == 0) _listVectors[returned] = true; //up triangle - if(intersect_linesegment_and_triangle(returned, s12, _eye, UpLeft, UpRight) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, UpLeft, UpRight) == 0) _listVectors[returned] = true; //right triangle - if(intersect_linesegment_and_triangle(returned, s12, _eye, UpRight, DownRight) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, UpRight, DownRight) == 0) _listVectors[returned] = true; //bottom triangled - if(intersect_linesegment_and_triangle(returned, s12, _eye, DownLeft, DownRight) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, DownLeft, DownRight) == 0) _listVectors[returned] = true; - s12.set(v3, v1); + s12->set(v3, v1); //left triangle - if(intersect_linesegment_and_triangle(returned, s12, _eye, UpLeft, DownLeft) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, UpLeft, DownLeft) == 0) _listVectors[returned] = true; //up triangle - if(intersect_linesegment_and_triangle(returned, s12, _eye, UpLeft, UpRight) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, UpLeft, UpRight) == 0) _listVectors[returned] = true; //right triangle - if(intersect_linesegment_and_triangle(returned, s12, _eye, UpRight, DownRight) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, UpRight, DownRight) == 0) _listVectors[returned] = true; //bottom triangled - if(intersect_linesegment_and_triangle(returned, s12, _eye, DownLeft, DownRight) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, _eye, DownLeft, DownRight) == 0) _listVectors[returned] = true; //we still have possibility of camera being above huge triangle, so it is possible that clipping volume //intersects this triangle thus giving coordinates relevant for determination of near plane - s12.set(_eye, UpLeft); + s12->set(_eye, UpLeft); - if(intersect_linesegment_and_triangle(returned, s12, v1, v2, v3) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, v1, v2, v3) == 0) _listVectors[returned] = true; - s12.set(_eye, DownLeft); + s12->set(_eye, DownLeft); - if(intersect_linesegment_and_triangle(returned, s12, v1, v2, v3) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, v1, v2, v3) == 0) _listVectors[returned] = true; - s12.set(_eye, UpRight); + s12->set(_eye, UpRight); - if(intersect_linesegment_and_triangle(returned, s12, v1, v2, v3) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, v1, v2, v3) == 0) _listVectors[returned] = true; - s12.set(_eye, DownRight); + s12->set(_eye, DownRight); - if(intersect_linesegment_and_triangle(returned, s12, v1, v2, v3) == 0) + if(intersect_linesegment_and_triangle(returned, *s12, v1, v2, v3) == 0) _listVectors[returned] = true; } } diff --git a/src/osgUtil/IntersectVisitor.cpp b/src/osgUtil/IntersectVisitor.cpp index 04311dda4..0fa261ee6 100644 --- a/src/osgUtil/IntersectVisitor.cpp +++ b/src/osgUtil/IntersectVisitor.cpp @@ -12,32 +12,87 @@ using namespace osg; using namespace osgUtil; -IntersectState::IntersectState() + + +Hit::Hit() +{ +} + + +Hit::Hit(const Hit& hit) +{ + // copy data across. + _ratio = hit._ratio; + _originalLineSegment = hit._originalLineSegment; + _localLineSegment = hit._localLineSegment; + _nodePath = hit._nodePath; + _geode = hit._geode; + _geoset = hit._geoset; + _matrix = hit._matrix; + _inverse = hit._inverse; + + _vecIndexList = hit._vecIndexList; + _primitiveIndex = hit._primitiveIndex; + _intersectPoint = hit._intersectPoint; + _intersectNormal = hit._intersectNormal; +} + + +Hit::~Hit() +{ +} + + +Hit& Hit::operator = (const Hit& hit) +{ + if (&hit==this) return *this; + + _matrix = hit._matrix; + _inverse = hit._inverse; + _originalLineSegment = hit._originalLineSegment; + _localLineSegment = hit._localLineSegment; + + // copy data across. + _ratio = hit._ratio; + _originalLineSegment = hit._originalLineSegment; + _localLineSegment = hit._localLineSegment; + _nodePath = hit._nodePath; + _geode = hit._geode; + _geoset = hit._geoset; + + _vecIndexList = hit._vecIndexList; + _primitiveIndex = hit._primitiveIndex; + _intersectPoint = hit._intersectPoint; + _intersectNormal = hit._intersectNormal; + + return *this; +} + +const osg::Vec3 Hit::getWorldIntersectNormal() const +{ + if (_inverse.valid()) + { + osg::Vec3 norm = osg::Matrix::transform3x3(*_inverse,_intersectNormal); + norm.normalize(); + return norm; + } + else return _intersectNormal; +} + + + +IntersectVisitor::IntersectState::IntersectState() { - _matrix = NULL; - _inverse = NULL; _segmentMaskStack.push_back(0xffffffff); } -IntersectState::~IntersectState() +IntersectVisitor::IntersectState::~IntersectState() { - if (_matrix) _matrix->unref(); - if (_inverse) _inverse->unref(); - for(LineSegmentList::iterator itr=_segList.begin(); - itr!=_segList.end(); - ++itr) - { - itr->first->unref(); - itr->second->unref(); - } - - _matrix = (osg::Matrix *)0xffffffff; - _inverse = (osg::Matrix *)0xffffffff; } -bool IntersectState::isCulled(const BoundingSphere& bs,LineSegmentmentMask& segMaskOut) +bool IntersectVisitor::IntersectState::isCulled(const BoundingSphere& bs,LineSegmentmentMask& segMaskOut) { bool hit = false; LineSegmentmentMask mask = 0x00000001; @@ -61,7 +116,7 @@ bool IntersectState::isCulled(const BoundingSphere& bs,LineSegmentmentMask& segM } -bool IntersectState::isCulled(const BoundingBox& bb,LineSegmentmentMask& segMaskOut) +bool IntersectVisitor::IntersectState::isCulled(const BoundingBox& bb,LineSegmentmentMask& segMaskOut) { bool hit = false; LineSegmentmentMask mask = 0x00000001; @@ -81,92 +136,6 @@ bool IntersectState::isCulled(const BoundingBox& bb,LineSegmentmentMask& segMask return !hit; } - -Hit::Hit() -{ - _originalLineSegment=NULL; - _localLineSegment=NULL; - _geode=NULL; - _geoset=NULL; - _matrix=NULL; -} - - -Hit::Hit(const Hit& hit):Referenced() -{ - // copy data across. - _ratio = hit._ratio; - _originalLineSegment = hit._originalLineSegment; - _localLineSegment = hit._localLineSegment; - _nodePath = hit._nodePath; - _geode = hit._geode; - _geoset = hit._geoset; - _matrix = hit._matrix; - - _vecIndexList = hit._vecIndexList; - _primitiveIndex = hit._primitiveIndex; - _intersectPoint = hit._intersectPoint; - _intersectNormal = hit._intersectNormal; - - if (_matrix) _matrix->ref(); - if (_originalLineSegment) _originalLineSegment->ref(); - if (_localLineSegment) _localLineSegment->ref(); -} - - -Hit::~Hit() -{ - if (_matrix) _matrix->unref(); - if (_originalLineSegment) _originalLineSegment->unref(); - if (_localLineSegment) _localLineSegment->unref(); - _matrix = (osg::Matrix*)0xffffffff; - _localLineSegment = (osg::LineSegment*)0xffffffff; - _localLineSegment = (osg::LineSegment*)0xffffffff; - _geode = (osg::Geode*)0xffffffff; -} - - -Hit& Hit::operator = (const Hit& hit) -{ - if (&hit==this) return *this; - - // free old memory. - if (_matrix!=hit._matrix) - { - if (_matrix) _matrix->unref(); - _matrix = hit._matrix; - if (_matrix) _matrix->ref(); - } - if (_originalLineSegment!=hit._originalLineSegment) - { - if (_originalLineSegment) _originalLineSegment->unref(); - _originalLineSegment = hit._originalLineSegment; - if (_originalLineSegment) _originalLineSegment->ref(); - } - if (_localLineSegment!=hit._localLineSegment) - { - if (_localLineSegment) _localLineSegment->unref(); - _localLineSegment = hit._localLineSegment; - if (_localLineSegment) _localLineSegment->ref(); - } - - // copy data across. - _ratio = hit._ratio; - _originalLineSegment = hit._originalLineSegment; - _localLineSegment = hit._localLineSegment; - _nodePath = hit._nodePath; - _geode = hit._geode; - _geoset = hit._geoset; - - _vecIndexList = hit._vecIndexList; - _primitiveIndex = hit._primitiveIndex; - _intersectPoint = hit._intersectPoint; - _intersectNormal = hit._intersectNormal; - - return *this; -} - - IntersectVisitor::IntersectVisitor() { // overide the default node visitor mode. @@ -182,16 +151,10 @@ IntersectVisitor::~IntersectVisitor() void IntersectVisitor::reset() { - - // - // first unref all referenced objects and then empty the containers. - // _intersectStateStack.clear(); // create a empty IntersectState on the the intersectStateStack. IntersectState* nis = new IntersectState; - nis->_matrix = NULL; - nis->_inverse = NULL; _intersectStateStack.push_back(nis); @@ -231,11 +194,11 @@ void IntersectVisitor::addLineSegment(LineSegment* seg) // create a new segment transformed to local coordintes. IntersectState* cis = _intersectStateStack.back().get(); LineSegment* ns = new LineSegment; - if (cis->_inverse) ns->mult(*seg,*(cis->_inverse)); + + if (cis->_inverse.valid()) ns->mult(*seg,*(cis->_inverse)); else *ns = *seg; - cis->_segList.push_back(std::pair(seg,ns)); - seg->ref(); - ns->ref(); + + cis->addLineSegmentPair(seg,ns); } @@ -246,7 +209,7 @@ void IntersectVisitor::pushMatrix(const Matrix& matrix) IntersectState* cis = _intersectStateStack.back().get(); - if (cis->_matrix) + if (cis->_matrix.valid()) { nis->_matrix = new Matrix; nis->_matrix->mult(matrix,*(cis->_matrix)); @@ -255,10 +218,8 @@ void IntersectVisitor::pushMatrix(const Matrix& matrix) { nis->_matrix = new Matrix(matrix); } - nis->_matrix->ref(); Matrix* inverse_world = new Matrix; - inverse_world->ref(); inverse_world->invert(*(nis->_matrix)); nis->_inverse = inverse_world; @@ -272,16 +233,12 @@ void IntersectVisitor::pushMatrix(const Matrix& matrix) { LineSegment* seg = new LineSegment; seg->mult(*(sitr->first),*inverse_world); - nis->_segList.push_back(std::pair(sitr->first,seg)); - seg->ref(); - sitr->first->ref(); + nis->addLineSegmentPair(sitr->first.get(),seg); } mask = mask << 1; } _intersectStateStack.push_back(nis); - - // notify(INFO) << << "IntersectVisitor::pushMatrix()"<< std::endl; } @@ -289,11 +246,8 @@ void IntersectVisitor::popMatrix() { if (!_intersectStateStack.empty()) { - // IntersectState* pvs = _intersectStateStack.back().get(); - // pvs->unref(); _intersectStateStack.pop_back(); } - // notify(INFO) << << "IntersectVisitor::popMatrix()"<< std::endl; } @@ -335,7 +289,7 @@ void IntersectVisitor::apply(Node& node) struct TriangleIntersect { - LineSegment _seg; + osg::ref_ptr _seg; Vec3 _s; Vec3 _d; @@ -350,13 +304,13 @@ struct TriangleIntersect TriangleIntersect(const LineSegment& seg,float ratio=FLT_MAX) { - _seg=seg; + _seg=new LineSegment(seg); _hit=false; _index = 0; _ratio = ratio; - _s = _seg.start(); - _d = _seg.end()-_seg.start(); + _s = _seg->start(); + _d = _seg->end()-_seg->start(); _length = _d.length(); _d /= _length; @@ -485,7 +439,7 @@ bool IntersectVisitor::intersect(GeoSet& gset) Hit hit; hit._nodePath = _nodePath; hit._matrix = cis->_matrix; - if (hit._matrix) hit._matrix->ref(); + hit._inverse = cis->_inverse; hit._geoset = &gset; if (_nodePath.empty()) hit._geode = NULL; else hit._geode = dynamic_cast(_nodePath.back()); @@ -493,25 +447,21 @@ bool IntersectVisitor::intersect(GeoSet& gset) hit._ratio = thitr->first; hit._primitiveIndex = thitr->second.first; hit._originalLineSegment = sitr->first; - if (hit._originalLineSegment) hit._originalLineSegment->ref(); hit._localLineSegment = sitr->second; - if (hit._localLineSegment) hit._localLineSegment->ref(); hit._intersectPoint = sitr->second->start()*(1.0f-hit._ratio)+ sitr->second->end()*hit._ratio; hit._intersectNormal = thitr->second.second; - // _segHitList[sitr->first].insert(hit); - _segHitList[sitr->first].push_back(hit); - std::sort(_segHitList[sitr->first].begin(),_segHitList[sitr->first].end()); + _segHitList[sitr->first.get()].push_back(hit); + std::sort(_segHitList[sitr->first.get()].begin(),_segHitList[sitr->first.get()].end()); hitFlag = true; } } } - // else notify(INFO) << << "no BB hit"<< std::endl; } return hitFlag;