[Bf-blender-cvs] [004034f8c52] xr-controller-support: XR: Fix grab transform for parented objects

Peter Kim noreply at git.blender.org
Fri Jul 2 11:18:49 CEST 2021


Commit: 004034f8c525f805cc348cb3323959dddfb96767
Author: Peter Kim
Date:   Fri Jul 2 17:59:14 2021 +0900
Branches: xr-controller-support
https://developer.blender.org/rB004034f8c525f805cc348cb3323959dddfb96767

XR: Fix grab transform 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 414d2dd21b5..a53edc6b090 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -1688,8 +1688,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;
-  float loc_ofs[3], rot_ofs[4];
+  float loc_t, rot_t, loc_ofs[3], rot_ofs[4];
   bool loc_ofs_set = false;
   bool rot_ofs_set = false;
 
@@ -1730,7 +1729,6 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
   const wmXrActionData *actiondata = event->customdata;
   Object *obedit = CTX_data_edit_object(C);
   BMEditMesh *em = (obedit && (obedit->type == OB_MESH)) ? BKE_editmesh_from_object(obedit) : NULL;
-  float q0[4], q1[4], q2[4];
   bool selected = false;
 
   if (loc_ofs_set) {
@@ -1741,8 +1739,9 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
   }
   if (rot_ofs_set) {
     /* Convert to controller space. */
-    invert_qt_qt_normalized(q0, rot_ofs);
-    mul_qt_qtqt(rot_ofs, actiondata->controller_rot, q0);
+    float q[4];
+    invert_qt_qt_normalized(q, rot_ofs);
+    mul_qt_qtqt(rot_ofs, actiondata->controller_rot, q);
     normalize_qt(rot_ofs);
   }
 
@@ -1785,6 +1784,8 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
     }
   }
   else {
+    float q0[4], q1[4], q2[4];
+
     /* Apply interpolation and offsets. */
     CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
       bool update = false;
@@ -1832,6 +1833,7 @@ static int wm_xr_transform_grab_invoke_3d(bContext *C, wmOperator *op, const wmE
       if (update) {
         DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM);
       }
+
       selected = true;
     }
     CTX_DATA_END;
@@ -1870,7 +1872,7 @@ static int wm_xr_transform_grab_modal_3d(bContext *C, wmOperator *op, const wmEv
   bScreen *screen_anim = ED_screen_animation_playing(wm);
   bool loc_lock, rot_lock, scale_lock;
   bool selected = false;
-  float delta[4][4], m[4][4];
+  float delta[4][4];
 
   PropertyRNA *prop = RNA_struct_find_property(op->ptr, "location_lock");
   loc_lock = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
@@ -1957,6 +1959,8 @@ 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];
+
     if (apply_transform) {
       if (do_bimanual) {
         wm_xr_grab_compute_bimanual(actiondata,
@@ -1982,6 +1986,12 @@ static int wm_xr_transform_grab_modal_3d(bContext *C, wmOperator *op, const wmEv
       if (apply_transform) {
         mul_m4_m4m4(m, 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);
+        }
+
         if (!loc_lock) {
           copy_v3_v3(ob->loc, m[3]);
         }



More information about the Bf-blender-cvs mailing list