static void Main(string[] args) { /*string folder = @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\map\0500\001"; * * string[] textureFolders = new string[2] * { * @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\map\texture", * @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\map\texture2" * };*/ string folder = @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\011"; string[] textureFolders = new string[2] { @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\011\texture\001", @"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\011\face\001" }; Stopwatch sw = Stopwatch.StartNew(); string[] ism2Files = Directory.GetFiles(folder, "*.ism2"); foreach (string ism2 in ism2Files) { if (ism2.IndexOf("col_") != -1) { continue; //Don't export collission data } string outputDir = Path.GetDirectoryName(ism2) + Path.DirectorySeparatorChar.ToString() + "pmx"; if (!Directory.Exists(outputDir)) { Directory.CreateDirectory(outputDir); } string pmx = outputDir + Path.DirectorySeparatorChar.ToString() + Path.GetFileName(Path.ChangeExtension(ism2, ".pmx")); Console.WriteLine("Importing " + Path.GetFileNameWithoutExtension(ism2)); PMXModel md = ISMModel.ImportISM(ism2); CleanUpModel(md); TriangleClearance.SeperateTriangles(md, false, true); MirrorX(md); FindTextures(md, textureFolders, outputDir); md.SaveToFile(pmx); Console.WriteLine(""); } sw.Stop(); Console.WriteLine("Import complete - " + (int)Math.Round(sw.Elapsed.TotalSeconds) + " seconds"); Console.ReadLine(); }
/*static bool CompareTwoFile(string file1, string file2) * { * FileStream fs1 = new FileStream(file1, FileMode.Open, FileAccess.Read, FileShare.Read); * FileStream fs2 = new FileStream(file2, FileMode.Open, FileAccess.Read, FileShare.Read); * * byte[] buffer1 = new byte[(int)fs1.Length]; * byte[] buffer2 = new byte[(int)fs2.Length]; * * fs1.Read(buffer1, 0, (int)fs1.Length); * fs2.Read(buffer2, 0, (int)fs2.Length); * * fs1.Close(); * fs2.Close(); * * fs1 = null; * fs2 = null; * * bool res = true; * bool longer = false; * string resString = "Both files identical."; * * for(int i = 0; i < Math.Max(buffer1.Length, buffer2.Length);i++) * { * if(i < buffer1.Length && i < buffer2.Length) * { * if(buffer1[i] != buffer2[i]) * { * res = false; * resString = "Files differ!"; * break; * } * } * else if(i >= buffer1.Length) * { * if(buffer2[i] == 0) * { * if(!longer) * { * resString = "File 2 has some trailing zeros (this shouldn't cause issues)."; * } * } * else * { * resString = "File 1 is missing data."; * res = false; * break; * } * } * else * { * if (buffer1[i] == 0) * { * if (!longer) * { * resString = "File 1 has some trailing zeros (this shouldn't cause issues)."; * } * } * else * { * resString = "File 2 is missing data."; * res = false; * break; * } * } * } * * Console.WriteLine(resString); * return res; * } * * static void Main(string[] args) * { * PMXModel md; * * string tmpFile = @"D:\mmd\temp.pmx"; * string[] inputFiles = new string[] * { * @"D:\mmd\Data\Model\Vocaloid\Miku\Appearance Miku\Appearance Miku.pmx", * @"D:\mmd\Data\Model\Selfies\Link\Link.pmx", * @"D:\mmd\Data\Model\Selfies\Luna\Luna (CHILD).pmx", * @"D:\mmd\Data\Model\GameModels\Neptunia\Nepgear\Nepggear.pmx", * @"D:\mmd\Data\Model\Vocaloid\Miku\on_Hexa_v102\onda_mod_Hexa_v102Nぽにて.pmx", * @"D:\mmd\Data\Model\GameModels\Zelda\zelda\zelda.pmx", * @"D:\mmd\Data\Model\Anime\No Game No Life\Shiro\Shiro.Pmx", * @"D:\mmd\Data\Model\Anime\No Game No Life\Shiro\Shiros phone.Pmx", * @"D:\mmd\Data\Model\Vocaloid\Luka\TDA Cheerleader Luka\TDA Cheerleader Luka.pmx", //Bad test case * @"D:\mmd\Data\Model\Vocaloid\Luka\Luka_v3.3\Luka.pmx", * @"D:\mmd\Data\Model\GameModels\Splatoon\きの式イカ\inkling.pmx" * }; * * /*try * {*/ /* foreach (string file in inputFiles) * { * string fn = Path.GetFileNameWithoutExtension(file); * Console.Write(fn + " - "); * md = PMXModel.LoadFromPMXFile(file); * Console.Write(" written - "); * md.SaveToFile(tmpFile); * * if(!CompareTwoFile(file, tmpFile)) * { * break; * } * * Console.WriteLine(""); * } * /*} * catch (Exception ex) * { * Console.WriteLine(ex.Message); * }*/ //WriteTestModel(); /*md = PMXModel.LoadFromPMDFile(@"D:\mmd\MikuMikuDance\UserFile\Model\初音ミクVer2.pmd"); * * md.SaveToPMDFile(@"D:\mmd\MikuMikuDance\UserFile\Model\MikuV2.pmd"); * md.SaveToFile(@"D:\mmd\MikuMikuDance\UserFile\Model\MikuV2.pmx");*/ //Console.WriteLine(md.Materials.Count); /*VMDFile vf = VMDFile.LoadFromFile(@"D:\mmd\Data\Motion\LoveSong\LoveSong.vmd"); * vf.SaveToFile(@"D:\mmd\Data\Motion\LoveSong\LoveSongSave.vmd"); * Console.WriteLine(vf.ModelName); * * vf = VMDFile.LoadFromFile(@"D:\mmd\Data\Motion\LoveSong\Camera.vmd"); * vf.SaveToFile(@"D:\mmd\Data\Motion\LoveSong\CameraSave.vmd"); * Console.WriteLine(vf.ModelName);*/ /*PMXModel pmx = PMXModel.LoadFromPMXFile(@"D:\mmd\Data\Model\Stages\OtakuRoom\Otaku Room.pmx"); * float mdlScale = 3.0f; * * foreach (PMXVertex vtx in pmx.Vertices) * { * vtx.Position *= mdlScale; * * if (vtx.Deform is PMXVertexDeformSDEF) * { * PMXVertexDeformSDEF vd = (PMXVertexDeformSDEF)vtx.Deform; * vd.C *= mdlScale; * vd.R0 *= mdlScale; * vd.R1 *= mdlScale; * } * } * foreach (PMXMaterial mat in pmx.Materials) * { * mat.EdgeSize *= mdlScale; * } * foreach (PMXBone bn in pmx.Bones) * { * bn.Position *= mdlScale; * } * foreach (PMXMorph mrph in pmx.Morphs) * { * foreach (PMXMorphOffsetBase offset in mrph.Offsets) * { * if (offset is PMXMorphOffsetVertex) * { * PMXMorphOffsetVertex ov = (PMXMorphOffsetVertex)offset; * ov.Translation *= mdlScale; * } * if (offset is PMXMorphOffsetBone) * { * PMXMorphOffsetBone ob = (PMXMorphOffsetBone)offset; * ob.Translation *= mdlScale; * } * } * } * foreach (PMXRigidBody rg in pmx.RigidBodies) * { * rg.Position *= mdlScale; * rg.Width *= mdlScale; * rg.Height *= mdlScale; * rg.Depth *= mdlScale; * } * foreach (PMXJoint jt in pmx.Joints) * { * jt.Position *= mdlScale; * jt.TranslationLimitMin *= mdlScale; * jt.TranslationLimitMax *= mdlScale; * } * * pmx.SaveToFile(@"D:\mmd\Data\Model\Stages\OtakuRoom\Otaku Room_scale.pmx");*/ /*float mdlScale = 3.0f; * * VMDFile vmd = VMDFile.LoadFromFile(@"D:\mmd\Data\Motion\YAHHO\YAHHO_MikuVer2.vmd"); * foreach (VMDBoneFrame vbf in vmd.Bones) * { * vbf.Translation *= mdlScale; * } * * foreach (VMDCameraFrame vcf in vmd.Camera) * { * vcf.Distance *= mdlScale; * vcf.Position *= mdlScale; * } * * vmd.SaveToFile(@"D:\mmd\Data\Motion\YAHHO\YAHHO_Sora_scale.vmd"); */ /*md = PMXModel.LoadFromPMXFile(@"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\031\vertnew\vert_shape.pmx"); * * foreach(PMXVertex vtx in md.Vertices) * { * vtx.Position.X *= -1.0f; * vtx.Normals.X *= -1.0f; * //vtx.UV.V *= -1.0f; * } * * PMXVertex vb; * foreach (PMXMaterial mt in md.Materials) * { * foreach(PMXTriangle vtr in mt.Triangles) * { * vb = vtr.Vertex1; * vtr.Vertex1 = vtr.Vertex3; * vtr.Vertex3 = vb; * } * } * * foreach (PMXBone bn in md.Bones) * { * bn.Position.X *= -1.0f; * if(!bn.HasChildBone) * { * bn.ChildVector.X *= 1.0f; * } * } * * md.SaveToFile(@"F:\Steam\SteamApps\common\Megadimension Neptunia VII\CONTENTS\GAME\model\chara\031\vertnew\vert_shape2.pmx");*/ /* * Console.ReadLine(); * } * * private static void WriteTestModel() * { * PMXModel md = new PMXModel(); * md.NameEN = "Cube"; * md.NameJP = "Cube"; * md.DescriptionEN = "Cube Desc"; * md.DescriptionJP = "Cube Desc"; * * PMXBone bn = new PMXBone(md); * bn.NameJP = "Root"; * bn.NameEN = "Root"; * bn.Position = new PMXVector3(0.0f, 0.0f, 0.0f); * bn.HasChildBone = false; * bn.ChildVector = new PMXVector3(0.0f, 15.0f, 0.0f); * bn.Translatable = true; * * md.Bones.Add(bn); * * PMXVector3[,] vertices = new PMXVector3[8, 3] * { * { new PMXVector3(-5.0f, 0.0f, -5.0f), new PMXVector3(-1.0f, -1.0f, -1.0f), new PMXVector3(0.0f, 1.0f, 0.0f) }, * { new PMXVector3(-5.0f, 10.0f, -5.0f), new PMXVector3(-1.0f, 1.0f, -1.0f), new PMXVector3(0.0f, 0.0f, 0.0f) }, * { new PMXVector3( 5.0f, 0.0f, -5.0f), new PMXVector3( 1.0f, -1.0f, -1.0f), new PMXVector3(1.0f, 1.0f, 0.0f) }, * { new PMXVector3( 5.0f, 10.0f, -5.0f), new PMXVector3( 1.0f, 1.0f, -1.0f), new PMXVector3(1.0f, 0.0f, 0.0f) }, * { new PMXVector3(-5.0f, 0.0f, 5.0f), new PMXVector3(-1.0f, -1.0f, 1.0f), new PMXVector3(0.0f, 0.0f, 0.0f) }, * { new PMXVector3(-5.0f, 10.0f, 5.0f), new PMXVector3(-1.0f, 1.0f, 1.0f), new PMXVector3(0.0f, 1.0f, 0.0f) }, * { new PMXVector3( 5.0f, 0.0f, 5.0f), new PMXVector3( 1.0f, -1.0f, 1.0f), new PMXVector3(1.0f, 0.0f, 0.0f) }, * { new PMXVector3( 5.0f, 10.0f, 5.0f), new PMXVector3( 1.0f, 1.0f, 1.0f), new PMXVector3(1.0f, 1.0f, 0.0f) }, * }; * * for (int i = 0; i < 8; i++) * { * PMXVertex vtx = new PMXVertex(md); * vtx.Position = vertices[i, 0]; * vtx.Normals = vertices[i, 1]; * vtx.UV = new PMXVector2(vertices[i, 2].X, vertices[i, 2].Y); * * md.Vertices.Add(vtx); * } * * PMXMaterial mat = new PMXMaterial(md); * mat.NameJP = "Base"; * mat.NameEN = "Base"; * mat.DiffuseTexture = "arrow.png"; * mat.Diffuse = new PMXColorRGB(1.0f, 1.0f, 1.0f); * mat.Specular = new PMXColorRGB(0.0f, 0.0f, 0.0f); * mat.Ambient = new PMXColorRGB(0.7f, 0.7f, 0.7f); * * int[,] triangleBases = new int[12, 3] * { * { 0, 1, 2 }, { 1, 3, 2 }, * { 6, 4, 0 }, { 0, 2, 6 }, * { 2, 3, 6 }, { 3, 7, 6 }, * { 4, 5, 0 }, { 5, 1, 0 }, * { 1, 5, 3 }, { 5, 7, 3 }, * { 4, 6, 5 }, { 6, 7, 5 } * }; * * for (int i = 0; i < 12; i++) * { * PMXTriangle mxt = new PMXTriangle(md, md.Vertices[triangleBases[i, 0]], md.Vertices[triangleBases[i, 1]], md.Vertices[triangleBases[i, 2]]); * mat.Triangles.Add(mxt); * } * md.Materials.Add(mat); * * md.DisplaySlots[0].References.Add(bn); * * md.NormalizeNormalVectors(); * md.SaveToFile(@"D:\mmd\cube.pmx"); * }*/ static void Main(string[] args) { /*string fle = @"D:\mmd\Data\Model\Anime\ikamusume\vrc\ika.pmx"; * * PMXModel pmx = PMXModel.LoadFromPMXFile(fle); * PMXBone spine = pmx.Bones[1]; * PMXBone chest = pmx.Bones[2]; * * foreach(PMXVertex v in pmx.Vertices) * { * if(v.Position.Y < 11.5f) * { * continue; * } * * if(v.Deform is PMXVertexDeformBDEF1) * { * if(((PMXVertexDeformBDEF1)v.Deform).Bone1 == spine) * { * ((PMXVertexDeformBDEF1)v.Deform).Bone1 = chest; * } * } * if (v.Deform is PMXVertexDeformBDEF2) * { * if (((PMXVertexDeformBDEF2)v.Deform).Bone2 == spine) * { * ((PMXVertexDeformBDEF2)v.Deform).Bone2 = chest; * } * } * * if (v.Deform is PMXVertexDeformBDEF4) * { * if (((PMXVertexDeformBDEF4)v.Deform).Bone3 == spine) * { * ((PMXVertexDeformBDEF4)v.Deform).Bone3 = chest; * } * if (((PMXVertexDeformBDEF4)v.Deform).Bone4 == spine) * { * ((PMXVertexDeformBDEF4)v.Deform).Bone4 = chest; * } * } * * if (v.Deform is PMXVertexDeformSDEF) * { * if (((PMXVertexDeformSDEF)v.Deform).Bone1 == spine) * { * ((PMXVertexDeformSDEF)v.Deform).Bone1 = chest; * } * if (((PMXVertexDeformSDEF)v.Deform).Bone2 == spine) * { * ((PMXVertexDeformSDEF)v.Deform).Bone2 = chest; * } * } * } * * foreach (PMXBone b in pmx.Bones) * { * if(b.NameEN != null && b.NameEN.Trim() != "") * { * b.NameJP = b.NameEN; * } * } * * pmx.SaveToFile(@"D:\mmd\Data\Model\Anime\ikamusume\vrc\ika-rig.pmx");*/ if (args.Length < 1) { return; } string fileName = args[0]; PMXModel pmx = PMXModel.LoadFromPMXFile(fileName); /*foreach (PMXBone t in pmx.Bones) * { * if (t.NameEN != null && t.NameEN.Trim().Length > 0) * { * t.NameJP = t.NameEN; * } * } * foreach (PMXMorph t in pmx.Morphs) * { * if (t.NameEN != null && t.NameEN.Trim().Length > 0) * { * t.NameJP = t.NameEN; * } * } * foreach (PMXMaterial t in pmx.Materials) * { * if (t.NameEN != null && t.NameEN.Trim().Length > 0) * { * t.NameJP = t.NameEN; * } * } * foreach (PMXDisplaySlot t in pmx.DisplaySlots) * { * if (t.NameEN != null && t.NameEN.Trim().Length > 0) * { * t.NameJP = t.NameEN; * } * }*/ File.Copy(fileName, fileName + ".bak", true); pmx.SaveToFile(fileName); }