Esempio n. 1
0
        public void Reload(TextReader reader)
        {
            bonePose.Clear();
            int debugLineCount = 0;

            ReadNotCommentLine(reader, ref debugLineCount);
            Name = ReadNotCommentLine(reader, ref debugLineCount);
            ReadNotCommentLine(reader, ref debugLineCount);
            while (true)
            {
                ReadLine(reader, ref debugLineCount);
                string l = ReadLine(reader, ref debugLineCount);
                if (string.IsNullOrEmpty(l))
                {
                    return;
                }
                if (!l.Contains('{'))
                {
                    return;
                }
                string t  = ReadLine(reader, ref debugLineCount);
                string r  = ReadLine(reader, ref debugLineCount);
                string eu = ReadLine(reader, ref debugLineCount);
                if (!eu.Contains('}'))
                {
                    return;
                }
                string       boneName     = l.Substring(l.IndexOf('{'));
                BoneKeyFrame boneKeyFrame = new BoneKeyFrame();
                boneKeyFrame.Translation = ReadVector3(t);
                boneKeyFrame.Rotation    = ReadQuaternion(t);
                bonePose[boneName]       = boneKeyFrame;
            }
        }
Esempio n. 2
0
        public static void Load(this MMDMotion motion, VMDFormat vmd)
        {
            motion.BoneKeyFrameSet.Clear();
            motion.MorphKeyFrameSet.Clear();

            foreach (var pair in vmd.BoneKeyFrameSet)
            {
                var keyFrames = new List <BoneKeyFrame>(pair.Value);
                motion.BoneKeyFrameSet.Add(pair.Key, keyFrames);
                for (int i = 0; i < keyFrames.Count; i++)
                {
                    BoneKeyFrame keyFrame = keyFrames[i];
                    keyFrame.Translation *= 0.1f;
                    keyFrames[i]          = keyFrame;
                }
            }
            foreach (var pair in vmd.MorphKeyFrameSet)
            {
                motion.MorphKeyFrameSet.Add(pair.Key, new List <MorphKeyFrame>(pair.Value));
            }
        }
Esempio n. 3
0
        public void Reload(BinaryReader reader)
        {
            headerChars = reader.ReadBytes(30);
            var uName      = reader.ReadBytes(20);
            var jpEncoding = CodePagesEncodingProvider.Instance.GetEncoding("shift_jis");

            Name = jpEncoding.GetString(uName);
            var stream = reader.BaseStream;

            int numOfBone = reader.ReadInt32();

            for (int i = 0; i < numOfBone; i++)
            {
                uName = reader.ReadBytes(15);
                int j = 0;
                for (; j < uName.Length; j++)
                {
                    if (uName[j] == 0)
                    {
                        break;
                    }
                }
                string nName = jpEncoding.GetString(uName, 0, j);
                if (!BoneKeyFrameSet.TryGetValue(nName, out List <BoneKeyFrame> keyFrames))
                {
                    keyFrames = new List <BoneKeyFrame>();
                    BoneKeyFrameSet.Add(nName, keyFrames);
                }
                BoneKeyFrame keyFrame = new BoneKeyFrame();
                keyFrame.Frame         = reader.ReadInt32();
                keyFrame.translation   = ReadVector3XInv(reader);
                keyFrame.rotation      = ReadQuaternionYZInv(reader);
                keyFrame.xInterpolator = ReadBoneInterpolator(reader);
                keyFrame.yInterpolator = ReadBoneInterpolator(reader);
                keyFrame.zInterpolator = ReadBoneInterpolator(reader);
                keyFrame.rInterpolator = ReadBoneInterpolator(reader);

                keyFrames.Add(keyFrame);
            }
            if (stream.Length - stream.Position == 0)
            {
                goto endlabel;
            }

            int numOfMorph = reader.ReadInt32();

            for (int i = 0; i < numOfMorph; i++)
            {
                uName = reader.ReadBytes(15);
                int j = 0;
                for (; j < uName.Length; j++)
                {
                    if (uName[j] == 0)
                    {
                        break;
                    }
                }
                string nName = jpEncoding.GetString(uName, 0, j);
                if (!MorphKeyFrameSet.TryGetValue(nName, out List <MorphKeyFrame> keyFrames))
                {
                    keyFrames = new List <MorphKeyFrame>();
                    MorphKeyFrameSet.Add(nName, keyFrames);
                }
                MorphKeyFrame keyFrame = new MorphKeyFrame();
                keyFrame.Frame  = reader.ReadInt32();
                keyFrame.Weight = reader.ReadSingle();

                keyFrames.Add(keyFrame);
            }
            if (stream.Length - stream.Position == 0)
            {
                goto endlabel;
            }

            int numOfCam = reader.ReadInt32();

            for (int i = 0; i < numOfCam; i++)
            {
                CameraKeyFrame keyFrame = new CameraKeyFrame();
                keyFrame.Frame          = reader.ReadInt32();
                keyFrame.distance       = reader.ReadSingle();
                keyFrame.position       = ReadVector3XInv(reader);
                keyFrame.rotation       = ReadVector3YZInv(reader);
                keyFrame.mxInterpolator = ReadCameraInterpolator(reader);
                keyFrame.myInterpolator = ReadCameraInterpolator(reader);
                keyFrame.mzInterpolator = ReadCameraInterpolator(reader);
                keyFrame.rInterpolator  = ReadCameraInterpolator(reader);
                keyFrame.dInterpolator  = ReadCameraInterpolator(reader);
                keyFrame.fInterpolator  = ReadCameraInterpolator(reader);
                keyFrame.FOV            = reader.ReadInt32();
                keyFrame.orthographic   = reader.ReadByte() != 0;

                CameraKeyFrames.Add(keyFrame);
            }
            if (stream.Length - stream.Position == 0)
            {
                goto endlabel;
            }

            int numOfLight = reader.ReadInt32();

            for (int i = 0; i < numOfLight; i++)
            {
                LightKeyFrame lightKeyFrame = new LightKeyFrame();
                lightKeyFrame.Frame    = reader.ReadInt32();
                lightKeyFrame.Color    = ReadVector3(reader);
                lightKeyFrame.Position = ReadVector3XInv(reader);

                LightKeyFrames.Add(lightKeyFrame);
            }
            if (stream.Length - stream.Position == 0)
            {
                goto endlabel;
            }

endlabel:
            foreach (var keyframes in BoneKeyFrameSet.Values)
            {
                keyframes.Sort();
            }
            foreach (var keyframes in MorphKeyFrameSet.Values)
            {
                keyframes.Sort();
            }
            CameraKeyFrames.Sort();
            LightKeyFrames.Sort();
        }
Esempio n. 4
0
        private static MotionData[] createMotionDataList(DataReader i_reader, float[] o_max_frame)
        {
            List <MotionData> result = new List <MotionData>();
            int ulNumBoneKeyFrames   = i_reader.readInt();

            // まずはモーションデータ中のボーンごとのキーフレーム数をカウント
            VMD_Motion[] tmp_vmd_motion = new VMD_Motion[ulNumBoneKeyFrames];
            for (int i = 0; i < ulNumBoneKeyFrames; i++)
            {
                tmp_vmd_motion[i] = new VMD_Motion();
                tmp_vmd_motion[i].read(i_reader);
            }

            float max_frame = 0.0f;

            for (int i = 0; i < ulNumBoneKeyFrames; i++)
            {
                if (max_frame < tmp_vmd_motion[i].ulFrameNo)
                {
                    max_frame = tmp_vmd_motion[i].ulFrameNo;    // 最大フレーム更新
                }
                bool is_found = false;
                for (int i2 = 0; i2 < result.Count; i2++)
                {
                    MotionData pMotTemp = result[i2];
                    if (pMotTemp.szBoneName.Equals(tmp_vmd_motion[i].szBoneName))
                    {
                        // リストに追加済みのボーン
                        pMotTemp.ulNumKeyFrames++;
                        is_found = true;
                        break;
                    }
                }

                if (!is_found)
                {
                    // リストにない場合は新規ノードを追加
                    MotionData pNew = new MotionData();
                    pNew.szBoneName     = tmp_vmd_motion[i].szBoneName;
                    pNew.ulNumKeyFrames = 1;
                    result.Add(pNew);
                }
            }


            // キーフレーム配列を確保
            for (int i = 0; i < result.Count; i++)
            {
                MotionData pMotTemp = result[i];
                pMotTemp.pKeyFrames     = BoneKeyFrame.createArray(pMotTemp.ulNumKeyFrames);
                pMotTemp.ulNumKeyFrames = 0;            // 配列インデックス用にいったん0にする
            }

            // ボーンごとにキーフレームを格納
            for (int i = 0; i < ulNumBoneKeyFrames; i++)
            {
                for (int i2 = 0; i2 < result.Count; i2++)
                {
                    MotionData pMotTemp = result[i2];
                    if (pMotTemp.szBoneName.Equals(tmp_vmd_motion[i].szBoneName))
                    {
                        BoneKeyFrame pKeyFrame = pMotTemp.pKeyFrames[pMotTemp.ulNumKeyFrames];

                        pKeyFrame.fFrameNo = (float)tmp_vmd_motion[i].ulFrameNo;
                        pKeyFrame.vec3Position.setValue(tmp_vmd_motion[i].vec3Position);
                        pKeyFrame.vec4Rotate.QuaternionNormalize(tmp_vmd_motion[i].vec4Rotate);

                        pMotTemp.ulNumKeyFrames++;

                        break;
                    }
                }
            }

            // キーフレーム配列を昇順にソート

            for (int i = 0; i < result.Count; i++)
            {
                MotionData pMotTemp = result[i];
                System.Array.Sort <BoneKeyFrame>(pMotTemp.pKeyFrames, new BoneCompare());
            }

            o_max_frame[0] = max_frame;
            return(result.ToArray());
        }