public static GameObject GenerateFaceMesh(Face f, GameObject parent) { Vector3[] vertices = f.Vertices.Select( v => new Vector3( (float)v.X * Helpers.Constants.M_PER_FT, (float)v.Z * Helpers.Constants.M_PER_FT, (float)v.Y * Helpers.Constants.M_PER_FT ) ).ToArray(); Vector2[] uvs = new Vector2[vertices.Length]; for (int i = 0; i < uvs.Length; i++) { uvs[i] = new Vector2(vertices[i].x, vertices[i].z); } Mesh msh = new Mesh(); msh.vertices = vertices; msh.triangles = f.Indices.ToList().ToArray().Reverse().ToArray(); msh.uv = uvs; msh.RecalculateNormals(); msh.RecalculateBounds(); GameObject newFace = new GameObject(); newFace.transform.position = Vector3.zero; newFace.transform.parent = parent.transform; newFace.name = $"Mesh Face"; newFace.gameObject.AddComponent(typeof(MeshRenderer)); ((MaterialFaceController)newFace.gameObject.AddComponent(typeof(MaterialFaceController))).LoadInstance(f); MeshFilter filter = newFace.gameObject.AddComponent(typeof(MeshFilter)) as MeshFilter; filter.mesh = msh; newFace.gameObject.AddComponent(typeof(MeshCollider)); MeshRenderer mr = newFace.GetComponent <MeshRenderer>(); mr.material = (UnityEngine.Material)UnityEngine.Resources.Load($"Default"); if (f.MaterialId != null && f.MaterialId != "-1") { var mat = MaterialLibrary.LookupMaterial("_" + f.MaterialId); if (mat != null) { mr.material = mat; newFace.name = $"_Mesh Face (_{f.MaterialId})"; } else { mat = MaterialLibrary.LookupMaterial(f.MaterialId); if (mat != null) { mr.material = mat; newFace.name = $"_Mesh Face ({f.MaterialId})"; } } } if (GeometryLibrary.GetObject(f.ElementId) == null) { GeometryLibrary.Add(f.ElementId, parent); } return(newFace); }