diff options
author | Peter Kim <pk15950@gmail.com> | 2021-10-05 09:55:57 +0300 |
---|---|---|
committer | Peter Kim <pk15950@gmail.com> | 2021-10-05 10:05:12 +0300 |
commit | 08511b1c3de0338314940397083adaba4e9cf492 (patch) | |
tree | 879ddffecd08dd9315847fdcffb0b2d76cee8637 /source/blender/windowmanager/xr/intern/wm_xr_session.c | |
parent | 300403a38b8ed7f0f84125ca9a82264757ae704a (diff) |
XR: Add runtime window area for XR events
This adds an offscreen View3D window area for the VR view in order to
execute XR events/operators in the proper context. The area is created
as runtime data before XR events are dispatched and set as the active
area during XR event handling.
Since the area is runtime-only, it will not be saved in files and since
the area is offscreen, it will not interfere with regular window areas.
The area is removed with the rest of the XR runtime data on exit, file
read, or when stopping the VR session.
Note: This also adds internal types (EVT_DATA_XR, EVT_XR_ACTION) and
structs (wmXrActionData) for XR events.
Reviewed By: Severin
Differential Revision: https://developer.blender.org/D12472
Diffstat (limited to 'source/blender/windowmanager/xr/intern/wm_xr_session.c')
-rw-r--r-- | source/blender/windowmanager/xr/intern/wm_xr_session.c | 35 |
1 files changed, 29 insertions, 6 deletions
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c index 88bf3ff453c..1e8cda30121 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_session.c +++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c @@ -30,9 +30,12 @@ #include "DEG_depsgraph.h" #include "DNA_camera_types.h" +#include "DNA_space_types.h" #include "DRW_engine.h" +#include "ED_screen.h" + #include "GHOST_C-api.h" #include "GPU_viewport.h" @@ -111,6 +114,7 @@ void wm_xr_session_toggle(wmWindowManager *wm, if (WM_xr_session_exists(xr_data)) { GHOST_XrSessionEnd(xr_data->runtime->context); + xr_data->runtime->session_state.is_started = false; } else { GHOST_XrSessionBeginInfo begin_info; @@ -197,8 +201,8 @@ static void wm_xr_session_draw_data_populate(wmXrData *xr_data, wm_xr_session_base_pose_calc(r_draw_data->scene, settings, &r_draw_data->base_pose); } -static wmWindow *wm_xr_session_root_window_or_fallback_get(const wmWindowManager *wm, - const wmXrRuntimeData *runtime_data) +wmWindow *wm_xr_session_root_window_or_fallback_get(const wmWindowManager *wm, + const wmXrRuntimeData *runtime_data) { if (runtime_data->session_root_win && BLI_findindex(&wm->windows, runtime_data->session_root_win) != -1) { @@ -373,6 +377,11 @@ wmXrSessionState *WM_xr_session_state_handle_get(const wmXrData *xr) return xr->runtime ? &xr->runtime->session_state : NULL; } +ScrArea *WM_xr_session_area_get(const wmXrData *xr) +{ + return xr->runtime ? xr->runtime->area : NULL; +} + bool WM_xr_session_state_viewer_pose_location_get(const wmXrData *xr, float r_location[3]) { if (!WM_xr_session_is_ready(xr) || !xr->runtime->session_state.is_view_data_set) { @@ -550,8 +559,9 @@ static void wm_xr_session_controller_data_update(const XrSessionSettings *settin } } -void wm_xr_session_actions_update(wmXrData *xr) +void wm_xr_session_actions_update(wmWindowManager *wm) { + wmXrData *xr = &wm->xr; if (!xr->runtime) { return; } @@ -565,14 +575,27 @@ void wm_xr_session_actions_update(wmXrData *xr) return; } - /* Only update controller data for active action set. */ + /* Only update controller data and dispatch events for active action set. */ if (active_action_set) { + const XrSessionSettings *settings = &xr->session_settings; + wmWindow *win = wm_xr_session_root_window_or_fallback_get(wm, xr->runtime); + if (active_action_set->controller_grip_action && active_action_set->controller_aim_action) { - wm_xr_session_controller_data_update(&xr->session_settings, + wm_xr_session_controller_data_update(settings, active_action_set->controller_grip_action, active_action_set->controller_aim_action, state); } + + if (win) { + /* Ensure an XR area exists for events. */ + if (!xr->runtime->area) { + xr->runtime->area = ED_area_offscreen_create(wm, win, SPACE_VIEW3D); + } + + /* Implemented in D10944. */ + // wm_xr_session_events_dispatch(xr, settings, xr_context, active_action_set, state, win); + } } } @@ -628,7 +651,7 @@ static void wm_xr_session_surface_draw(bContext *C) Main *bmain = CTX_data_main(C); wmXrDrawData draw_data; - if (!GHOST_XrSessionIsRunning(wm->xr.runtime->context)) { + if (!WM_xr_session_is_ready(&wm->xr)) { return; } |