[Bf-blender-cvs] [5fd158bb870] xr-controller-support: XR: Refactor motion capture objects

Peter Kim noreply at git.blender.org
Thu Aug 26 12:55:05 CEST 2021


Commit: 5fd158bb870ade1127295789b358e025c71cbb56
Author: Peter Kim
Date:   Thu Aug 26 19:14:47 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rB5fd158bb870ade1127295789b358e025c71cbb56

XR: Refactor motion capture objects

This refactors the feature of binding objects to controllers
and recording auto-keyframes, or "motion capture objects", by
providing a more complete API for managing objects and moving the
implementation out of wm_xr_session.c and into its own file
(wm_xr_mocap.c).

In addition, motion capture objects are now stored as a dynamic array
instead of a fixed array, which was previously hard-coded for
specific devices. Each entry in this dynamic array is uniquely
identified by an Object pointer and is mapped to a VR device via an
OpenXR user path. For example, an object can be bound to the headset
via "/user/head", and the left controller via "/user/hand/left".

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

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.h
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/xr/intern/wm_xr_intern.h
A	source/blender/windowmanager/xr/intern/wm_xr_mocap.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/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 90f55808bb0..ac4d2000817 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -2764,14 +2764,11 @@ 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);
 
-  xr_data->session_settings.headset_object = restore_pointer_by_name(
-      id_map, (ID *)xr_data->session_settings.headset_object, USER_REAL);
-
-  xr_data->session_settings.controller0_object = restore_pointer_by_name(
-      id_map, (ID *)xr_data->session_settings.controller0_object, USER_REAL);
-
-  xr_data->session_settings.controller1_object = restore_pointer_by_name(
-      id_map, (ID *)xr_data->session_settings.controller1_object, USER_REAL);
+  LISTBASE_FOREACH (XrMotionCaptureObject *, mocap_ob, &xr_data->session_settings.mocap_objects) {
+    if (mocap_ob->ob) {
+      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 cb6fb0dba60..a4db6ccb2cd 100644
--- a/source/blender/editors/include/ED_transform.h
+++ b/source/blender/editors/include/ED_transform.h
@@ -31,8 +31,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);
@@ -191,6 +193,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 094ae080de0..eed80acba3e 100644
--- a/source/blender/editors/transform/transform_convert.c
+++ b/source/blender/editors/transform/transform_convert.c
@@ -1584,11 +1584,9 @@ void transform_convert_clip_mirror_modifier_apply(TransDataContainer *tc)
 }
 
 /* for the realtime animation recording feature, handle overlapping data */
-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.h b/source/blender/editors/transform/transform_convert.h
index a817a9cf4e2..4f28fff27df 100644
--- a/source/blender/editors/transform/transform_convert.h
+++ b/source/blender/editors/transform/transform_convert.h
@@ -30,11 +30,9 @@ struct BezTriple;
 struct FCurve;
 struct ListBase;
 struct Object;
-struct Scene;
 struct TransData;
 struct TransDataCurveHandleFlags;
 struct TransInfo;
-struct ViewLayer;
 struct bContext;
 
 /* transform_convert.c */
@@ -69,7 +67,6 @@ struct TransDataCurveHandleFlags *initTransDataCurveHandles(TransData *td, struc
 char transform_convert_frame_side_dir_get(TransInfo *t, float cframe);
 bool FrameOnMouseSide(char side, float frame, float cframe);
 void transform_convert_clip_mirror_modifier_apply(TransDataContainer *tc);
-void animrecord_check_state(TransInfo *t, struct Object *ob);
 
 /* transform_convert_action.c */
 void createTransActionData(bContext *C, TransInfo *t);
@@ -197,9 +194,6 @@ void special_aftertrans_update__node(bContext *C, TransInfo *t);
 
 /* transform_convert_object.c */
 void createTransObject(bContext *C, TransInfo *t);
-void autokeyframe_object(
-    bContext *C, struct Scene *scene, struct ViewLayer *view_layer, Object *ob, int tmode);
-bool motionpath_need_update_object(Scene *scene, Object *ob);
 void recalcData_objects(TransInfo *t);
 void special_aftertrans_update__object(bContext *C, TransInfo *t);
 
diff --git a/source/blender/editors/transform/transform_convert_armature.c b/source/blender/editors/transform/transform_convert_armature.c
index f56d60b7376..d8e6d9f75d4 100644
--- a/source/blender/editors/transform/transform_convert_armature.c
+++ b/source/blender/editors/transform/transform_convert_armature.c
@@ -1453,7 +1453,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 3e9d8b48cc3..63d59fd08f3 100644
--- a/source/blender/editors/transform/transform_convert_object.c
+++ b/source/blender/editors/transform/transform_convert_object.c
@@ -728,7 +728,8 @@ 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.
  */
-void autokeyframe_object(bContext *C, Scene *scene, ViewLayer *view_layer, Object *ob, int tmode)
+void ED_transform_autokeyframe_object(
+    bContext *C, Scene *scene, ViewLayer *view_layer, Object *ob, int tmode)
 {
   Main *bmain = CTX_data_main(C);
   ID *id = &ob->id;
@@ -849,7 +850,7 @@ void autokeyframe_object(bContext *C, Scene *scene, ViewLayer *view_layer, Objec
 
 /* Return if we need to update motion paths, only if they already exist,
  * and we will insert a keyframe at the end of transform. */
-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),
@@ -894,11 +895,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
@@ -970,10 +971,10 @@ void special_aftertrans_update__object(bContext *C, TransInfo *t)
 
     /* Set autokey 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 b307eca7a33..57347c3d710 100644
--- a/source/blender/makesdna/DNA_xr_types.h
+++ b/source/blender/makesdna/DNA_xr_types.h
@@ -48,16 +48,15 @@ typedef struct XrSessionSettings {
   char controller_draw_style;
   /** The eye (view) used when projecting 3D to 2D (e.g. when performing GPU select). */
   char selection_eye;
-
   char _pad2;
 
   /** Clipping distance. */
   float clip_start, clip_end;
 
-  int flag;
+  int flag; /* eXrSessionFlag */
 
   /** Known action configurations. */
-  ListBase actionconfigs;
+  ListBase actionconfigs; /* XrActionConfig */
   /** Default configuration. */
   struct XrActionConfig *defaultconf;
   /** Addon configuration. */
@@ -65,14 +64,10 @@ typedef struct XrSessionSettings {
   /** User configuration. */
   struct XrActionConfig *userconf;
 
-  /** Objects to constrain to XR headset/controller poses. */
-  Object *headset_object;
-  Object *controller0_object;
-  Object *controller1_object;
-  char headset_flag;
-  char controller0_flag;
-  char controller1_flag;
-  char _pad3[5];
+  /** Objects to bind to headset/controller poses. */
+  ListBase mocap_objects; /* XrMotionCaptureObject */
+  short sel_mocap_object;
+  char _pad3[6];
 } XrSessionSettings;
 
 typedef enum eXrSessionFlag {
@@ -98,11 +93,6 @@ typedef enum eXrSessionEye {
   XR_EYE_RIGHT = 1,
 } eXrSessionEye;
 
-typedef enum eXrSessionObjectFlag {
-  XR_OBJECT_ENABLE = (1 << 0),
-  XR_OBJECT_AUTOKEY = (1 << 1),
-} eXrSessionObjectFlag;
-
 /** XR action type. Enum values match those in GHOST_XrActionType enum for consistency. */
 typedef enum eXrActionType {
   XR_BOOLEAN_INPUT = 1,
@@ -153,6 +143,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),
+} eXrMotionCaptureF

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list