Beispiel #1
0
    static void MakeMeshNoUVCol(MegaCacheOBJMesh newMesh, Mesh mesh, bool adjust, bool recalcnormals, bool tangents)
    {
        int v1 = 0;
        int v2 = 1;
        int v3 = 2;
        int v4 = 3;

        Vector3 n1 = Vector3.forward;
        Vector3 n2 = Vector3.forward;
        Vector3 n3 = Vector3.forward;
        Vector3 n4 = Vector3.forward;
        Vector2 uv = Vector2.zero;

        for (int t = 0; t < newMesh.faces.Count; t++)
        {
            MegaCacheOBJFace f = newMesh.faces[t];

            if (newMesh.normals.Count > 0)
            {
                n1 = newMesh.normals[f.n[v1]];
                n2 = newMesh.normals[f.n[v2]];
                n3 = newMesh.normals[f.n[v3]];
                if (f.quad)
                {
                    n4 = newMesh.normals[f.n[v4]];
                }
            }

            if (adjust)
            {
                faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v2]], n1, n3, n2, uv, uv, uv, newMesh.cols[f.v[v1]], newMesh.cols[f.v[v3]], newMesh.cols[f.v[v2]], 1, f.mtl));
            }
            else
            {
                faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v2]], newMesh.vertices[f.v[v3]], n1, n2, n3, uv, uv, uv, newMesh.cols[f.v[v1]], newMesh.cols[f.v[v2]], newMesh.cols[f.v[v3]], 1, f.mtl));
            }

            if (f.quad)
            {
                if (adjust)
                {
                    faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v4]], newMesh.vertices[f.v[v3]], n1, n4, n3, uv, uv, uv, newMesh.cols[f.v[v1]], newMesh.cols[f.v[v4]], newMesh.cols[f.v[v3]], 1, f.mtl));
                }
                else
                {
                    faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v4]], n1, n3, n4, uv, uv, uv, newMesh.cols[f.v[v1]], newMesh.cols[f.v[v3]], newMesh.cols[f.v[v4]], 1, f.mtl));
                }
            }
        }

        MegaCacheMeshConstructorOBJNoUVCol.Construct(faces, mesh, newMesh.vertices.ToArray(), false, recalcnormals, tangents);
    }
    static public Mesh ImportFile(string filePath, float scale, bool adjust, bool tangents, bool loadmtls, bool optimize, bool recalcnormals)
    {
        faces.Clear();

        importpath = Path.GetDirectoryName(filePath);

        StreamReader stream     = File.OpenText(filePath);
        string       entireText = stream.ReadToEnd();

        stream.Close();

        MegaCacheOBJMesh newMesh = new MegaCacheOBJMesh();

        populateMeshStructNew(entireText, ref newMesh, loadmtls);
        Mesh mesh = new Mesh();

        int v1 = 0;
        int v2 = 1;
        int v3 = 2;
        int v4 = 3;

        currentmtl = 0;
        smthgrp    = 0;

        for (int i = 0; i < newMesh.vertices.Count; i++)
        {
            newMesh.vertices[i] *= scale;

            if (adjust)
            {
                Vector3 p = newMesh.vertices[i];
                p.x = -p.x;
                newMesh.vertices[i] = p;
            }
        }

        for (int i = 0; i < newMesh.normals.Count; i++)
        {
            Vector3 p = newMesh.normals[i];
            p.x = -p.x;
            newMesh.normals[i] = p;
        }

        Vector3 n1 = Vector3.forward;
        Vector3 n2 = Vector3.forward;
        Vector3 n3 = Vector3.forward;
        Vector3 n4 = Vector3.forward;

        if (newMesh.normals.Count == 0)
        {
            recalcnormals = true;
        }

        if (newMesh.uv.Count == 0)
        {
            for (int t = 0; t < newMesh.faces.Count; t++)
            {
                MegaCacheOBJFace f = newMesh.faces[t];

                if (newMesh.normals.Count > 0)
                {
                    n1 = newMesh.normals[f.n[v1]];
                    n2 = newMesh.normals[f.n[v2]];
                    n3 = newMesh.normals[f.n[v3]];
                    if (f.quad)
                    {
                        n4 = newMesh.normals[f.n[v4]];
                    }
                }

                if (adjust)
                {
                    faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v2]], n1, n3, n2, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl));
                }
                else
                {
                    faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v2]], newMesh.vertices[f.v[v3]], n1, n2, n3, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl));
                }

                if (f.quad)
                {
                    if (adjust)
                    {
                        faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v4]], newMesh.vertices[f.v[v3]], n1, n4, n3, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl));
                    }
                    else
                    {
                        faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v4]], n1, n3, n4, Vector3.zero, Vector3.zero, Vector3.zero, 1, f.mtl));
                    }
                }
            }

            MegaCacheMeshConstructorOBJNoUV.Construct(faces, mesh, newMesh.vertices.ToArray(), false, recalcnormals, tangents);
        }
        else
        {
            for (int t = 0; t < newMesh.faces.Count; t++)
            {
                MegaCacheOBJFace f = newMesh.faces[t];

                if (newMesh.normals.Count > 0)
                {
                    n1 = newMesh.normals[f.n[v1]];
                    n2 = newMesh.normals[f.n[v2]];
                    n3 = newMesh.normals[f.n[v3]];
                    if (f.quad)
                    {
                        n4 = newMesh.normals[f.n[v4]];
                    }
                }

                if (adjust)
                {
                    faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v2]], n1, n3, n2, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v3]], newMesh.uv[f.uv[v2]], 1, f.mtl));
                }
                else
                {
                    faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v2]], newMesh.vertices[f.v[v3]], n1, n2, n3, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v2]], newMesh.uv[f.uv[v3]], 1, f.mtl));
                }

                if (f.quad)
                {
                    if (adjust)
                    {
                        faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v4]], newMesh.vertices[f.v[v3]], n1, n4, n3, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v4]], newMesh.uv[f.uv[v3]], 1, f.mtl));
                    }
                    else
                    {
                        faces.Add(new MegaCacheFace(newMesh.vertices[f.v[v1]], newMesh.vertices[f.v[v3]], newMesh.vertices[f.v[v4]], n1, n3, n4, newMesh.uv[f.uv[v1]], newMesh.uv[f.uv[v3]], newMesh.uv[f.uv[v4]], 1, f.mtl));
                    }
                }
            }

            MegaCacheMeshConstructorOBJ.Construct(faces, mesh, newMesh.vertices.ToArray(), false, recalcnormals, tangents);
        }

        return(mesh);
    }
    static void populateMeshStructNew(string entireText, ref MegaCacheOBJMesh mesh, bool loadmtls)
    {
        offset = 0;
        string currentText = ReadLine(entireText);

        char[]   splitIdentifier  = { ' ' };
        char[]   splitIdentifier2 = { '/' };
        string[] brokenString;
        string[] brokenBrokenString;

        //int smthgrp = -1;

        while (currentText != null)
        {
            currentText  = currentText.Trim();
            brokenString = currentText.Split(splitIdentifier, 50);
            switch (brokenString[0])
            {
            case "g": break;

            case "usemtl":
                brokenString[1] = brokenString[1].Replace(':', '_');
                if (loadmtls)
                {
                    currentmtl = GetMtlID(brokenString[1]);
                }
                else
                {
                    currentmtl = 0;
                }
                break;

            case "usemap": break;

            case "mtllib":
                if (loadmtls)
                {
                    string p = importpath + "/" + brokenString[1];
                    LoadMtlLib(p);
                }

                break;

            case "v": mesh.vertices.Add(new Vector3(float.Parse(brokenString[1]), float.Parse(brokenString[2]), float.Parse(brokenString[3]))); break;

            case "vt": mesh.uv.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break;

            case "vt1": mesh.uv1.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break;

            case "vt2": mesh.uv2.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break;

            case "vn": mesh.normals.Add(new Vector3(float.Parse(brokenString[1]), float.Parse(brokenString[2]), float.Parse(brokenString[3]))); break;

            case "vc": break;

            case "f":
                int j = 1;

                MegaCacheOBJFace oface = new MegaCacheOBJFace();

                oface.mtl     = currentmtl;
                oface.smthgrp = smthgrp;

                while (j < brokenString.Length && ("" + brokenString[j]).Length > 0)
                {
                    brokenBrokenString = brokenString[j].Split(splitIdentifier2, 3);

                    if (j == 4)
                    {
                        oface.quad = true;
                    }

                    oface.v[j - 1] = int.Parse(brokenBrokenString[0]) - 1;

                    if (brokenBrokenString.Length > 1)
                    {
                        if (brokenBrokenString[1] != "")
                        {
                            oface.uv[j - 1] = int.Parse(brokenBrokenString[1]) - 1;
                        }

                        if (brokenBrokenString.Length > 2)
                        {
                            oface.n[j - 1] = int.Parse(brokenBrokenString[2]) - 1;
                        }
                    }
                    j++;
                }
                mesh.faces.Add(oface);
                break;

            case "s":
                //if ( brokenString[1] == "off" )
                //smthgrp = -1;
                //else
                //smthgrp = int.Parse(brokenString[1]);
                break;
            }

            currentText = ReadLine(entireText);

            if (currentText != null)
            {
                currentText = currentText.Replace("  ", " ");
            }
        }
    }
    static void populateMeshStructNew(string entireText, ref MegaCacheOBJMesh mesh, bool loadmtls)
    {
        offset = 0;
        string currentText = ReadLine(entireText);

        char[] splitIdentifier = { ' ' };
        char[] splitIdentifier2 = { '/' };
        string[] brokenString;
        string[] brokenBrokenString;

        while ( currentText != null )
        {
            currentText = currentText.Trim();
            brokenString = currentText.Split(splitIdentifier, 50);
            switch ( brokenString[0] )
            {
                case "g": break;
                case "usemtl": currentmtl = GetMtlID(brokenString[1]); break;
                case "usemap": break;
                case "mtllib": break;
                case "v": mesh.vertices.Add(new Vector3(float.Parse(brokenString[1]), float.Parse(brokenString[2]), float.Parse(brokenString[3]))); break;
                case "vt": mesh.uv.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break;
                case "vt1": mesh.uv1.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break;
                case "vt2": mesh.uv2.Add(new Vector2(float.Parse(brokenString[1]), float.Parse(brokenString[2]))); break;
                case "vn": mesh.normals.Add(new Vector3(float.Parse(brokenString[1]), float.Parse(brokenString[2]), float.Parse(brokenString[3]))); break;
                case "vc": break;
                case "f":
                    int j = 1;

                    MegaCacheOBJFace oface = new MegaCacheOBJFace();

                    oface.mtl = currentmtl;
                    oface.smthgrp = smthgrp;

                    while ( j < brokenString.Length && ("" + brokenString[j]).Length > 0 )
                    {
                        brokenBrokenString = brokenString[j].Split(splitIdentifier2, 3);

                        if ( j == 4 )
                            oface.quad = true;

                        oface.v[j - 1] = int.Parse(brokenBrokenString[0]) - 1;

                        if ( brokenBrokenString.Length > 1 )
                        {
                            if ( brokenBrokenString[1] != "" )
                                oface.uv[j - 1] = int.Parse(brokenBrokenString[1]) - 1;

                            if ( brokenBrokenString.Length > 2 )
                                oface.n[j - 1] = int.Parse(brokenBrokenString[2]) - 1;
                        }
                        j++;
                    }
                    mesh.faces.Add(oface);
                    break;

                case "s": break;
            }

            currentText = ReadLine(entireText);

            if ( currentText != null )
                currentText = currentText.Replace("  ", " ");
        }
    }