Example #1
0
    //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;
            }
        //}
    }
Example #2
0
    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;
                }
            }

        }
    }