protected virtual void ProcessNode( BspNode node, Ray tracingRay, float maxDistance, float traceDistance )
{
// check if ray already encountered a solid brush
if ( StopRayTracing )
return;
if ( node.IsLeaf )
{
ProcessLeaf( node, tracingRay, maxDistance, traceDistance );
return;
}
IntersectResult result = tracingRay.Intersects( node.SplittingPlane );
if ( result.Hit )
{
if ( result.Distance < maxDistance )
{
if ( node.GetSide( tracingRay.Origin ) == PlaneSide.Negative )
{
ProcessNode( node.BackNode, tracingRay, result.Distance, traceDistance );
Vector3 splitPoint = tracingRay.Origin + tracingRay.Direction * result.Distance;
ProcessNode( node.FrontNode, new Ray( splitPoint, tracingRay.Direction ), maxDistance - result.Distance, traceDistance + result.Distance );
}
else
{
ProcessNode( node.FrontNode, tracingRay, result.Distance, traceDistance );
Vector3 splitPoint = tracingRay.Origin + tracingRay.Direction * result.Distance;
ProcessNode( node.BackNode, new Ray( splitPoint, tracingRay.Direction ), maxDistance - result.Distance, traceDistance + result.Distance );
}
}
else
ProcessNode( node.GetNextNode( tracingRay.Origin ), tracingRay, maxDistance, traceDistance );
}
else
ProcessNode( node.GetNextNode( tracingRay.Origin ), tracingRay, maxDistance, traceDistance );
}