mirror of
https://github.com/amwatson/CitraVR.git
synced 2024-09-20 03:11:40 +02:00
don't make cursor active on any layer other than error message if error is showing
This commit is contained in:
parent
48a77ac30a
commit
611fc9acef
2 changed files with 97 additions and 95 deletions
|
@ -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();
|
||||
|
|
|
@ -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
|
||||
|
|
Loading…
Reference in a new issue