diff --git a/doc/Doxyfiles/auto_Doxyfile b/doc/Doxyfiles/auto_Doxyfile index 6956b85e2..0ebf7868a 100644 --- a/doc/Doxyfiles/auto_Doxyfile +++ b/doc/Doxyfiles/auto_Doxyfile @@ -323,7 +323,6 @@ INPUT = $(OSGHOME)/include/osg \ $(OSGHOME)/include/osgParticle \ $(OSGHOME)/include/osgText \ $(OSGHOME)/include/osgUtil \ - $(OSGHOME)/include/osgUtx \ $(OSGHOME)/doc/Doxyfiles/auto_Mainpage # If the value of the INPUT tag contains directories, you can use the diff --git a/doc/Doxyfiles/core_Doxyfile b/doc/Doxyfiles/core_Doxyfile index fc936e83f..47e4b2337 100644 --- a/doc/Doxyfiles/core_Doxyfile +++ b/doc/Doxyfiles/core_Doxyfile @@ -323,7 +323,6 @@ INPUT = $(OSGHOME)/include/osg \ $(OSGHOME)/include/osgParticle \ $(OSGHOME)/include/osgText \ $(OSGHOME)/include/osgUtil \ - $(OSGHOME)/include/osgUtx \ $(OSGHOME)/doc/Doxyfiles/auto_Mainpage # If the value of the INPUT tag contains directories, you can use the diff --git a/include/osg/CopyOp b/include/osg/CopyOp index 2234d70d3..f80cbc9e5 100644 --- a/include/osg/CopyOp +++ b/include/osg/CopyOp @@ -17,6 +17,8 @@ class StateSet; class StateAttribute; class Node; class Drawable; +class Array; +class Primitive; /** Copy Op(erator) used to control the whether shallow or deep copy is used * during copy construction and clone operation.*/ @@ -35,6 +37,8 @@ class SG_EXPORT CopyOp DEEP_COPY_STATEATTRIBUTES = 16, DEEP_COPY_TEXTURES = 32, DEEP_COPY_IMAGES = 64, + DEEP_COPY_ARRAYS = 128, + DEEP_COPY_PRIMITIVES = 256, DEEP_COPY_ALL = 0xffffffff }; @@ -51,6 +55,8 @@ class SG_EXPORT CopyOp virtual StateAttribute* operator() (const StateAttribute* attr) const; virtual Texture* operator() (const Texture* text) const; virtual Image* operator() (const Image* image) const; + virtual Array* operator() (const Array* image) const; + virtual Primitive* operator() (const Primitive* image) const; protected: diff --git a/include/osgUtil/IntersectVisitor b/include/osgUtil/IntersectVisitor index 8a8ae9dd4..7268ed511 100644 --- a/include/osgUtil/IntersectVisitor +++ b/include/osgUtil/IntersectVisitor @@ -76,17 +76,6 @@ class OSGUTIL_EXPORT IntersectVisitor : public osg::NodeVisitor /** Add a line segment to use for intersection testing during scene traversal.*/ void addLineSegment(osg::LineSegment* seg); - /** Modes to control how IntersectVisitor reports hits. */ - enum HitReportingMode { - ONLY_NEAREST_HIT, - ALL_HITS - }; - - /** Set the mode of how hits should reported back from a traversal.*/ - void setHitReportingMode(HitReportingMode hrm) { _hitReportingMode = hrm; } - /** Get the mode of how hits should reported back from a traversal.*/ - HitReportingMode getHitReportingMode() { return _hitReportingMode; } - //typedef std::multiset HitList; typedef std::vector HitList; typedef std::map LineSegmentHitListMap; @@ -151,8 +140,6 @@ class OSGUTIL_EXPORT IntersectVisitor : public osg::NodeVisitor IntersectStateStack _intersectStateStack; osg::NodePath _nodePath; - - HitReportingMode _hitReportingMode; LineSegmentHitListMap _segHitList; }; diff --git a/src/osg/CopyOp.cpp b/src/osg/CopyOp.cpp index 9cd03df94..62ebc11be 100644 --- a/src/osg/CopyOp.cpp +++ b/src/osg/CopyOp.cpp @@ -3,6 +3,8 @@ #include #include #include +#include +#include using namespace osg; @@ -72,3 +74,19 @@ Image* CopyOp::operator() (const Image* image) const return dynamic_cast(image->clone(*this)); else return const_cast(image); } + +Array* CopyOp::operator() (const Array* array) const +{ + if (array && _flags&DEEP_COPY_ARRAYS) + return dynamic_cast(array->clone(*this)); + else + return const_cast(array); +} + +Primitive* CopyOp::operator() (const Primitive* primitive) const +{ + if (primitive && _flags&DEEP_COPY_PRIMITIVES) + return dynamic_cast(primitive->clone(*this)); + else + return const_cast(primitive); +} diff --git a/src/osg/Geometry.cpp b/src/osg/Geometry.cpp index d2a9c6c5f..0919a9d1b 100644 --- a/src/osg/Geometry.cpp +++ b/src/osg/Geometry.cpp @@ -11,14 +11,26 @@ Geometry::Geometry() Geometry::Geometry(const Geometry& geometry,const CopyOp& copyop): Drawable(geometry,copyop), - _primitives(geometry._primitives), - _vertexArray(geometry._vertexArray), + _vertexArray(dynamic_cast(copyop(geometry._vertexArray.get()))), _normalBinding(geometry._normalBinding), - _normalArray(geometry._normalArray), + _normalArray(dynamic_cast(copyop(geometry._normalArray.get()))), _colorBinding(geometry._colorBinding), - _colorArray(geometry._colorArray), - _texCoordList(geometry._texCoordList) + _colorArray(copyop(geometry._colorArray.get())) { + for(PrimitiveList::const_iterator pitr=geometry._primitives.begin(); + pitr!=geometry._primitives.end(); + ++pitr) + { + Primitive* primitive = copyop(pitr->get()); + if (primitive) _primitives.push_back(primitive); + } + + for(TexCoordArrayList::const_iterator titr=geometry._texCoordList.begin(); + titr!=geometry._texCoordList.end(); + ++titr) + { + _texCoordList.push_back(copyop(titr->get())); + } } Geometry::~Geometry() diff --git a/src/osgUtil/IntersectVisitor.cpp b/src/osgUtil/IntersectVisitor.cpp index dd5db6be3..e6b907c15 100644 --- a/src/osgUtil/IntersectVisitor.cpp +++ b/src/osgUtil/IntersectVisitor.cpp @@ -140,13 +140,13 @@ IntersectVisitor::IntersectVisitor() { // overide the default node visitor mode. setTraversalMode(NodeVisitor::TRAVERSE_ACTIVE_CHILDREN); + reset(); } IntersectVisitor::~IntersectVisitor() { - _hitReportingMode = ONLY_NEAREST_HIT; } @@ -476,6 +476,7 @@ bool IntersectVisitor::intersect(Drawable& drawable) hit._intersectNormal = thitr->second.second; _segHitList[sitr->first.get()].push_back(hit); + std::sort(_segHitList[sitr->first.get()].begin(),_segHitList[sitr->first.get()].end()); hitFlag = true;