void FOculusInput::SetHapticFeedbackValues(int32 ControllerId, int32 Hand, const FHapticFeedbackValues& Values) { for (FOculusTouchControllerPair& ControllerPair : ControllerPairs) { if (ControllerPair.UnrealControllerIndex == ControllerId) { FOculusTouchControllerState& ControllerState = ControllerPair.ControllerStates[Hand]; if (ControllerState.bIsCurrentlyTracked) { if(IOculusRiftPlugin::IsAvailable()) { FOvrSessionShared::AutoSession OvrSession(IOculusRiftPlugin::Get().GetSession()); if (OvrSession && FApp::HasVRFocus()) { float FreqMin, FreqMax = 0.f; GetHapticFrequencyRange(FreqMin, FreqMax); const float Frequency = FMath::Lerp(FreqMin, FreqMax, FMath::Clamp(Values.Frequency, 0.f, 1.f)); const float Amplitude = Values.Amplitude * GetHapticAmplitudeScale(); if ((ControllerState.HapticAmplitude != Amplitude) || (ControllerState.HapticFrequency != Frequency)) { ControllerState.HapticAmplitude = Amplitude; ControllerState.HapticFrequency = Frequency; const ovrControllerType OvrController = (EControllerHand(Hand) == EControllerHand::Left) ? ovrControllerType_LTouch : ovrControllerType_RTouch; ovr_SetControllerVibration(OvrSession, OvrController, Frequency, Amplitude); UE_CLOG(0, LogOcInput, Log, TEXT("SetHapticFeedbackValues: Hand %d, freq %f, amp %f"), int(Hand), Frequency, Amplitude); ControllerState.bPlayingHapticEffect = (Amplitude != 0.f) && (Frequency != 0.f); } } } } break; } } }
void FOculusInput::UpdateForceFeedback( const FOculusTouchControllerPair& ControllerPair, const EControllerHand Hand ) { const FOculusTouchControllerState& ControllerState = ControllerPair.ControllerStates[ (int32)Hand ]; check(IOculusRiftPlugin::IsAvailable()); ovrSession OvrSession = IOculusRiftPlugin::Get().GetSession(); if( ControllerState.bIsCurrentlyTracked && !ControllerState.bPlayingHapticEffect && OvrSession) { float FreqMin, FreqMax = 0.f; GetHapticFrequencyRange(FreqMin, FreqMax); // Map the [0.0 - 1.0] range to a useful range of frequencies for the Oculus controllers const float ActualFrequency = FMath::Lerp(FreqMin, FreqMax, FMath::Clamp(ControllerState.HapticFrequency, 0.0f, 1.0f)); // Oculus SDK wants amplitude values between 0.0 and 1.0 const float ActualAmplitude = ControllerState.HapticAmplitude * GetHapticAmplitudeScale(); const ovrControllerType OvrController = ( Hand == EControllerHand::Left ) ? ovrControllerType_LTouch : ovrControllerType_RTouch; ovr_SetControllerVibration( OvrSession, OvrController, ActualFrequency, ActualAmplitude ); } }