From 93f4d31cf94047bf9f0c72e52c072816b20975db Mon Sep 17 00:00:00 2001
From: scrawl <scrawl@baseoftrash.de>
Date: Sat, 31 Oct 2015 01:30:02 +0100
Subject: [PATCH] Raytest mask fix (Fixes #2984)

---
 apps/openmw/mwrender/renderingmanager.cpp | 38 ++++++++++-------------
 1 file changed, 16 insertions(+), 22 deletions(-)

diff --git a/apps/openmw/mwrender/renderingmanager.cpp b/apps/openmw/mwrender/renderingmanager.cpp
index 03a44a4e61..da81b23b1a 100644
--- a/apps/openmw/mwrender/renderingmanager.cpp
+++ b/apps/openmw/mwrender/renderingmanager.cpp
@@ -588,23 +588,27 @@ namespace MWRender
 
     }
 
+    osg::ref_ptr<osgUtil::IntersectionVisitor> createIntersectionVisitor(osgUtil::Intersector* intersector, bool ignorePlayer, bool ignoreActors)
+    {
+        osg::ref_ptr<osgUtil::IntersectionVisitor> intersectionVisitor( new osgUtil::IntersectionVisitor(intersector));
+        int mask = intersectionVisitor->getTraversalMask();
+        mask &= ~(Mask_RenderToTexture|Mask_Sky|Mask_Debug|Mask_Effect|Mask_Water|Mask_SimpleWater);
+        if (ignorePlayer)
+            mask &= ~(Mask_Player);
+        if (ignoreActors)
+            mask &= ~(Mask_Actor|Mask_Player);
+
+        intersectionVisitor->setTraversalMask(mask);
+        return intersectionVisitor;
+    }
+
     RenderingManager::RayResult RenderingManager::castRay(const osg::Vec3f& origin, const osg::Vec3f& dest, bool ignorePlayer, bool ignoreActors)
     {
         osg::ref_ptr<osgUtil::LineSegmentIntersector> intersector (new osgUtil::LineSegmentIntersector(osgUtil::LineSegmentIntersector::MODEL,
             origin, dest));
         intersector->setIntersectionLimit(osgUtil::LineSegmentIntersector::LIMIT_NEAREST);
 
-        osgUtil::IntersectionVisitor intersectionVisitor(intersector);
-        int mask = intersectionVisitor.getTraversalMask();
-        mask &= ~(Mask_RenderToTexture|Mask_Sky|Mask_Debug|Mask_Effect|Mask_Water);
-        if (ignorePlayer)
-            mask &= ~(Mask_Player);
-        if (ignoreActors)
-            mask &= ~(Mask_Actor|Mask_Player);
-
-        intersectionVisitor.setTraversalMask(mask);
-
-        mRootNode->accept(intersectionVisitor);
+        mRootNode->accept(*createIntersectionVisitor(intersector, ignorePlayer, ignoreActors));
 
         return getIntersectionResult(intersector);
     }
@@ -623,17 +627,7 @@ namespace MWRender
         intersector->setEnd(end);
         intersector->setIntersectionLimit(osgUtil::LineSegmentIntersector::LIMIT_NEAREST);
 
-        osgUtil::IntersectionVisitor intersectionVisitor(intersector);
-        int mask = intersectionVisitor.getTraversalMask();
-        mask &= ~(Mask_RenderToTexture|Mask_Sky|Mask_Debug|Mask_Effect|Mask_Water);
-        if (ignorePlayer)
-            mask &= ~(Mask_Player);
-        if (ignoreActors)
-            mask &= ~(Mask_Actor|Mask_Player);
-
-        intersectionVisitor.setTraversalMask(mask);
-
-        mViewer->getCamera()->accept(intersectionVisitor);
+        mViewer->getCamera()->accept(*createIntersectionVisitor(intersector, ignorePlayer, ignoreActors));
 
         return getIntersectionResult(intersector);
     }