diff options
author | Peter Klimenko <peterklimk@outlook.com> | 2020-07-31 13:18:54 +0300 |
---|---|---|
committer | Peter Klimenko <peterklimk@outlook.com> | 2020-07-31 13:18:54 +0300 |
commit | 306058f7adcd1ea8752fa036e365e1acb7ab6619 (patch) | |
tree | 06b4a2b632ec28c29b5f0f3cd3b9d45cf0f570e2 /source | |
parent | 97a4a8d0fb7fd9ac34f9f5d4d5a0689c01235e14 (diff) |
Some changes to help fix the controller graphics.
Diffstat (limited to 'source')
-rw-r--r-- | source/blender/draw/intern/draw_manager_data.c | 2 | ||||
-rw-r--r-- | source/blender/windowmanager/xr/intern/wm_xr.c | 6 | ||||
-rw-r--r-- | source/blender/windowmanager/xr/intern/wm_xr_draw.c | 42 |
3 files changed, 36 insertions, 14 deletions
diff --git a/source/blender/draw/intern/draw_manager_data.c b/source/blender/draw/intern/draw_manager_data.c index 3184d6155d2..60376c56fd1 100644 --- a/source/blender/draw/intern/draw_manager_data.c +++ b/source/blender/draw/intern/draw_manager_data.c @@ -1544,6 +1544,8 @@ static void draw_frustum_bound_sphere_calc(const BoundBox *bbox, /* just use median point */ mid_v3_v3v3(bsphere->center, farpoint, nearpoint); + + mul_m4_v3(viewinv, farpoint); bsphere->radius = len_v3v3(bsphere->center, farpoint); } else if (projmat[2][0] == 0.0f && projmat[2][1] == 0.0f) { diff --git a/source/blender/windowmanager/xr/intern/wm_xr.c b/source/blender/windowmanager/xr/intern/wm_xr.c index 90f30809136..36ced62660a 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr.c +++ b/source/blender/windowmanager/xr/intern/wm_xr.c @@ -105,6 +105,12 @@ bool wm_xr_init(wmWindowManager *wm) if (!wm->xr.runtime) { wm->xr.runtime = wm_xr_runtime_data_create(); wm->xr.runtime->context = context; + + unit_qt(wm->xr.runtime->session_state.world_pose.orientation_quat); + wm->xr.runtime->session_state.world_pose.position[0] = 0.f; + wm->xr.runtime->session_state.world_pose.position[1] = 0.f; + wm->xr.runtime->session_state.world_pose.position[2] = 0.f; + wm->xr.runtime->session_state.world_scale = 1.f; } } BLI_assert(wm->xr.runtime && wm->xr.runtime->context); diff --git a/source/blender/windowmanager/xr/intern/wm_xr_draw.c b/source/blender/windowmanager/xr/intern/wm_xr_draw.c index df8ea4447ac..b1c59cb41be 100644 --- a/source/blender/windowmanager/xr/intern/wm_xr_draw.c +++ b/source/blender/windowmanager/xr/intern/wm_xr_draw.c @@ -40,7 +40,7 @@ #include "wm_surface.h" #include "wm_xr_intern.h" -void wm_xr_pose_to_viewmat(const GHOST_XrPose *pose, float r_viewmat[4][4]) +void wm_xr_pose_to_viewmat(float r_viewmat[4][4], const GHOST_XrPose *pose) { float iquat[4]; invert_qt_qt_normalized(iquat, pose->orientation_quat); @@ -51,6 +51,7 @@ void wm_xr_pose_to_viewmat(const GHOST_XrPose *pose, float r_viewmat[4][4]) static void wm_xr_draw_matrices_create(const wmXrDrawData *draw_data, const GHOST_XrDrawViewInfo *draw_view, const XrSessionSettings *session_settings, + float scale, float r_view_mat[4][4], float r_proj_mat[4][4]) { @@ -68,15 +69,15 @@ static void wm_xr_draw_matrices_create(const wmXrDrawData *draw_data, draw_view->fov.angle_right, draw_view->fov.angle_up, draw_view->fov.angle_down, - session_settings->clip_start, - session_settings->clip_end); + session_settings->clip_start * scale, + session_settings->clip_end * scale); float eye_mat[4][4]; float base_mat[4][4]; - wm_xr_pose_to_viewmat(&eye_pose, eye_mat); + wm_xr_pose_to_viewmat(eye_mat, &eye_pose); /* Calculate the base pose matrix (in world space!). */ - wm_xr_pose_to_viewmat(&draw_data->base_pose, base_mat); + wm_xr_pose_to_viewmat(base_mat, &draw_data->base_pose); mul_m4_m4m4(r_view_mat, eye_mat, base_mat); } @@ -98,6 +99,16 @@ static void wm_xr_draw_viewport_buffers_to_active_framebuffer( GPU_viewport_draw_to_screen_ex(surface_data->viewport, 0, &rect, draw_view->expects_srgb_buffer); } +void apply_world_transform(float viewmat[4][4], GHOST_XrPose world_pose, float scale) +{ + float world[4][4]; + float scalev[3] = {scale, scale, scale}; + + loc_quat_size_to_mat4(world, world_pose.position, world_pose.orientation_quat, scalev); + + mul_m4_m4m4(viewmat, viewmat, world); +} + /** * \brief Draw a viewport for a single eye. * @@ -119,8 +130,13 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata) BLI_assert(WM_xr_session_is_ready(xr_data)); wm_xr_session_draw_data_update(session_state, settings, draw_view, draw_data); - wm_xr_draw_matrices_create(draw_data, draw_view, settings, viewmat, winmat); - wm_xr_session_state_update(settings, draw_data, draw_view, session_state); + wm_xr_draw_matrices_create( + wm_xr_session_state_update(settings, draw_data, draw_view, session_state); + draw_data, draw_view, settings, session_state->world_scale, viewmat, winmat); + + apply_world_transform(viewmat, session_state->world_pose, session_state->world_scale); + + wm_xr_session_state_update(settings, draw_data, draw_view, session_state, viewmat); if (!wm_xr_session_surface_offscreen_ensure(surface_data, draw_view)) { return; @@ -141,8 +157,8 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata) display_flags, viewmat, winmat, - settings->clip_start, - settings->clip_end, + settings->clip_start * session_state->world_scale, + settings->clip_end * session_state->world_scale, false, true, true, @@ -179,10 +195,8 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata) immBegin(GPU_PRIM_LINES, 2); immVertex3f(pos, leftPose.position[0], leftPose.position[1], leftPose.position[2]); - immVertex3f(pos, - leftPose.position[0] + 5.0f, - leftPose.position[1] + 5.0f, - leftPose.position[2] + 5.0f); + immVertex3f( + pos, leftPose.position[0] + 5.0f, leftPose.position[1] + 5.0f, leftPose.position[2] + 5.0f); immEnd(); @@ -195,7 +209,7 @@ void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata) rightPose.position[2] + 5.0f); immEnd(); - + immUnbindProgram(); GPU_blend(false); |