public override NNInfo GetNearestForce (Vector3 position, NNConstraint constraint) {
if (nodes == null || depth*width*layerCount != nodes.Length || layerCount == 0) {
return new NNInfo ();
}
Vector3 globalPosition = position;
position = inverseMatrix.MultiplyPoint3x4 (position);
int x = Mathf.Clamp (Mathf.RoundToInt (position.x-0.5F) , 0, width-1);
int z = Mathf.Clamp (Mathf.RoundToInt (position.z-0.5F) , 0, depth-1);
LevelGridNode minNode = null;
float minDist = float.PositiveInfinity;
int overlap = getNearestForceOverlap;
minNode = GetNearestNode (globalPosition,x,z,constraint);
if (minNode != null) {
minDist = ((Vector3)minNode.position-globalPosition).sqrMagnitude;
}
/*if (constraint.Suitable (firstBestNode)) {
minNode = firstBestNode;
minDist = ((Vector3)minNode.position-globalPosition).sqrMagnitude;
}*/
if (minNode != null) {
if (overlap == 0) return new NNInfo(minNode);
else overlap--;
}
//int counter = 0;
float maxDist = constraint.constrainDistance ? AstarPath.active.maxNearestNodeDistance : float.PositiveInfinity;
float maxDistSqr = maxDist*maxDist;
//for (int w = 1; w < getNearestForceLimit;w++) {
for (int w = 1;;w++) {
int nx = x;
int nz = z+w;
//int nz2 = nz*width;
//Check if the nodes are within distance limit
if (nodeSize*w > maxDist) {
return new NNInfo(minNode);
}
for (nx = x-w;nx <= x+w;nx++) {
if (nx < 0 || nz < 0 || nx >= width || nz >= depth) continue;
LevelGridNode node = GetNearestNode (globalPosition, nx,nz, constraint);
if (node != null) {
float dist = ((Vector3)node.position-globalPosition).sqrMagnitude;
//Debug.DrawRay (nodes[nx+nz*width].position,Vector3.up*dist,Color.cyan);counter++;
if (dist < minDist && dist < maxDistSqr) { minDist = dist; minNode = node; }
}
}
nz = z-w;
//nz2 = nz*width;
for (nx = x-w;nx <= x+w;nx++) {
if (nx < 0 || nz < 0 || nx >= width || nz >= depth) continue;
LevelGridNode node = GetNearestNode (globalPosition, nx,nz, constraint);
if (node != null) {
float dist = ((Vector3)node.position-globalPosition).sqrMagnitude;
//Debug.DrawRay (nodes[nx+nz*width].position,Vector3.up*dist,Color.cyan);counter++;
if (dist < minDist && dist < maxDistSqr) { minDist = dist; minNode = node; }
}
}
nx = x-w;
nz = z-w+1;
for (nz = z-w+1;nz <= z+w-1; nz++) {
if (nx < 0 || nz < 0 || nx >= width || nz >= depth) continue;
LevelGridNode node = GetNearestNode (globalPosition, nx,nz, constraint);
if (node != null) {
float dist = ((Vector3)node.position-globalPosition).sqrMagnitude;
//Debug.DrawRay (nodes[nx+nz*width].position,Vector3.up*dist,Color.cyan);counter++;
if (dist < minDist && dist < maxDistSqr) { minDist = dist; minNode = node; }
}
}
nx = x+w;
for (nz = z-w+1;nz <= z+w-1; nz++) {
if (nx < 0 || nz < 0 || nx >= width || nz >= depth) continue;
LevelGridNode node = GetNearestNode (globalPosition, nx,nz, constraint);
if (node != null) {
float dist = ((Vector3)node.position-globalPosition).sqrMagnitude;
//Debug.DrawRay (nodes[nx+nz*width].position,Vector3.up*dist,Color.cyan);counter++;
if (dist < minDist && dist < maxDistSqr) { minDist = dist; minNode = node; }
}
}
if (minNode != null) {
if (overlap == 0) return new NNInfo(minNode);
else overlap--;
}
}
//return new NNInfo ();
}