[Bf-blender-cvs] [306058f7adc] soc-2020-xr-input: Some changes to help fix the controller graphics.

Peter Klimenko noreply at git.blender.org
Fri Jul 31 12:19:02 CEST 2020


Commit: 306058f7adcd1ea8752fa036e365e1acb7ab6619
Author: Peter Klimenko
Date:   Fri Jul 31 20:18:54 2020 +1000
Branches: soc-2020-xr-input
https://developer.blender.org/rB306058f7adcd1ea8752fa036e365e1acb7ab6619

Some changes to help fix the controller graphics.

===================================================================

M	source/blender/draw/intern/draw_manager_data.c
M	source/blender/windowmanager/xr/intern/wm_xr.c
M	source/blender/windowmanager/xr/intern/wm_xr_draw.c

===================================================================

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);



More information about the Bf-blender-cvs mailing list