Exemple #1
0
    Mesh ConvertInstanceToMesh(AMF_Permutations perm)
    {
        Quaternion q    = Quaternion.AngleAxis(90f, Vector3.up);
        Mesh       temp = new Mesh();

        temp.name = perm.pName;
        List <Vector3> verts = new List <Vector3>();
        List <Vector2> uvs   = new List <Vector2>();
        //List<int> badIndex = new List<int>();
        //int[] identity=new int[perm.vertices.Count];
        List <BoneWeight> bones = new List <BoneWeight>();

        //Matrix4x4 texMatrix=Matrix4x4.identity;
        for (int i = 0; i < perm.vertices.Count; i++)
        {
            Vector3   pos  = perm.vertices[i].pos;
            Matrix4x4 flip = Matrix4x4.identity;
            flip.SetRow(0, new Vector4(-1, 0));
            if (float.IsNaN(perm.mult))
            {
                flip.SetRow(1, new Vector4(0, 0, 1));
                flip.SetRow(2, new Vector4(0, -1));
            }
            verts.Add((flip.MultiplyPoint3x4(pos)));//q*
            uvs.Add(perm.vertices[i].tex);
            //texMatrix=perm.vertices[i].tmat;
            if (perm.vertices[i].HasBoneWeight())
            {
                bones.Add(perm.vertices[i].GetBoneWeight());
            }
        }
        temp.SetVertices(verts);
        temp.SetUVs(0, uvs);
        temp.boneWeights = bones.ToArray();
        //Triangles
        List <int> tris;
        int        faceTotal = 0;

        temp.subMeshCount = perm.meshes.Count;

        for (int s = 0; s < perm.meshes.Count; s++)
        {
            AMF_Mesh sinfo = perm.meshes[s];
            faceTotal += sinfo.faceCount;
            tris       = new List <int>();
            for (int f = 0; f < sinfo.faceCount; f++)
            {
                Vector3Int face = perm.faces[f + sinfo.startingFace];
                tris.Add(face.x);
                tris.Add(face.y);
                tris.Add(face.z);
            }
            temp.SetTriangles(tris, s);
        }

        return(temp);
    }
Exemple #2
0
    List <Mesh> ConvertInstanceToMesh(AMF_Permutations perm, bool splitSubmeshes)
    {
        List <Mesh> meshes = new List <Mesh>();

        List <Vector3> verts = new List <Vector3>();
        List <Vector2> uvs   = new List <Vector2>();
        //List<int> badIndex = new List<int>();
        //int[] identity=new int[perm.vertices.Count];
        List <BoneWeight> bones = new List <BoneWeight>();

        //Matrix4x4 texMatrix=Matrix4x4.identity;
        for (int i = 0; i < perm.vertices.Count; i++)
        {
            Vector3   pos  = perm.vertices[i].pos;
            Matrix4x4 flip = Matrix4x4.identity;
            flip.SetRow(0, new Vector4(-1, 0));
            if (float.IsNaN(perm.mult))
            {
                flip.SetRow(1, new Vector4(0, 0, 1));
                flip.SetRow(2, new Vector4(0, -1));
            }
            verts.Add(flip.MultiplyPoint3x4(pos));
            uvs.Add(perm.vertices[i].tex);
            //texMatrix=perm.vertices[i].tmat;
            if (perm.vertices[i].HasBoneWeight())
            {
                bones.Add(perm.vertices[i].GetBoneWeight());
            }
        }
        Mesh temp;
        Dictionary <int, int> remap = new Dictionary <int, int>();

        int[]          tempfaces;
        List <Vector3> tempverts;
        List <Vector2> tempuvs;

        for (int s = 0; s < perm.meshes.Count; s++)
        {
            temp = new Mesh();
            remap.Clear();
            temp.name = perm.pName + ":" + s;
            meshes.Add(temp);
            AMF_Mesh sinfo = perm.meshes[s];
            //sinfo.faceCount
            tempfaces = new int[sinfo.faceCount * 3];
            tempverts = new List <Vector3>();
            tempuvs   = new List <Vector2>();
            //populate vertex array and remap
            for (int f = 0; f < sinfo.faceCount; f++)
            {
                Vector3Int face = perm.faces[f + sinfo.startingFace];
                if (!remap.ContainsKey(face.x))
                {
                    tempverts.Add(verts[face.x]);
                    tempuvs.Add(uvs[face.x]);
                    remap.Add(face.x, tempverts.Count - 1);
                }
                tempfaces[f / 3] = remap[face.x];

                if (!remap.ContainsKey(face.y))
                {
                    tempverts.Add(verts[face.y]);
                    tempuvs.Add(uvs[face.y]);
                    remap.Add(face.y, tempverts.Count - 1);
                }
                tempfaces[f / 3 + 1] = remap[face.y];

                if (!remap.ContainsKey(face.z))
                {
                    tempverts.Add(verts[face.z]);
                    tempuvs.Add(uvs[face.z]);
                    remap.Add(face.z, tempverts.Count - 1);
                }
                tempfaces[f / 3 + 2] = remap[face.z];
            }
            temp.vertices = tempverts.ToArray();
            temp.uv       = tempuvs.ToArray();
            temp.SetTriangles(tempfaces, 0);
        }

        return(meshes);
    }