[Bf-blender-cvs] [9a808748887] temp-xr-tracker: XR: Add dedicated handling/API for VR trackers

Peter Kim noreply at git.blender.org
Mon Apr 4 09:55:58 CEST 2022


Commit: 9a808748887f567345e605e2704fb1cd930b4614
Author: Peter Kim
Date:   Mon Apr 4 16:55:07 2022 +0900
Branches: temp-xr-tracker
https://developer.blender.org/rB9a808748887f567345e605e2704fb1cd930b4614

XR: Add dedicated handling/API for VR trackers

Allows for easier testing/debugging of tracker functionality by
separating trackers from session controller data. Also, this should
make it possible to use controllers and trackers during a VR session
simultaneously.

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

M	source/blender/makesdna/DNA_xr_types.h
M	source/blender/makesrna/intern/rna_xr.c
M	source/blender/windowmanager/WM_api.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 6097dfcfe7e..e4b92fe885b 100644
--- a/source/blender/makesdna/DNA_xr_types.h
+++ b/source/blender/makesdna/DNA_xr_types.h
@@ -115,6 +115,8 @@ typedef enum eXrPoseFlag {
   /* Pose represents controller grip/aim. */
   XR_POSE_GRIP = (1 << 0),
   XR_POSE_AIM = (1 << 1),
+  /* Pose represents VR tracker. */
+  XR_POSE_TRACKER = (1 << 2),
 } eXrPoseFlag;
 
 typedef enum eXrMotionCaptureFlag {
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index db35807b151..65f99166e51 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -523,6 +523,29 @@ static void rna_XrActionMapItem_pose_is_controller_aim_set(PointerRNA *ptr, bool
 #  endif
 }
 
+static bool rna_XrActionMapItem_pose_is_tracker_get(PointerRNA *ptr)
+{
+#  ifdef WITH_XR_OPENXR
+  XrActionMapItem *ami = ptr->data;
+  if ((ami->pose_flag & XR_POSE_TRACKER) != 0) {
+    return true;
+  }
+#  else
+  UNUSED_VARS(ptr);
+#  endif
+  return false;
+}
+
+static void rna_XrActionMapItem_pose_is_tracker_set(PointerRNA *ptr, bool value)
+{
+#  ifdef WITH_XR_OPENXR
+  XrActionMapItem *ami = ptr->data;
+  SET_FLAG_FROM_TEST(ami->pose_flag, value, XR_POSE_TRACKER);
+#  else
+  UNUSED_VARS(ptr, value);
+#  endif
+}
+
 static void rna_XrActionMapItem_bindings_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
 {
 #  ifdef WITH_XR_OPENXR
@@ -1048,6 +1071,32 @@ bool rna_XrSessionState_controller_pose_actions_set(bContext *C,
 #  endif
 }
 
+bool rna_XrSessionState_tracker_pose_action_add(bContext *C,
+                                                const char *action_set_name,
+                                                const char *tracker_action_name)
+{
+#  ifdef WITH_XR_OPENXR
+  wmWindowManager *wm = CTX_wm_manager(C);
+  return WM_xr_tracker_pose_action_add(&wm->xr, action_set_name, tracker_action_name);
+#  else
+  UNUSED_VARS(C, action_set_name, tracker_action_name);
+  return false;
+#  endif
+}
+
+bool rna_XrSessionState_tracker_pose_action_remove(bContext *C,
+                                                   const char *action_set_name,
+                                                   const char *tracker_action_name)
+{
+#  ifdef WITH_XR_OPENXR
+  wmWindowManager *wm = CTX_wm_manager(C);
+  return WM_xr_tracker_pose_action_remove(&wm->xr, action_set_name, tracker_action_name);
+#  else
+  UNUSED_VARS(C, action_set_name, tracker_action_name);
+  return false;
+#  endif
+}
+
 void rna_XrSessionState_action_state_get(bContext *C,
                                          const char *action_set_name,
                                          const char *action_name,
@@ -1171,6 +1220,32 @@ static void rna_XrSessionState_controller_aim_rotation_get(bContext *C,
 #  endif
 }
 
+static void rna_XrSessionState_tracker_location_get(bContext *C,
+                                                    const char *user_path,
+                                                    float r_values[3])
+{
+#  ifdef WITH_XR_OPENXR
+  const wmWindowManager *wm = CTX_wm_manager(C);
+  WM_xr_session_state_tracker_location_get(&wm->xr, user_path, r_values);
+#  else
+  UNUSED_VARS(C, user_path);
+  zero_v3(r_values);
+#  endif
+}
+
+static void rna_XrSessionState_tracker_rotation_get(bContext *C,
+                                                    const char *user_path,
+                                                    float r_values[4])
+{
+#  ifdef WITH_XR_OPENXR
+  const wmWindowManager *wm = CTX_wm_manager(C);
+  WM_xr_session_state_tracker_rotation_get(&wm->xr, user_path, r_values);
+#  else
+  UNUSED_VARS(C, user_path);
+  unit_qt(r_values);
+#  endif
+}
+
 static void rna_XrSessionState_viewer_pose_location_get(PointerRNA *ptr, float *r_values)
 {
 #  ifdef WITH_XR_OPENXR
@@ -1827,6 +1902,11 @@ static void rna_def_xr_actionmap(BlenderRNA *brna)
   RNA_def_property_ui_text(
       prop, "Is Controller Aim", "The action poses will be used for the VR controller aims");
 
+  prop = RNA_def_property(srna, "pose_is_tracker", PROP_BOOLEAN, PROP_NONE);
+  RNA_def_property_boolean_funcs(
+      prop, "rna_XrActionMapItem_pose_is_tracker_get", "rna_XrActionMapItem_pose_is_tracker_set");
+  RNA_def_property_ui_text(prop, "Is Tracker", "The action poses represent a VR tracker");
+
   prop = RNA_def_property(srna, "haptic_name", PROP_STRING, PROP_NONE);
   RNA_def_property_ui_text(
       prop, "Haptic Name", "Name of the haptic action to apply when executing this action");
@@ -2359,6 +2439,42 @@ static void rna_def_xr_session_state(BlenderRNA *brna)
   parm = RNA_def_boolean(func, "result", 0, "Result", "");
   RNA_def_function_return(func, parm);
 
+  func = RNA_def_function(
+      srna, "tracker_pose_action_add", "rna_XrSessionState_tracker_pose_action_add");
+  RNA_def_function_ui_description(func, "Add a VR tracker pose to the session");
+  RNA_def_function_flag(func, FUNC_NO_SELF);
+  parm = RNA_def_pointer(func, "context", "Context", "", "");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_string(func, "action_set", NULL, MAX_NAME, "Action Set", "Action set name");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_string(func,
+                        "tracker_action",
+                        NULL,
+                        MAX_NAME,
+                        "Tracker Action",
+                        "Name of the action representing the VR tracker");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_boolean(func, "result", 0, "Result", "");
+  RNA_def_function_return(func, parm);
+
+  func = RNA_def_function(
+      srna, "tracker_pose_action_remove", "rna_XrSessionState_tracker_pose_action_remove");
+  RNA_def_function_ui_description(func, "Remove a VR tracker pose from the session");
+  RNA_def_function_flag(func, FUNC_NO_SELF);
+  parm = RNA_def_pointer(func, "context", "Context", "", "");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_string(func, "action_set", NULL, MAX_NAME, "Action Set", "Action set name");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_string(func,
+                        "tracker_action",
+                        NULL,
+                        MAX_NAME,
+                        "Tracker Action",
+                        "Name of the action representing the VR tracker");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_boolean(func, "result", 0, "Result", "");
+  RNA_def_function_return(func, parm);
+
   func = RNA_def_function(srna, "action_state_get", "rna_XrSessionState_action_state_get");
   RNA_def_function_ui_description(func, "Get the current state of a VR action");
   RNA_def_function_flag(func, FUNC_NO_SELF);
@@ -2541,6 +2657,49 @@ static void rna_def_xr_session_state(BlenderRNA *brna)
   RNA_def_property_ui_range(parm, -FLT_MAX, FLT_MAX, 1, 5);
   RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_OUTPUT);
 
+  func = RNA_def_function(srna, "tracker_location_get", "rna_XrSessionState_tracker_location_get");
+  RNA_def_function_ui_description(func, "Get the last known tracker location in world space");
+  RNA_def_function_flag(func, FUNC_NO_SELF);
+  parm = RNA_def_pointer(func, "context", "Context", "", "");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_string(
+      func, "user_path", NULL, XR_MAX_USER_PATH_LENGTH, "User Path", "OpenXR user path");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_float_translation(func,
+                                   "location",
+                                   3,
+                                   NULL,
+                                   -FLT_MAX,
+                                   FLT_MAX,
+                                   "Location",
+                                   "Tracker location",
+                                   -FLT_MAX,
+                                   FLT_MAX);
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_OUTPUT);
+
+  func = RNA_def_function(srna, "tracker_rotation_get", "rna_XrSessionState_tracker_rotation_get");
+  RNA_def_function_ui_description(
+      func, "Get the last known tracker rotation (quaternion) in world space");
+  RNA_def_function_flag(func, FUNC_NO_SELF);
+  parm = RNA_def_pointer(func, "context", "Context", "", "");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_string(
+      func, "user_path", NULL, XR_MAX_USER_PATH_LENGTH, "User Path", "OpenXR user path");
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_REQUIRED);
+  parm = RNA_def_float_vector(func,
+                              "rotation",
+                              4,
+                              NULL,
+                              -FLT_MAX,
+                              FLT_MAX,
+                              "Rotation",
+                              "Tracker quaternion rotation",
+                              -FLT_MAX,
+                              FLT_MAX);
+  parm->subtype = PROP_QUATERNION;
+  RNA_def_property_ui_range(parm, -FLT_MAX, FLT_MAX, 1, 5);
+  RNA_def_parameter_flags(parm, PROP_NEVER_NULL, PARM_OUTPUT);
+
   prop = RNA_def_property(srna, "viewer_pose_location", PROP_FLOAT, PROP_TRANSLATION);
   RNA_def_property_array(prop, 3);
   RNA_def_property_float_funcs(prop, "rna_XrSessionState_viewer_pose_location_get", NULL, NULL);
diff --git a/source/blender/windowmanager/WM_api.h b/source/blender/windowmanager/WM_api.h
index cf5d082445c..7bb2ce18ef7 100644
--- a/source/blender/windowmanager/WM_api.h
+++ b/source/blender/windowmanager/WM_api.h
@@ -1592,6 +1592,12 @@ bool WM_xr_session_state_controller_aim_location_get(const wmXrData *xr,
 bool WM_xr_session_state_controller_aim_rotation_get(const wmXrData *xr,
                                                      unsigned int subaction_idx,
                                                      float r_rotation[4]);
+bool WM_xr_session_state_tracker_location_get(const wmXrData *xr,
+                                              const 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list