[Bf-blender-cvs] [5e8d3f6d281] xr-actions-D9124: Operators: Add invoke_3d() and implement for VIEW3D_OT_select

Peter Kim noreply at git.blender.org
Tue Oct 13 14:45:02 CEST 2020


Commit: 5e8d3f6d281267a7866060dee0a78b10bb65429b
Author: Peter Kim
Date:   Tue Oct 13 18:11:22 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB5e8d3f6d281267a7866060dee0a78b10bb65429b

Operators: Add invoke_3d() and implement for VIEW3D_OT_select

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

M	source/blender/editors/space_view3d/view3d_select.c
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/WM_types.h
M	source/blender/windowmanager/intern/wm_event_query.c
M	source/blender/windowmanager/intern/wm_event_system.c
M	source/blender/windowmanager/wm_event_system.h
M	source/blender/windowmanager/xr/intern/wm_xr_draw.c
M	source/blender/windowmanager/xr/intern/wm_xr_intern.h
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

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

diff --git a/source/blender/editors/space_view3d/view3d_select.c b/source/blender/editors/space_view3d/view3d_select.c
index 3f758c0fda3..e03609dab52 100644
--- a/source/blender/editors/space_view3d/view3d_select.c
+++ b/source/blender/editors/space_view3d/view3d_select.c
@@ -2507,6 +2507,60 @@ static int view3d_select_invoke(bContext *C, wmOperator *op, const wmEvent *even
   return view3d_select_exec(C, op);
 }
 
+static void controller_loc_to_mval(const float loc[3],
+                                   const float viewmat[4][4],
+                                   const float winmat[4][4],
+                                   short winx,
+                                   short winy,
+                                   int r_mval[2])
+{
+  float persmat[4][4];
+  float tmp[3];
+
+  mul_m4_m4m4(persmat, winmat, viewmat);
+  copy_v3_v3(tmp, loc);
+  mul_project_m4_v3(persmat, tmp);
+  r_mval[0] = (int)(((float)winx / 2.0f) * (1.0f + tmp[0]));
+  r_mval[1] = (int)(((float)winy / 2.0f) * (1.0f + tmp[1]));
+}
+
+static int view3d_select_invoke_3d(bContext *C, wmOperator *op, const wmEvent *event)
+{
+  BLI_assert(event->type == EVT_XR_ACTION);
+  BLI_assert(event->custom == EVT_DATA_XR);
+  BLI_assert(event->customdata);
+
+  ARegion *ar = CTX_wm_region(C);
+  RegionView3D *rv3d = ar->regiondata;
+  wmXrActionData *customdata = event->customdata;
+  float viewmat_prev[4][4];
+  float winmat_prev[4][4];
+  int mval[2];
+
+  /* Since this function is called in a window context, we need to replace the
+   * window viewmat and winmat with the XR surface counterparts to get a correct
+   * result for GPU select. */
+  copy_m4_m4(viewmat_prev, rv3d->viewmat);
+  copy_m4_m4(winmat_prev, rv3d->winmat);
+  copy_m4_m4(rv3d->viewmat, customdata->viewmat);
+  copy_m4_m4(rv3d->winmat, customdata->winmat);
+
+  controller_loc_to_mval(customdata->controller_loc,
+                         customdata->viewmat,
+                         customdata->winmat,
+                         ar->winx,
+                         ar->winy,
+                         mval);
+
+  RNA_int_set_array(op->ptr, "location", mval);
+
+  int retval = view3d_select_exec(C, op);
+  copy_m4_m4(rv3d->viewmat, viewmat_prev);
+  copy_m4_m4(rv3d->winmat, winmat_prev);
+
+  return retval;
+}
+
 void VIEW3D_OT_select(wmOperatorType *ot)
 {
   PropertyRNA *prop;
@@ -2518,6 +2572,7 @@ void VIEW3D_OT_select(wmOperatorType *ot)
 
   /* api callbacks */
   ot->invoke = view3d_select_invoke;
+  ot->invoke_3d = view3d_select_invoke_3d;
   ot->exec = view3d_select_exec;
   ot->poll = ED_operator_view3d_active;
 
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index 9b23cfcec67..949f25fac2d 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -686,7 +686,7 @@ static void rna_Event_xr_action_get(PointerRNA *ptr, char *value)
 {
   const wmEvent *event = ptr->data;
   if (WM_event_is_xr(event)) {
-    WM_event_xr_data(event, &value, NULL, NULL, NULL, NULL);
+    WM_event_xr_data(event, &value, NULL, NULL, NULL, NULL, NULL, NULL);
   }
   else {
     value[0] = '\0';
@@ -710,7 +710,7 @@ static int rna_Event_xr_type_get(PointerRNA *ptr)
   const wmEvent *event = ptr->data;
   if (WM_event_is_xr(event)) {
     GHOST_XrActionType type;
-    WM_event_xr_data(event, NULL, (char *)&type, NULL, NULL, NULL);
+    WM_event_xr_data(event, NULL, (char *)&type, NULL, NULL, NULL, NULL, NULL);
     return type;
   }
   else {
@@ -722,7 +722,7 @@ static void rna_Event_xr_state_get(PointerRNA *ptr, float *value)
 {
   const wmEvent *event = ptr->data;
   if (WM_event_is_xr(event)) {
-    WM_event_xr_data(event, NULL, NULL, value, NULL, NULL);
+    WM_event_xr_data(event, NULL, NULL, value, NULL, NULL, NULL, NULL);
   }
   else {
     memset(value, 0, sizeof(float[2]));
@@ -733,7 +733,7 @@ static void rna_Event_xr_controller_location_get(PointerRNA *ptr, float *value)
 {
   const wmEvent *event = ptr->data;
   if (WM_event_is_xr(event)) {
-    WM_event_xr_data(event, NULL, NULL, NULL, value, NULL);
+    WM_event_xr_data(event, NULL, NULL, NULL, value, NULL, NULL, NULL);
   }
   else {
     memset(value, 0, sizeof(float[3]));
@@ -744,7 +744,7 @@ static void rna_Event_xr_controller_rotation_get(PointerRNA *ptr, float *value)
 {
   const wmEvent *event = ptr->data;
   if (WM_event_is_xr(event)) {
-    WM_event_xr_data(event, NULL, NULL, NULL, NULL, value);
+    WM_event_xr_data(event, NULL, NULL, NULL, NULL, value, NULL, NULL);
   }
   else {
     value[0] = 1.0f;
@@ -752,6 +752,28 @@ static void rna_Event_xr_controller_rotation_get(PointerRNA *ptr, float *value)
   }
 }
 
+static void rna_Event_xr_view_matrix_get(PointerRNA *ptr, float values[16])
+{
+  const wmEvent *event = ptr->data;
+  if (WM_event_is_xr(event)) {
+    WM_event_xr_data(event, NULL, NULL, NULL, NULL, NULL, (float(*)[4])values, NULL);
+  }
+  else {
+    memset(values, 0, sizeof(float[16]));
+  }
+}
+
+static void rna_Event_xr_projection_matrix_get(PointerRNA *ptr, float values[16])
+{
+  const wmEvent *event = ptr->data;
+  if (WM_event_is_xr(event)) {
+    WM_event_xr_data(event, NULL, NULL, NULL, NULL, NULL, NULL, (float(*)[4])values);
+  }
+  else {
+    memset(values, 0, sizeof(float[16]));
+  }
+}
+
 static PointerRNA rna_PopupMenu_layout_get(PointerRNA *ptr)
 {
   struct uiPopupMenu *pup = ptr->data;
@@ -2324,8 +2346,8 @@ static void rna_def_event(BlenderRNA *brna)
 
   prop = RNA_def_property(srna, "xr_controller_location", PROP_FLOAT, PROP_TRANSLATION);
   RNA_def_property_array(prop, 3);
-  RNA_def_property_float_funcs(prop, "rna_Event_xr_controller_location_get", NULL, NULL);
   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+  RNA_def_property_float_funcs(prop, "rna_Event_xr_controller_location_get", NULL, NULL);
   RNA_def_property_ui_text(
       prop,
       "XR Controller Location",
@@ -2333,13 +2355,26 @@ static void rna_def_event(BlenderRNA *brna)
 
   prop = RNA_def_property(srna, "xr_controller_rotation", PROP_FLOAT, PROP_QUATERNION);
   RNA_def_property_array(prop, 4);
-  RNA_def_property_float_funcs(prop, "rna_Event_xr_controller_rotation_get", NULL, NULL);
   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+  RNA_def_property_float_funcs(prop, "rna_Event_xr_controller_rotation_get", NULL, NULL);
   RNA_def_property_ui_text(
       prop,
       "XR Controller Rotation",
       "Rotation of the action's corresponding controller pose in world space");
 
+  prop = RNA_def_property(srna, "xr_view_matrix", PROP_FLOAT, PROP_MATRIX);
+  RNA_def_property_array(prop, 16);
+  RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+  RNA_def_property_float_funcs(prop, "rna_Event_xr_view_matrix_get", NULL, NULL);
+  RNA_def_property_ui_text(prop, "XR View Matrix", "View matrix of the XR viewer centroid");
+
+  prop = RNA_def_property(srna, "xr_projection_matrix", PROP_FLOAT, PROP_MATRIX);
+  RNA_def_property_array(prop, 16);
+  RNA_def_property_float_funcs(prop, "rna_Event_xr_projection_matrix_get", NULL, NULL);
+  RNA_def_property_clear_flag(prop, PROP_EDITABLE);
+  RNA_def_property_ui_text(
+      prop, "XR Projection Matrix", "Projection matrix of the XR viewer centroid");
+
   RNA_define_verify_sdna(1); /* not in sdna */
 }
 
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index 8956c9b2382..273e91571b2 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -865,7 +865,9 @@ void WM_event_xr_data(const struct wmEvent *event,
                       char *type,
                       float state[2],
                       float controller_loc[3],
-                      float controller_rot[4]);
+                      float controller_rot[4],
+                      float viewmat[4][4],
+                      float winmat[4][4]);
 bool WM_event_is_xr(const struct wmEvent *event);
 
 #ifdef WITH_INPUT_IME
diff --git a/source/blender/windowmanager/WM_types.h b/source/blender/windowmanager/WM_types.h
index 82e85e2277c..649628156d0 100644
--- a/source/blender/windowmanager/WM_types.h
+++ b/source/blender/windowmanager/WM_types.h
@@ -643,6 +643,9 @@ typedef struct wmXrActionData {
   /** Controller pose corresponding to the action's subaction path. */
   float controller_loc[3];
   float controller_rot[4];
+  /** Viewmat and winmat of the XR viewer centroid. */
+  float viewmat[4][4];
+  float winmat[4][4];
   /** Operator. */
   struct wmOperatorType *ot;
 } wmXrActionData;
@@ -720,6 +723,14 @@ typedef struct wmOperatorType {
                 struct wmOperator *,
                 const struct wmEvent *) ATTR_WARN_UNUSED_RESULT;
 
+  /**
+   * Same as invoke() but intended to be called from an XR session.
+   * The event type should be EVT_XR_ACTION and custom data type EVT_DATA_XR.
+   */
+  int (*invoke_3d)(struct bContext *,
+                   struct wmOperator *,
+                   const struct wmEvent *) ATTR_WARN_UNUSED_RESULT;
+
   /**
    * Called when a modal operator is canceled (not used often).
    * Internal cleanup can be done here if needed.
@@ -736,6 +747,14 @@ typedef struct wmOperatorType {
                struct wmOperator *,
                const struct wmEvent *) ATTR_WARN_UNUSED_RESULT;
 
+  /**
+   * Same as modal() but intended to be called from an XR session.
+   * The event type should be EVT_XR_ACTION and custom data type EVT_DATA_XR.
+   */
+  int (*modal_3d)(struct bContext *,
+                  struct wmOperator *,
+                  const struct wmEvent *) ATTR_WARN_UNUSED_RESULT;
+
   /**
    * Verify if the operator can be executed in the current context, note
    * that the operator might still fail to execute even if this return true.
diff --git a/source/blender/windowmanager/intern/wm_event_query.c b/source/blender/windowmanager/intern/wm_event_query.c
index 2813a8c7ca0..63354106b27 100644
--- a/source/blender/windowmanager/intern/wm_event_query.c
+++ b/source/blender/windowmanager/intern/wm_event_query.c
@@ -431,28 +431,32 @@ void WM_event_xr_data(const wmEvent *event,
                       char *type,
                       float state[2],
                       float controller_loc[3],
-                      float controller_rot[4])
+

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list