public static VmdDocument Parse(Stream stream) { var rt = new VmdDocument(); // leave open var br = new BinaryReader(stream); var header = ReadVmdString(br, 30); if (header == "Vocaloid Motion Data file") { rt.Version = VmdVersion.MMDVer2; } else if (header == "Vocaloid Motion Data 0002") { rt.Version = VmdVersion.MMDVer3; } else { throw new InvalidOperationException("invalid format"); } rt.ModelName = ReadVmdString(br, rt.Version == VmdVersion.MMDVer2 ? 10 : 20); rt.BoneFrames = ReadBoneFrames(br).ToList(); rt.MorphFrames = ReadMorphFrames(br).ToList(); rt.CameraFrames = ReadCameraFrames(br, rt.Version).ToList(); rt.LightFrames = ReadLightFrames(br).ToList(); if (br.GetRemainingLength() > 4) { rt.SelfShadowFrames = ReadSelfShadowFrames(br).ToList(); } return(rt); }
public static VmdMorphFrame Parse(BinaryReader br) { return(new VmdMorphFrame { Name = VmdDocument.ReadVmdString(br, 15), FrameTime = br.ReadUInt32(), Weight = br.ReadSingle(), }); }
public void Write(BinaryWriter bw) { bw.Write(this.FrameTime); bw.Write(this.IsVisible ? (byte)1 : (byte)0); bw.Write(this.IKEnabled.Count); this.IKEnabled.ForEach(_ => { VmdDocument.WriteVmdString(bw, _.Key, 20, VmdVersion.MMDVer2); bw.Write(_.Value ? (byte)1 : (byte)0); }); }
public void Write(BinaryWriter bw, VmdVersion version) { VmdDocument.WriteVmdString(bw, this.Name, 15, version); bw.Write(this.FrameTime); this.Position.ForEach(bw.Write); this.Quaternion.ForEach(bw.Write); var x = this.XInterpolation; var y = this.YInterpolation; var z = this.ZInterpolation; var r = this.RotationInterpolation; var X_x1 = x[0].X; var X_y1 = x[0].Y; var Y_x1 = y[0].X; var Y_y1 = y[0].Y; var Z_x1 = z[0].X; var Z_y1 = z[0].Y; var R_x1 = r[0].X; var R_y1 = r[0].Y; var X_x2 = x[1].X; var X_y2 = x[1].Y; var Y_x2 = y[1].X; var Y_y2 = y[1].Y; var Z_x2 = z[1].X; var Z_y2 = z[1].Y; var R_x2 = r[1].X; var R_y2 = r[1].Y; bw.Write(new byte[] { X_x1, Y_x1, Z_x1, R_x1, X_y1, Y_y1, Z_y1, R_y1, X_x2, Y_x2, Z_x2, R_x2, X_y2, Y_y2, Z_y2, R_y2, Y_x1, Z_x1, R_x1, X_y1, Y_y1, Z_y1, R_y1, X_x2, Y_x2, Z_x2, R_x2, X_y2, Y_y2, Z_y2, R_y2, 01, Z_x1, R_x1, X_y1, Y_y1, Z_y1, R_y1, X_x2, Y_x2, Z_x2, R_x2, X_y2, Y_y2, Z_y2, R_y2, 01, 00, R_x1, X_y1, Y_y1, Z_y1, R_y1, X_x2, Y_x2, Z_x2, R_x2, X_y2, Y_y2, Z_y2, R_y2, 01, 00, 00 }); }
public static VmdBoneFrame Parse(BinaryReader br) { var rt = new VmdBoneFrame { Name = VmdDocument.ReadVmdString(br, 15), FrameTime = br.ReadUInt32(), Position = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), }, Quaternion = new[] { br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), br.ReadSingle(), }, }; var ipBuffer = br.ReadBytes(64); var ipA = ipBuffer.Take(4) .Zip(ipBuffer.Skip(4).Take(4), (x, y) => new VmdInterpolationPoint(x, y)); var ipB = ipBuffer.Skip(8) .Take(4) .Zip(ipBuffer.Skip(8 + 4).Take(4), (x, y) => new VmdInterpolationPoint(x, y)); var ip = ipA.Zip(ipB, (a, b) => new[] { a, b }).ToArray(); rt.XInterpolation = ip[0]; rt.YInterpolation = ip[1]; rt.ZInterpolation = ip[2]; rt.RotationInterpolation = ip[3]; return(rt); }
public static VmdPropertyFrame Parse(BinaryReader br) { return(new VmdPropertyFrame { FrameTime = br.ReadUInt32(), IsVisible = br.ReadByte() != 0, IKEnabled = Enumerable.Range(0, br.ReadInt32()).Select(_ => Tuple.Create(VmdDocument.ReadVmdString(br, 20), br.ReadByte())).ToDictionary(_ => _.Item1, _ => _.Item2 != 0), }); }
public override void Run(CommandArgs e) { var mmds = Process.GetProcessesByName("MikuMikuDance"); e.Cancel = true; try { if (!mmds.Any()) { MessageBox.Show(this.ApplicationForm, Util.Bilingual ( this.Scene.Language, "MikuMikuDance が起動されていません。\r\nMikuMikuDance が起動している状態で実行してください。", "Cannot find MikuMikuDance.\r\nPlease start MikuMikuDance to proceed." ), Util.Bilingual(this.Scene.Language, this.Text, this.EnglishText), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } switch (this.Scene.Mode) { case EditMode.CameraMode: case EditMode.ModelMode: break; case EditMode.None: MessageBox.Show(this.ApplicationForm, Util.Bilingual ( this.Scene.Language, "モデルの現在の変形状態およびモデル、カメラ、または照明のキーフレームのみ送信できます。\r\nモデル、カメラ、または照明を選択してください。", "Only the current model transformation or model, camera, light keyframes can be sent.\r\nPlease select them first." ), Util.Bilingual(this.Scene.Language, this.Text, this.EnglishText), MessageBoxButtons.OK, MessageBoxIcon.Information); return; } using (var f = new SetMmdTransformationForm(this.Scene.Language, mmds)) { if (f.ShowDialog(this.ApplicationForm) != DialogResult.OK) return; if (this.Scene.Mode == EditMode.ModelMode) { var model = this.Scene.ActiveModel; var changedBonesOnly = f.ChangedBonesOnly; var vpd = new VpdDocument { ParentFileName = "miku.osm", }; var vmd = new VmdDocument { ModelName = model.Name, }; var useVmd = false; var frameNumbers = model.Bones.SelectMany(_ => _.Layers) .SelectMany(_ => _.Frames) .Where(_ => _.Selected) .Select(_ => _.FrameNumber) .Concat(model.Morphs.SelectMany(_ => _.Frames) .Where(_ => _.Selected) .Select(_ => _.FrameNumber)) .DefaultIfEmpty(0) .ToArray(); var firstFrame = frameNumbers.Min(); foreach (var i in model.Bones) { var local = i.CurrentLocalMotion; if (!changedBonesOnly || local.Move != Vector3.Zero || local.Rotation != Quaternion.Identity) vpd.Bones.Add(new VpdBone { BoneName = i.Name, Position = ToArray(local.Move), Quaternion = ToArray(local.Rotation), }); foreach (var j in i.Layers.First().SelectedFrames) { useVmd = true; vmd.BoneFrames.Add(new VmdBoneFrame { FrameTime = (uint)(j.FrameNumber - firstFrame), Name = i.Name, Position = ToArray(j.Position), Quaternion = ToArray(j.Quaternion), RotationInterpolation = ToArray(j.InterpolRA, j.InterpolRB), XInterpolation = ToArray(j.InterpolXA, j.InterpolXB), YInterpolation = ToArray(j.InterpolYA, j.InterpolYB), ZInterpolation = ToArray(j.InterpolZA, j.InterpolZB), }); } } foreach (var i in model.Morphs) foreach (var j in i.SelectedFrames) { useVmd = true; vmd.MorphFrames.Add(new VmdMorphFrame { FrameTime = (uint)(j.FrameNumber - firstFrame), Name = i.Name, Weight = j.Weight, }); } if (useVmd) using (var vmdStream = new MemoryStream()) { vmd.Write(vmdStream); vmdStream.Seek(0, SeekOrigin.Begin); MmdDrop.DropFile(f.SelectedMmd.MainWindowHandle, new MmdDropFile("TempMotion" + f.SelectedMmd.Id + ".vmd", vmdStream)); } using (var vpdStream = new MemoryStream(Encoding.GetEncoding(932).GetBytes(vpd.GetFormattedText()))) MmdDrop.DropFile(f.SelectedMmd.MainWindowHandle, new MmdDropFile("TempPose" + f.SelectedMmd.Id + ".vpd", vpdStream) { Timeout = 500, }); } else if (this.Scene.Mode == EditMode.CameraMode) { var vmd = new VmdDocument { ModelName = "カメラ・照明\0on Data", }; foreach (var i in this.Scene.Cameras.First().Layers.First().SelectedFrames) vmd.CameraFrames.Add(new VmdCameraFrame { FrameTime = (uint)i.FrameNumber, Position = ToArray(i.Position), Angle = ToArray(new Vector3(-i.Angle.X, (float)(i.Angle.Y - Math.PI), i.Angle.Z)), FovInDegree = (int)MathHelper.ToDegrees(i.Fov), Ortho = /* TODO: get perspective */ false, Radius = -i.Radius, AngleInterpolation = ToArray(i.InterpolRoteA, i.InterpolRoteB), XInterpolation = ToArray(i.InterpolMoveA, i.InterpolMoveB), YInterpolation = ToArray(i.InterpolMoveA, i.InterpolMoveB), ZInterpolation = ToArray(i.InterpolMoveA, i.InterpolMoveB), RadiusInterpolation = ToArray(i.InterpolDistA, i.InterpolDistB), FovInterpolation = ToArray(i.InterpolFovA, i.InterpolFovB), }); foreach (var i in this.Scene.Lights.First().SelectedFrames) vmd.LightFrames.Add(new VmdLightFrame { FrameTime = (uint)i.FrameNumber, Position = ToArray(-i.Position / 100), Color = ToArray(i.Color), }); using (var vmdStream = new MemoryStream()) { vmd.Write(vmdStream); vmdStream.Seek(0, SeekOrigin.Begin); MmdDrop.DropFile(f.SelectedMmd.MainWindowHandle, new MmdDropFile("TempMotion" + f.SelectedMmd.Id + ".vmd", vmdStream)); } } } } finally { foreach (var i in mmds) i.Dispose(); } }
public static VmdDocument Parse(Stream stream) { var rt = new VmdDocument(); // leave open var br = new BinaryReader(stream); var header = ReadVmdString(br, 30); if (header == "Vocaloid Motion Data file") rt.Version = VmdVersion.MMDVer2; else if (header == "Vocaloid Motion Data 0002") rt.Version = VmdVersion.MMDVer3; else throw new InvalidOperationException("invalid format"); rt.ModelName = ReadVmdString(br, rt.Version == VmdVersion.MMDVer2 ? 10 : 20); rt.BoneFrames = ReadBoneFrames(br).ToList(); rt.MorphFrames = ReadMorphFrames(br).ToList(); rt.CameraFrames = ReadCameraFrames(br, rt.Version).ToList(); rt.LightFrames = ReadLightFrames(br).ToList(); if (br.GetRemainingLength() > 4) rt.SelfShadowFrames = ReadSelfShadowFrames(br).ToList(); if (br.GetRemainingLength() > 4) rt.PropertyFrames = ReadPropertyFrames(br).ToList(); return rt; }
public void Write(BinaryWriter bw, VmdVersion version) { VmdDocument.WriteVmdString(bw, this.Name, 15, version); bw.Write(this.FrameTime); bw.Write(this.Weight); }