[Bf-blender-cvs] [43dd6ba3307] xr-actions-D9124: XR: Ensure mesh object for edit mode raycast
Peter Kim
noreply at git.blender.org
Fri Nov 13 17:47:55 CET 2020
Commit: 43dd6ba330782b76f11c09ab3ad115c654632a90
Author: Peter Kim
Date: Sat Nov 14 01:23:09 2020 +0900
Branches: xr-actions-D9124
https://developer.blender.org/rB43dd6ba330782b76f11c09ab3ad115c654632a90
XR: Ensure mesh object for edit mode raycast
===================================================================
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 20ad5e6eb9b..494c7cd7c54 100644
--- a/source/blender/windowmanager/xr/intern/wm_xr_operators.c
+++ b/source/blender/windowmanager/xr/intern/wm_xr_operators.c
@@ -336,6 +336,7 @@ static bool wm_xr_select_raycast(bContext *C,
Depsgraph *depsgraph = CTX_data_ensure_evaluated_depsgraph(C);
ViewContext vc;
ED_view3d_viewcontext_init(C, &vc, depsgraph);
+ vc.em = (vc.obedit && (vc.obedit->type == OB_MESH)) ? BKE_editmesh_from_object(vc.obedit) : NULL;
float location[3];
float normal[3];
@@ -365,103 +366,99 @@ static bool wm_xr_select_raycast(bContext *C,
bool hit = false;
bool changed = false;
- if (ob && BKE_object_is_in_editmode(ob)) {
- vc.em = BKE_editmesh_from_object(ob);
-
- if (vc.em) {
- BMesh *bm = vc.em->bm;
- BMFace *f = NULL;
- BMEdge *e = NULL;
- BMVert *v = NULL;
-
- if (index != -1) {
- ToolSettings *ts = vc.scene->toolsettings;
- float co[3];
- f = BM_face_at_index(bm, index);
-
- if ((ts->selectmode & SCE_SELECT_VERTEX) != 0) {
- /* Find nearest vertex. */
- float dist_max = *ray_dist;
- float dist;
- BMLoop *l = f->l_first;
- for (int i = 0; i < f->len; ++i, l = l->next) {
- mul_v3_m4v3(co, obmat, l->v->co);
- if ((dist = len_manhattan_v3v3(location, co)) < dist_max) {
- v = l->v;
- dist_max = dist;
- }
- }
- if (v) {
- hit = true;
+ if (ob && vc.em && (ob->id.orig_id == &vc.obedit->id)) { /* TODO_XR: Non-mesh objects. */
+ BMesh *bm = vc.em->bm;
+ BMFace *f = NULL;
+ BMEdge *e = NULL;
+ BMVert *v = NULL;
+
+ if (index != -1) {
+ ToolSettings *ts = vc.scene->toolsettings;
+ float co[3];
+ f = BM_face_at_index(bm, index);
+
+ if ((ts->selectmode & SCE_SELECT_VERTEX) != 0) {
+ /* Find nearest vertex. */
+ float dist_max = *ray_dist;
+ float dist;
+ BMLoop *l = f->l_first;
+ for (int i = 0; i < f->len; ++i, l = l->next) {
+ mul_v3_m4v3(co, obmat, l->v->co);
+ if ((dist = len_manhattan_v3v3(location, co)) < dist_max) {
+ v = l->v;
+ dist_max = dist;
}
}
- if ((ts->selectmode & SCE_SELECT_EDGE) != 0) {
- /* Find nearest edge. */
- float dist_max = *ray_dist;
- float dist;
- BMLoop *l = f->l_first;
- for (int i = 0; i < f->len; ++i, l = l->next) {
- add_v3_v3v3(co, l->e->v1->co, l->e->v2->co);
- mul_v3_fl(co, 0.5f);
- mul_m4_v3(obmat, co);
- if ((dist = len_manhattan_v3v3(location, co)) < dist_max) {
- e = l->e;
- dist_max = dist;
- }
- }
- if (e) {
- hit = true;
+ if (v) {
+ hit = true;
+ }
+ }
+ if ((ts->selectmode & SCE_SELECT_EDGE) != 0) {
+ /* Find nearest edge. */
+ float dist_max = *ray_dist;
+ float dist;
+ BMLoop *l = f->l_first;
+ for (int i = 0; i < f->len; ++i, l = l->next) {
+ add_v3_v3v3(co, l->e->v1->co, l->e->v2->co);
+ mul_v3_fl(co, 0.5f);
+ mul_m4_v3(obmat, co);
+ if ((dist = len_manhattan_v3v3(location, co)) < dist_max) {
+ e = l->e;
+ dist_max = dist;
}
}
- if ((ts->selectmode & SCE_SELECT_FACE) != 0) {
+ if (e) {
hit = true;
}
- else {
- f = NULL;
- }
}
-
- if (!hit) {
- if (deselect_all && (select_op == SEL_OP_SET)) {
- changed = EDBM_mesh_deselect_all_multi(C);
- }
+ if ((ts->selectmode & SCE_SELECT_FACE) != 0) {
+ hit = true;
}
else {
- bool set_v = false;
- bool set_e = false;
- bool set_f = false;
+ f = NULL;
+ }
+ }
- if (v) {
- wm_xr_select_op_apply(v, bm, XR_SEL_VERTEX, select_op, &changed, &set_v);
- }
- if (e) {
- wm_xr_select_op_apply(e, bm, XR_SEL_EDGE, select_op, &changed, &set_e);
+ if (!hit) {
+ if (deselect_all && (select_op == SEL_OP_SET)) {
+ changed = EDBM_mesh_deselect_all_multi(C);
+ }
+ }
+ else {
+ bool set_v = false;
+ bool set_e = false;
+ bool set_f = false;
+
+ if (v) {
+ wm_xr_select_op_apply(v, bm, XR_SEL_VERTEX, select_op, &changed, &set_v);
+ }
+ if (e) {
+ wm_xr_select_op_apply(e, bm, XR_SEL_EDGE, select_op, &changed, &set_e);
+ }
+ if (f) {
+ wm_xr_select_op_apply(f, bm, XR_SEL_FACE, select_op, &changed, &set_f);
+ }
+
+ if (set_v || set_e || set_f) {
+ EDBM_mesh_deselect_all_multi(C);
+ if (set_v) {
+ BM_vert_select_set(bm, v, true);
}
- if (f) {
- wm_xr_select_op_apply(f, bm, XR_SEL_FACE, select_op, &changed, &set_f);
+ if (set_e) {
+ BM_edge_select_set(bm, e, true);
}
-
- if (set_v || set_e || set_f) {
- EDBM_mesh_deselect_all_multi(C);
- if (set_v) {
- BM_vert_select_set(bm, v, true);
- }
- if (set_e) {
- BM_edge_select_set(bm, e, true);
- }
- if (set_f) {
- BM_face_select_set(bm, f, true);
- }
+ if (set_f) {
+ BM_face_select_set(bm, f, true);
}
}
+ }
- if (changed) {
- DEG_id_tag_update((ID *)vc.obedit->data, ID_RECALC_SELECT);
- WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data);
- }
+ if (changed) {
+ DEG_id_tag_update((ID *)vc.obedit->data, ID_RECALC_SELECT);
+ WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data);
}
}
- else if (vc.obedit) {
+ else if (vc.em) {
if (deselect_all && (select_op == SEL_OP_SET)) {
changed = EDBM_mesh_deselect_all_multi(C);
}
More information about the Bf-blender-cvs
mailing list