[Bf-blender-cvs] [73daf1f7219] xr-actions-D9124: XR: Support auto keying XR constraint objects
Peter Kim
noreply at git.blender.org
Tue Nov 3 10:50:53 CET 2020
Commit: 73daf1f72193f59aec16c284a2519702ec153ac4
Author: Peter Kim
Date: Tue Nov 3 17:37:41 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB73daf1f72193f59aec16c284a2519702ec153ac4
XR: Support auto keying XR constraint objects
If specified, headset / controller objects will auto key on animation
playback. This can be useful for virtual camera applications.
===================================================================
M source/blender/editors/transform/transform_convert.h
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/xr/intern/wm_xr_session.c
===================================================================
diff --git a/source/blender/editors/transform/transform_convert.h b/source/blender/editors/transform/transform_convert.h
index b753572ea7b..50c55745fac 100644
--- a/source/blender/editors/transform/transform_convert.h
+++ b/source/blender/editors/transform/transform_convert.h
@@ -28,10 +28,12 @@ struct BezTriple;
struct FCurve;
struct ListBase;
struct Object;
+struct Scene;
struct TransData;
struct TransDataContainer;
struct TransDataCurveHandleFlags;
struct TransInfo;
+struct ViewLayer;
struct bContext;
struct bKinematicConstraint;
struct bPoseChannel;
@@ -163,6 +165,9 @@ void special_aftertrans_update__node(bContext *C, TransInfo *t);
/* transform_convert_object.c */
void createTransObject(bContext *C, TransInfo *t);
void createTransTexspace(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_object.c b/source/blender/editors/transform/transform_convert_object.c
index 90ffccfdd7b..96bb6485bc9 100644
--- a/source/blender/editors/transform/transform_convert_object.c
+++ b/source/blender/editors/transform/transform_convert_object.c
@@ -784,8 +784,7 @@ void createTransTexspace(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(
- bContext *C, Scene *scene, ViewLayer *view_layer, Object *ob, int tmode)
+void autokeyframe_object(bContext *C, Scene *scene, ViewLayer *view_layer, Object *ob, int tmode)
{
Main *bmain = CTX_data_main(C);
ID *id = &ob->id;
@@ -906,7 +905,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 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),
diff --git a/source/blender/makesdna/DNA_xr_types.h b/source/blender/makesdna/DNA_xr_types.h
index 1e8aefbe532..3980b49e5e7 100644
--- a/source/blender/makesdna/DNA_xr_types.h
+++ b/source/blender/makesdna/DNA_xr_types.h
@@ -52,6 +52,11 @@ typedef struct XrSessionSettings {
Object *headset_object;
Object *controller0_object;
Object *controller1_object;
+
+ char headset_flag;
+ char controller0_flag;
+ char controller1_flag;
+ char _pad3[5];
} XrSessionSettings;
typedef enum eXrSessionFlag {
@@ -68,3 +73,8 @@ typedef enum eXrSessionEye {
XR_EYE_LEFT = 0,
XR_EYE_RIGHT = 1,
} eXrSessionEye;
+
+typedef enum eXrSessionObjectFlag {
+ XR_OBJECT_ENABLE = (1 << 0),
+ XR_OBJECT_AUTOKEY = (1 << 1),
+} eXrSessionObjectFlag;
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index a0f11520061..83a7ff7eb26 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -40,6 +40,177 @@
# include "WM_api.h"
+# ifdef WITH_XR_OPENXR
+static wmXrData *rna_XrSession_wm_xr_data_get(PointerRNA *ptr)
+{
+ /* Callers could also get XrSessionState pointer through ptr->data, but prefer if we just
+ * consistently pass wmXrData pointers to the WM_xr_xxx() API. */
+
+ BLI_assert((ptr->type == &RNA_XrSessionSettings) || (ptr->type == &RNA_XrSessionState));
+
+ wmWindowManager *wm = (wmWindowManager *)ptr->owner_id;
+ BLI_assert(wm && (GS(wm->id.name) == ID_WM));
+
+ return &wm->xr;
+}
+# endif
+
+static bool rna_XrSessionSettings_headset_object_enable_get(PointerRNA *ptr)
+{
+# ifdef WITH_XR_OPENXR
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ return (xr->session_settings.headset_flag & XR_OBJECT_ENABLE) != 0;
+# else
+ UNUSED_VARS(ptr);
+ return false;
+# endif
+}
+
+static void rna_XrSessionSettings_headset_object_enable_set(PointerRNA *ptr, bool value)
+{
+# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ if (value) {
+ xr->session_settings.headset_flag |= XR_OBJECT_ENABLE;
+ }
+ else {
+ xr->session_settings.headset_flag &= (~XR_OBJECT_ENABLE);
+ }
+# else
+ UNUSED_VARS(ptr, value);
+# endif
+}
+
+static bool rna_XrSessionSettings_headset_object_autokey_get(PointerRNA *ptr)
+{
+# ifdef WITH_XR_OPENXR
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ return (xr->session_settings.headset_flag & XR_OBJECT_AUTOKEY) != 0;
+# else
+ UNUSED_VARS(ptr);
+ return false;
+# endif
+}
+
+static void rna_XrSessionSettings_headset_object_autokey_set(PointerRNA *ptr, bool value)
+{
+# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ if (value) {
+ xr->session_settings.headset_flag |= XR_OBJECT_AUTOKEY;
+ }
+ else {
+ xr->session_settings.headset_flag &= (~XR_OBJECT_AUTOKEY);
+ }
+# else
+ UNUSED_VARS(ptr, value);
+# endif
+}
+
+static bool rna_XrSessionSettings_controller0_object_enable_get(PointerRNA *ptr)
+{
+# ifdef WITH_XR_OPENXR
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ return (xr->session_settings.controller0_flag & XR_OBJECT_ENABLE) != 0;
+# else
+ UNUSED_VARS(ptr);
+ return false;
+# endif
+}
+
+static void rna_XrSessionSettings_controller0_object_enable_set(PointerRNA *ptr, bool value)
+{
+# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ if (value) {
+ xr->session_settings.controller0_flag |= XR_OBJECT_ENABLE;
+ }
+ else {
+ xr->session_settings.controller0_flag &= (~XR_OBJECT_ENABLE);
+ }
+# else
+ UNUSED_VARS(ptr, value);
+# endif
+}
+
+static bool rna_XrSessionSettings_controller0_object_autokey_get(PointerRNA *ptr)
+{
+# ifdef WITH_XR_OPENXR
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ return (xr->session_settings.controller0_flag & XR_OBJECT_AUTOKEY) != 0;
+# else
+ UNUSED_VARS(ptr);
+ return false;
+# endif
+}
+
+static void rna_XrSessionSettings_controller0_object_autokey_set(PointerRNA *ptr, bool value)
+{
+# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ if (value) {
+ xr->session_settings.controller0_flag |= XR_OBJECT_AUTOKEY;
+ }
+ else {
+ xr->session_settings.controller0_flag &= (~XR_OBJECT_AUTOKEY);
+ }
+# else
+ UNUSED_VARS(ptr, value);
+# endif
+}
+
+static bool rna_XrSessionSettings_controller1_object_enable_get(PointerRNA *ptr)
+{
+# ifdef WITH_XR_OPENXR
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ return (xr->session_settings.controller1_flag & XR_OBJECT_ENABLE) != 0;
+# else
+ UNUSED_VARS(ptr);
+ return false;
+# endif
+}
+
+static void rna_XrSessionSettings_controller1_object_enable_set(PointerRNA *ptr, bool value)
+{
+# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ if (value) {
+ xr->session_settings.controller1_flag |= XR_OBJECT_ENABLE;
+ }
+ else {
+ xr->session_settings.controller1_flag &= (~XR_OBJECT_ENABLE);
+ }
+# else
+ UNUSED_VARS(ptr, value);
+# endif
+}
+
+static bool rna_XrSessionSettings_controller1_object_autokey_get(PointerRNA *ptr)
+{
+# ifdef WITH_XR_OPENXR
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ return (xr->session_settings.controller1_flag & XR_OBJECT_AUTOKEY) != 0;
+# else
+ UNUSED_VARS(ptr);
+ return false;
+# endif
+}
+
+static void rna_XrSessionSettings_controller1_object_autokey_set(PointerRNA *ptr, bool value)
+{
+# ifdef WITH_XR_OPENXR
+ wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+ if (value) {
+ xr->session_settings.controller1_flag |= XR_OBJECT_AUTOKEY;
+ }
+ else {
+ xr->session_settings.controller1_flag &= (~XR_OBJECT_AUTOKEY);
+ }
+# else
+ UNUSED_VARS(ptr, value);
+# endif
+}
+
static bool rna_XrSessionState_is_running(bContext *C)
{
# ifdef WITH_XR_OPENXR
@@ -363,25 +534,10 @@ bool rna_XrSessionState_haptic_action_apply(bContext *C,
# endif
}
-# ifdef WITH_XR_OPENXR
-static wmXrData *rna_XrSessionState_wm_xr_data_get(PointerRNA *ptr)
-{
- /* Callers could also get XrSessionState pointer through ptr->data, but prefer if we just
- * consistently pass wmXrData pointers to the WM_xr_xxx() API. */
-
- BLI_assert(ptr->type == &RNA_XrSessionState);
-
- wmWindowManager *wm = (wmWindowManager *)ptr->owner_id;
- BLI_assert(wm && (GS(wm->id.name) == ID_WM));
-
- return &wm->xr;
-}
-# endif
-
static void rna_XrSessionState_viewer_pose_location_get(PointerRNA *ptr, float *r_values)
{
# ifdef WITH_XR_OPENXR
- const wmXrData *xr = rna_XrSessionState_wm_xr_data_get(ptr);
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
WM_xr_session_state_viewer_pose_location_get(xr, r_values);
# else
UNUSED_VARS(ptr);
@@ -392,7 +548,7 @@ static void rna_XrSessionState_viewer_pose_location_get(PointerRNA *ptr, float *
static void rna_XrSessionState_viewer_pose_rotation_get(PointerRNA *ptr, float *r_values)
{
# ifdef WITH_XR_OPENXR
- const wmXrData *xr = rna_XrSessionState_wm_xr_data_get(ptr);
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
WM_xr_session_state_viewer_pose_rotation_get(xr, r_values);
# else
UNUSED_VARS(ptr);
@@ -403,7 +559,7 @@ static void rna_XrSessionState_viewer_pose_rotation_get(PointerRNA *ptr, float *
static void rna_XrSessionState_controller_pose0_location_get(PointerRNA *ptr, float *r_values)
{
# ifdef WITH_XR_OPENXR
- const wmXrData *xr = rna_XrSessionState_wm_xr_data_get(ptr);
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
WM_xr_session_state_controller_pose_location_get(xr, 0, r_values);
# else
UNUSED_VARS(ptr);
@@ -414,7 +570,7 @@ static void rna_XrSessionState_controller_pose0_location_get(PointerRNA *ptr, fl
static void rna_XrSessionState_controller_pose0_rotation_get(PointerRNA *ptr, float *r_values)
{
# ifdef WITH_XR_OPENXR
- const wmXrData *xr = rna_XrSessionState_wm_xr_data_get(ptr);
+ const wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
WM_xr_session_state_controller_pose_rotat
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-blender-cvs
mailing list