示例#1
0
    /// <summary>
    /// Clean up the duplicate edges that share the same MidPos and Instantiate the Edge prefabs.
    /// </summary>
    /// <param name="edgeColl">Dirty array with edges</param>
    /// <returns>Clean array of edges</returns>
    public PREdgeHolder[] CreateUniqEdgePrefabs(PREdgeHolder[] edgeColl)
    {
        // Group the edges according to the MidPos vector. For the cube I will have groups of 2 edges that overlap.
        var result = edgeColl.GroupBy(edge => edge.MidPos);

        PREdgeHolder[] cleaEdgeColl = new PREdgeHolder[result.Count()];
        for (int i = 0; i < result.Count(); i++)
        {
            // Get only the first elemnt from each group and assign it to the clean array.
            cleaEdgeColl[i] = result.ToArray()[i].ToArray()[0];
            // Create the objects.
            GameObject obj = GameObject.Instantiate(EdgePref, transform.TransformPoint(cleaEdgeColl[i].MidPos),
                                                    cleaEdgeColl[i].MidRot, PR_EDGE_GO.transform);
            obj.name = "Edge" + i;
            obj.SetActive(true);
            // Setup the PREdge file
            PREdge edgeCO = obj.GetComponent <PREdge>();
            edgeCO.EdgeHolder = cleaEdgeColl[i];
        }

        return(cleaEdgeColl);
    }
示例#2
0
 /// <summary>
 /// Generate the EdgeHolders for every Edge in every face. The array has overlaping EdgeHolders.
 /// </summary>
 /// <returns>Array with overlaping EdgeHolders.</returns>
 public virtual PREdgeHolder[] GenerateEdgeHolders()
 {
     PREdgeHolder[] edgeColl = new PREdgeHolder[GeoMesh.vertexCount];
     for (int i = 0; i < GeoMesh.subMeshCount; i++)
     {
         // Keep track of the actual number of the edge that is being generated,
         // If it is the last one - connect the vertex to first one.
         if (GeoMesh.GetTopology(i) == MeshTopology.Quads)
         {
             int index = -1;
             for (uint j = GeoMesh.GetIndexStart(i); j < GeoMesh.GetIndexStart(i) + GeoMesh.GetIndexCount(i); j++)
             {
                 index++;
                 if (index < 3)
                 {
                     Vector3      v0   = GeoMesh.vertices[j];
                     Vector3      v1   = GeoMesh.vertices[j + 1];
                     PREdgeHolder edge = new PREdgeHolder(v0, v1, this.gameObject);
                     edge.V0Index = (int)j;
                     edge.V1Index = (int)j + 1;
                     edgeColl[j]  = edge;
                 }
                 else
                 {
                     Vector3      v0   = GeoMesh.vertices[j];
                     Vector3      v1   = GeoMesh.vertices[j - 3];
                     PREdgeHolder edge = new PREdgeHolder(v0, v1, this.gameObject);
                     edge.V0Index = (int)j;
                     edge.V1Index = (int)j - 3;
                     edgeColl[j]  = edge;
                 }
             }
         }
         else if (GeoMesh.GetTopology(i) == MeshTopology.Triangles)
         {
             int index = -1;
             for (uint j = GeoMesh.GetIndexStart(i); j < GeoMesh.GetIndexStart(i) + GeoMesh.GetIndexCount(i); j++)
             {
                 index++;
                 if (index < 2)
                 {
                     Vector3      v0   = GeoMesh.vertices[j];
                     Vector3      v1   = GeoMesh.vertices[j + 1];
                     PREdgeHolder edge = new PREdgeHolder(v0, v1, this.gameObject);
                     edge.V0Index = (int)j;
                     edge.V1Index = (int)j + 1;
                     edgeColl[j]  = edge;
                 }
                 else
                 {
                     Vector3      v0   = GeoMesh.vertices[j];
                     Vector3      v1   = GeoMesh.vertices[j - 2];
                     PREdgeHolder edge = new PREdgeHolder(v0, v1, this.gameObject);
                     edge.V0Index = (int)j;
                     edge.V1Index = (int)j - 2;
                     edgeColl[j]  = edge;
                 }
             }
         }
     }
     return(edgeColl);
 }