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); }
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); }