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; } }
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)); } }
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(); }
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()); }