Drive the engine's mouse cursor from the VR aim ray on the game quad
build / build (push) Successful in 1m44s
build / build (push) Successful in 1m44s
The game quad's laser beam was purely visual - aiming at the game's own UI (inventory, menus, dialogs) had no way to interact with it. Add a real mouse pointer: absolute cursor position plus a single left click, mirroring a plain point-and-click mouse (no mouselook, no right-click, no drag). New xr_mouse.c/h bridges the aim-ray hit-test to the vendored engine's own public mouse API - mouse_put_xy() for position, a synthetic SDL_MOUSEBUTTONDOWN/UP (SDL_BUTTON_LEFT) via SDL_PushEvent for clicks, the same technique nativeSendPrintableChar() already uses for synthetic keyboard input. No engine patch needed. Deliberately bypasses SDLActivity.onNativeMouse()/SDL_MOUSEMOTION/SetMouseXY(), whose physical-window-size scaling is unreliable in this headless immersive build. xr_input_try_game_quad() now reports the hit u,v; a new g_game_touch_active[] tracks a held click on the game quad so it survives the ray straying onto the keyboard/menu before release, gating those overlays' claims the same way pending overlay touches already do.
This commit is contained in:
@@ -0,0 +1,35 @@
|
||||
// Bridges VR aim-ray hit-testing (xr_input.c) to the vendored engine's
|
||||
// mouse input (engine/src/Libraries/INPUT/Source/mouse.h) - lets the
|
||||
// controller's laser pointer drive the game's own UI (inventory, menus,
|
||||
// dialogs) exactly like a desktop mouse: absolute cursor position plus a
|
||||
// single left button, no relative/mouselook mode, no right button.
|
||||
#ifndef QUESTSHOCK_XR_MOUSE_H
|
||||
#define QUESTSHOCK_XR_MOUSE_H
|
||||
|
||||
#include <stdbool.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
// Sets the engine's absolute mouse position (mouse_put_xy()) - call every
|
||||
// frame the aim ray is actually hitting the game quad; x/y are pixel
|
||||
// coordinates in the game's own logical resolution (see
|
||||
// xr_get_game_resolution() in xr_session.h), already clamped by the
|
||||
// caller. Do not call on frames the ray isn't hitting the game quad - the
|
||||
// cursor should hold its last position, not snap elsewhere.
|
||||
void xr_mouse_move(int x, int y);
|
||||
|
||||
// Pushes a synthetic SDL_MOUSEBUTTONDOWN/UP (SDL_BUTTON_LEFT) - matches
|
||||
// KeyboardOverlay's nativeSendPrintableChar() in questshock_native.c: a
|
||||
// plain SDL_Event built by hand and handed to the public SDL_PushEvent(),
|
||||
// no engine patch needed. pump_events() (sdl_events.c) reads whatever
|
||||
// mouse_put_xy() last set, not any x/y carried on the event itself - call
|
||||
// xr_mouse_move() first if position needs updating this frame.
|
||||
void xr_mouse_click(bool down);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Reference in New Issue
Block a user