[Bf-blender-cvs] [3feb3a47079] xr-controller-support: XR: Fix grab interp/offsets for parented objects

Peter Kim noreply at git.blender.org
Fri Jul 9 04:30:09 CEST 2021


Commit: 3feb3a470794b8ac37032035f9fbe6134e71f2af
Author: Peter Kim
Date:   Fri Jul 9 11:23:02 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rB3feb3a470794b8ac37032035f9fbe6134e71f2af

XR: Fix grab interp/offsets for parented objects

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

M	source/blender/windowmanager/xr/intern/wm_xr_operators.c

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

diff --git a/source/blender/windowmanager/xr/intern/wm_xr_operators.c b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
index 5e05a2c71f8..75531076a5d 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -441,7 +441,7 @@ static int wm_xr_navigation_grab_modal_3d(bContext *C, wmOperator *op, const wmE
   wmXrData *xr = &wm->xr;
   bool loc_lock, locz_lock, rot_lock, rotz_lock, scale_lock;
   GHOST_XrPose nav_pose;
-  float nav_scale, nav_mat[4][4], nav_inv[4][4], delta[4][4], m[4][4];
+  float nav_scale, nav_mat[4][4], nav_inv[4][4], delta[4][4], out[4][4];
 
   PropertyRNA *prop = RNA_struct_find_property(op->ptr, "lock_location");
   loc_lock = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
@@ -499,15 +499,15 @@ static int wm_xr_navigation_grab_modal_3d(bContext *C, wmOperator *op, const wmE
                          delta);
     }
 
-    mul_m4_m4m4(m, delta, nav_mat);
+    mul_m4_m4m4(out, delta, nav_mat);
 
     /* Limit scale to reasonable values. */
-    nav_scale = len_v3(m[0]);
+    nav_scale = len_v3(out[0]);
 
     if (!(nav_scale < 0.001f || nav_scale > 1000.0f)) {
-      WM_xr_session_state_nav_location_set(xr, m[3]);
+      WM_xr_session_state_nav_location_set(xr, out[3]);
       if (!rot_lock) {
-        mat4_to_quat(nav_pose.orientation_quat, m);
+        mat4_to_quat(nav_pose.orientation_quat, out);
         normalize_qt(nav_pose.orientation_quat);
         WM_xr_session_state_nav_rotation_set(xr, nav_pose.orientation_quat);
       }
@@ -925,7 +925,7 @@ static int wm_xr_navigation_fly_modal_3d(bContext *C, wmOperator *op, const wmEv
   bool speed_interp_cubic = false;
   float speed, speed_max, speed_p0[2], speed_p1[2];
   GHOST_XrPose nav_pose;
-  float nav_mat[4][4], delta[4][4], m[4][4];
+  float nav_mat[4][4], delta[4][4], out[4][4];
 
   const float time_now = PIL_check_seconds_timer();
 
@@ -1082,11 +1082,11 @@ static int wm_xr_navigation_fly_modal_3d(bContext *C, wmOperator *op, const wmEv
     wm_xr_fly_compute_move(mode, speed, ref_quat, nav_mat, locz_lock, delta);
   }
 
-  mul_m4_m4m4(m, delta, nav_mat);
+  mul_m4_m4m4(out, delta, nav_mat);
 
-  WM_xr_session_state_nav_location_set(xr, m[3]);
+  WM_xr_session_state_nav_location_set(xr, out[3]);
   if (turn) {
-    mat4_to_quat(nav_pose.orientation_quat, m);
+    mat4_to_quat(nav_pose.orientation_quat, out);
     WM_xr_session_state_nav_rotation_set(xr, nav_pose.orientation_quat);
   }
 
@@ -1849,7 +1849,7 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
   }
 
   bool loc_lock, rot_lock, scale_lock;
-  float loc_t, rot_t, loc_ofs[3], rot_ofs[4];
+  float loc_t, rot_t, loc_ofs_orig[3], rot_ofs_orig[4];
   bool loc_ofs_set = false;
   bool rot_ofs_set = false;
 
@@ -1860,7 +1860,7 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
     loc_t = prop ? RNA_property_float_get(op->ptr, prop) : 0.0f;
     prop = RNA_struct_find_property(op->ptr, "location_offset");
     if (prop && RNA_property_is_set(op->ptr, prop)) {
-      RNA_property_float_get_array(op->ptr, prop, loc_ofs);
+      RNA_property_float_get_array(op->ptr, prop, loc_ofs_orig);
       loc_ofs_set = true;
     }
   }
@@ -1874,8 +1874,8 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
     if (prop && RNA_property_is_set(op->ptr, prop)) {
       float eul[3];
       RNA_property_float_get_array(op->ptr, prop, eul);
-      eul_to_quat(rot_ofs, eul);
-      normalize_qt(rot_ofs);
+      eul_to_quat(rot_ofs_orig, eul);
+      normalize_qt(rot_ofs_orig);
       rot_ofs_set = true;
     }
   }
@@ -1892,20 +1892,6 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
   BMEditMesh *em = (obedit && (obedit->type == OB_MESH)) ? BKE_editmesh_from_object(obedit) : NULL;
   bool selected = false;
 
-  if (loc_ofs_set) {
-    /* Convert to controller space. */
-    float m[3][3];
-    quat_to_mat3(m, actiondata->controller_rot);
-    mul_m3_v3(m, loc_ofs);
-  }
-  if (rot_ofs_set) {
-    /* Convert to controller space. */
-    float q[4];
-    invert_qt_qt_normalized(q, rot_ofs);
-    mul_qt_qtqt(rot_ofs, actiondata->controller_rot, q);
-    normalize_qt(rot_ofs);
-  }
-
   if (em) { /* TODO_XR: Non-mesh objects. */
     /* Check for selection. */
     Scene *scene = CTX_data_scene(C);
@@ -1945,17 +1931,61 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
     }
   }
   else {
-    float q0[4], q1[4], q2[4];
+    float controller_loc[3], controller_rot[4], controller_mat[4][4];
+    float loc_ofs[3], loc_ofs_controller[3], rot_ofs[4], rot_ofs_controller[4],
+        rot_ofs_orig_inv[4];
+    float q0[4], q1[4], q2[4], m0[4][4], m1[4][4], m2[4][4];
+
+    quat_to_mat4(controller_mat, actiondata->controller_rot);
+    copy_v3_v3(controller_mat[3], actiondata->controller_loc);
+
+    /* Convert offsets to controller space. */
+    if (loc_ofs_set) {
+      copy_v3_v3(loc_ofs_controller, loc_ofs_orig);
+      mul_qt_v3(actiondata->controller_rot, loc_ofs_controller);
+    }
+    if (rot_ofs_set) {
+      invert_qt_qt_normalized(rot_ofs_orig_inv, rot_ofs_orig);
+      mul_qt_qtqt(rot_ofs_controller, actiondata->controller_rot, rot_ofs_orig_inv);
+      normalize_qt(rot_ofs_controller);
+    }
 
     /* Apply interpolation and offsets. */
     CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
       bool update = false;
 
+      if (ob->parent) {
+        invert_m4_m4(m0, ob->parentinv);
+        mul_m4_m4m4(m1, ob->parent->imat, controller_mat);
+        mul_m4_m4m4(m2, m0, m1);
+        mat4_to_loc_quat(controller_loc, controller_rot, m2);
+
+        if (loc_ofs_set) {
+          copy_v3_v3(loc_ofs, loc_ofs_orig);
+          mul_qt_v3(controller_rot, loc_ofs);
+        }
+        if (rot_ofs_set) {
+          mul_qt_qtqt(rot_ofs, controller_rot, rot_ofs_orig_inv);
+          normalize_qt(rot_ofs);
+        }
+      }
+      else {
+        copy_v3_v3(controller_loc, actiondata->controller_loc);
+        copy_qt_qt(controller_rot, actiondata->controller_rot);
+
+        if (loc_ofs_set) {
+          copy_v3_v3(loc_ofs, loc_ofs_controller);
+        }
+        if (rot_ofs_set) {
+          copy_qt_qt(rot_ofs, rot_ofs_controller);
+        }
+      }
+
       if (!loc_lock) {
         if (loc_t > 0.0f) {
-          ob->loc[0] += loc_t * (actiondata->controller_loc[0] - ob->loc[0]);
-          ob->loc[1] += loc_t * (actiondata->controller_loc[1] - ob->loc[1]);
-          ob->loc[2] += loc_t * (actiondata->controller_loc[2] - ob->loc[2]);
+          ob->loc[0] += loc_t * (controller_loc[0] - ob->loc[0]);
+          ob->loc[1] += loc_t * (controller_loc[1] - ob->loc[1]);
+          ob->loc[2] += loc_t * (controller_loc[2] - ob->loc[2]);
           update = true;
         }
         if (loc_ofs_set) {
@@ -1967,7 +1997,7 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
       if (!rot_lock) {
         if (rot_t > 0.0f) {
           eul_to_quat(q1, ob->rot);
-          interp_qt_qtqt(q0, q1, actiondata->controller_rot, rot_t);
+          interp_qt_qtqt(q0, q1, controller_rot, rot_t);
           if (!rot_ofs_set) {
             quat_to_eul(ob->rot, q0);
           }
@@ -1980,7 +2010,7 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
           rotation_between_quats_to_quat(q1, rot_ofs, q0);
           mul_qt_qtqt(q0, rot_ofs, q1);
           normalize_qt(q0);
-          mul_qt_qtqt(q2, actiondata->controller_rot, q1);
+          mul_qt_qtqt(q2, controller_rot, q1);
           normalize_qt(q2);
           rotation_between_quats_to_quat(q1, q0, q2);
 
@@ -2120,7 +2150,7 @@ static int wm_xr_transform_grab_modal_3d(bContext *C, wmOperator *op, const wmEv
     selected = true;
   }
   else {
-    float m[4][4], m0[4][4], m1[4][4];
+    float out[4][4], m0[4][4], m1[4][4];
 
     if (apply_transform) {
       if (do_bimanual) {
@@ -2145,22 +2175,22 @@ static int wm_xr_transform_grab_modal_3d(bContext *C, wmOperator *op, const wmEv
 
     CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
       if (apply_transform) {
-        mul_m4_m4m4(m, delta, ob->obmat);
+        mul_m4_m4m4(out, delta, ob->obmat);
 
         if (ob->parent) {
           invert_m4_m4(m0, ob->parentinv);
-          mul_m4_m4m4(m1, ob->parent->imat, m);
-          mul_m4_m4m4(m, m0, m1);
+          mul_m4_m4m4(m1, ob->parent->imat, out);
+          mul_m4_m4m4(out, m0, m1);
         }
 
         if (!loc_lock) {
-          copy_v3_v3(ob->loc, m[3]);
+          copy_v3_v3(ob->loc, out[3]);
         }
         if (!rot_lock) {
-          mat4_to_eul(ob->rot, m);
+          mat4_to_eul(ob->rot, out);
         }
         if (!scale_lock && do_bimanual) {
-          mat4_to_size(ob->scale, m);
+          mat4_to_size(ob->scale, out);
         }
 
         DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM);



More information about the Bf-blender-cvs mailing list