public static XEFBodyData FromReader(BinaryReader reader)
        {
            XEFBodyData bodyData = new XEFBodyData();

            foreach (XEFJointType jointType in Enum.GetValues(typeof(XEFJointType)))
            {
                bodyData.SkeletonJointPositions[jointType] = XEFVector.FromReader(reader);
            }

            foreach (XEFJointType jointType in Enum.GetValues(typeof(XEFJointType)))
            {
                bodyData.SkeletonJointOrientations[jointType] = XEFVector.FromReader(reader);
            }

            foreach (XEFJointType jointType in Enum.GetValues(typeof(XEFJointType)))
            {
                bodyData.SkeletonJointPositionTrackingStates[jointType] = (XEFTrackingState)reader.ReadInt32();
            }

            bodyData.ExpressionData = XEFExpressionData.FromReader(reader);

            bodyData.HandDataLeft  = XEFHandData.FromReader(reader);
            bodyData.HandDataRight = XEFHandData.FromReader(reader);

            reader.ReadInt32(); // padding

            bodyData.TrackingID    = reader.ReadUInt64();
            bodyData.TrackingState = (XEFBodyTrackingState)reader.ReadInt32();

            bodyData.LeanData = XEFLeanData.FromReader(reader);

            bodyData.QualityFlags = reader.ReadUInt32();

            return(bodyData);
        }
        public static XEFBodyFrame FromByteArray(byte[] data)
        {
            XEFBodyFrame bodyData = new XEFBodyFrame();

            using (MemoryStream stream = new MemoryStream(data))
            {
                using (BinaryReader reader = new BinaryReader(stream))
                {
                    bodyData.FloorClipPlane = XEFVector.FromReader(reader);
                    bodyData.Up             = XEFVector.FromReader(reader);

                    for (int i = 0; i < BODY_DATA_SIZE; i++)
                    {
                        bodyData.BodyData[i] = XEFBodyData.FromReader(reader);
                    }

                    bodyData.QualityFlags = reader.ReadUInt32();
                    reader.ReadInt32(); // Padding
                    reader.ReadInt32();
                    reader.ReadInt32();
                }
            }
            return(bodyData);
        }