/// <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); }
/// <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); }