@@ -39,7 +39,7 @@ public void Fetch()
3939 }
4040
4141 private DeviceFeature deviceFeature ;
42- private TrackingActivator trackingActivator = TrackingActivator . Default ;
42+ private static TrackingActivator trackingActivator = TrackingActivator . Default ;
4343 private GestureActivator gestureActivator = GestureActivator . Default ;
4444 private uint leftDeviceIndex = VRModule . INVALID_DEVICE_INDEX ;
4545 private uint rightDeviceIndex = VRModule . INVALID_DEVICE_INDEX ;
@@ -186,6 +186,40 @@ protected override void OnUpdateDeviceInput()
186186
187187 public override uint GetRightHandedIndex ( ) { return rightDeviceIndex ; }
188188
189+ public static bool TryGetLeftPinchRay ( out Vector3 origin , out Vector3 direction )
190+ {
191+ if ( ! trackingActivator . isLeftValid )
192+ {
193+ origin = Vector3 . zero ;
194+ direction = Vector3 . zero ;
195+
196+ return false ;
197+ }
198+
199+ var pinch = trackingActivator . getLeftPinchData ;
200+ Coordinate . GetVectorFromGL ( pinch . pinch . origin , out origin ) ;
201+ Coordinate . GetVectorFromGL ( pinch . pinch . direction , out direction ) ;
202+
203+ return true ;
204+ }
205+
206+ public static bool TryGetRightPinchRay ( out Vector3 origin , out Vector3 direction )
207+ {
208+ if ( ! trackingActivator . isRightValid )
209+ {
210+ origin = Vector3 . zero ;
211+ direction = Vector3 . zero ;
212+
213+ return false ;
214+ }
215+
216+ var pinch = trackingActivator . getRightPinchData ;
217+ Coordinate . GetVectorFromGL ( pinch . pinch . origin , out origin ) ;
218+ Coordinate . GetVectorFromGL ( pinch . pinch . direction , out direction ) ;
219+
220+ return true ;
221+ }
222+
189223 private enum FeatureActivity
190224 {
191225 Stopped ,
@@ -458,9 +492,13 @@ public bool TryFetchData(WVR_PoseOriginModel originModel)
458492 return false ;
459493 }
460494
461- public bool isLeftValid { get { return trackingData . left . isValidPose ; } }
495+ public bool isLeftValid { get { return trackingData . left . isValidPose && ! Interop . WVR_IsInputFocusCapturedBySystem ( ) ; } }
496+
497+ public bool isRightValid { get { return trackingData . right . isValidPose && ! Interop . WVR_IsInputFocusCapturedBySystem ( ) ; } }
462498
463- public bool isRightValid { get { return trackingData . right . isValidPose ; } }
499+ public WVR_HandPoseState_t getLeftPinchData { get { return pinchData . left ; } }
500+
501+ public WVR_HandPoseState_t getRightPinchData { get { return pinchData . right ; } }
464502
465503 public void UpdateJoints ( IVRModuleDeviceStateRW state , bool isLeft )
466504 {
@@ -475,18 +513,41 @@ public void UpdateJoints(IVRModuleDeviceStateRW state, bool isLeft)
475513 state . handJoints [ handJointMapping [ s_NaturalHandJoints [ i ] ] ] = new JointPose ( p ) ;
476514 }
477515
478- state . isPoseValid = data . isValidPose ;
516+ state . isPoseValid = data . isValidPose && ! Interop . WVR_IsInputFocusCapturedBySystem ( ) ;
479517 state . pose = state . handJoints [ HandJointName . Wrist ] . pose ;
480518 }
481519
482520 public void UpdateDeviceInput ( IVRModuleDeviceStateRW state , bool isLeft )
483521 {
484522 var pinch = isLeft ? pinchData . left : pinchData . right ;
485- var pinched = pinch . pinch . strength >= 0.95f ;
523+ var pinched = pinch . pinch . strength >= 0.5f ;
486524
487525 state . SetButtonPress ( VRModuleRawButton . GestureIndexPinch , pinched ) ;
488526 state . SetButtonTouch ( VRModuleRawButton . GestureIndexPinch , pinched ) ;
489527 state . SetAxisValue ( VRModuleRawAxis . Trigger , pinch . pinch . strength ) ;
528+
529+ var indexCurl = GetFingerCurl ( state , HandJointName . IndexTip ) ;
530+ var middleCurl = GetFingerCurl ( state , HandJointName . MiddleTip ) ;
531+ var ringCurl = GetFingerCurl ( state , HandJointName . RingTip ) ;
532+ var pinkyCurl = GetFingerCurl ( state , HandJointName . PinkyTip ) ;
533+ var curlAvg = ( indexCurl + middleCurl + ringCurl + pinkyCurl ) * 0.25f ;
534+
535+ state . SetAxisValue ( VRModuleRawAxis . IndexCurl , indexCurl ) ;
536+ state . SetAxisValue ( VRModuleRawAxis . MiddleCurl , middleCurl ) ;
537+ state . SetAxisValue ( VRModuleRawAxis . RingCurl , ringCurl ) ;
538+ state . SetAxisValue ( VRModuleRawAxis . PinkyCurl , pinkyCurl ) ;
539+ state . SetAxisValue ( VRModuleRawAxis . CapSenseGrip , curlAvg ) ;
540+ state . SetButtonPress ( VRModuleRawButton . Grip , curlAvg > 0.75f ) ;
541+ state . SetButtonTouch ( VRModuleRawButton . Grip , curlAvg > 0.50f ) ;
542+ }
543+
544+ private float GetFingerCurl ( IVRModuleDeviceStateRW state , HandJointName finger )
545+ {
546+ var palmDir = state . pose . forward ;
547+ var fingerDir = state . handJoints [ finger ] . pose . forward ;
548+ var angle = Vector3 . SignedAngle ( palmDir , fingerDir , state . pose . right ) ;
549+ if ( angle < - 90f ) { angle += 360f ; }
550+ return Mathf . InverseLerp ( 0f , 180f , angle ) ;
490551 }
491552
492553 private static void InitializeHandTrackerInfo ( ref WVR_HandTrackerInfo_t handTrackerInfo , ref WVR_HandJoint [ ] jointMappingArray , ref ulong [ ] jointValidFlagArray , uint count )
0 commit comments