void ReadFrames(BinaryReader br, ref Vmd vmd) { Frame currentFrame = new Frame { Index = 0 }; var baseStream = br.BaseStream; try { while (baseStream.Position != baseStream.Length) { var bone = new Bone(); string boneName = ReadString(br, 15); // EOF checking workaround: For some reason baseStream checking doesn't work if (string.IsNullOrEmpty(boneName)) { break; } int frameIdx = br.ReadInt32(); // Finalize and register the current frame and create a new instance when the frame index increases if (currentFrame.Index != frameIdx) { if (currentFrame.Index > frameIdx) { throw new Exception("Frame indices are not sorted in ascending order."); } vmd.Frames.Add(currentFrame); currentFrame = new Frame { Index = frameIdx }; } // Read bone data and set to the current frame bone.Name = boneName; float x = br.ReadSingle(); float y = br.ReadSingle(); float z = br.ReadSingle(); bone.Position = new Vector3(x, y, z); float qx = br.ReadSingle(); float qy = br.ReadSingle(); float qz = br.ReadSingle(); float qw = br.ReadSingle(); bone.Quaternion = new Quaternion(qx, qy, qz, qw); bone.InterpolationParameters = br.ReadBytes(64).ToList(); currentFrame.Bones.Add(boneName, bone); } // Register the last frame vmd.Frames.Add(currentFrame); } catch (Exception ex) { string msg = $"Following error occured while reading {_path}:\n {ex.Message}"; ErrorHandler.AskTermination(msg); } }