Esempio n. 1
0
 public uint?ConnectedID(VoxelArea.DIRECTION dir)
 {
     if (_connection.ContainsKey(dir))
     {
         return(_connection[dir]);
     }
     return(null);
 }
Esempio n. 2
0
 public void RemoveConnectionID(VoxelArea.DIRECTION dir)
 {
     _connection.Remove(dir);
 }
Esempio n. 3
0
 public void ConnectedID(VoxelArea.DIRECTION dir, uint value)
 {
     _connection[dir] = value;
 }
Esempio n. 4
0
        private void Contours(uint first, uint index, ref List <Vector3> contours, VoxelArea.DIRECTION from = VoxelArea.DIRECTION.End)
        {
            if (!_walkableCells.ContainsKey(index))
            {
                return;
            }

            var va   = _voxelizer.VoxelArea;
            var cell = _walkableCells[index];

            if (cell == null)
            {
                Debug.Log("eeeee" + index);
                return;
            }
            float halfSize = va.CellSize * 0.5f;

            uint radiusCellCount = (uint)Mathf.CeilToInt(_agentInfo.AgentRadius / va.CellSize);

            Vector3 cellPos;

            va.GetCellPosition(index, out cellPos);

            VoxelArea.DIRECTION next = VoxelArea.DIRECTION.End;
            VoxelArea.DIRECTION prev = VoxelArea.DIRECTION.End;

            bool bFirst = false, bFind = false, bEnd = false;

            if (first == index)
            {
                bFirst = true;
            }
            int count = 0;

            uint?connectedIndex;

            for (int i = 0; i < 4; ++i)
            {
                if (bFind && bEnd)
                {
                    break;
                }
                int j = i; // Left or End(first)
                if (from == VoxelArea.DIRECTION.Backward)
                {
                    j = i + 1;
                }
                else if (from == VoxelArea.DIRECTION.Right)
                {
                    j = i + 2;
                }
                else if (from == VoxelArea.DIRECTION.Forward)
                {
                    j = i + 3;
                }
                if (j > 3)
                {
                    j -= 4;
                }
                VoxelArea.DIRECTION connected = VoxelArea.DIRECTION.Backward;
                if (j == 1)
                {
                    connected = VoxelArea.DIRECTION.Right;
                }
                else if (j == 2)
                {
                    connected = VoxelArea.DIRECTION.Forward;
                }
                else if (j == 3)
                {
                    connected = VoxelArea.DIRECTION.Left;
                }
                connectedIndex = cell.ConnectedID(connected);
                if (connectedIndex != null)
                {
                    if (_walkableCells[connectedIndex.Value] == null)
                    {
                        Debug.Log("errrrr " + connectedIndex);
                        return;
                    }
                    if (_walkableCells[connectedIndex.Value].Distance == radiusCellCount)
                    {
                        bFind = true;
                        ++count;
                        Vector3 tmp = cellPos;
                        if (bFirst)
                        {
                            if (connected == VoxelArea.DIRECTION.Left || connected == VoxelArea.DIRECTION.Backward)
                            {
                                tmp.x -= halfSize;
                            }
                            else
                            {
                                tmp.x += halfSize;
                            }
                            if (connected == VoxelArea.DIRECTION.Left || connected == VoxelArea.DIRECTION.Forward)
                            {
                                tmp.z += halfSize;
                            }
                            else
                            {
                                tmp.z -= halfSize;
                            }
                            contours.Add(tmp);
                            bFirst = false;
                        }
                        tmp = cellPos;
                        if (connected == VoxelArea.DIRECTION.Left || connected == VoxelArea.DIRECTION.Forward)
                        {
                            tmp.x -= halfSize;
                        }
                        else
                        {
                            tmp.x += halfSize;
                        }
                        if (connected == VoxelArea.DIRECTION.Right || connected == VoxelArea.DIRECTION.Forward)
                        {
                            tmp.z += halfSize;
                        }
                        else
                        {
                            tmp.z -= halfSize;
                        }
                        contours.Add(tmp);
                        switch (connected)
                        {
                        case VoxelArea.DIRECTION.Left:
                            next = VoxelArea.DIRECTION.Backward;
                            break;

                        case VoxelArea.DIRECTION.Backward:
                            next = VoxelArea.DIRECTION.Right;
                            break;

                        case VoxelArea.DIRECTION.Right:
                            next = VoxelArea.DIRECTION.Forward;
                            break;

                        case VoxelArea.DIRECTION.Forward:
                            next = VoxelArea.DIRECTION.Left;
                            break;
                        }
                    }
                    else if (_walkableCells[connectedIndex.Value].Distance == radiusCellCount + 1)
                    {
                        next = connected;
                        break;
                    }
                    else
                    {
                        bEnd = true;
                    }
                }
                else
                {
                    //bEnd = true;
                }

                if (first == index && j == 3)
                {
                    _exceptContours.Add(index);
                    return;
                }
            }

            if (count >= 4)
            {
                return;
            }

            if (next == VoxelArea.DIRECTION.End)
            {
                switch (from)
                {
                case VoxelArea.DIRECTION.Left:
                    next = VoxelArea.DIRECTION.Backward;
                    prev = VoxelArea.DIRECTION.Forward;
                    break;

                case VoxelArea.DIRECTION.Backward:
                    next = VoxelArea.DIRECTION.Right;
                    prev = VoxelArea.DIRECTION.Left;
                    break;

                case VoxelArea.DIRECTION.Right:
                    next = VoxelArea.DIRECTION.Forward;
                    prev = VoxelArea.DIRECTION.Backward;
                    break;

                case VoxelArea.DIRECTION.Forward:
                    next = VoxelArea.DIRECTION.Left;
                    prev = VoxelArea.DIRECTION.Right;
                    break;

                case VoxelArea.DIRECTION.End:
                    next = VoxelArea.DIRECTION.Right;
                    prev = VoxelArea.DIRECTION.Left;
                    break;
                }
            }
            else
            {
                switch (next)
                {
                case VoxelArea.DIRECTION.Left:
                    prev = VoxelArea.DIRECTION.Right;
                    break;

                case VoxelArea.DIRECTION.Backward:
                    prev = VoxelArea.DIRECTION.Forward;
                    break;

                case VoxelArea.DIRECTION.Right:
                    prev = VoxelArea.DIRECTION.Left;
                    break;

                case VoxelArea.DIRECTION.Forward:
                    prev = VoxelArea.DIRECTION.Backward;
                    break;
                }
            }

            _exceptContours.Add(index);

            var nextID = cell.ConnectedID(next);

            if (nextID == null)
            {
                return;
            }
            Contours(first, nextID.Value, ref contours, prev);
        }
Esempio n. 5
0
        private void Contours(ref List <Vector3> contours, uint first, uint index, bool?clockwise = null, VoxelArea.DIRECTION from = VoxelArea.DIRECTION.End)
        {
            var     va              = _voxelizer.VoxelArea;
            var     cell            = _walkableCells[index];
            float   halfSize        = va.CellSize * 0.5f;
            uint    radiusCellCount = (uint)Mathf.CeilToInt(_agentInfo.AgentRadius / va.CellSize);
            Vector3 cellPos; va.GetCellPosition(index, out cellPos);

            VoxelArea.DIRECTION next = VoxelArea.DIRECTION.End;
            VoxelArea.DIRECTION prev = VoxelArea.DIRECTION.End;

            bool bStart = false, bFind = false, bEnd = false;

            uint?connectedIndex = null;

            #region start
            if (first == index && clockwise == null)
            {
                bStart         = true;
                connectedIndex = cell.ConnectedID(VoxelArea.DIRECTION.Backward);
                if (connectedIndex.HasValue)
                {
                    if (_walkableCells[connectedIndex.Value] == null)
                    {
                        return;
                    }
                    else if (_walkableCells[connectedIndex.Value].Distance == radiusCellCount)
                    {
                        clockwise = false;
                        Vector3 tmp = cellPos;
                        tmp.x -= halfSize;
                        tmp.z -= halfSize;
                        contours.Add(tmp);
                    }
                }

                if (!clockwise.HasValue)
                {
                    connectedIndex = cell.ConnectedID(VoxelArea.DIRECTION.Forward);
                    if (connectedIndex.HasValue)
                    {
                        if (_walkableCells[connectedIndex.Value] == null)
                        {
                            return;
                        }
                        else if (_walkableCells[connectedIndex.Value].Distance == radiusCellCount)
                        {
                            clockwise = true;
                            Vector3 tmp = cellPos;
                            tmp.x -= halfSize;
                            tmp.z += halfSize;
                            contours.Add(tmp);
                        }
                    }
                }
            }
            if (!clockwise.HasValue) // solo or non
            {
                // non 시작시 non은 무조껀 우측으로 가는 상황만 걸리는듯.
                connectedIndex = cell.ConnectedID(VoxelArea.DIRECTION.Right);
                if (connectedIndex.HasValue)
                {
                    if (_walkableCells[connectedIndex.Value] == null)
                    {
                        return;
                    }
                    else if (_walkableCells[connectedIndex.Value].Distance == radiusCellCount + 1)
                    {
                        // non 다음으로 패스...
                        Vector3 tmp_ = cellPos;
                        tmp_.x += halfSize;
                        tmp_.z += halfSize;
                        contours.Add(tmp_);
                        Contours(ref contours, first, connectedIndex.Value, clockwise = true, VoxelArea.DIRECTION.Left);
                        return;
                    }
                }
                // solo
                Vector3 tmp = cellPos;
                tmp.x -= halfSize;
                tmp.z -= halfSize;
                contours.Add(tmp);
                clockwise = false;
            }
            #endregion

            int count = 0;
            for (count = 0; count < 4; ++count)
            {
                if (bFind && bEnd)
                {
                    break;
                }
                int j = count;       // Left or End(first)
                if (clockwise.Value) // clockwise  // 0 = for, 1 = right, 2 = back, 3 = left
                {
                    if (from == VoxelArea.DIRECTION.Left || from == VoxelArea.DIRECTION.End)
                    {
                        j = count;
                    }
                    else if (from == VoxelArea.DIRECTION.Forward)
                    {
                        j = count + 1;
                    }
                    else if (from == VoxelArea.DIRECTION.Right)
                    {
                        j = count + 2;
                    }
                    else if (from == VoxelArea.DIRECTION.Backward)
                    {
                        j = count + 3;
                    }
                }
                else
                {
                    if (from == VoxelArea.DIRECTION.Left || from == VoxelArea.DIRECTION.End)
                    {
                        j = count;
                    }
                    else if (from == VoxelArea.DIRECTION.Backward)
                    {
                        j = count + 1;
                    }
                    else if (from == VoxelArea.DIRECTION.Right)
                    {
                        j = count + 2;
                    }
                    else if (from == VoxelArea.DIRECTION.Forward)
                    {
                        j = count + 3;
                    }
                }
                if (j > 3)
                {
                    j -= 4;
                }
                VoxelArea.DIRECTION connected = VoxelArea.DIRECTION.End;
                if (clockwise.Value) // clockwise  // 0 = for, 1 = right, 2 = back, 3 = left
                {
                    if (j == 0)
                    {
                        connected = VoxelArea.DIRECTION.Forward;
                    }
                    else if (j == 1)
                    {
                        connected = VoxelArea.DIRECTION.Right;
                    }
                    else if (j == 2)
                    {
                        connected = VoxelArea.DIRECTION.Backward;
                    }
                    else if (j == 3)
                    {
                        connected = VoxelArea.DIRECTION.Left;
                    }
                }
                else // counterclockwise  // 0 = back, 1 = right, 2 = for, 3 = left
                {
                    if (j == 0)
                    {
                        connected = VoxelArea.DIRECTION.Backward;
                    }
                    else if (j == 1)
                    {
                        connected = VoxelArea.DIRECTION.Right;
                    }
                    else if (j == 2)
                    {
                        connected = VoxelArea.DIRECTION.Forward;
                    }
                    else if (j == 3)
                    {
                        connected = VoxelArea.DIRECTION.Left;
                    }
                }
                connectedIndex = cell.ConnectedID(connected);
                if (connectedIndex.HasValue)
                {
                    if (!_walkableCells.ContainsKey(connectedIndex.Value))
                    {
                        return;
                    }
                    else if (_walkableCells[connectedIndex.Value].Distance == radiusCellCount)
                    {
                        bFind = true;
                        Vector3 tmp = cellPos;
                        if (clockwise.Value)
                        {
                            if (connected == VoxelArea.DIRECTION.Left || connected == VoxelArea.DIRECTION.Backward)
                            {
                                tmp.x -= halfSize;
                            }
                            else
                            {
                                tmp.x += halfSize;
                            }
                            if (connected == VoxelArea.DIRECTION.Left || connected == VoxelArea.DIRECTION.Forward)
                            {
                                tmp.z += halfSize;
                            }
                            else
                            {
                                tmp.z -= halfSize;
                            }

                            switch (connected)
                            {
                            case VoxelArea.DIRECTION.Left:
                                next = VoxelArea.DIRECTION.Forward;
                                break;

                            case VoxelArea.DIRECTION.Forward:
                                next = VoxelArea.DIRECTION.Right;
                                break;

                            case VoxelArea.DIRECTION.Right:
                                next = VoxelArea.DIRECTION.Backward;
                                break;

                            case VoxelArea.DIRECTION.Backward:
                                next = VoxelArea.DIRECTION.Left;
                                break;
                            }
                        }
                        else
                        {
                            if (connected == VoxelArea.DIRECTION.Left || connected == VoxelArea.DIRECTION.Forward)
                            {
                                tmp.x -= halfSize;
                            }
                            else
                            {
                                tmp.x += halfSize;
                            }
                            if (connected == VoxelArea.DIRECTION.Right || connected == VoxelArea.DIRECTION.Forward)
                            {
                                tmp.z += halfSize;
                            }
                            else
                            {
                                tmp.z -= halfSize;
                            }

                            switch (connected)
                            {
                            case VoxelArea.DIRECTION.Left:
                                next = VoxelArea.DIRECTION.Backward;
                                break;

                            case VoxelArea.DIRECTION.Backward:
                                next = VoxelArea.DIRECTION.Right;
                                break;

                            case VoxelArea.DIRECTION.Right:
                                next = VoxelArea.DIRECTION.Forward;
                                break;

                            case VoxelArea.DIRECTION.Forward:
                                next = VoxelArea.DIRECTION.Left;
                                break;
                            }
                        }
                        contours.Add(tmp);
                    }
                    else if (_walkableCells[connectedIndex.Value].Distance == radiusCellCount + 1)
                    {
                        next = connected;
                        break;
                    }
                    else
                    {
                        bEnd = true;
                    }
                }
            }

            if ((first == index && !bStart) || (first == index && count >= 3))
            {
                _exceptContours.Add(index);
                return;
            }

            switch (next)
            {
            case VoxelArea.DIRECTION.Left:
                prev = VoxelArea.DIRECTION.Right;
                break;

            case VoxelArea.DIRECTION.Backward:
                prev = VoxelArea.DIRECTION.Forward;
                break;

            case VoxelArea.DIRECTION.Right:
                prev = VoxelArea.DIRECTION.Left;
                break;

            case VoxelArea.DIRECTION.Forward:
                prev = VoxelArea.DIRECTION.Backward;
                break;
            }

            _exceptContours.Add(index);

            var nextID = cell.ConnectedID(next);
            if (nextID == null)
            {
                return;
            }
            Contours(ref contours, first, nextID.Value, clockwise, prev);
        }