Skip to content

Commit

Permalink
Oculus Touch 6Dof controller support.
Browse files Browse the repository at this point in the history
  • Loading branch information
daoshengmu committed Nov 29, 2018
1 parent 7f7e391 commit 0a9db56
Showing 1 changed file with 55 additions and 32 deletions.
87 changes: 55 additions & 32 deletions app/src/oculusvr/cpp/DeviceDelegateOculusVR.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -469,6 +469,7 @@ struct DeviceDelegateOculusVR::State {
bool layersEnabled = true;
ovrJava java = {};
ovrMobile* ovr = nullptr;
ovrDeviceType deviceType;
OculusEyeSwapChainPtr eyeSwapChains[VRAPI_EYE_COUNT];
OculusLayerCubePtr cubeLayer;
OculusLayerEquirectPtr equirectLayer;
Expand Down Expand Up @@ -534,6 +535,7 @@ struct DeviceDelegateOculusVR::State {
return;
}
initialized = true;
deviceType = (ovrDeviceType)vrapi_GetSystemPropertyInt(&java, VRAPI_SYS_PROP_DEVICE_TYPE);
SetRenderSize(device::RenderMode::StandAlone);

for (int i = 0; i < VRAPI_EYE_COUNT; ++i) {
Expand Down Expand Up @@ -642,45 +644,59 @@ struct DeviceDelegateOculusVR::State {
controllerTransform = vrb::Matrix::Rotation(quat);
}

if (controllerCapabilities.ControllerCapabilities & ovrControllerCaps_HasPositionTracking) {
auto & position = tracking.HeadPose.Pose.Position;
controllerTransform.TranslateInPlace(vrb::Vector(position.x, position.y, position.z));
} else {
controllerTransform = elbow->GetTransform(hand, head, controllerTransform);
}

controllerTransform = elbow->GetTransform(hand, head, controllerTransform);
controller->SetTransform(0, controllerTransform);

controllerState.Header.ControllerType = ovrControllerType_TrackedRemote;
vrapi_GetCurrentInputState(ovr, controllerID, &controllerState.Header);

reorientCount = controllerState.RecenterCount;
const bool triggerPressed = (controllerState.Buttons & ovrButton_A) != 0;
const bool trackpadPressed = (controllerState.Buttons & ovrButton_Enter) != 0;
const bool trackpadTouched = (bool) controllerState.TrackpadStatus;
const bool backPressed = (controllerState.Buttons & ovrButton_Back) != 0;
controller->SetButtonState(0, ControllerDelegate::BUTTON_TRIGGER, 1, triggerPressed, triggerPressed);
controller->SetButtonState(0, ControllerDelegate::BUTTON_TOUCHPAD, 0, trackpadPressed, trackpadTouched);
// By setting vrapi_SetPropertyInt(&java, VRAPI_EAT_NATIVE_GAMEPAD_EVENTS, 0);
// The app will receive onBackPressed when the back button is pressed on the controller.
// So there is no need to check for it here. Leaving code commented out for reference
// in the case that the back button stops working again due to Oculus Mobile API change.
// controller->SetButtonState(0, ControllerDelegate::BUTTON_APP, -1, backPressed, backPressed);

const float trackpadX = controllerState.TrackpadPosition.x / (float)controllerCapabilities.TrackpadMaxX;
const float trackpadY = controllerState.TrackpadPosition.y / (float)controllerCapabilities.TrackpadMaxY;
float scrollX = trackpadX;
float scrollY = trackpadY;
if (trackpadTouched && !trackpadPressed) {
controller->SetTouchPosition(0, scrollX, scrollY);
const int32_t kNumAxes = 2;
bool triggerPressed, triggerTouched = false;
bool trackpadPressed, trackpadTouched = false;
float axes[kNumAxes];
float trackpadX, trackpadY = 0.0f;
if (deviceType >= VRAPI_DEVICE_TYPE_OCULUSQUEST_START &&
deviceType <= VRAPI_DEVICE_TYPE_OCULUSQUEST_END) {
triggerPressed = (controllerState.Buttons & ovrButton_Trigger) != 0;
triggerTouched = (controllerState.Touches & ovrTouch_IndexTrigger) != 0;
trackpadPressed = (controllerState.Buttons & ovrButton_Joystick) != 0;
trackpadTouched = (controllerState.Touches & ovrTouch_Joystick) != 0;

controller->SetButtonState(0, ControllerDelegate::BUTTON_APP, -1, controllerState.Buttons & ovrButton_B,
controllerState.Touches & ovrTouch_B);
trackpadX = controllerState.Joystick.x;
trackpadY = controllerState.Joystick.y;
axes[0] = trackpadX;
axes[1] = trackpadY;
controller->SetScrolledDelta(0, trackpadX, trackpadY);
} else {
controller->SetTouchPosition(0, scrollX, scrollY);
controller->EndTouch(0);
triggerPressed = (controllerState.Buttons & ovrButton_A) != 0;
triggerTouched = triggerPressed;
trackpadPressed = (controllerState.Buttons & ovrButton_Enter) != 0;
trackpadTouched = (bool) controllerState.TrackpadStatus;

// For Oculus Go, by setting vrapi_SetPropertyInt(&java, VRAPI_EAT_NATIVE_GAMEPAD_EVENTS, 0);
// The app will receive onBackPressed when the back button is pressed on the controller.
// So there is no need to check for it here. Leaving code commented out for reference
// in the case that the back button stops working again due to Oculus Mobile API change.
// const bool backPressed = (controllerState.Buttons & ovrButton_Back) != 0;
// controller->SetButtonState(0, ControllerDelegate::BUTTON_APP, -1, backPressed, backPressed);
trackpadX = controllerState.TrackpadPosition.x / (float)controllerCapabilities.TrackpadMaxX;
trackpadY = controllerState.TrackpadPosition.y / (float)controllerCapabilities.TrackpadMaxY;

if (trackpadTouched && !trackpadPressed) {
controller->SetTouchPosition(0, trackpadX, trackpadY);
} else {
controller->SetTouchPosition(0, trackpadX, trackpadY);
controller->EndTouch(0);
}
axes[0] = trackpadTouched ? trackpadX * 2.0f - 1.0f : 0.0f;
axes[1] = trackpadTouched ? trackpadY * 2.0f - 1.0f : 0.0f;
}
controller->SetButtonState(0, ControllerDelegate::BUTTON_TRIGGER, 1, triggerPressed, triggerTouched);
controller->SetButtonState(0, ControllerDelegate::BUTTON_TOUCHPAD, 0, trackpadPressed, trackpadTouched);

const int32_t kNumAxes = 2;
float axes[kNumAxes] = { trackpadTouched ? trackpadX * 2.0f - 1.0f : 0.0f,
trackpadTouched ? trackpadY * 2.0f - 1.0f : 0.0f };
controller->SetAxes(0, axes, kNumAxes);
}

Expand Down Expand Up @@ -797,8 +813,15 @@ DeviceDelegateOculusVR::SetClipPlanes(const float aNear, const float aFar) {
void
DeviceDelegateOculusVR::SetControllerDelegate(ControllerDelegatePtr& aController) {
m.controller = aController;
m.controller->CreateController(0, 0, "Gear VR Controller");
m.controller->SetButtonCount(0, 2);
if (m.controllerCapabilities & ovrControllerCaps_ModelOculusTouch) {
m.controller->CreateController(0, 0, "Oculus Touch Controller");
m.controller->SetButtonCount(0, 6);

// Todo: Getting multiple controllers support.
} else {
m.controller->CreateController(0, 0, "Gear VR Controller");
m.controller->SetButtonCount(0, 2);
}
}

void
Expand Down

0 comments on commit 0a9db56

Please sign in to comment.