//public System.Object lockObject; public void AddSpan(uint bottom, uint top, int area, int voxelWalkableClimb) { VoxelSpan span = new VoxelSpan (bottom,top,area); //lock (lockObject) { if (firstSpan == null) { firstSpan = span; return; } VoxelSpan prev = null; VoxelSpan cSpan = firstSpan; //for (VoxelSpan cSpan = firstSpan; cSpan != null; cSpan = cSpan.next) { while (cSpan != null) { if (cSpan.bottom > span.top) { break; } else if (cSpan.top < span.bottom) { prev = cSpan; cSpan = cSpan.next; } else { if (cSpan.bottom < bottom) { span.bottom = cSpan.bottom; } if (cSpan.top > top) { span.top = cSpan.top; } //1 is flagMergeDistance, when a walkable flag is favored before an unwalkable one if (Mathfx.Abs ((int)span.top - (int)cSpan.top) <= voxelWalkableClimb) { span.area = Mathfx.Max (span.area,cSpan.area); } VoxelSpan next = cSpan.next; if (prev != null) { prev.next = next; } else { firstSpan = next; } cSpan = next; /*cSpan.bottom = cSpan.bottom < bottom ? cSpan.bottom : bottom; cSpan.top = cSpan.top > top ? cSpan.top : top; if (cSpan.bottom < span.bottom) { span.bottom = cSpan.bottom; } if (cSpan.top > span.top) { span.top = cSpan.top; } span.area = Mathfx.Min (span.area,cSpan.area); VoxelSpan next = cSpan.next; if (prev != null) { prev.next = next; } else { firstSpan = next; } cSpan = next;*/ } } if (prev != null) { span.next = prev.next; prev.next = span; } else { span.next = firstSpan; firstSpan = span; } //} }
public void FilterWalkable(uint walkableHeight) { VoxelSpan prev = null; for (VoxelSpan cSpan = firstSpan; cSpan != null; cSpan = cSpan.next) { if (cSpan.area == 1) { if (prev != null) { prev.next = cSpan.next; } else { firstSpan = cSpan.next; } } else { if (cSpan.next != null) { cSpan.top = cSpan.next.bottom; } else { cSpan.top = VoxelArea.MaxHeight; } uint val = cSpan.top-cSpan.bottom; if (cSpan.top < cSpan.bottom) { Debug.Log ((cSpan.top-cSpan.bottom)); } if (val < walkableHeight) { if (prev != null) { prev.next = cSpan.next; } else { firstSpan = cSpan.next; } } else { prev = cSpan; continue; } } } }