[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