/// <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);
     }
 }
示例#2
0
        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);
    }