Vocaloid Motion Data file created by Higuchi_U
        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);
        }
Example #2
0
 public static VmdMorphFrame Parse(BinaryReader br)
 {
     return(new VmdMorphFrame
     {
         Name = VmdDocument.ReadVmdString(br, 15),
         FrameTime = br.ReadUInt32(),
         Weight = br.ReadSingle(),
     });
 }
Example #3
0
 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);
     });
 }
Example #4
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
            });
        }
Example #5
0
        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);
        }
Example #6
0
 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();
            }
        }
Example #8
0
        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;
        }
Example #9
0
 public void Write(BinaryWriter bw, VmdVersion version)
 {
     VmdDocument.WriteVmdString(bw, this.Name, 15, version);
     bw.Write(this.FrameTime);
     bw.Write(this.Weight);
 }