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;
		}
	}
}
Пример #2
0
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 );
	}
}