[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