[Bf-blender-cvs] [65804b203ec] xr-controller-support: XR: Add location/rotation locks for navigation

Peter Kim noreply at git.blender.org
Sat Jun 19 11:19:47 CEST 2021


Commit: 65804b203ec5111d79d1cf7bd4a9c94f8baf5191
Author: Peter Kim
Date:   Sat Jun 19 18:12:43 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rB65804b203ec5111d79d1cf7bd4a9c94f8baf5191

XR: Add location/rotation locks for navigation

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

M	source/blender/windowmanager/xr/intern/wm_xr_intern.h
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/windowmanager/xr/intern/wm_xr_intern.h b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
index 7a8320ab3d6..74235137273 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_intern.h
+++ b/source/blender/windowmanager/xr/intern/wm_xr_intern.h
@@ -209,6 +209,6 @@ void wm_xr_pose_to_mat(const GHOST_XrPose *pose, float r_mat[4][4]);
 void wm_xr_pose_scale_to_mat(const GHOST_XrPose *pose, float scale, float r_mat[4][4]);
 void wm_xr_pose_to_imat(const GHOST_XrPose *pose, float r_imat[4][4]);
 void wm_xr_pose_scale_to_imat(const GHOST_XrPose *pose, float scale, float r_imat[4][4]);
-;
+
 void wm_xr_draw_view(const GHOST_XrDrawViewInfo *draw_view, void *customdata);
 void wm_xr_draw_controllers(const struct bContext *C, struct ARegion *region, void *customdata);
diff --git a/source/blender/windowmanager/xr/intern/wm_xr_operators.c b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
index d0915b87f13..c9d5a8de0c7 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -200,100 +200,116 @@ static void wm_xr_grab_update(wmOperator *op, const wmXrActionData *actiondata)
   }
 }
 
-static void wm_xr_grab_compute(const wmXrActionData *actiondata,
-                               const XrGrabData *data,
-                               const Object *obedit,
-                               bool reverse,
-                               bool loc_lock,
-                               bool rot_lock,
-                               float r_delta[4][4])
+static void orient_mat_z_normalized(float R[4][4], const float z_axis[3])
 {
-  float m0[4][4], m1[4][4];
+  const float scale = len_v3(R[0]);
+  float x_axis[3], y_axis[3];
 
-  if (obedit) {
-    float m2[4][4];
+  cross_v3_v3v3(y_axis, z_axis, R[0]);
+  normalize_v3(y_axis);
+  mul_v3_v3fl(R[1], y_axis, scale);
 
-    if (rot_lock) {
-      unit_m4(m0);
-      copy_v3_v3(m0[3], reverse ? actiondata->controller_loc : data->mat_prev[3]);
-      mul_m4_m4m4(m1, obedit->imat, m0);
-      invert_m4(m1);
+  cross_v3_v3v3(x_axis, R[1], z_axis);
+  normalize_v3(x_axis);
+  mul_v3_v3fl(R[0], x_axis, scale);
 
-      copy_v3_v3(m0[3], reverse ? data->mat_prev[3] : actiondata->controller_loc);
-      mul_m4_m4m4(m2, obedit->imat, m0);
+  mul_v3_v3fl(R[2], z_axis, scale);
+}
 
-      mul_m4_m4m4(r_delta, m2, m1);
-    }
-    else {
-      if (reverse) {
-        quat_to_mat4(m0, actiondata->controller_rot);
-        copy_v3_v3(m0[3], actiondata->controller_loc);
-        mul_m4_m4m4(m1, obedit->imat, m0);
-        invert_m4(m1);
+static void wm_xr_grab_navlocks_apply(const float nav_mat[4][4],
+                                      const float nav_inv[4][4],
+                                      bool loc_lock,
+                                      bool locz_lock,
+                                      bool rotz_lock,
+                                      float r_prev[4][4],
+                                      float r_curr[4][4])
+{
+  /* Locked in base pose coordinates. */
+  float prev_base[4][4], curr_base[4][4];
 
-        mul_m4_m4m4(m2, obedit->imat, data->mat_prev);
+  mul_m4_m4m4(prev_base, nav_inv, r_prev);
+  mul_m4_m4m4(curr_base, nav_inv, r_curr);
 
-        mul_m4_m4m4(r_delta, m2, m1);
-      }
-      else {
-        mul_m4_m4m4(m1, obedit->imat, data->mat_prev);
-        invert_m4(m1);
+  if (rotz_lock) {
+    const float z_axis[3] = {0.0f, 0.0f, 1.0f};
+    orient_mat_z_normalized(prev_base, z_axis);
+    orient_mat_z_normalized(curr_base, z_axis);
+  }
 
-        quat_to_mat4(m0, actiondata->controller_rot);
-        copy_v3_v3(m0[3], actiondata->controller_loc);
-        mul_m4_m4m4(m2, obedit->imat, m0);
+  if (loc_lock) {
+    copy_v3_v3(curr_base[3], prev_base[3]);
+  }
+  else if (locz_lock) {
+    curr_base[3][2] = prev_base[3][2];
+  }
 
-        mul_m4_m4m4(r_delta, m2, m1);
-      }
+  mul_m4_m4m4(r_prev, nav_mat, prev_base);
+  mul_m4_m4m4(r_curr, nav_mat, curr_base);
+}
 
-      if (loc_lock) {
-        zero_v3(r_delta[3]);
-      }
-    }
+static void wm_xr_grab_compute(const wmXrActionData *actiondata,
+                               const XrGrabData *data,
+                               const Object *obedit,
+                               const float nav_mat[4][4],
+                               const float nav_inv[4][4],
+                               bool reverse,
+                               bool loc_lock,
+                               bool locz_lock,
+                               bool rot_lock,
+                               bool rotz_lock,
+                               float r_delta[4][4])
+{
+  const bool nav_lock = (nav_mat && nav_inv);
+  float prev[4][4], curr[4][4];
+
+  if (!rot_lock) {
+    copy_m4_m4(prev, data->mat_prev);
+    zero_v3(prev[3]);
+    quat_to_mat4(curr, actiondata->controller_rot);
   }
   else {
-    if (rot_lock) {
-      unit_m4(m0);
-      copy_v3_v3(m0[3], reverse ? actiondata->controller_loc : data->mat_prev[3]);
-      invert_m4_m4(m1, m0);
-
-      copy_v3_v3(m0[3], reverse ? data->mat_prev[3] : actiondata->controller_loc);
-
-      mul_m4_m4m4(r_delta, m0, m1);
-    }
-    else {
-      if (reverse) {
-        quat_to_mat4(m1, actiondata->controller_rot);
-        copy_v3_v3(m1[3], actiondata->controller_loc);
-        invert_m4(m1);
+    unit_m4(prev);
+    unit_m4(curr);
+  }
 
-        mul_m4_m4m4(r_delta, data->mat_prev, m1);
-      }
-      else {
-        invert_m4_m4(m1, data->mat_prev);
+  if (!loc_lock || nav_lock) {
+    copy_v3_v3(prev[3], data->mat_prev[3]);
+    copy_v3_v3(curr[3], actiondata->controller_loc);
+  }
 
-        quat_to_mat4(m0, actiondata->controller_rot);
-        copy_v3_v3(m0[3], actiondata->controller_loc);
+  if (obedit) {
+    mul_m4_m4m4(prev, obedit->imat, prev);
+    mul_m4_m4m4(curr, obedit->imat, curr);
+  }
 
-        mul_m4_m4m4(r_delta, m0, m1);
-      }
+  if (nav_lock) {
+    wm_xr_grab_navlocks_apply(nav_mat, nav_inv, loc_lock, locz_lock, rotz_lock, prev, curr);
+  }
 
-      if (loc_lock) {
-        zero_v3(r_delta[3]);
-      }
-    }
+  if (reverse) {
+    invert_m4(curr);
+    mul_m4_m4m4(r_delta, prev, curr);
+  }
+  else {
+    invert_m4(prev);
+    mul_m4_m4m4(r_delta, curr, prev);
   }
 }
 
 static void wm_xr_grab_compute_bimanual(const wmXrActionData *actiondata,
                                         const XrGrabData *data,
                                         const Object *obedit,
+                                        const float nav_mat[4][4],
+                                        const float nav_inv[4][4],
                                         bool reverse,
                                         bool loc_lock,
+                                        bool locz_lock,
                                         bool rot_lock,
+                                        bool rotz_lock,
                                         bool scale_lock,
                                         float r_delta[4][4])
 {
+  const bool nav_lock = (nav_mat && nav_inv);
   float prev[4][4], curr[4][4];
   unit_m4(prev);
   unit_m4(curr);
@@ -329,7 +345,7 @@ static void wm_xr_grab_compute_bimanual(const wmXrActionData *actiondata,
     normalize_v3_v3(curr[2], z_axis_curr);
   }
 
-  if (!loc_lock) {
+  if (!loc_lock || nav_lock) {
     /* Translation: translation of the averaged controller locations. */
     add_v3_v3v3(prev[3], data->mat_prev[3], data->mat_other_prev[3]);
     mul_v3_fl(prev[3], 0.5f);
@@ -359,6 +375,10 @@ static void wm_xr_grab_compute_bimanual(const wmXrActionData *actiondata,
     mul_m4_m4m4(curr, obedit->imat, curr);
   }
 
+  if (nav_lock) {
+    wm_xr_grab_navlocks_apply(nav_mat, nav_inv, loc_lock, locz_lock, rotz_lock, prev, curr);
+  }
+
   if (reverse) {
     invert_m4(curr);
     mul_m4_m4m4(r_delta, prev, curr);
@@ -408,14 +428,18 @@ static int wm_xr_navigation_grab_modal_3d(bContext *C, wmOperator *op, const wmE
   XrGrabData *data = op->customdata;
   wmWindowManager *wm = CTX_wm_manager(C);
   wmXrData *xr = &wm->xr;
-  bool loc_lock, rot_lock, scale_lock;
+  bool loc_lock, locz_lock, rot_lock, rotz_lock, scale_lock;
   GHOST_XrPose nav_pose;
-  float nav_scale, nav_mat[4][4], delta[4][4], m[4][4];
+  float nav_scale, nav_mat[4][4], nav_inv[4][4], delta[4][4], m[4][4];
 
   PropertyRNA *prop = RNA_struct_find_property(op->ptr, "lock_location");
   loc_lock = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
+  prop = RNA_struct_find_property(op->ptr, "lock_location_z");
+  locz_lock = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
   prop = RNA_struct_find_property(op->ptr, "lock_rotation");
   rot_lock = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
+  prop = RNA_struct_find_property(op->ptr, "lock_rotation_z");
+  rotz_lock = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
   prop = RNA_struct_find_property(op->ptr, "lock_scale");
   scale_lock = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
 
@@ -425,38 +449,67 @@ static int wm_xr_navigation_grab_modal_3d(bContext *C, wmOperator *op, const wmE
                                 (actiondata->bimanual || !data->bimanual_prev);
 
   if (apply_navigation) {
+    const bool nav_lock = (loc_lock || locz_lock || rotz_lock);
+
     WM_xr_session_state_nav_location_get(xr, nav_pose.position);
     WM_xr_session_state_nav_rotation_get(xr, nav_pose.orientation_quat);
     WM_xr_session_state_nav_scale_get(xr, &nav_scale);
 
     wm_xr_pose_scale_to_mat(&nav_pose, nav_scale, nav_mat);
+    if (nav_lock) {
+      wm_xr_pose_scale_to_imat(&nav_pose, nav_scale, nav_inv);
+    }
 
     if (do_bimanual) {
-      wm_xr_grab_compute_bimanual(
-          actiondata, data, NULL, true, loc_lock, rot_lock, scale_lock, delta);
+      wm_xr_grab_compute_bimanual(actiondata,
+                                  data,
+                                  NULL,
+                                  nav_lock ? nav_mat : NULL,
+                                  nav_lock ? nav_inv : NULL,
+                                  true,
+                                  loc_lock,
+                                  locz_lock,
+                                  rot_lock,
+                 

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list