[Bf-blender-cvs] [5781031d1cc] xr-dev: XR: Motion Capture

Peter Kim noreply at git.blender.org
Sun Feb 20 07:59:18 CET 2022


Commit: 5781031d1ccfac88f5f21485f98bbd7fc9f4d483
Author: Peter Kim
Date:   Sun Feb 20 15:53:51 2022 +0900
Branches: xr-dev
https://developer.blender.org/rB5781031d1ccfac88f5f21485f98bbd7fc9f4d483

XR: Motion Capture

https://developer.blender.org/D10947

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

M	source/blender/blenloader/intern/readfile.c
M	source/blender/editors/include/ED_transform.h
M	source/blender/editors/transform/transform_convert.c
M	source/blender/editors/transform/transform_convert_armature.c
M	source/blender/editors/transform/transform_convert_object.c
M	source/blender/makesdna/DNA_xr_types.h
M	source/blender/makesrna/intern/rna_xr.c
M	source/blender/windowmanager/CMakeLists.txt
M	source/blender/windowmanager/WM_api.h
M	source/blender/windowmanager/intern/wm.c
M	source/blender/windowmanager/intern/wm_files.c
M	source/blender/windowmanager/intern/wm_window.c
M	source/blender/windowmanager/xr/intern/wm_xr.c
M	source/blender/windowmanager/xr/intern/wm_xr_actionmap.c
M	source/blender/windowmanager/xr/intern/wm_xr_intern.h
A	source/blender/windowmanager/xr/intern/wm_xr_mocap.c
M	source/blender/windowmanager/xr/intern/wm_xr_session.c
M	source/blender/windowmanager/xr/wm_xr.h

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

diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 7dd35203a89..6f65eda93a9 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2421,6 +2421,10 @@ static void lib_link_wm_xr_data_restore(struct IDNameLib_Map *id_map, wmXrData *
 {
   xr_data->session_settings.base_pose_object = restore_pointer_by_name(
       id_map, (ID *)xr_data->session_settings.base_pose_object, USER_REAL);
+
+  LISTBASE_FOREACH (XrMotionCaptureObject *, mocap_ob, &xr_data->session_settings.mocap_objects) {
+    mocap_ob->ob = restore_pointer_by_name(id_map, (ID *)mocap_ob->ob, USER_REAL);
+  }
 }
 
 static void lib_link_window_scene_data_restore(wmWindow *win, Scene *scene, ViewLayer *view_layer)
diff --git a/source/blender/editors/include/ED_transform.h b/source/blender/editors/include/ED_transform.h
index 66c17ff8115..d68873dddd6 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -15,8 +15,10 @@ extern "C" {
 
 struct Object;
 struct bContext;
+struct ViewLayer;
 struct wmKeyConfig;
 struct wmOperatorType;
+struct wmTimer;
 
 void ED_keymap_transform(struct wmKeyConfig *keyconf);
 void transform_operatortypes(void);
@@ -202,6 +204,19 @@ int ED_transform_calc_gizmo_stats(const struct bContext *C,
                                   const struct TransformCalcParams *params,
                                   struct TransformBounds *tbounds);
 
+/* transform_convert.c */
+void ED_transform_animrecord_check_state(struct Scene *scene,
+                                         struct wmTimer *animtimer,
+                                         struct Object *ob);
+
+/* transform_convert_object.c */
+void ED_transform_autokeyframe_object(struct bContext *C,
+                                      struct Scene *scene,
+                                      struct ViewLayer *view_layer,
+                                      struct Object *ob,
+                                      int tmode);
+bool ED_transform_motionpath_need_update_object(struct Scene *scene, struct Object *ob);
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/editors/transform/transform_convert.c b/source/blender/editors/transform/transform_convert.c
index 4a2169b381e..aec3ffb432f 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -1569,11 +1569,9 @@ void transform_convert_clip_mirror_modifier_apply(TransDataContainer *tc)
   }
 }
 
-void animrecord_check_state(TransInfo *t, struct Object *ob)
+void ED_transform_animrecord_check_state(Scene *scene, wmTimer *animtimer, struct Object *ob)
 {
-  Scene *scene = t->scene;
   ID *id = &ob->id;
-  wmTimer *animtimer = t->animtimer;
   ScreenAnimData *sad = (animtimer) ? animtimer->customdata : NULL;
 
   /* sanity checks */
diff --git a/source/blender/editors/transform/transform_convert_armature.c b/source/blender/editors/transform/transform_convert_armature.c
index ad4c0fd631d..52d87eb08a0 100644
--- a/source/blender/editors/transform/transform_convert_armature.c
+++ b/source/blender/editors/transform/transform_convert_armature.c
@@ -1470,7 +1470,7 @@ void recalcData_pose(TransInfo *t)
         /* XXX: this currently doesn't work, since flags aren't set yet! */
         int targetless_ik = (t->flag & T_AUTOIK);
 
-        animrecord_check_state(t, ob);
+        ED_transform_animrecord_check_state(t->scene, t->animtimer, ob);
         autokeyframe_pose(t->context, t->scene, ob, t->mode, targetless_ik);
       }
 
diff --git a/source/blender/editors/transform/transform_convert_object.c b/source/blender/editors/transform/transform_convert_object.c
index 1d187d01588..b599e282959 100644
--- a/source/blender/editors/transform/transform_convert_object.c
+++ b/source/blender/editors/transform/transform_convert_object.c
@@ -716,7 +716,7 @@ void createTransObject(bContext *C, TransInfo *t)
  * \note Context may not always be available,
  * so must check before using it as it's a luxury for a few cases.
  */
-static void autokeyframe_object(
+void ED_transform_autokeyframe_object(
     bContext *C, Scene *scene, ViewLayer *view_layer, Object *ob, int tmode)
 {
   Main *bmain = CTX_data_main(C);
@@ -838,7 +838,7 @@ static void autokeyframe_object(
 
 /* Return if we need to update motion paths, only if they already exist,
  * and we will insert a keyframe at the end of transform. */
-static bool motionpath_need_update_object(Scene *scene, Object *ob)
+bool ED_transform_motionpath_need_update_object(Scene *scene, Object *ob)
 {
   /* XXX: there's potential here for problems with unkeyed rotations/scale,
    *      but for now (until proper data-locality for baking operations),
@@ -882,11 +882,11 @@ void recalcData_objects(TransInfo *t)
       /* TODO: autokeyframe calls need some setting to specify to add samples
        * (FPoints) instead of keyframes? */
       if ((t->animtimer) && IS_AUTOKEY_ON(t->scene)) {
-        animrecord_check_state(t, ob);
-        autokeyframe_object(t->context, t->scene, t->view_layer, ob, t->mode);
+        ED_transform_animrecord_check_state(t->scene, t->animtimer, ob);
+        ED_transform_autokeyframe_object(t->context, t->scene, t->view_layer, ob, t->mode);
       }
 
-      motionpath_update |= motionpath_need_update_object(t->scene, ob);
+      motionpath_update |= ED_transform_motionpath_need_update_object(t->scene, ob);
 
       /* sets recalc flags fully, instead of flushing existing ones
        * otherwise proxies don't function correctly
@@ -959,10 +959,10 @@ void special_aftertrans_update__object(bContext *C, TransInfo *t)
 
     /* Set auto-key if necessary. */
     if (!canceled) {
-      autokeyframe_object(C, t->scene, t->view_layer, ob, t->mode);
+      ED_transform_autokeyframe_object(C, t->scene, t->view_layer, ob, t->mode);
     }
 
-    motionpath_update |= motionpath_need_update_object(t->scene, ob);
+    motionpath_update |= ED_transform_motionpath_need_update_object(t->scene, ob);
 
     /* Restore rigid body transform. */
     if (ob->rigidbody_object && canceled) {
diff --git a/source/blender/makesdna/DNA_xr_types.h b/source/blender/makesdna/DNA_xr_types.h
index 92f5ff3ccc3..457bf44f3b8 100644
--- a/source/blender/makesdna/DNA_xr_types.h
+++ b/source/blender/makesdna/DNA_xr_types.h
@@ -38,9 +38,13 @@ typedef struct XrSessionSettings {
   int flag;
 
   ListBase actionmaps; /* XrActionMap */
-  short actactionmap;
-  short selactionmap;
-  char _pad3[4];
+  short act_actionmap;
+  short sel_actionmap;
+  char _pad3[2];
+
+  /** Objects to bind to headset/controller poses. */
+  short sel_mocap_object;
+  ListBase mocap_objects; /* #XrMotionCaptureObject */
 } XrSessionSettings;
 
 typedef enum eXrSessionFlag {
@@ -111,6 +115,11 @@ typedef enum eXrPoseFlag {
   XR_POSE_AIM = (1 << 1),
 } eXrPoseFlag;
 
+typedef enum eXrMotionCaptureFlag {
+  XR_MOCAP_OBJECT_ENABLE = (1 << 0),
+  XR_MOCAP_OBJECT_AUTOKEY = (1 << 1),
+} eXrMotionCaptureFlag;
+
 /**
  * The following user and component path lengths are dependent on OpenXR's XR_MAX_PATH_LENGTH
  * (256). A user path will be combined with a component path to identify an action binding, and
@@ -209,6 +218,24 @@ typedef struct XrActionMap {
 
 /* -------------------------------------------------------------------- */
 
+typedef struct XrMotionCaptureObject {
+  struct XrMotionCaptureObject *next, *prev;
+
+  /** Object to bind to a VR device. Used as struct identifier. */
+  Object *ob;
+  /** OpenXR user path, identifies the target headset/controller. */
+  char user_path[64]; /* XR_MAX_USER_PATH_LENGTH */
+
+  /** Location/rotation offsets. */
+  float location_offset[3];
+  float rotation_offset[3];
+
+  short flag; /* eXrMotionCaptureFlag */
+  char _pad[6];
+} XrMotionCaptureObject;
+
+/* -------------------------------------------------------------------- */
+
 #ifdef __cplusplus
 }
 #endif
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index 83eb92e6533..a606e57ba58 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -224,7 +224,7 @@ static void rna_XrActionMapBinding_name_update(Main *bmain, Scene *UNUSED(scene)
   wmWindowManager *wm = bmain->wm.first;
   if (wm) {
     XrActionMap *actionmap = BLI_findlink(&wm->xr.session_settings.actionmaps,
-                                          wm->xr.session_settings.selactionmap);
+                                          wm->xr.session_settings.sel_actionmap);
     if (actionmap) {
       XrActionMapItem *ami = BLI_findlink(&actionmap->items, actionmap->sel_item);
       if (ami) {
@@ -550,7 +550,7 @@ static void rna_XrActionMapItem_name_update(Main *bmain, Scene *UNUSED(scene), P
   wmWindowManager *wm = bmain->wm.first;
   if (wm) {
     XrActionMap *actionmap = BLI_findlink(&wm->xr.session_settings.actionmaps,
-                                          wm->xr.session_settings.selactionmap);
+                                          wm->xr.session_settings.sel_actionmap);
     if (actionmap) {
       XrActionMapItem *ami = ptr->data;
       WM_xr_actionmap_item_ensure_unique(actionmap, ami);
@@ -656,6 +656,126 @@ static void rna_XrActionMap_name_update(Main *bmain, Scene *UNUSED(scene), Point
 
 /** \} */
 
+/* -------------------------------------------------------------------- */
+/** \name XR Motion Capture
+ * \{ */
+
+static XrMotionCaptureObject *rna_XrMotionCaptureObject_new(XrSessionSettings *settings,
+                                                            PointerRNA *ob_ptr)
+{
+#  ifdef WITH_XR_OPENXR
+  Object *ob = ob_ptr->data;
+  return WM_xr_mocap_object_new(settings, ob);
+#  else
+  UNUSED_VARS(settings, ob_ptr);
+  return NULL;
+#  endif
+}
+
+static void rna_XrMotionCaptureObject_remove(XrSessionSettings *settings, PointerRNA *mocap_ob_ptr)
+{
+#  ifdef WITH_XR_OPENXR
+  XrMotionCaptureObject *mocap_ob = mocap_ob_ptr->data;
+  WM_xr_mocap_object_remove(settings, mocap_ob);
+  RNA_POINTER_INVALIDATE(mocap_ob_ptr);
+#  else
+  UNUSED_VARS(settings, mocap_ob_ptr);
+#  endif
+}
+
+static XrMotionCaptureObject *rna_XrMotionCaptureObject_find(X

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list