public Vector3 IntersectSegment( Vector3 start, Vector3 end )
{
Vector3 dir = end - start;
Vector3 ray = start;
//special case...
if ( dir.x == 0 && dir.z == 0 )
{
if ( ray.y <= GetHeightAt( ray.x, ray.z ) )
{
return start;
}
}
dir.Normalize();
//dir.x *= mScale.x;
//dir.y *= mScale.y;
//dir.z *= mScale.z;
AxisAlignedBox box = this.BoundingBox;
//start with the next one...
ray += dir;
// traverse down the ray until we are
while ( !( ( ray.x < box.Minimum.x ) ||
( ray.x > box.Maximum.x ) ||
( ray.z < box.Minimum.z ) ||
( ray.z > box.Maximum.z ) ) )
{
float h = GetHeightAt( ray.x, ray.z );
if ( ray.y <= h )
{
return ray;
}
else
{
ray += dir;
}
}
if ( ray.x < box.Minimum.x && GetNeighbor( Neighbor.West ) != null )
return GetNeighbor( Neighbor.West ).IntersectSegment( ray, end );
else if ( ray.z < box.Minimum.z && GetNeighbor( Neighbor.North ) != null )
return GetNeighbor( Neighbor.North ).IntersectSegment( ray, end );
else if ( ray.x > box.Maximum.x && GetNeighbor( Neighbor.East ) != null )
return GetNeighbor( Neighbor.East ).IntersectSegment( ray, end );
else if ( ray.z > box.Maximum.z && GetNeighbor( Neighbor.South ) != null )
return GetNeighbor( Neighbor.South ).IntersectSegment( ray, end );
else
{
return new Vector3( -1, -1, -1 );
}
}