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. @@ _______________________________________________ Bf-blender-cvs mailing list [email protected] List details, subscription details or unsubscribe: https://lists.blender.org/mailman/listinfo/bf-blender-cvs
