mirror of
https://gitlab.com/OpenMW/openmw.git
synced 2025-04-11 00:44:33 +00:00
Reuse the intersection visitor and set a traversal number to allow the terrain component to manage its view more efficiently
This commit is contained in:
parent
db00d47ca2
commit
9371100fde
@ -730,18 +730,23 @@ namespace MWRender
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
osg::ref_ptr<osgUtil::IntersectionVisitor> createIntersectionVisitor(osgUtil::Intersector* intersector, bool ignorePlayer, bool ignoreActors)
|
osg::ref_ptr<osgUtil::IntersectionVisitor> RenderingManager::getIntersectionVisitor(osgUtil::Intersector *intersector, bool ignorePlayer, bool ignoreActors)
|
||||||
{
|
{
|
||||||
osg::ref_ptr<osgUtil::IntersectionVisitor> intersectionVisitor( new osgUtil::IntersectionVisitor(intersector));
|
if (!mIntersectionVisitor)
|
||||||
int mask = intersectionVisitor->getTraversalMask();
|
mIntersectionVisitor = new osgUtil::IntersectionVisitor;
|
||||||
|
|
||||||
|
mIntersectionVisitor->setTraversalNumber(mViewer->getFrameStamp()->getFrameNumber());
|
||||||
|
mIntersectionVisitor->setIntersector(intersector);
|
||||||
|
|
||||||
|
int mask = ~0;
|
||||||
mask &= ~(Mask_RenderToTexture|Mask_Sky|Mask_Debug|Mask_Effect|Mask_Water|Mask_SimpleWater);
|
mask &= ~(Mask_RenderToTexture|Mask_Sky|Mask_Debug|Mask_Effect|Mask_Water|Mask_SimpleWater);
|
||||||
if (ignorePlayer)
|
if (ignorePlayer)
|
||||||
mask &= ~(Mask_Player);
|
mask &= ~(Mask_Player);
|
||||||
if (ignoreActors)
|
if (ignoreActors)
|
||||||
mask &= ~(Mask_Actor|Mask_Player);
|
mask &= ~(Mask_Actor|Mask_Player);
|
||||||
|
|
||||||
intersectionVisitor->setTraversalMask(mask);
|
mIntersectionVisitor->setTraversalMask(mask);
|
||||||
return intersectionVisitor;
|
return mIntersectionVisitor;
|
||||||
}
|
}
|
||||||
|
|
||||||
RenderingManager::RayResult RenderingManager::castRay(const osg::Vec3f& origin, const osg::Vec3f& dest, bool ignorePlayer, bool ignoreActors)
|
RenderingManager::RayResult RenderingManager::castRay(const osg::Vec3f& origin, const osg::Vec3f& dest, bool ignorePlayer, bool ignoreActors)
|
||||||
@ -750,7 +755,7 @@ namespace MWRender
|
|||||||
origin, dest));
|
origin, dest));
|
||||||
intersector->setIntersectionLimit(osgUtil::LineSegmentIntersector::LIMIT_NEAREST);
|
intersector->setIntersectionLimit(osgUtil::LineSegmentIntersector::LIMIT_NEAREST);
|
||||||
|
|
||||||
mRootNode->accept(*createIntersectionVisitor(intersector, ignorePlayer, ignoreActors));
|
mRootNode->accept(*getIntersectionVisitor(intersector, ignorePlayer, ignoreActors));
|
||||||
|
|
||||||
return getIntersectionResult(intersector);
|
return getIntersectionResult(intersector);
|
||||||
}
|
}
|
||||||
@ -769,7 +774,7 @@ namespace MWRender
|
|||||||
intersector->setEnd(end);
|
intersector->setEnd(end);
|
||||||
intersector->setIntersectionLimit(osgUtil::LineSegmentIntersector::LIMIT_NEAREST);
|
intersector->setIntersectionLimit(osgUtil::LineSegmentIntersector::LIMIT_NEAREST);
|
||||||
|
|
||||||
mViewer->getCamera()->accept(*createIntersectionVisitor(intersector, ignorePlayer, ignoreActors));
|
mViewer->getCamera()->accept(*getIntersectionVisitor(intersector, ignorePlayer, ignoreActors));
|
||||||
|
|
||||||
return getIntersectionResult(intersector);
|
return getIntersectionResult(intersector);
|
||||||
}
|
}
|
||||||
|
@ -17,6 +17,12 @@ namespace osg
|
|||||||
class PositionAttitudeTransform;
|
class PositionAttitudeTransform;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace osgUtil
|
||||||
|
{
|
||||||
|
class IntersectionVisitor;
|
||||||
|
class Intersector;
|
||||||
|
}
|
||||||
|
|
||||||
namespace Resource
|
namespace Resource
|
||||||
{
|
{
|
||||||
class ResourceSystem;
|
class ResourceSystem;
|
||||||
@ -204,6 +210,10 @@ namespace MWRender
|
|||||||
|
|
||||||
void reportStats() const;
|
void reportStats() const;
|
||||||
|
|
||||||
|
osg::ref_ptr<osgUtil::IntersectionVisitor> getIntersectionVisitor(osgUtil::Intersector* intersector, bool ignorePlayer, bool ignoreActors);
|
||||||
|
|
||||||
|
osg::ref_ptr<osgUtil::IntersectionVisitor> mIntersectionVisitor;
|
||||||
|
|
||||||
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
osg::ref_ptr<osgViewer::Viewer> mViewer;
|
||||||
osg::ref_ptr<osg::Group> mRootNode;
|
osg::ref_ptr<osg::Group> mRootNode;
|
||||||
osg::ref_ptr<osg::Group> mSceneRoot;
|
osg::ref_ptr<osg::Group> mSceneRoot;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user