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
path: root/source
diff options
context:
space:
mode:
authorPeter Klimenko <peterklimk@outlook.com>2020-07-31 13:18:54 +0300
committerPeter Klimenko <peterklimk@outlook.com>2020-07-31 13:18:54 +0300
commit306058f7adcd1ea8752fa036e365e1acb7ab6619 (patch)
tree06b4a2b632ec28c29b5f0f3cd3b9d45cf0f570e2 /source
parent97a4a8d0fb7fd9ac34f9f5d4d5a0689c01235e14 (diff)
Some changes to help fix the controller graphics.
Diffstat (limited to 'source')
-rw-r--r--source/blender/draw/intern/draw_manager_data.c2
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr.c6
-rw-r--r--source/blender/windowmanager/xr/intern/wm_xr_draw.c42
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);