[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