Esempio n. 1
0
        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);
        }