public RetrievedPhotons RetrieveNearestNeighbors(PhotonVector3 point, float distanceSquared, int maxPhotons, Vector3 normal) { RetrievedPhotons _retrieved = new RetrievedPhotons(maxPhotons); LocatePhotons(root, point, distanceSquared, ref _retrieved, normal); return(_retrieved); }
public void LocatePhotons(Node <CompressedPhoton> node, PhotonVector3 _p, float _distSquared, ref RetrievedPhotons _retrieved, Vector3 normal) { if (node == null) { return; } // Step 1: Check distance between current node and point. If it's within radius, add it. PhotonVector3 difference = node.Current.position - _p; float dist2 = difference[0] * difference[0]; dist2 += difference[1] * difference[1]; dist2 += difference[2] * difference[2]; if (dist2 < _distSquared) { if ((node.Current != null) && (Vector3.Dot(node.Current.Direction, normal) < 0)) { _retrieved.AddIfClosest(node.Current, dist2); } } // Step 2: Is the point greater or lesser than the current node? Go left or right depending. if (difference[node.Axis] >= 0) { LocatePhotons(node.Right, _p, _distSquared, ref _retrieved, normal); if (difference[node.Axis] * difference[node.Axis] < _distSquared) { LocatePhotons(node.Left, _p, _distSquared, ref _retrieved, normal); } } else { LocatePhotons(node.Left, _p, _distSquared, ref _retrieved, normal); if (difference[node.Axis] * difference[node.Axis] < _distSquared) { LocatePhotons(node.Right, _p, _distSquared, ref _retrieved, normal); } } }