public void RegisterConfig(TransformConfig transformConfig, TransformJointData jointData,
                                   Func <float> timeProvider)
        {
            bool containsKeyAlready = _idToTransformStateInfo.ContainsKey(transformConfig.InstanceId);

            Assert.IsFalse(containsKeyAlready,
                           "Trying to register multiple configs with the same id into " +
                           "TransformFeatureStateCollection.");

            var featureStateProvider = new FeatureStateProvider <TransformFeature, string>
                                       // note that jointData and transformConfig are reference types (classes), because they can change
                                       // during run time
                                           ((feature) => TransformFeatureValueProvider.GetValue(feature, jointData, transformConfig),
                                           feature => (int)feature,
                                           timeProvider);
            TransformStateInfo newTransfState = new TransformStateInfo(transformConfig, featureStateProvider);

            featureStateProvider.InitializeThresholds(transformConfig.FeatureThresholds);
            _idToTransformStateInfo.Add(transformConfig.InstanceId, newTransfState);
        }
        public static float GetValue(TransformFeature transformFeature, TransformJointData transformJointData,
                                     TransformConfig transformConfig)
        {
            TransformProperties transformProps =
                new TransformProperties(transformJointData.CenterEyePose, transformJointData.WristPose,
                                        transformJointData.Handedness, transformJointData.TrackingSystemUp,
                                        transformJointData.TrackingSystemForward);

            switch (transformFeature)
            {
            case TransformFeature.WristDown:
                return(GetWristDownValue(in transformProps, in transformConfig));

            case TransformFeature.WristUp:
                return(GetWristUpValue(in transformProps, in transformConfig));

            case TransformFeature.PalmDown:
                return(GetPalmDownValue(in transformProps, in transformConfig));

            case TransformFeature.PalmUp:
                return(GetPalmUpValue(in transformProps, in transformConfig));

            case TransformFeature.PalmTowardsFace:
                return(GetPalmTowardsFaceValue(in transformProps, in transformConfig));

            case TransformFeature.PalmAwayFromFace:
                return(GetPalmAwayFromFaceValue(in transformProps, in transformConfig));

            case TransformFeature.FingersUp:
                return(GetFingersUpValue(in transformProps, in transformConfig));

            case TransformFeature.FingersDown:
                return(GetFingersDownValue(in transformProps, in transformConfig));

            case TransformFeature.PinchClear:
            default:
                return(GetPinchClearValue(in transformProps, in transformConfig));
            }
        }