[Bf-blender-cvs] [8916a04df89] xr-actions-D9124: XR: Restore XR object transforms at session end

Peter Kim noreply at git.blender.org
Thu Nov 26 05:33:34 CET 2020


Commit: 8916a04df8924d0af843a92cfaacafb945b563fa
Author: Peter Kim
Date:   Wed Nov 25 22:51:58 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB8916a04df8924d0af843a92cfaacafb945b563fa

XR: Restore XR object transforms at session end

If an object was constrained to a headset/controller pose during the
session, then its original transform will be restored at session end
to prevent unwanted changes to the scene. This will also occur when
toggling the constraint or changing the constrained object.

===================================================================

M	source/blender/makesrna/intern/CMakeLists.txt
M	source/blender/makesrna/intern/rna_xr.c
M	source/blender/windowmanager/xr/intern/wm_xr_intern.h
M	source/blender/windowmanager/xr/intern/wm_xr_session.c

===================================================================

diff --git a/source/blender/makesrna/intern/CMakeLists.txt b/source/blender/makesrna/intern/CMakeLists.txt
index d638d6f66cc..16a7864c0d1 100644
--- a/source/blender/makesrna/intern/CMakeLists.txt
+++ b/source/blender/makesrna/intern/CMakeLists.txt
@@ -351,6 +351,9 @@ if(WITH_INPUT_NDOF)
 endif()
 
 if(WITH_XR_OPENXR)
+  list(APPEND INC
+    ../../windowmanager/xr
+  )
   add_definitions(-DWITH_XR_OPENXR)
 endif()
 
diff --git a/source/blender/makesrna/intern/rna_xr.c b/source/blender/makesrna/intern/rna_xr.c
index 06ba291f229..7a2b80c5402 100644
--- a/source/blender/makesrna/intern/rna_xr.c
+++ b/source/blender/makesrna/intern/rna_xr.c
@@ -41,6 +41,8 @@
 #  include "WM_api.h"
 
 #  ifdef WITH_XR_OPENXR
+#    include "xr/intern/wm_xr_intern.h"
+
 static wmXrData *rna_XrSession_wm_xr_data_get(PointerRNA *ptr)
 {
   /* Callers could also get XrSessionState pointer through ptr->data, but prefer if we just
@@ -107,6 +109,30 @@ static void rna_XrSessionSettings_use_absolute_tracking_set(PointerRNA *ptr, boo
 #  endif
 }
 
+static void rna_XrSessionSettings_headset_object_set(PointerRNA *ptr,
+                                                     PointerRNA value,
+                                                     struct ReportList *UNUSED(reports))
+{
+#  ifdef WITH_XR_OPENXR
+  wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+  Object *ob = value.data;
+  if (WM_xr_session_exists(xr)) {
+    if (xr->session_settings.headset_object) {
+      /* Restore previous object's original pose. */
+      wm_xr_session_object_pose_set(&xr->runtime->session_state.headset_object_orig_pose,
+                                    xr->session_settings.headset_object);
+    }
+    if (ob) {
+      /* Store new object's original pose. */
+      wm_xr_session_object_pose_get(ob, &xr->runtime->session_state.headset_object_orig_pose);
+    }
+  }
+  xr->session_settings.headset_object = ob;
+#  else
+  UNUSED_VARS(ptr, value);
+#  endif
+}
+
 static bool rna_XrSessionSettings_headset_object_enable_get(PointerRNA *ptr)
 {
 #  ifdef WITH_XR_OPENXR
@@ -128,6 +154,17 @@ static void rna_XrSessionSettings_headset_object_enable_set(PointerRNA *ptr, boo
   else {
     xr->session_settings.headset_flag &= (~XR_OBJECT_ENABLE);
   }
+
+  /* Store/restore object's original pose. */
+  Object *ob = xr->session_settings.headset_object;
+  if (ob && WM_xr_session_exists(xr)) {
+    if (value) {
+      wm_xr_session_object_pose_get(ob, &xr->runtime->session_state.headset_object_orig_pose);
+    }
+    else {
+      wm_xr_session_object_pose_set(&xr->runtime->session_state.headset_object_orig_pose, ob);
+    }
+  }
 #  else
   UNUSED_VARS(ptr, value);
 #  endif
@@ -159,6 +196,30 @@ static void rna_XrSessionSettings_headset_object_autokey_set(PointerRNA *ptr, bo
 #  endif
 }
 
+static void rna_XrSessionSettings_controller0_object_set(PointerRNA *ptr,
+                                                         PointerRNA value,
+                                                         struct ReportList *UNUSED(reports))
+{
+#  ifdef WITH_XR_OPENXR
+  wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+  Object *ob = value.data;
+  if (WM_xr_session_exists(xr)) {
+    if (xr->session_settings.controller0_object) {
+      /* Restore previous object's original pose. */
+      wm_xr_session_object_pose_set(&xr->runtime->session_state.controller0_object_orig_pose,
+                                    xr->session_settings.controller0_object);
+    }
+    if (ob) {
+      /* Store new object's original pose. */
+      wm_xr_session_object_pose_get(ob, &xr->runtime->session_state.controller0_object_orig_pose);
+    }
+  }
+  xr->session_settings.controller0_object = ob;
+#  else
+  UNUSED_VARS(ptr, value);
+#  endif
+}
+
 static bool rna_XrSessionSettings_controller0_object_enable_get(PointerRNA *ptr)
 {
 #  ifdef WITH_XR_OPENXR
@@ -180,6 +241,17 @@ static void rna_XrSessionSettings_controller0_object_enable_set(PointerRNA *ptr,
   else {
     xr->session_settings.controller0_flag &= (~XR_OBJECT_ENABLE);
   }
+
+  /* Store/restore object's original pose. */
+  Object *ob = xr->session_settings.controller0_object;
+  if (ob && WM_xr_session_exists(xr)) {
+    if (value) {
+      wm_xr_session_object_pose_get(ob, &xr->runtime->session_state.controller0_object_orig_pose);
+    }
+    else {
+      wm_xr_session_object_pose_set(&xr->runtime->session_state.controller0_object_orig_pose, ob);
+    }
+  }
 #  else
   UNUSED_VARS(ptr, value);
 #  endif
@@ -211,6 +283,30 @@ static void rna_XrSessionSettings_controller0_object_autokey_set(PointerRNA *ptr
 #  endif
 }
 
+static void rna_XrSessionSettings_controller1_object_set(PointerRNA *ptr,
+                                                         PointerRNA value,
+                                                         struct ReportList *UNUSED(reports))
+{
+#  ifdef WITH_XR_OPENXR
+  wmXrData *xr = rna_XrSession_wm_xr_data_get(ptr);
+  Object *ob = value.data;
+  if (WM_xr_session_exists(xr)) {
+    if (xr->session_settings.controller1_object) {
+      /* Restore previous object's original pose. */
+      wm_xr_session_object_pose_set(&xr->runtime->session_state.controller1_object_orig_pose,
+                                    xr->session_settings.controller1_object);
+    }
+    if (ob) {
+      /* Store new object's original pose. */
+      wm_xr_session_object_pose_get(ob, &xr->runtime->session_state.controller1_object_orig_pose);
+    }
+  }
+  xr->session_settings.controller1_object = ob;
+#  else
+  UNUSED_VARS(ptr, value);
+#  endif
+}
+
 static bool rna_XrSessionSettings_controller1_object_enable_get(PointerRNA *ptr)
 {
 #  ifdef WITH_XR_OPENXR
@@ -232,6 +328,17 @@ static void rna_XrSessionSettings_controller1_object_enable_set(PointerRNA *ptr,
   else {
     xr->session_settings.controller1_flag &= (~XR_OBJECT_ENABLE);
   }
+
+  /* Store/restore object's original pose. */
+  Object *ob = xr->session_settings.controller1_object;
+  if (ob && WM_xr_session_exists(xr)) {
+    if (value) {
+      wm_xr_session_object_pose_get(ob, &xr->runtime->session_state.controller1_object_orig_pose);
+    }
+    else {
+      wm_xr_session_object_pose_set(&xr->runtime->session_state.controller1_object_orig_pose, ob);
+    }
+  }
 #  else
   UNUSED_VARS(ptr, value);
 #  endif
@@ -797,6 +904,8 @@ static void rna_def_xr_session_settings(BlenderRNA *brna)
   RNA_def_property_update(prop, NC_WM | ND_XR_DATA_CHANGED, NULL);
 
   prop = RNA_def_property(srna, "headset_object", PROP_POINTER, PROP_NONE);
+  RNA_def_property_pointer_funcs(
+      prop, NULL, "rna_XrSessionSettings_headset_object_set", NULL, NULL);
   RNA_def_property_flag(prop, PROP_EDITABLE);
   RNA_def_property_ui_text(
       prop,
@@ -805,6 +914,8 @@ static void rna_def_xr_session_settings(BlenderRNA *brna)
   RNA_def_property_update(prop, NC_WM | ND_XR_DATA_CHANGED, NULL);
 
   prop = RNA_def_property(srna, "controller0_object", PROP_POINTER, PROP_NONE);
+  RNA_def_property_pointer_funcs(
+      prop, NULL, "rna_XrSessionSettings_controller0_object_set", NULL, NULL);
   RNA_def_property_flag(prop, PROP_EDITABLE);
   RNA_def_property_ui_text(
       prop,
@@ -813,6 +924,8 @@ static void rna_def_xr_session_settings(BlenderRNA *brna)
   RNA_def_property_update(prop, NC_WM | ND_XR_DATA_CHANGED, NULL);
 
   prop = RNA_def_property(srna, "controller1_object", PROP_POINTER, PROP_NONE);
+  RNA_def_property_pointer_funcs(
+      prop, NULL, "rna_XrSessionSettings_controller1_object_set", NULL, NULL);
   RNA_def_property_flag(prop, PROP_EDITABLE);
   RNA_def_property_ui_text(
       prop,
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_intern.h b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
index cff648f1341..7c1d3a56b39 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_intern.h
+++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
@@ -75,6 +75,11 @@ typedef struct wmXrSessionState {
    * on calls to wm_xr_session_actions_update().
    * If NULL, all action sets will be treated as active and updated. */
   struct wmXrActionSet *active_action_set;
+
+  /** Constraint object original poses. */
+  GHOST_XrPose headset_object_orig_pose;
+  GHOST_XrPose controller0_object_orig_pose;
+  GHOST_XrPose controller1_object_orig_pose;
 } wmXrSessionState;
 
 typedef struct wmXrRuntimeData {
@@ -183,6 +188,8 @@ void wm_xr_session_actions_uninit(wmXrData *xr);
 void wm_xr_session_controller_data_populate(const wmXrAction *controller_pose_action,
                                             wmXrSessionState *state);
 void wm_xr_session_controller_data_clear(wmXrSessionState *state);
+void wm_xr_session_object_pose_get(const Object *ob, GHOST_XrPose *pose);
+void wm_xr_session_object_pose_set(const GHOST_XrPose *pose, Object *ob);
 void wm_xr_session_object_autokey(struct bContext *C,
                                   struct Scene *scene,
                                   struct ViewLayer *view_layer,
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_session.c b/source/blender/windowmanager/xr/intern/wm_xr_session.c
index 024ef21b97d..caf5b9014ea 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_session.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_session.c
@@ -65,19 +65,49 @@ static CLG_LogRef LOG = {"wm.xr"};
 static void wm_xr_session_create_cb(void *customdata)
 {
   wmXrData *xr_data = customdata;
+  XrSessionSettings *settings = &xr_data->session_settings;
+  wmXrSessionState *state = &xr_data->runtime->session_state;
   Main *bmain = CTX_data_main(xr_data->runtime->bcontext);
 
   /* Get action set data from Python. */
   BKE_callback_exec_null(bmain, BKE_CB_EVT_XR_SESSION_START_PRE);
 
   wm_xr_session_actions_init(xr_data);
+
+  /* Store constraint object poses. */
+  if (settings->headset_object) {
+    wm_xr_session_object_pose_get(settings->headset_object, &state->headset_object_orig_pose);
+  }
+  if (settings->controller0_object) {
+    wm_xr_session_object_pose_get(settings->controller0_object,
+                                  &state->controller0_object_orig_pose);
+  }
+  if (settings->controller1_object) {
+    wm_xr_session_object_pose_get(settings->controller1_object,
+                                  &state->controller1_object_orig_pose);
+ 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list