public uint?ConnectedID(VoxelArea.DIRECTION dir) { if (_connection.ContainsKey(dir)) { return(_connection[dir]); } return(null); }
public void RemoveConnectionID(VoxelArea.DIRECTION dir) { _connection.Remove(dir); }
public void ConnectedID(VoxelArea.DIRECTION dir, uint value) { _connection[dir] = value; }
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); }
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); }