Mesh PopulateMesh(FileReader.ObjectFile obj)
    {
        Mesh mesh = new Mesh();

        List <int[]> triplets  = new List <int[]> ();
        List <int>   submeshes = new List <int> ();

        for (int i = 0; i < obj.f.Count; i += 1)
        {
            for (int j = 0; j < obj.f [i].Count; j += 1)
            {
                triplets.Add(obj.f [i] [j]);
            }
            submeshes.Add(obj.f [i].Count);
        }

        Vector3[] vertices = new Vector3[triplets.Count];
        //Vector3[] normals = new Vector3[triplets.Count];
        Vector2[] uvs = new Vector2[triplets.Count];

        for (int i = 0; i < triplets.Count; i += 1)
        {
            vertices [i] = obj.v [triplets [i] [0] - 1];
            //normals [i] = obj.vn [triplets [i] [2] - 1];
            if (triplets [i] [1] > 0)
            {
                uvs [i] = obj.vt [triplets [i] [1] - 1];
            }
        }

        mesh.name     = obj.o;
        mesh.vertices = vertices;
        //mesh.normals = normals;
        mesh.uv           = uvs;
        mesh.subMeshCount = submeshes.Count;

        int vertex = 0;

        for (int i = 0; i < submeshes.Count; i += 1)
        {
            int[] triangles = new int[submeshes [i]];
            for (int j = 0; j < submeshes [i]; j += 1)
            {
                triangles [j] = vertex;
                vertex       += 1;
            }
            mesh.SetTriangles(triangles, i);
        }

        mesh.RecalculateNormals();
        mesh.RecalculateBounds();
        mesh.Optimize();

        return(mesh);
    }
Example #2
0
    IEnumerator ConstructModel(string filename)
    {
        isLoaded = false;

        FileReader.ObjectFile   obj = FileReader.ReadObjectFile(directoryPath + filename);
        FileReader.MaterialFile mtl = FileReader.ReadMaterialFile(directoryPath + obj.mtllib);

        MeshFilter   filter   = gameObject.AddComponent <MeshFilter> ();
        MeshRenderer renderer = gameObject.AddComponent <MeshRenderer> ();

        filter.mesh        = PopulateMesh(obj);
        renderer.materials = DefineMaterial(obj, mtl);

        isLoaded = true;
        yield return(null);
    }
    Material[] DefineMaterial(FileReader.ObjectFile obj, FileReader.MaterialFile mtl)
    {
        Material[] materials = new Material[obj.usemtl.Count];

        for (int i = 0; i < obj.usemtl.Count; i += 1)
        {
            int       index   = mtl.newmtl.IndexOf(obj.usemtl [i]);
            Texture2D texture = new Texture2D(1, 1);
            texture.LoadImage(File.ReadAllBytes(Path.Combine(directoryPath, mtl.mapKd [index])));

            materials [i]             = new Material(Shader.Find("Diffuse"));
            materials [i].name        = mtl.newmtl [index];
            materials [i].mainTexture = texture;
        }

        return(materials);
    }