[Bf-blender-cvs] [5b45070024a] xr-controller-support: XR: Refactor controller poses

Peter Kim noreply at git.blender.org
Thu Jul 22 08:53:45 CEST 2021


Commit: 5b45070024a48a67d6a4ce69e19a186a0f07fd93
Author: Peter Kim
Date:   Thu Jul 22 00:58:17 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rB5b45070024a48a67d6a4ce69e19a186a0f07fd93

XR: Refactor controller poses

Separates controller poses into two components, "grip" and "aim",
which are both required to accurately represent the controllers
without manual offsets.

Following their OpenXR definitions, the grip pose represents the
user's hand when holding the controller, and the aim pose represents
the controller's aiming source.

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

M	source/blender/makesdna/DNA_xr_types.h
M	source/blender/makesrna/intern/rna_wm.c
M	source/blender/makesrna/intern/rna_xr.c
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/WM_types.h
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_action.c
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/makesdna/DNA_xr_types.h b/source/blender/makesdna/DNA_xr_types.h
index f269343baa3..9c5fd55ceaa 100644
--- a/source/blender/makesdna/DNA_xr_types.h
+++ b/source/blender/makesdna/DNA_xr_types.h
@@ -132,6 +132,12 @@ typedef enum eXrActionFlag {
   XR_ACTION_HAPTIC_REPEAT = (1 << 11),
 } eXrActionFlag;
 
+typedef enum eXrPoseFlag {
+  /* Pose represents controller grip/aim. */
+  XR_POSE_GRIP = (1 << 0),
+  XR_POSE_AIM = (1 << 1),
+} eXrPoseFlag;
+
 /* -------------------------------------------------------------------- */
 
 typedef struct XrActionMapItem {
@@ -165,8 +171,7 @@ typedef struct XrActionMapItem {
   short action_flag; /* eXrActionFlag */
 
   /** Pose action properties. */
-  char pose_is_controller;
-  char _pad2[1];
+  short pose_flag; /* eXrPoseFlag */
   float pose_location[3];
   float pose_rotation[3];
 
diff --git a/source/blender/makesrna/intern/rna_wm.c b/source/blender/makesrna/intern/rna_wm.c
index ba2b398a5a2..c2ed5ed6958 100644
--- a/source/blender/makesrna/intern/rna_wm.c
+++ b/source/blender/makesrna/intern/rna_wm.c
@@ -2540,19 +2540,17 @@ static void rna_def_event(BlenderRNA *brna)
   RNA_def_property_array(prop, 3);
   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",
-      "Location of the action's corresponding controller pose in world space");
+  RNA_def_property_ui_text(prop,
+                           "XR Controller Location",
+                           "Location of the action's corresponding controller aim in world space");
 
   prop = RNA_def_property(srna, "xr_controller_rotation", PROP_FLOAT, PROP_QUATERNION);
   RNA_def_property_array(prop, 4);
   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");
+  RNA_def_property_ui_text(prop,
+                           "XR Controller Rotation",
+                           "Rotation of the action's corresponding controller aim in world space");
 
   prop = RNA_def_property(srna, "xr_controller_location_other", PROP_FLOAT, PROP_TRANSLATION);
   RNA_def_property_array(prop, 3);
@@ -2560,7 +2558,7 @@ static void rna_def_event(BlenderRNA *brna)
   RNA_def_property_float_funcs(prop, "rna_Event_xr_controller_location_other_get", NULL, NULL);
   RNA_def_property_ui_text(prop,
                            "XR Controller Location Other",
-                           "Controller location of the other user path for bimanual actions");
+                           "Controller aim location of the other user path for bimanual actions");
 
   prop = RNA_def_property(srna, "xr_controller_rotation_other", PROP_FLOAT, PROP_QUATERNION);
   RNA_def_property_array(prop, 4);
@@ -2568,7 +2566,7 @@ static void rna_def_event(BlenderRNA *brna)
   RNA_def_property_float_funcs(prop, "rna_Event_xr_controller_rotation_other_get", NULL, NULL);
   RNA_def_property_ui_text(prop,
                            "XR Controller Rotation Other",
-                           "Controller rotation of the other user path for bimanual actions");
+                           "Controller aim rotation of the other user path for bimanual actions");
 
   prop = RNA_def_property(srna, "xr_focal_length", PROP_FLOAT, PROP_NONE);
   RNA_def_property_clear_flag(prop, PROP_EDITABLE);
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index c6bb6cf4581..763a9762d55 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -312,6 +312,62 @@ static void rna_XrActionMapItem_haptic_flag_set(PointerRNA *ptr, int value)
 #  endif
 }
 
+static bool rna_XrActionMapItem_pose_is_controller_grip_get(PointerRNA *ptr)
+{
+#  ifdef WITH_XR_OPENXR
+  XrActionMapItem *ami = ptr->data;
+  if ((ami->pose_flag & XR_POSE_GRIP) != 0) {
+    return true;
+  }
+#  else
+  UNUSED_VARS(ptr);
+#  endif
+  return false;
+}
+
+static void rna_XrActionMapItem_pose_is_controller_grip_set(PointerRNA *ptr, bool value)
+{
+#  ifdef WITH_XR_OPENXR
+  XrActionMapItem *ami = ptr->data;
+  if (value) {
+    ami->pose_flag |= XR_POSE_GRIP;
+  }
+  else {
+    ami->pose_flag &= ~XR_POSE_GRIP;
+  }
+#  else
+  UNUSED_VARS(ptr, value);
+#  endif
+}
+
+static bool rna_XrActionMapItem_pose_is_controller_aim_get(PointerRNA *ptr)
+{
+#  ifdef WITH_XR_OPENXR
+  XrActionMapItem *ami = ptr->data;
+  if ((ami->pose_flag & XR_POSE_AIM) != 0) {
+    return true;
+  }
+#  else
+  UNUSED_VARS(ptr);
+#  endif
+  return false;
+}
+
+static void rna_XrActionMapItem_pose_is_controller_aim_set(PointerRNA *ptr, bool value)
+{
+#  ifdef WITH_XR_OPENXR
+  XrActionMapItem *ami = ptr->data;
+  if (value) {
+    ami->pose_flag |= XR_POSE_AIM;
+  }
+  else {
+    ami->pose_flag &= ~XR_POSE_AIM;
+  }
+#  else
+  UNUSED_VARS(ptr, value);
+#  endif
+}
+
 static void rna_XrActionMapItem_name_update(Main *bmain, Scene *UNUSED(scene), PointerRNA *ptr)
 {
 #  ifdef WITH_XR_OPENXR
@@ -1069,15 +1125,17 @@ bool rna_XrSessionState_active_action_set_set(bContext *C, const char *action_se
 #  endif
 }
 
-bool rna_XrSessionState_controller_pose_action_set(bContext *C,
-                                                   const char *action_set_name,
-                                                   const char *action_name)
+bool rna_XrSessionState_controller_pose_actions_set(bContext *C,
+                                                    const char *action_set_name,
+                                                    const char *grip_action_name,
+                                                    const char *aim_action_name)
 {
 #  ifdef WITH_XR_OPENXR
   wmWindowManager *wm = CTX_wm_manager(C);
-  return WM_xr_controller_pose_action_set(&wm->xr, action_set_name, action_name);
+  return WM_xr_controller_pose_actions_set(
+      &wm->xr, action_set_name, grip_action_name, aim_action_name);
 #  else
-  UNUSED_VARS(C, action_set_name, action_name);
+  UNUSED_VARS(C, action_set_name, grip_action_name, aim_action_name);
   return false;
 #  endif
 }
@@ -1186,44 +1244,88 @@ static void rna_XrSessionState_viewer_pose_rotation_get(PointerRNA *ptr, float *
 #  endif
 }
 
-static void rna_XrSessionState_controller_pose0_location_get(PointerRNA *ptr, float *r_values)
+static void rna_XrSessionState_controller0_grip_location_get(PointerRNA *ptr, float *r_values)
+{
+#  ifdef WITH_XR_OPENXR
+  const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+  WM_xr_session_state_controller_grip_location_get(xr, 0, r_values);
+#  else
+  UNUSED_VARS(ptr);
+  zero_v3(r_values);
+#  endif
+}
+
+static void rna_XrSessionState_controller0_grip_rotation_get(PointerRNA *ptr, float *r_values)
+{
+#  ifdef WITH_XR_OPENXR
+  const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+  WM_xr_session_state_controller_grip_rotation_get(xr, 0, r_values);
+#  else
+  UNUSED_VARS(ptr);
+  unit_qt(r_values);
+#  endif
+}
+
+static void rna_XrSessionState_controller0_aim_location_get(PointerRNA *ptr, float *r_values)
 {
 #  ifdef WITH_XR_OPENXR
   const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
-  WM_xr_session_state_controller_pose_location_get(xr, 0, r_values);
+  WM_xr_session_state_controller_aim_location_get(xr, 0, r_values);
 #  else
   UNUSED_VARS(ptr);
   zero_v3(r_values);
 #  endif
 }
 
-static void rna_XrSessionState_controller_pose0_rotation_get(PointerRNA *ptr, float *r_values)
+static void rna_XrSessionState_controller0_aim_rotation_get(PointerRNA *ptr, float *r_values)
 {
 #  ifdef WITH_XR_OPENXR
   const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
-  WM_xr_session_state_controller_pose_rotation_get(xr, 0, r_values);
+  WM_xr_session_state_controller_aim_rotation_get(xr, 0, r_values);
 #  else
   UNUSED_VARS(ptr);
   unit_qt(r_values);
 #  endif
 }
 
-static void rna_XrSessionState_controller_pose1_location_get(PointerRNA *ptr, float *r_values)
+static void rna_XrSessionState_controller1_grip_location_get(PointerRNA *ptr, float *r_values)
 {
 #  ifdef WITH_XR_OPENXR
   const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
-  WM_xr_session_state_controller_pose_location_get(xr, 1, r_values);
+  WM_xr_session_state_controller_grip_location_get(xr, 1, r_values);
 #  else
   UNUSED_VARS(ptr);
   zero_v3(r_values);
 #  endif
 }
 
-static void rna_XrSessionState_controller_pose1_rotation_get(PointerRNA *ptr, float *r_values)
+static void rna_XrSessionState_controller1_grip_rotation_get(PointerRNA *ptr, float *r_values)
 {
 #  ifdef WITH_XR_OPENXR
   const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
-  WM_xr_session_state_controller_pose_rotation_get(xr, 1, r_values);
+  WM_xr_session_state_controller_grip_rotation_get(xr, 1, r_values);
+#  else
+  UNUSED_VARS(ptr);
+  unit_qt(r_values);
+#  endif
+}
+
+static void rna_XrSessionState_controller1_aim_location_get(PointerRNA *ptr, float *r_values)
+{
+#  ifdef WITH_XR_OPENXR
+  const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+  WM_xr_session_state_controller_aim_location_get(xr, 1, r_values);
+#  else
+  UNUSED_VARS(ptr);
+  zero_v3(r_values);
+#  endif
+}
+
+static void rna_XrSessionState_controller1_aim_rotation_get(PointerRNA *ptr, float *r_values)
+{
+#  ifdef WITH_XR_OPENXR
+  const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+  WM_xr_session_state_controller_aim_rotation_get(xr, 1, r_values);
 #  else
   UNUSED_VARS(ptr);
   unit_qt(r_values);
@@ -1686,8 +1788,19 @@ static void rna_def_xr_actionconfig(BlenderRNA *brna)
   RNA_def_property_ui_text(
       prop, "Bimanual", "Action depends on the states/poses of both user paths");
 
-  prop = RNA_def_property(srna, "pose_is_controller", PROP_BOOLEAN, PROP_NONE);
-  RNA_def_property_ui_text(prop, "Is Controller", "Pose will be used for the VR controllers");
+  prop = RNA_def_property(srna, "pose_is_controller_grip", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_funcs(prop,
+                                 "rna_XrActionMapItem_pose_is_controller_grip_get",
+             

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list