Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'source/blender/windowmanager/xr/intern/wm_xr_session.c')
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr_session.c90
1 files changed, 57 insertions, 33 deletions
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c
index 1ddbe228e05..252f358c798 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_session.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c
@@ -225,7 +225,7 @@ typedef enum wmXrSessionStateEvent {
SESSION_STATE_EVENT_NONE = 0,
SESSION_STATE_EVENT_START,
SESSION_STATE_EVENT_RESET_TO_BASE_POSE,
- SESSION_STATE_EVENT_POSITON_TRACKING_TOGGLE,
+ SESSION_STATE_EVENT_POSITION_TRACKING_TOGGLE,
} wmXrSessionStateEvent;
static bool wm_xr_session_draw_data_needs_reset_to_base_pose(const wmXrSessionState *state,
@@ -253,7 +253,7 @@ static wmXrSessionStateEvent wm_xr_session_state_to_event(const wmXrSessionState
XR_SESSION_USE_POSITION_TRACKING) !=
(settings->flag & XR_SESSION_USE_POSITION_TRACKING));
if (position_tracking_toggled) {
- return SESSION_STATE_EVENT_POSITON_TRACKING_TOGGLE;
+ return SESSION_STATE_EVENT_POSITION_TRACKING_TOGGLE;
}
return SESSION_STATE_EVENT_NONE;
@@ -288,7 +288,7 @@ void wm_xr_session_draw_data_update(const wmXrSessionState *state,
copy_v3_fl(draw_data->eye_position_ofs, 0.0f);
}
break;
- case SESSION_STATE_EVENT_POSITON_TRACKING_TOGGLE:
+ case SESSION_STATE_EVENT_POSITION_TRACKING_TOGGLE:
if (use_position_tracking) {
/* Keep the current position, and let the user move from there. */
copy_v3_v3(draw_data->eye_position_ofs, state->prev_eye_position_ofs);
@@ -317,6 +317,7 @@ void wm_xr_session_state_update(const XrSessionSettings *settings,
{
GHOST_XrPose viewer_pose;
const bool use_position_tracking = settings->flag & XR_SESSION_USE_POSITION_TRACKING;
+ const bool use_absolute_tracking = settings->flag & XR_SESSION_USE_ABSOLUTE_TRACKING;
mul_qt_qtqt(viewer_pose.orientation_quat,
draw_data->base_pose.orientation_quat,
@@ -324,14 +325,16 @@ void wm_xr_session_state_update(const XrSessionSettings *settings,
copy_v3_v3(viewer_pose.position, draw_data->base_pose.position);
/* The local pose and the eye pose (which is copied from an earlier local pose) both are view
* space, so Y-up. In this case we need them in regular Z-up. */
- viewer_pose.position[0] -= draw_data->eye_position_ofs[0];
- viewer_pose.position[1] += draw_data->eye_position_ofs[2];
- viewer_pose.position[2] -= draw_data->eye_position_ofs[1];
if (use_position_tracking) {
viewer_pose.position[0] += draw_view->local_pose.position[0];
viewer_pose.position[1] -= draw_view->local_pose.position[2];
viewer_pose.position[2] += draw_view->local_pose.position[1];
}
+ if (!use_absolute_tracking) {
+ viewer_pose.position[0] -= draw_data->eye_position_ofs[0];
+ viewer_pose.position[1] += draw_data->eye_position_ofs[2];
+ viewer_pose.position[2] -= draw_data->eye_position_ofs[1];
+ }
copy_v3_v3(state->viewer_pose.position, viewer_pose.position);
copy_qt_qt(state->viewer_pose.orientation_quat, viewer_pose.orientation_quat);
@@ -451,9 +454,14 @@ static void wm_xr_session_controller_mats_update(const XrSessionSettings *settin
float base_inv[4][4];
float tmp[4][4];
- zero_v3(view_ofs);
if ((settings->flag & XR_SESSION_USE_POSITION_TRACKING) == 0) {
- add_v3_v3(view_ofs, state->prev_local_pose.position);
+ copy_v3_v3(view_ofs, state->prev_local_pose.position);
+ }
+ else {
+ zero_v3(view_ofs);
+ }
+ if ((settings->flag & XR_SESSION_USE_ABSOLUTE_TRACKING) == 0) {
+ add_v3_v3(view_ofs, state->prev_eye_position_ofs);
}
wm_xr_pose_to_viewmat(&state->prev_base_pose, base_inv);
@@ -538,7 +546,6 @@ void wm_xr_session_controller_data_clear(wmXrSessionState *state)
*/
static void wm_xr_session_surface_draw(bContext *C)
{
- wmXrSurfaceData *surface_data = g_xr_surface->customdata;
wmWindowManager *wm = CTX_wm_manager(C);
Main *bmain = CTX_data_main(C);
wmXrDrawData draw_data;
@@ -554,38 +561,50 @@ static void wm_xr_session_surface_draw(bContext *C)
GHOST_XrSessionDrawViews(wm->xr.runtime->context, &draw_data);
- GPU_offscreen_unbind(surface_data->offscreen, false);
+ GPU_framebuffer_restore();
}
bool wm_xr_session_surface_offscreen_ensure(wmXrSurfaceData *surface_data,
const GHOST_XrDrawViewInfo *draw_view)
{
- const bool size_changed = surface_data->offscreen &&
- (GPU_offscreen_width(surface_data->offscreen) != draw_view->width) &&
- (GPU_offscreen_height(surface_data->offscreen) != draw_view->height);
+ wmXrViewportPair *vp = NULL;
+ if (draw_view->view_idx >= BLI_listbase_count(&surface_data->viewports)) {
+ vp = MEM_callocN(sizeof(*vp), __func__);
+ BLI_addtail(&surface_data->viewports, vp);
+ }
+ else {
+ vp = BLI_findlink(&surface_data->viewports, draw_view->view_idx);
+ }
+ BLI_assert(vp);
+
+ GPUOffScreen *offscreen = vp->offscreen;
+ GPUViewport *viewport = vp->viewport;
+ const bool size_changed = offscreen && (GPU_offscreen_width(offscreen) != draw_view->width) &&
+ (GPU_offscreen_height(offscreen) != draw_view->height);
char err_out[256] = "unknown";
bool failure = false;
- if (surface_data->offscreen) {
- BLI_assert(surface_data->viewport);
+ if (offscreen) {
+ BLI_assert(viewport);
if (!size_changed) {
return true;
}
- GPU_viewport_free(surface_data->viewport);
- GPU_offscreen_free(surface_data->offscreen);
- }
-
- if (!(surface_data->offscreen = GPU_offscreen_create(
- draw_view->width, draw_view->height, true, false, err_out))) {
- failure = true;
- }
-
- if (failure) {
- /* Pass. */
+ GPU_viewport_free(viewport);
+ GPU_offscreen_free(offscreen);
+ }
+
+ offscreen = vp->offscreen = GPU_offscreen_create(
+ draw_view->width, draw_view->height, true, false, err_out);
+ if (offscreen) {
+ viewport = vp->viewport = GPU_viewport_create();
+ if (!viewport) {
+ GPU_offscreen_free(offscreen);
+ offscreen = vp->offscreen = NULL;
+ failure = true;
+ }
}
- else if (!(surface_data->viewport = GPU_viewport_create())) {
- GPU_offscreen_free(surface_data->offscreen);
+ else {
failure = true;
}
@@ -600,12 +619,17 @@ bool wm_xr_session_surface_offscreen_ensure(wmXrSurfaceData *surface_data,
static void wm_xr_session_surface_free_data(wmSurface *surface)
{
wmXrSurfaceData *data = surface->customdata;
+ ListBase *lb = &data->viewports;
+ wmXrViewportPair *vp;
- if (data->viewport) {
- GPU_viewport_free(data->viewport);
- }
- if (data->offscreen) {
- GPU_offscreen_free(data->offscreen);
+ while ((vp = BLI_pophead(lb))) {
+ if (vp->viewport) {
+ GPU_viewport_free(vp->viewport);
+ }
+ if (vp->offscreen) {
+ GPU_offscreen_free(vp->offscreen);
+ }
+ BLI_freelinkN(lb, vp);
}
MEM_freeN(surface->customdata);