public static XEFExpressionData FromReader(BinaryReader reader)
        {
            XEFExpressionData expressionData = new XEFExpressionData();

            expressionData.Face_Neutral = (XEFExpressionConfidenceLevel)reader.ReadInt32();
            expressionData.Face_Happy   = (XEFExpressionConfidenceLevel)reader.ReadInt32();

            expressionData.Activity_Talking        = (XEFExpressionConfidenceLevel)reader.ReadInt32();
            expressionData.Activity_EyeLeftClosed  = (XEFExpressionConfidenceLevel)reader.ReadInt32();
            expressionData.Activity_EyeRightClosed = (XEFExpressionConfidenceLevel)reader.ReadInt32();
            expressionData.Activity_MouthOpen      = (XEFExpressionConfidenceLevel)reader.ReadInt32();
            expressionData.Activity_MouthMoved     = (XEFExpressionConfidenceLevel)reader.ReadInt32();
            expressionData.Activity_LookingAway    = (XEFExpressionConfidenceLevel)reader.ReadInt32();
            reader.ReadInt32(); // Extra unknown expressions
            reader.ReadInt32();
            reader.ReadInt32();
            reader.ReadInt32();

            expressionData.Engagement_Engaged = (XEFExpressionConfidenceLevel)reader.ReadInt32();

            expressionData.Appearance_WearingGlasses = (XEFExpressionConfidenceLevel)reader.ReadInt32();
            reader.ReadInt32(); // Extra unknown appearances
            reader.ReadInt32();
            reader.ReadInt32();
            reader.ReadInt32();
            reader.ReadInt32();

            expressionData.TrackingState = (XEFTrackingState)reader.ReadInt32();

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