From cbcf7015bba30020c4a6427a9d5f926641dc4096 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 26 Jun 2018 20:46:49 +0100 Subject: [PATCH] Replaced creation of a temporary Settings object on the heap with creation on the stack to improve performance --- src/osgUtil/LineSegmentIntersector.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/src/osgUtil/LineSegmentIntersector.cpp b/src/osgUtil/LineSegmentIntersector.cpp index 65b61c8be..c9607266b 100644 --- a/src/osgUtil/LineSegmentIntersector.cpp +++ b/src/osgUtil/LineSegmentIntersector.cpp @@ -28,7 +28,7 @@ using namespace osgUtil; namespace LineSegmentIntersectorUtils { -struct Settings : public osg::Referenced +struct Settings { Settings() : _lineSegIntersector(0), @@ -46,7 +46,7 @@ struct Settings : public osg::Referenced template struct IntersectFunctor { - osg::ref_ptr _settings; + Settings* _settings; unsigned int _primitiveIndex; Vec3 _start; @@ -518,16 +518,16 @@ void LineSegmentIntersector::intersect(osgUtil::IntersectionVisitor& iv, osg::Dr { if (reachedLimit()) return; - osg::ref_ptr settings = new LineSegmentIntersectorUtils::Settings; - settings->_lineSegIntersector = this; - settings->_iv = &iv; - settings->_drawable = drawable; - settings->_limitOneIntersection = (_intersectionLimit == LIMIT_ONE_PER_DRAWABLE || _intersectionLimit == LIMIT_ONE); + LineSegmentIntersectorUtils::Settings settings; + settings._lineSegIntersector = this; + settings._iv = &iv; + settings._drawable = drawable; + settings._limitOneIntersection = (_intersectionLimit == LIMIT_ONE_PER_DRAWABLE || _intersectionLimit == LIMIT_ONE); osg::Geometry* geometry = drawable->asGeometry(); if (geometry) { - settings->_vertices = dynamic_cast(geometry->getVertexArray()); + settings._vertices = dynamic_cast(geometry->getVertexArray()); } osg::KdTree* kdTree = iv.getUseKdTreeWhenAvailable() ? dynamic_cast(drawable->getShape()) : 0; @@ -535,7 +535,7 @@ void LineSegmentIntersector::intersect(osgUtil::IntersectionVisitor& iv, osg::Dr if (getPrecisionHint()==USE_DOUBLE_CALCULATIONS) { osg::TemplatePrimitiveFunctor > intersector; - intersector.set(s,e, settings.get()); + intersector.set(s,e, &settings); if (kdTree) kdTree->intersect(intersector, kdTree->getNode(0)); else drawable->accept(intersector); @@ -543,7 +543,7 @@ void LineSegmentIntersector::intersect(osgUtil::IntersectionVisitor& iv, osg::Dr else { osg::TemplatePrimitiveFunctor > intersector; - intersector.set(s,e, settings.get()); + intersector.set(s,e, &settings); if (kdTree) kdTree->intersect(intersector, kdTree->getNode(0)); else drawable->accept(intersector);