[Bf-blender-cvs] [1ef02d8f4b2] xr-controller-support: Update with changes from D10948, D12472

Peter Kim noreply at git.blender.org
Thu Sep 23 04:42:10 CEST 2021


Commit: 1ef02d8f4b2a40884170c98cc78bebc28de77259
Author: Peter Kim
Date:   Wed Sep 22 19:16:52 2021 -0700
Branches: xr-controller-support
https://developer.blender.org/rB1ef02d8f4b2a40884170c98cc78bebc28de77259

Update with changes from D10948, D12472

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

M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/xr/intern/wm_xr_draw.c
M	source/blender/windowmanager/xr/intern/wm_xr_operators.c
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

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

diff --git a/source/blender/windowmanager/intern/wm_event_system.c b/source/blender/windowmanager/intern/wm_event_system.c
index 4c5df150818..05eaeae5a7c 100644
--- a/source/blender/windowmanager/intern/wm_event_system.c
+++ b/source/blender/windowmanager/intern/wm_event_system.c
@@ -3280,23 +3280,12 @@ static void wm_event_free_and_remove_from_queue_if_valid(wmEvent *event)
  * \{ */
 
 #ifdef WITH_XR_OPENXR
-static int wm_event_handle_xrevent(
+static void wm_event_handle_xrevent(
     bContext *C, wmWindowManager *wm, wmWindow *win, bScreen *screen, wmEvent *event)
 {
-  BLI_assert(event->val == KM_PRESS || event->val == KM_RELEASE);
-
   int action = 0;
 
-  if (event->val == KM_RELEASE) {
-    wmXrActionData *actiondata = event->customdata;
-    if (actiondata->ot->modal || actiondata->ot->modal_3d) {
-      /* Don't execute modal operators on release. */
-      action |= WM_HANDLER_BREAK;
-      return action;
-    }
-  }
-
-  /* Find a valid region for executing XR operators. */
+  /* Find a valid region for XR operator execution and modal handling. */
   ED_screen_areas_iter (win, screen, area) {
     CTX_wm_area_set(C, area);
     if (!CTX_wm_view3d(C)) {
@@ -3309,31 +3298,39 @@ static int wm_event_handle_xrevent(
       }
       CTX_wm_region_set(C, region);
 
-      wmXrActionData *actiondata = event->customdata;
-      PointerRNA properties = {.type = actiondata->ot->srna, .data = actiondata->op_properties};
+      action |= wm_handlers_do(C, event, &win->modalhandlers);
 
-      if (actiondata->ot->invoke || actiondata->ot->invoke_3d) {
-        /* Invoke operator, either executing operator or transferring responsibility to window
-         * modal handlers. */
-        wm_operator_invoke(C,
-                           actiondata->ot,
-                           event,
-                           actiondata->op_properties ? &properties : NULL,
-                           NULL,
-                           false,
-                           false);
-      }
-      else {
-        /* Execute operator. */
-        wmOperator *op = wm_operator_create(
-            wm, actiondata->ot, actiondata->op_properties ? &properties : NULL, NULL);
-        if ((WM_operator_call(C, op) & OPERATOR_HANDLED) == 0) {
-          WM_operator_free(op);
+      if ((action & WM_HANDLER_BREAK) == 0) {
+        wmXrActionData *actiondata = event->customdata;
+        if ((actiondata->ot->modal || actiondata->ot->modal_3d) && event->val == KM_RELEASE) {
+          /* Don't execute modal operators on release. */
+        }
+        else {
+          PointerRNA properties = {.type = actiondata->ot->srna,
+                                   .data = actiondata->op_properties};
+          if (actiondata->ot->invoke || actiondata->ot->invoke_3d) {
+            /* Invoke operator, either executing operator or transferring responsibility to window
+             * modal handlers. */
+            wm_operator_invoke(C,
+                               actiondata->ot,
+                               event,
+                               actiondata->op_properties ? &properties : NULL,
+                               NULL,
+                               false,
+                               false);
+          }
+          else {
+            /* Execute operator. */
+            wmOperator *op = wm_operator_create(
+                wm, actiondata->ot, actiondata->op_properties ? &properties : NULL, NULL);
+            if ((WM_operator_call(C, op) & OPERATOR_HANDLED) == 0) {
+              WM_operator_free(op);
+            }
+          }
         }
+        action |= WM_HANDLER_BREAK;
       }
 
-      action |= WM_HANDLER_BREAK;
-
       CTX_wm_region_set(C, NULL);
       break;
     }
@@ -3344,8 +3341,6 @@ static int wm_event_handle_xrevent(
   }
 
   CTX_wm_area_set(C, NULL);
-
-  return action;
 }
 #endif /* WITH_XR_OPENXR */
 
@@ -3446,6 +3441,16 @@ void wm_event_do_handlers(bContext *C)
 
       CTX_wm_window_set(C, win);
 
+#ifdef WITH_XR_OPENXR
+      if (event->type == EVT_XR_ACTION) {
+        wm_event_handle_xrevent(C, wm, win, screen, event);
+        BLI_remlink(&win->event_queue, event);
+        wm_event_free(event);
+        /* Skip mouse event handling below, which is unnecessary for XR events. */
+        continue;
+      }
+#endif
+
       /* Clear tool-tip on mouse move. */
       if (screen->tool_tip && screen->tool_tip->exit_on_event) {
         if (ELEM(event->type, MOUSEMOVE, INBETWEEN_MOUSEMOVE)) {
@@ -3503,17 +3508,6 @@ void wm_event_do_handlers(bContext *C)
           win->addmousemove = true;
         }
 #endif
-#ifdef WITH_XR_OPENXR
-        else if (event->type == EVT_XR_ACTION) {
-          action |= wm_event_handle_xrevent(C, wm, win, screen, event);
-          if (action & WM_HANDLER_BREAK) {
-            BLI_remlink(&win->event_queue, event);
-            wm_event_free(event);
-          }
-          /* Skip mouse event handling below, which is unnecessary for XR events. */
-          continue;
-        }
-#endif
 
         ED_screen_areas_iter (win, screen, area) {
           /* After restoring a screen from SCREENMAXIMIZED we have to wait
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_draw.c b/source/blender/windowmanager/xr/intern/wm_xr_draw.c
index 0f0806754e8..bbbf7a16c9f 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_draw.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_draw.c
@@ -331,7 +331,8 @@ void wm_xr_draw_controllers(const bContext *UNUSED(C), ARegion *UNUSED(region),
 
     GPUVertFormat *format = immVertexFormat();
     uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-    uint col = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+    uint col = GPU_vertformat_attr_add(
+        format, "color", GPU_COMP_U8, 4, GPU_FETCH_INT_TO_FLOAT_UNIT);
     immBindBuiltinProgram(GPU_SHADER_3D_POLYLINE_FLAT_COLOR);
 
     float viewport[4];
@@ -341,7 +342,7 @@ void wm_xr_draw_controllers(const bContext *UNUSED(C), ARegion *UNUSED(region),
     immUniform1f("lineWidth", 3.0f * U.pixelsize);
 
     if (draw_ray) {
-      const float color[4] = {0.35f, 0.35f, 1.0f, 0.5f};
+      const uchar color[4] = {89, 89, 255, 127};
       const float scale = settings->clip_end;
       float ray[3];
 
@@ -349,22 +350,23 @@ void wm_xr_draw_controllers(const bContext *UNUSED(C), ARegion *UNUSED(region),
       GPU_blend(GPU_BLEND_ALPHA);
 
       immBegin(GPU_PRIM_LINES, (uint)BLI_listbase_count(&state->controllers) * 2);
-      immAttr4fv(col, color);
 
       LISTBASE_FOREACH (wmXrController *, controller, &state->controllers) {
         const float(*mat)[4] = controller->aim_mat;
         madd_v3_v3v3fl(ray, mat[3], mat[2], -scale);
 
+        immAttrSkip(col);
         immVertex3fv(pos, mat[3]);
+        immAttr4ubv(col, color);
         immVertex3fv(pos, ray);
       }
 
       immEnd();
     }
     else {
-      const float r[4] = {1.0f, 0.2f, 0.322f, 1.0f};
-      const float g[4] = {0.545f, 0.863f, 0.0f, 1.0f};
-      const float b[4] = {0.157f, 0.565f, 1.0f, 1.0f};
+      const uchar r[4] = {255, 51, 82, 255};
+      const uchar g[4] = {139, 220, 0, 255};
+      const uchar b[4] = {40, 144, 255, 255};
       const float scale = 0.01f;
       float x_axis[3], y_axis[3], z_axis[3];
 
@@ -379,16 +381,19 @@ void wm_xr_draw_controllers(const bContext *UNUSED(C), ARegion *UNUSED(region),
         madd_v3_v3v3fl(y_axis, mat[3], mat[1], scale);
         madd_v3_v3v3fl(z_axis, mat[3], mat[2], scale);
 
-        immAttr4fv(col, r);
+        immAttrSkip(col);
         immVertex3fv(pos, mat[3]);
+        immAttr4ubv(col, r);
         immVertex3fv(pos, x_axis);
 
-        immAttr4fv(col, g);
+        immAttrSkip(col);
         immVertex3fv(pos, mat[3]);
+        immAttr4ubv(col, g);
         immVertex3fv(pos, y_axis);
 
-        immAttr4fv(col, b);
+        immAttrSkip(col);
         immVertex3fv(pos, mat[3]);
+        immAttr4ubv(col, b);
         immVertex3fv(pos, z_axis);
       }
 
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_operators.c b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
index 7efd70115c2..4f7499f3aa0 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -605,10 +605,11 @@ static void wm_xr_raycast_draw(const bContext *UNUSED(C),
 
   GPUVertFormat *format = immVertexFormat();
   uint pos = GPU_vertformat_attr_add(format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT);
-  immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
-  immUniformColor4fv(data->color);
 
   if (data->from_viewer) {
+    immBindBuiltinProgram(GPU_SHADER_3D_UNIFORM_COLOR);
+    immUniformColor4fv(data->color);
+
     GPU_depth_test(GPU_DEPTH_NONE);
     GPU_point_size(7.0f);
 
@@ -617,11 +618,21 @@ static void wm_xr_raycast_draw(const bContext *UNUSED(C),
     immEnd();
   }
   else {
+    uint col = GPU_vertformat_attr_add(format, "color", GPU_COMP_F32, 4, GPU_FETCH_FLOAT);
+    immBindBuiltinProgram(GPU_SHADER_3D_POLYLINE_FLAT_COLOR);
+
+    float viewport[4];
+    GPU_viewport_size_get_f(viewport);
+    immUniform2fv("viewportSize", &viewport[2]);
+
+    immUniform1f("lineWidth", 3.0f * U.pixelsize);
+
     GPU_depth_test(GPU_DEPTH_LESS_EQUAL);
-    GPU_line_width(3.0f);
 
     immBegin(GPU_PRIM_LINES, 2);
+    immAttrSkip(col);
     immVertex3fv(pos, data->origin);
+    immAttr4fv(col, data->color);
     immVertex3fv(pos, data->end);
     immEnd();
   }
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c
index c30decf5c97..845c0fa20b4 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_session.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c
@@ -151,6 +151,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;
@@ -1353,11 +1354,9 @@ void wm_xr_session_controller_data_populate(const wmXrAction *grip_action,
   /* Activate draw callback. */
   if (g_xr_surface) {
     wmXrSurfaceData *su

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list