/// <summary> /// Walks the entire BSP tree and returns the leaf which contains the given point. /// </summary>r public BspNode FindLeaf(Vector3 point) { BspNode node = nodes[0]; while (!node.IsLeaf) { node = node.GetNextNode(point); } return(node); }
protected virtual void ProcessNode( BspNode node, Ray tracingRay, float maxDistance, float traceDistance ) { // check if ray already encountered a solid brush if ( this.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 ); } }