don't make cursor active on any layer other than error message if error is showing

This commit is contained in:
amwatson 2024-02-11 23:57:52 -06:00
parent 48a77ac30a
commit 611fc9acef
2 changed files with 97 additions and 95 deletions

View file

@ -254,29 +254,29 @@ void UILayer::Shutdown() {
}
int UILayer::CreateSwapchain() {
{
AndroidWindowBounds viewBounds;
if (mEnv->ExceptionCheck()) { mEnv->ExceptionClear(); }
const jint ret =
mEnv->CallIntMethod(mVrUILayerObject, mGetBoundsMethodID, BoundsHandle(&viewBounds).l);
// Check for exceptions (and log them).
if (mEnv->ExceptionCheck()) {
mEnv->ExceptionDescribe();
mEnv->ExceptionClear();
FAIL("Exception in getBoundsForView()");
{
AndroidWindowBounds viewBounds;
if (mEnv->ExceptionCheck()) { mEnv->ExceptionClear(); }
const jint ret =
mEnv->CallIntMethod(mVrUILayerObject, mGetBoundsMethodID, BoundsHandle(&viewBounds).l);
// Check for exceptions (and log them).
if (mEnv->ExceptionCheck()) {
mEnv->ExceptionDescribe();
mEnv->ExceptionClear();
FAIL("Exception in getBoundsForView()");
}
if (ret < 0) {
ALOGE("{}() returned error {}", __FUNCTION__, ret);
return -1;
}
if (viewBounds.Width() == 0 || viewBounds.Height() == 0) {
ALOGE("{}() returned invalid bounds {} x {}", __FUNCTION__, viewBounds.Width(),
viewBounds.Height());
return -2;
}
mSwapchain.mWidth = viewBounds.Width();
mSwapchain.mHeight = viewBounds.Height();
}
if (ret < 0) {
ALOGE("{}() returned error {}", __FUNCTION__, ret);
return -1;
}
if (viewBounds.Width() == 0 || viewBounds.Height() == 0) {
ALOGE("{}() returned invalid bounds {} x {}", __FUNCTION__, viewBounds.Width(),
viewBounds.Height());
return -2;
}
mSwapchain.mWidth = viewBounds.Width();
mSwapchain.mHeight = viewBounds.Height();
}
// Initialize swapchain.
{
XrSwapchainCreateInfo swapchainCreateInfo;
@ -287,7 +287,7 @@ int UILayer::CreateSwapchain() {
XR_SWAPCHAIN_USAGE_SAMPLED_BIT | XR_SWAPCHAIN_USAGE_COLOR_ATTACHMENT_BIT;
swapchainCreateInfo.format = 0;
swapchainCreateInfo.sampleCount = 0;
swapchainCreateInfo.width = mSwapchain.mWidth;
swapchainCreateInfo.width = mSwapchain.mWidth;
swapchainCreateInfo.height = mSwapchain.mHeight;
swapchainCreateInfo.faceCount = 0;
swapchainCreateInfo.arraySize = 0;
@ -308,8 +308,8 @@ int UILayer::CreateSwapchain() {
ALOGD("UILayer: created swapchain {}x{}", mSwapchain.mWidth, mSwapchain.mHeight);
mEnv->CallIntMethod(mVrUILayerObject, mSetSurfaceMethodId, mSurface,
(int)mSwapchain.mWidth, (int)mSwapchain.mHeight);
mEnv->CallIntMethod(mVrUILayerObject, mSetSurfaceMethodId, mSurface, (int)mSwapchain.mWidth,
(int)mSwapchain.mHeight);
if (mEnv->ExceptionCheck()) {
mEnv->ExceptionDescribe();
mEnv->ExceptionClear();

View file

@ -539,80 +539,82 @@ private:
mErrorMessageLayer->SendClickToUI(cursorPos2d,
triggerState.currentState);
}
} else if (mIsKeyboardActive) {
shouldRenderCursor = mKeyboardLayer->GetRayIntersectionWithPanel(
start, end, cursorPos2d, cursorPose3d);
if (triggerState.changedSinceLastSync) {
mKeyboardLayer->SendClickToUI(cursorPos2d,
triggerState.currentState);
}
} else {
shouldRenderCursor = mGameSurfaceLayer->GetRayIntersectionWithPanel(
start, end, cursorPos2d, cursorPose3d);
ALOG_INPUT_VERBOSE("Cursor 2D coords: {} {}", cursorPos2d.x,
cursorPos2d.y);
if (triggerState.currentState == 0 &&
triggerState.changedSinceLastSync) {
jni->CallVoidMethod(mActivityObject, mSendClickToWindowMethodID,
cursorPos2d.x, cursorPos2d.y, 0);
} else if (triggerState.changedSinceLastSync &&
triggerState.currentState == 1) {
jni->CallVoidMethod(mActivityObject, mSendClickToWindowMethodID,
cursorPos2d.x, cursorPos2d.y, 1);
} else if (triggerState.currentState == 1 &&
!triggerState.changedSinceLastSync) {
jni->CallVoidMethod(mActivityObject, mSendClickToWindowMethodID,
cursorPos2d.x, cursorPos2d.y, 2);
}
if (!shouldRenderCursor) {
// Handling this here means L2/R2 are liable to
// be slightly out of sync with the other
// buttons (which are handled before
// WaitFrame()). We'll see if that ends up being
// a problem for any games.
ForwardButtonStateIfNeeded(
jni, mActivityObject, mForwardVRInputMethodID,
104 /* BUTTON_L2 */,
mInputStateFrame
.mIndexTriggerState[InputStateFrame::LEFT_CONTROLLER],
"l2");
ForwardButtonStateIfNeeded(
jni, mActivityObject, mForwardVRInputMethodID,
105 /* BUTTON_R2 */,
mInputStateFrame
.mIndexTriggerState[InputStateFrame::RIGHT_CONTROLLER],
"r2");
}
}
// Hit test the top panel
if (!shouldRenderCursor) {
shouldRenderCursor =
mGameSurfaceLayer->GetRayIntersectionWithPanelTopPanel(
} else { // Don't test for cursor intersection if error message is shown
if (mIsKeyboardActive) {
shouldRenderCursor = mKeyboardLayer->GetRayIntersectionWithPanel(
start, end, cursorPos2d, cursorPose3d);
// If top panel is hit, trigger controls the
// position/rotation
if (shouldRenderCursor && triggerState.currentState) {
// null out X component -- screen should stay
// center
mGameSurfaceLayer->SetTopPanelFromController(XrVector3f{
0, cursorPose3d.position.y, cursorPose3d.position.z});
// If trigger is pressed, thumbstick controls
// the depth
const XrActionStateVector2f& thumbstickState =
mInputStateFrame
.mThumbStickState[mInputStateFrame.mPreferredHand];
if (triggerState.changedSinceLastSync) {
mKeyboardLayer->SendClickToUI(cursorPos2d,
triggerState.currentState);
}
} else {
shouldRenderCursor = mGameSurfaceLayer->GetRayIntersectionWithPanel(
start, end, cursorPos2d, cursorPose3d);
ALOG_INPUT_VERBOSE("Cursor 2D coords: {} {}", cursorPos2d.x,
cursorPos2d.y);
if (triggerState.currentState == 0 &&
triggerState.changedSinceLastSync) {
jni->CallVoidMethod(mActivityObject, mSendClickToWindowMethodID,
cursorPos2d.x, cursorPos2d.y, 0);
} else if (triggerState.changedSinceLastSync &&
triggerState.currentState == 1) {
jni->CallVoidMethod(mActivityObject, mSendClickToWindowMethodID,
cursorPos2d.x, cursorPos2d.y, 1);
} else if (triggerState.currentState == 1 &&
!triggerState.changedSinceLastSync) {
static constexpr float kThumbStickDirectionThreshold = 0.5f;
if (std::abs(thumbstickState.currentState.y) >
kThumbStickDirectionThreshold) {
mGameSurfaceLayer->SetTopPanelFromThumbstick(
thumbstickState.currentState.y);
jni->CallVoidMethod(mActivityObject, mSendClickToWindowMethodID,
cursorPos2d.x, cursorPos2d.y, 2);
}
if (!shouldRenderCursor) {
// Handling this here means L2/R2 are liable to
// be slightly out of sync with the other
// buttons (which are handled before
// WaitFrame()). We'll see if that ends up being
// a problem for any games.
ForwardButtonStateIfNeeded(
jni, mActivityObject, mForwardVRInputMethodID,
104 /* BUTTON_L2 */,
mInputStateFrame
.mIndexTriggerState[InputStateFrame::LEFT_CONTROLLER],
"l2");
ForwardButtonStateIfNeeded(
jni, mActivityObject, mForwardVRInputMethodID,
105 /* BUTTON_R2 */,
mInputStateFrame
.mIndexTriggerState[InputStateFrame::RIGHT_CONTROLLER],
"r2");
}
}
if (shouldRenderCursor) {
cursorType = CursorLayer::CursorType::CURSOR_TYPE_TOP_PANEL;
// Hit test the top panel
if (!shouldRenderCursor) {
shouldRenderCursor =
mGameSurfaceLayer->GetRayIntersectionWithPanelTopPanel(
start, end, cursorPos2d, cursorPose3d);
// If top panel is hit, trigger controls the
// position/rotation
if (shouldRenderCursor && triggerState.currentState) {
// null out X component -- screen should stay
// center
mGameSurfaceLayer->SetTopPanelFromController(XrVector3f{
0, cursorPose3d.position.y, cursorPose3d.position.z});
// If trigger is pressed, thumbstick controls
// the depth
const XrActionStateVector2f& thumbstickState =
mInputStateFrame
.mThumbStickState[mInputStateFrame.mPreferredHand];
static constexpr float kThumbStickDirectionThreshold = 0.5f;
if (std::abs(thumbstickState.currentState.y) >
kThumbStickDirectionThreshold) {
mGameSurfaceLayer->SetTopPanelFromThumbstick(
thumbstickState.currentState.y);
}
}
if (shouldRenderCursor) {
cursorType = CursorLayer::CursorType::CURSOR_TYPE_TOP_PANEL;
}
}
}
// Add a scale factor so the cursor doesn't scale as