public bool RemoveBone(int meshIdx, int boneIdx) { remMesh mesh = Parser.MESC[meshIdx]; remSkin boneList = rem.FindSkin(mesh.name, Parser.SKIC); if (boneList.Count == 1 && boneIdx == 0) { Parser.SKIC.RemoveChild(boneList); return(true); } else { boneList.RemoveChild(boneIdx); return(false); } }
public static void RemoveSubmesh(remParser parser, remMesh mesh, int submeshIdx) { List <int> newFaces = new List <int>(mesh.numFaces * 3); List <int> newFaceMarks = new List <int>(mesh.numFaces); bool[] usedVertices = new bool[mesh.numVertices]; for (int i = 0; i < mesh.faceMarks.Length; i++) { if (mesh.faceMarks[i] != submeshIdx) { newFaceMarks.Add(mesh.faceMarks[i] < submeshIdx ? mesh.faceMarks[i] : mesh.faceMarks[i] - 1); for (int j = i * 3; j < i * 3 + 3; j++) { int vertIdx = mesh.faces[j]; newFaces.Add(vertIdx); usedVertices[vertIdx] = true; } } } int[] vertIdxMap = new int[mesh.numVertices]; List <remVertex> vertList = new List <remVertex>(mesh.numVertices); int numNewVerts = 0; for (int i = 0; i < mesh.numVertices; i++) { if (usedVertices[i]) { vertIdxMap[i] = numNewVerts++; vertList.Add(mesh.vertices[i]); } } mesh.vertices = vertList.ToArray(); for (int i = 0; i < newFaces.Count; i++) { newFaces[i] = vertIdxMap[newFaces[i]]; } mesh.faces = newFaces.ToArray(); mesh.faceMarks = newFaceMarks.ToArray(); mesh.materials.RemoveAt(submeshIdx); remSkin skin = rem.FindSkin(mesh.name, parser.SKIC); if (skin != null) { for (int i = 0; i < skin.Count; i++) { remBoneWeights bw = skin[i]; Dictionary <int, float> newBoneWeights = new Dictionary <int, float>(); for (int j = 0; j < bw.numVertIdxWts; j++) { int oldVertIdx = bw.vertexIndices[j]; if (usedVertices[oldVertIdx]) { newBoneWeights.Add(vertIdxMap[oldVertIdx], bw.vertexWeights[j]); } } if (newBoneWeights.Count > 0) { bw.vertexIndices = new int[newBoneWeights.Count]; bw.vertexWeights = new float[newBoneWeights.Count]; newBoneWeights.Keys.CopyTo(bw.vertexIndices, 0); newBoneWeights.Values.CopyTo(bw.vertexWeights, 0); } else { skin.RemoveChild(i); i--; } } } }