/// <summary> /// Adds triangle. If his Vectors should align with another triangles vectors, they need to be the same instances /// </summary> /// <param name="trngls"></param> public void AddTriangleByReference(Triangle trngls) { C5.HashSet <Triangle> incidence = new C5.HashSet <Triangle>(); triangleIncidence.Add(trngls, new ArrayList <Triangle>()); //register each vertex foreach (Vector3 vertex in trngls.vertices) { if (!vertex2Triangle.ContainsKey(vertex)) { vertex2Triangle[vertex] = new ArrayList <Triangle>(); } else { foreach (Triangle triangle in vertex2Triangle[vertex]) { if (incidence.Contains(triangle)) //already found a common vertex { triangleIncidence[triangle].Add(trngls); triangleIncidence[trngls].Add(triangle); } else { incidence.Add(triangle); //first common vertex found -> remember it } } } vertex2Triangle[vertex].Add(trngls); } }
public Nav2dNode findClosestAccessibleNodeInGrid(Vector3Int cellPos, Vector3 targetPos) { Nav2dNode node = null; C5.HashSet <Vector3Int> explored = new C5.HashSet <Vector3Int>(); Queue <Vector3Int> opened = new Queue <Vector3Int>(); opened.Enqueue(cellPos); // dont try to long for (int i = 0; i < 20; i++) { Vector3Int current = opened.Dequeue(); Nav2dCell cell = FindNavCellAtPosition(current); node = cell?.findClosestAccessibleNodeInCell(targetPos); if (node != null) { break; } explored.Add(current); Vector3Int[] neighbors = { current + new Vector3Int(0, 1, 0), current + new Vector3Int(0, -1, 0), current + new Vector3Int(-1, 0, 0), current + new Vector3Int(1, 0, 0) }; foreach (var n in neighbors) { if (!explored.Contains(n)) { opened.Enqueue(n); } } } return(node); }
public IEnumerable <Mesh> ExtractMeshes() { List <Mesh> meshes = new List <Mesh>(); C5.HashSet <Triangle> untouched = new C5.HashSet <Triangle>(); untouched.AddAll(triangleIncidence.Keys); Queue <Triangle> open = new Queue <Triangle>(); //the mesh that is beeing built List <Vector3> vertices = new List <Vector3>(); Dictionary <Vector3, int> vertexToIndex = new Dictionary <Vector3, int>(); List <int> indices = new List <int>(); while (!untouched.IsEmpty) { if (open.Count == 0) //empty - open on a new slot { open.Enqueue(untouched.First()); untouched.Remove(open.First()); } if (vertices.Count > 60000) //too many - split meshes { Mesh msh = new Mesh(); msh.vertices = vertices.ToArray(); msh.triangles = indices.ToArray(); meshes.Add(msh); vertices.Clear(); vertexToIndex.Clear(); indices.Clear(); } //one step of BFS Triangle current = open.Dequeue(); foreach (Triangle expand in triangleIncidence[current]) { if (untouched.Contains(expand)) { open.Enqueue(expand); untouched.Remove(expand); } } //add to mesh for (int i = 0; i < 3; i++) { if (vertexToIndex.ContainsKey(current.vertices[i])) { indices.Add(vertexToIndex[current.vertices[i]]); } else { vertices.Add(current.vertices[i]); vertexToIndex[current.vertices[i]] = vertices.Count - 1; indices.Add(vertices.Count - 1); } } } //buuild last mesh Mesh msh2 = new Mesh(); msh2.vertices = vertices.ToArray(); msh2.triangles = indices.ToArray(); meshes.Add(msh2); return(meshes); }