[Bf-blender-cvs] [6fdf4930285] xr-actions-D9124: XR: Support mesh editing with grab operator

Peter Kim noreply at git.blender.org
Fri Nov 13 17:47:58 CET 2020


Commit: 6fdf4930285e7806d87d821f0cd42c2101b34ab9
Author: Peter Kim
Date:   Sat Nov 14 01:26:04 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB6fdf4930285e7806d87d821f0cd42c2101b34ab9

XR: Support mesh editing with grab operator

Uses similar mechanics as object mode, but interpolation and offsets
are not yet supported.

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

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 494c7cd7c54..dd9f63f3506 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -704,6 +704,8 @@ static int wm_xr_grab_invoke_3d(bContext *C, wmOperator *op, const wmEvent *even
   }
 
   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 tmp0[4], tmp1[4], tmp2[4];
   bool selected = false;
 
@@ -720,48 +722,88 @@ static int wm_xr_grab_invoke_3d(bContext *C, wmOperator *op, const wmEvent *even
     normalize_qt(rot_ofs);
   }
 
-  CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
-    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]);
-      }
-      if (loc_ofs_set) {
-        add_v3_v3(ob->loc, loc_ofs);
+  if (em) { /* TODO_XR: Non-mesh objects. */
+    /* Check for selection. */
+    Scene *scene = CTX_data_scene(C);
+    ToolSettings *ts = scene->toolsettings;
+    BMesh *bm = em->bm;
+    BMIter iter;
+    if ((ts->selectmode & SCE_SELECT_FACE) != 0) {
+      BMFace *f;
+      BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+        if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
+          selected = true;
+          break;
+        }
       }
     }
-
-    if (!rot_lock) {
-      if (rot_t > 0.0f) {
-        eul_to_quat(tmp1, ob->rot);
-        interp_qt_qtqt(tmp0, tmp1, actiondata->controller_rot, rot_t);
-        if (!rot_ofs_set) {
-          quat_to_eul(ob->rot, tmp0);
+    if (!selected) {
+      if ((ts->selectmode & SCE_SELECT_EDGE) != 0) {
+        BMEdge *e;
+        BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+          if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
+            selected = true;
+            break;
+          }
         }
       }
-      else if (rot_ofs_set) {
-        eul_to_quat(tmp0, ob->rot);
-      }
-      if (rot_ofs_set) {
-        rotation_between_quats_to_quat(tmp1, rot_ofs, tmp0);
-        mul_qt_qtqt(tmp0, rot_ofs, tmp1);
-        normalize_qt(tmp0);
-        mul_qt_qtqt(tmp2, actiondata->controller_rot, tmp1);
-        normalize_qt(tmp2);
-        rotation_between_quats_to_quat(tmp1, tmp0, tmp2);
-
-        mul_qt_qtqt(tmp2, tmp0, tmp1);
-        normalize_qt(tmp2);
-        quat_to_eul(ob->rot, tmp2);
+      if (!selected) {
+        if ((ts->selectmode & SCE_SELECT_VERTEX) != 0) {
+          BMVert *v;
+          BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+            if (BM_elem_flag_test(v, BM_ELEM_SELECT)) {
+              selected = true;
+              break;
+            }
+          }
+        }
       }
     }
+  }
+  else {
+    CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
+      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]);
+        }
+        if (loc_ofs_set) {
+          add_v3_v3(ob->loc, loc_ofs);
+        }
+      }
 
-    DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM);
+      if (!rot_lock) {
+        if (rot_t > 0.0f) {
+          eul_to_quat(tmp1, ob->rot);
+          interp_qt_qtqt(tmp0, tmp1, actiondata->controller_rot, rot_t);
+          if (!rot_ofs_set) {
+            quat_to_eul(ob->rot, tmp0);
+          }
+        }
+        else if (rot_ofs_set) {
+          eul_to_quat(tmp0, ob->rot);
+        }
+        if (rot_ofs_set) {
+          rotation_between_quats_to_quat(tmp1, rot_ofs, tmp0);
+          mul_qt_qtqt(tmp0, rot_ofs, tmp1);
+          normalize_qt(tmp0);
+          mul_qt_qtqt(tmp2, actiondata->controller_rot, tmp1);
+          normalize_qt(tmp2);
+          rotation_between_quats_to_quat(tmp1, tmp0, tmp2);
+
+          mul_qt_qtqt(tmp2, tmp0, tmp1);
+          normalize_qt(tmp2);
+          quat_to_eul(ob->rot, tmp2);
+        }
+      }
 
-    selected = true;
+      DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM);
+
+      selected = true;
+    }
+    CTX_DATA_END;
   }
-  CTX_DATA_END;
 
   if (!selected) {
     wm_xr_grab_uninit(op);
@@ -794,6 +836,8 @@ static int wm_xr_grab_modal_3d(bContext *C, wmOperator *op, const wmEvent *event
   XrGrabData *data = op->customdata;
   Scene *scene = CTX_data_scene(C);
   ViewLayer *view_layer = CTX_data_view_layer(C);
+  Object *obedit = CTX_data_edit_object(C);
+  BMEditMesh *em = (obedit && (obedit->type == OB_MESH)) ? BKE_editmesh_from_object(obedit) : NULL;
   wmWindowManager *wm = CTX_wm_manager(C);
   bScreen *screen_anim = ED_screen_animation_playing(wm);
   bool loc_lock, rot_lock;
@@ -805,37 +849,158 @@ static int wm_xr_grab_modal_3d(bContext *C, wmOperator *op, const wmEvent *event
   prop = RNA_struct_find_property(op->ptr, "rotation_lock");
   rot_lock = prop ? RNA_property_boolean_get(op->ptr, prop) : false;
 
-  invert_m4_m4(tmp, data->mat_prev);
-  quat_to_mat4(data->mat_prev, actiondata->controller_rot);
-  copy_v3_v3(data->mat_prev[3], actiondata->controller_loc);
-  mul_m4_m4m4(delta, data->mat_prev, tmp);
-
-  CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
+  if (em) { /* TODO_XR: Non-mesh objects. */
     if (!loc_lock || !rot_lock) {
-      copy_m4_m4(tmp, ob->obmat);
-      mul_m4_m4m4(ob->obmat, delta, tmp);
+      Scene *scene = CTX_data_scene(C);
+      ToolSettings *ts = scene->toolsettings;
+      BMesh *bm = em->bm;
+      BMIter iter;
+      float tmp0[4][4], tmp1[4][4];
+
+      if (rot_lock) {
+        unit_m4(tmp);
+        copy_v3_v3(tmp[3], data->mat_prev[3]);
+        mul_m4_m4m4(tmp0, obedit->imat, tmp);
+        invert_m4(tmp0);
+
+        quat_to_mat4(data->mat_prev, actiondata->controller_rot);
+        copy_v3_v3(data->mat_prev[3], actiondata->controller_loc);
+        copy_v3_v3(tmp[3], data->mat_prev[3]);
+        mul_m4_m4m4(tmp1, obedit->imat, tmp);
+
+        mul_m4_m4m4(delta, tmp1, tmp0);
+      }
+      else {
+        copy_m4_m4(tmp, data->mat_prev);
+        mul_m4_m4m4(tmp0, obedit->imat, tmp);
+        invert_m4(tmp0);
 
-      if (!loc_lock) {
-        copy_v3_v3(ob->loc, ob->obmat[3]);
+        quat_to_mat4(data->mat_prev, actiondata->controller_rot);
+        copy_v3_v3(data->mat_prev[3], actiondata->controller_loc);
+        copy_m4_m4(tmp, data->mat_prev);
+        mul_m4_m4m4(tmp1, obedit->imat, tmp);
+
+        mul_m4_m4m4(delta, tmp1, tmp0);
+
+        if (loc_lock) {
+          zero_v3(delta[3]);
+        }
       }
-      if (!rot_lock) {
-        mat4_to_eul(ob->rot, ob->obmat);
+
+      if ((ts->selectmode & SCE_SELECT_VERTEX) != 0) {
+        BMVert *v;
+        BM_ITER_MESH (v, &iter, bm, BM_VERTS_OF_MESH) {
+          if (BM_elem_flag_test(v, BM_ELEM_SELECT) &&
+              !BM_elem_flag_test(v, BM_ELEM_INTERNAL_TAG)) {
+            mul_m4_v3(delta, v->co);
+            BM_elem_flag_enable(v, BM_ELEM_INTERNAL_TAG);
+          }
+        }
+      }
+      if ((ts->selectmode & SCE_SELECT_EDGE) != 0) {
+        BMEdge *e;
+        BM_ITER_MESH (e, &iter, bm, BM_EDGES_OF_MESH) {
+          if (BM_elem_flag_test(e, BM_ELEM_SELECT)) {
+            if (!BM_elem_flag_test(e->v1, BM_ELEM_INTERNAL_TAG)) {
+              mul_m4_v3(delta, e->v1->co);
+              BM_elem_flag_enable(e->v1, BM_ELEM_INTERNAL_TAG);
+            }
+            if (!BM_elem_flag_test(e->v2, BM_ELEM_INTERNAL_TAG)) {
+              mul_m4_v3(delta, e->v2->co);
+              BM_elem_flag_enable(e->v2, BM_ELEM_INTERNAL_TAG);
+            }
+          }
+        }
+      }
+      if ((ts->selectmode & SCE_SELECT_FACE) != 0) {
+        BMFace *f;
+        BMLoop *l;
+        BM_ITER_MESH (f, &iter, bm, BM_FACES_OF_MESH) {
+          if (BM_elem_flag_test(f, BM_ELEM_SELECT)) {
+            l = f->l_first;
+            for (int i = 0; i < f->len; ++i, l = l->next) {
+              if (!BM_elem_flag_test(l->v, BM_ELEM_INTERNAL_TAG)) {
+                mul_m4_v3(delta, l->v->co);
+                BM_elem_flag_enable(l->v, BM_ELEM_INTERNAL_TAG);
+              }
+            }
+          }
+        }
       }
 
-      DEG_id_tag_update(&ob->id, ID_RECALC_TRANSFORM);
+      BM_mesh_elem_hflag_disable_all(bm, BM_VERT, BM_ELEM_INTERNAL_TAG, false);
+      EDBM_mesh_normals_update(em);
+      DEG_id_tag_update(&obedit->id, ID_RECALC_GEOMETRY);
     }
-
-    if (screen_anim && autokeyframe_cfra_can_key(scene, &ob->id)) {
-      wm_xr_session_object_autokey(C, scene, view_layer, NULL, ob, true);
+    else {
+      quat_to_mat4(data->mat_prev, actiondata->controller_rot);
+      copy_v3_v3(data->mat_prev[3], actiondata->controller_loc);
     }
 
     selected = true;
   }
-  CTX_DATA_END;
+  else {
+    if (!loc_lock || !rot_lock) {
+      if (rot_lock) {
+        float tmp0[4][4];
+        unit_m4(tmp0);
+        copy_v3_v3(tmp0[3], data->mat_prev[3]);
+        invert_m4_m4(tmp, tmp0);
+
+        quat_to_mat4(data->mat_prev, actiondata->controller_rot);
+        copy_v3_v3(data->mat_prev[3], actiondata->controller_loc);
+        copy_v3_v3(tmp0[3], data->mat_prev[3]);
+
+        mul_m4_m4m4(delta, tmp0, tmp);
+      }
+      else {
+        invert_m4_m4(tmp, data->mat_prev);
+        quat_to_mat4(data->mat_prev, actiondata->controller_rot);
+        copy_v3_v3(data->mat_prev[3], actiondata->controller_loc);
+        mul_m4_m4m4(delta, data->mat_prev, tmp);
+
+        if (loc_lock) {
+          zero_v3(delta[3]);
+        }
+      }
+    }
+    else {
+      quat_to_mat4(data->mat_prev, actiondata->controller_rot);
+      copy_v3_v3(data->mat_prev[3], actiondata->controller_loc);
+    }
+
+    CTX_DATA_BEGIN (C, Object *, ob, selected_objects) {
+      if (!loc_lock || !rot_lock) {
+        copy_m4_m4(tmp, ob->obmat);
+        mul_m4_m4m4(ob->obmat, delta, tmp);
+
+        if (!loc_lock) {
+          copy_v3_v3(ob->loc, ob->obmat[3]);
+        }
+        if (

@@ Diff output truncated at 10240 characters. @@



More information about the Bf-blender-cvs mailing list