1
0
Fork 0
mirror of https://github.com/OpenMW/openmw.git synced 2025-02-01 04:45:36 +00:00

Merge pull request #2696 from akortunov/intersector

Fix LineSegmentIntersector usage
This commit is contained in:
Alexei Dobrohotov 2020-02-11 09:48:10 +03:00 committed by GitHub
commit 54e7e0c718
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 21 additions and 7 deletions

View file

@ -150,12 +150,12 @@ void QuadTreeNode::traverseTo(ViewData* vd, float size, const osg::Vec2f& center
}
}
void QuadTreeNode::intersect(ViewData* vd, TerrainLineIntersector* intersector)
void QuadTreeNode::intersect(ViewData* vd, TerrainLineIntersector& intersector)
{
if (!hasValidBounds())
return;
if (!intersector->intersectAndClip(getBoundingBox()))
if (!intersector.intersectAndClip(getBoundingBox()))
return;
if (getNumChildren() == 0)

View file

@ -20,6 +20,14 @@ namespace Terrain
_parent = intersector;
}
TerrainLineIntersector(osgUtil::LineSegmentIntersector* intersector) :
osgUtil::LineSegmentIntersector(intersector->getStart(), intersector->getEnd())
{
setPrecisionHint(intersector->getPrecisionHint());
_intersectionLimit = intersector->getIntersectionLimit();
_parent = intersector;
}
bool intersectAndClip(const osg::BoundingBox& bbInput)
{
osg::Vec3d s(_start), e(_end);
@ -98,7 +106,7 @@ namespace Terrain
void traverseTo(ViewData* vd, float size, const osg::Vec2f& center);
/// Adds all leaf nodes which intersect the line from start to end
void intersect(ViewData* vd, TerrainLineIntersector* intersector);
void intersect(ViewData* vd, TerrainLineIntersector& intersector);
private:
QuadTreeNode* mParent;

View file

@ -362,11 +362,17 @@ void QuadTreeWorld::accept(osg::NodeVisitor &nv)
if (!lineIntersector)
throw std::runtime_error("Cannot update QuadTreeWorld: node visitor is not LineSegmentIntersector");
osg::Matrix matrix = osg::Matrix::identity();
if (lineIntersector->getCoordinateFrame() == osgUtil::Intersector::CoordinateFrame::MODEL && iv->getModelMatrix() == 0)
matrix = lineIntersector->getTransformation(*iv, osgUtil::Intersector::CoordinateFrame::MODEL);
osg::ref_ptr<TerrainLineIntersector> terrainIntersector (new TerrainLineIntersector(lineIntersector, matrix));
mRootNode->intersect(vd, terrainIntersector);
{
TerrainLineIntersector terrainIntersector(lineIntersector);
mRootNode->intersect(vd, terrainIntersector);
}
else
{
osg::Matrix matrix(lineIntersector->getTransformation(*iv, lineIntersector->getCoordinateFrame()));
TerrainLineIntersector terrainIntersector(lineIntersector, matrix);
mRootNode->intersect(vd, terrainIntersector);
}
}
}