private static ImportedMesh ImportMeshList(List <MqoObject> mqoObjects, List <string> mqoMaterials) { ImportedMesh meshList = new ImportedMesh(); meshList.Name = mqoObjects[0].name; float scale = 1f; if (!mqoObjects[0].worldCoords) { int startPos = meshList.Name.IndexOf("(Scale="); if (startPos > 0) { int endPos = meshList.Name.IndexOf(')'); scale = 1f / Single.Parse(meshList.Name.Substring(startPos + 7, endPos - startPos - 7)); } } meshList.BoneList = new List <ImportedBone>(0); meshList.SubmeshList = new List <ImportedSubmesh>(mqoObjects.Count); int vertIdx = 0; foreach (MqoObject mqoObject in mqoObjects) { List <VertexMap>[] vertexMapList = new List <VertexMap> [mqoMaterials.Count + 1]; Dictionary <int, VertexMap>[] vertexMapDic = new Dictionary <int, VertexMap> [mqoMaterials.Count + 1]; List <VertexMap[]>[] faceMap = new List <VertexMap[]> [mqoMaterials.Count + 1]; foreach (MqoFace mqoFace in mqoObject.faces) { int mqoFaceMatIdxOffset = mqoFace.materialIndex + 1; if (vertexMapList[mqoFaceMatIdxOffset] == null) { vertexMapList[mqoFaceMatIdxOffset] = new List <VertexMap>(mqoObject.vertices.Length); vertexMapDic[mqoFaceMatIdxOffset] = new Dictionary <int, VertexMap>(); faceMap[mqoFaceMatIdxOffset] = new List <VertexMap[]>(mqoObject.faces.Length); } VertexMap[] faceMapArray = new VertexMap[mqoFace.vertexIndices.Length]; faceMap[mqoFaceMatIdxOffset].Add(faceMapArray); for (int i = 0; i < mqoFace.vertexIndices.Length; i++) { VertexMap vertMap; if (!vertexMapDic[mqoFaceMatIdxOffset].TryGetValue(mqoFace.vertexIndices[i], out vertMap)) { ImportedVertex vert; MqoVertex mqoVert = mqoObject.vertices[mqoFace.vertexIndices[i]]; if (mqoVert is MqoVertexWithColour) { vert = new ImportedVertexWithColour(); ((ImportedVertexWithColour)vert).Colour = ((MqoVertexWithColour)mqoVert).colour; } else { vert = new ImportedVertex(); } vert.BoneIndices = new byte[4]; vert.Weights = new float[4]; vert.Normal = new Vector3(); vert.UV = mqoFace.UVs[i]; vert.Position = mqoVert.coords * scale; vertMap = new VertexMap { mqoIdx = mqoFace.vertexIndices[i], vert = vert }; vertexMapDic[mqoFaceMatIdxOffset].Add(mqoFace.vertexIndices[i], vertMap); vertMap.uvDic.Add(mqoFace.UVs[i], vertMap); vertexMapList[mqoFaceMatIdxOffset].Add(vertMap); } VertexMap uvVertMap; if (!vertMap.uvDic.TryGetValue(mqoFace.UVs[i], out uvVertMap)) { ImportedVertex vert = new ImportedVertex(); vert.BoneIndices = new byte[4]; vert.Weights = new float[4]; vert.Normal = new Vector3(); vert.UV = mqoFace.UVs[i]; vert.Position = mqoObject.vertices[mqoFace.vertexIndices[i]].coords; uvVertMap = new VertexMap { mqoIdx = Int32.MaxValue, vert = vert }; vertMap.uvDic.Add(mqoFace.UVs[i], uvVertMap); vertexMapList[mqoFaceMatIdxOffset].Add(uvVertMap); } faceMapArray[i] = uvVertMap; } } for (int i = 0; i < vertexMapList.Length; i++) { if (vertexMapList[i] != null) { ImportedSubmesh mesh = new ImportedSubmesh(); mesh.VertexList = new List <ImportedVertex>(vertexMapList[i].Count); mesh.FaceList = new List <ImportedFace>(faceMap[i].Count); mesh.Index = mqoObject.baseIdx; mesh.WorldCoords = mqoObject.worldCoords; mesh.Visible = mqoObject.visible; int matIdx = i - 1; if ((matIdx >= 0) && (matIdx < mqoMaterials.Count)) { mesh.Material = mqoMaterials[matIdx]; } meshList.SubmeshList.Add(mesh); vertexMapList[i].Sort(); for (int j = 0; j < vertexMapList[i].Count; j++) { vertexMapList[i][j].wsMeshIdx = j; mesh.VertexList.Add(vertexMapList[i][j].vert); vertIdx++; } for (int j = 0; j < faceMap[i].Count; j++) { ImportedFace face = new ImportedFace(); face.VertexIndices = new int[] { faceMap[i][j][0].wsMeshIdx, faceMap[i][j][2].wsMeshIdx, faceMap[i][j][1].wsMeshIdx }; mesh.FaceList.Add(face); } } } } return(meshList); }
public ImporterMorph(string path) { try { Importer importer = new Importer(path); MorphList = new List <ImportedMorph>(); ImportedMorph morphList = new ImportedMorph(); MorphList.Add(morphList); morphList.KeyframeList = new List <ImportedMorphKeyframe>(importer.MeshList.Count); ImportedSubmesh firstVisibleSubmesh = null; string firstVisibleMorph = null; foreach (ImportedMesh meshList in importer.MeshList) { int dotPos = meshList.Name.IndexOf('.'); if (dotPos >= 0 && morphList.Name == null) { morphList.Name = meshList.Name.Substring(0, dotPos); } foreach (ImportedSubmesh submesh in meshList.SubmeshList) { ImportedMorphKeyframe morph = new ImportedMorphKeyframe(); morph.Name = meshList.Name; dotPos = morph.Name.IndexOf('.'); if (dotPos >= 0) { morph.Name = morph.Name.Substring(dotPos + 1); } morph.VertexList = submesh.VertexList; morphList.KeyframeList.Add(morph); if (firstVisibleSubmesh == null && submesh.Visible) { firstVisibleSubmesh = submesh; firstVisibleMorph = meshList.Name; } } } if (firstVisibleMorph == null && importer.MeshList.Count > 0 && importer.MeshList[0].SubmeshList.Count > 0) { firstVisibleSubmesh = importer.MeshList[0].SubmeshList[0]; firstVisibleMorph = importer.MeshList[0].Name; } if (firstVisibleMorph != null) { Report.ReportLog("Building morph mask from " + firstVisibleMorph); morphList.MorphedVertexIndices = new List <ushort>(); List <ImportedVertex> vertList = firstVisibleSubmesh.VertexList; for (ushort i = 0; i < vertList.Count; i++) { if (vertList[i] is ImportedVertexWithColour) { ImportedVertexWithColour vertCol = (ImportedVertexWithColour)vertList[i]; if (vertCol.Colour.Red < 0.1 && vertCol.Colour.Green < 0.1 && vertCol.Colour.Blue > 0.9) { morphList.MorphedVertexIndices.Add(i); } } } } if (morphList.Name == null) { int startIdx = path.IndexOf('-', path.LastIndexOf('\\')) + 1; int endIdx = path.LastIndexOf('-'); if (startIdx > endIdx) { int extIdx = path.ToLower().LastIndexOf(".morph.mqo"); for (int i = extIdx - 1; i >= 0; i--) { if (!Char.IsDigit(path[i])) { endIdx = i + 1; break; } } } if ((startIdx > 0) && (endIdx > 0) && (startIdx < endIdx)) { morphList.Name = path.Substring(startIdx, endIdx - startIdx); } if (morphList.Name == String.Empty) { morphList.Name = "(no name)"; } } } catch (Exception ex) { Report.ReportLog("Error importing .morphs.mqo: " + ex.Message); } }
public ImporterMorph(string path, float vertexScaling) { try { Importer importer = new Importer(path, vertexScaling); MorphList = new List <ImportedMorph>(); ImportedMorph morphList = null; String lastGroup = String.Empty; ImportedSubmesh firstVisibleSubmesh = null; string firstVisibleMorph = null; foreach (ImportedMesh meshList in importer.MeshList) { int dotPos = meshList.Name.IndexOf('.'); string meshName = dotPos >= 0 ? meshList.Name.Substring(0, dotPos) : meshList.Name; int nextDot = dotPos >= 0 ? meshList.Name.IndexOf('.', dotPos + 1) : -1; String group = nextDot >= 0 ? meshList.Name.Substring(dotPos + 1, nextDot - dotPos - 1) : "unknown_blendshape"; if (group != lastGroup) { morphList = new ImportedMorph(); morphList.Name = meshName; morphList.ClipName = group; MorphList.Add(morphList); morphList.KeyframeList = new List <ImportedMorphKeyframe>(importer.MeshList.Count); morphList.Channels = new List <Tuple <float, int, int> >(importer.MeshList.Count); lastGroup = group; } foreach (ImportedSubmesh submesh in meshList.SubmeshList) { morphList.Channels.Add(new Tuple <float, int, int>(0f, morphList.KeyframeList.Count, 1)); ImportedMorphKeyframe morph = new ImportedMorphKeyframe(); morph.Name = meshList.Name; dotPos = morph.Name.LastIndexOf('.'); if (dotPos >= 0) { morph.Name = morph.Name.Substring(dotPos + 1); } morph.VertexList = submesh.VertexList; morph.Weight = 100f; morphList.KeyframeList.Add(morph); if (firstVisibleSubmesh == null && submesh.Visible) { firstVisibleSubmesh = submesh; firstVisibleMorph = meshList.Name; } } } if (firstVisibleMorph == null && importer.MeshList.Count > 0 && importer.MeshList[0].SubmeshList.Count > 0) { firstVisibleSubmesh = importer.MeshList[0].SubmeshList[0]; firstVisibleMorph = importer.MeshList[0].Name; } if (firstVisibleMorph != null) { Report.ReportLog("Building morph mask from " + firstVisibleMorph); morphList.MorphedVertexIndices = new List <ushort>(); List <ImportedVertex> vertList = firstVisibleSubmesh.VertexList; for (ushort i = 0; i < vertList.Count; i++) { if (vertList[i] is ImportedVertexWithColour) { ImportedVertexWithColour vertCol = (ImportedVertexWithColour)vertList[i]; if (vertCol.Colour.Red < 0.1 && vertCol.Colour.Green < 0.1 && vertCol.Colour.Blue > 0.9) { morphList.MorphedVertexIndices.Add(i); } } } } if (morphList.Name == null) { int startIdx = path.IndexOf('-', path.LastIndexOf('\\')) + 1; int endIdx = path.LastIndexOf('-'); if (startIdx > endIdx) { int extIdx = path.ToLower().LastIndexOf(".morph.mqo"); for (int i = extIdx - 1; i >= 0; i--) { if (!Char.IsDigit(path[i])) { endIdx = i + 1; break; } } } if ((startIdx > 0) && (endIdx > 0) && (startIdx < endIdx)) { morphList.Name = path.Substring(startIdx, endIdx - startIdx); } if (morphList.Name == String.Empty) { morphList.Name = "(no name)"; } } } catch (Exception ex) { Report.ReportLog("Error importing .morphs.mqo: " + ex.Message); } }