From 21e379b7335efe340218ebfe6b576f826c990948 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Tue, 5 Mar 2019 14:40:33 +1100 Subject: 3D View: move pre-select mesh element access into gizmo API --- source/blender/editors/include/ED_view3d.h | 8 +++ source/blender/editors/mesh/editmesh_polybuild.c | 37 +------------- .../space_view3d/view3d_gizmo_preselect_type.c | 59 ++++++++++++++++++++++ 3 files changed, 69 insertions(+), 35 deletions(-) (limited to 'source') diff --git a/source/blender/editors/include/ED_view3d.h b/source/blender/editors/include/ED_view3d.h index d6f0d99b2b9..2457d78f1d4 100644 --- a/source/blender/editors/include/ED_view3d.h +++ b/source/blender/editors/include/ED_view3d.h @@ -27,6 +27,7 @@ /* ********* exports for space_view3d/ module ********** */ struct ARegion; struct BMEdge; +struct BMElem; struct BMFace; struct BMVert; struct BPoint; @@ -60,10 +61,12 @@ struct bPoseChannel; struct bScreen; struct rctf; struct rcti; +struct wmGizmo; struct wmOperator; struct wmOperatorType; struct wmWindow; struct wmWindowManager; + enum eGPUFXFlags; /* for derivedmesh drawing callbacks, for view3d_select, .... */ @@ -551,4 +554,9 @@ void ED_view3d_draw_bgpic_test( struct ARegion *ar, struct View3D *v3d, const bool do_foreground, const bool do_camera_frame); +/* view3d_gizmo_preselect_type.c */ +void ED_view3d_gizmo_mesh_preselect_get_active( + struct bContext *C, struct wmGizmo *gz, + struct Base **r_base, struct BMElem **r_ele); + #endif /* __ED_VIEW3D_H__ */ diff --git a/source/blender/editors/mesh/editmesh_polybuild.c b/source/blender/editors/mesh/editmesh_polybuild.c index 7012629ec95..e7e69703237 100644 --- a/source/blender/editors/mesh/editmesh_polybuild.c +++ b/source/blender/editors/mesh/editmesh_polybuild.c @@ -89,48 +89,15 @@ static bool edbm_preselect_or_active( Base **r_base, BMElem **r_ele) { - ViewLayer *view_layer = CTX_data_view_layer(C); ARegion *ar = CTX_wm_region(C); wmGizmoMap *gzmap = ar->gizmo_map; wmGizmoGroup *gzgroup = gzmap ? WM_gizmomap_group_find(gzmap, "VIEW3D_GGT_mesh_preselect_elem") : NULL; if (gzgroup != NULL) { wmGizmo *gz = gzgroup->gizmos.first; - const int object_index = RNA_int_get(gz->ptr, "object_index"); - - /* weak, allocate an array just to access the index. */ - Base *base = NULL; - Object *obedit = NULL; - { - uint bases_len; - Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(view_layer, CTX_wm_view3d(C), &bases_len); - if (object_index < bases_len) { - base = bases[object_index]; - obedit = base->object; - } - MEM_freeN(bases); - } - - *r_base = base; - *r_ele = NULL; - - if (obedit) { - BMEditMesh *em = BKE_editmesh_from_object(obedit); - BMesh *bm = em->bm; - const int vert_index = RNA_int_get(gz->ptr, "vert_index"); - const int edge_index = RNA_int_get(gz->ptr, "edge_index"); - const int face_index = RNA_int_get(gz->ptr, "face_index"); - if (vert_index != -1) { - *r_ele = (BMElem *)BM_vert_at_index_find(bm, vert_index); - } - else if (edge_index != -1) { - *r_ele = (BMElem *)BM_edge_at_index_find(bm, edge_index); - } - else if (face_index != -1) { - *r_ele = (BMElem *)BM_face_at_index_find(bm, face_index); - } - } + ED_view3d_gizmo_mesh_preselect_get_active(C, gz, r_base, r_ele); } else { + ViewLayer *view_layer = CTX_data_view_layer(C); Base *base = view_layer->basact; Object *obedit = base->object; BMEditMesh *em = BKE_editmesh_from_object(obedit); diff --git a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c index 029df078a09..418a9e76678 100644 --- a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c +++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c @@ -423,3 +423,62 @@ void ED_gizmotypes_preselect_3d(void) } /** \} */ + + +/* -------------------------------------------------------------------- */ +/** \name Gizmo Accessors + * + * This avoids each user of the gizmo needing to write their own look-ups to access + * the information from this gizmo. + * \{ */ + +void ED_view3d_gizmo_mesh_preselect_get_active( + bContext *C, wmGizmo *gz, + Base **r_base, BMElem **r_ele) +{ + ViewLayer *view_layer = CTX_data_view_layer(C); + + const int object_index = RNA_int_get(gz->ptr, "object_index"); + + /* weak, allocate an array just to access the index. */ + Base *base = NULL; + Object *obedit = NULL; + { + uint bases_len; + Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(view_layer, CTX_wm_view3d(C), &bases_len); + if (object_index < bases_len) { + base = bases[object_index]; + obedit = base->object; + } + MEM_freeN(bases); + } + + *r_base = base; + *r_ele = NULL; + + if (obedit) { + BMEditMesh *em = BKE_editmesh_from_object(obedit); + BMesh *bm = em->bm; + PropertyRNA *prop; + + /* Ring select only defines edge, check properties exist first. */ + prop = RNA_struct_find_property(gz->ptr, "vert_index"); + const int vert_index = prop ? RNA_property_int_get(gz->ptr, prop) : -1; + prop = RNA_struct_find_property(gz->ptr, "edge_index"); + const int edge_index = prop ? RNA_property_int_get(gz->ptr, prop) : -1; + prop = RNA_struct_find_property(gz->ptr, "face_index"); + const int face_index = prop ? RNA_property_int_get(gz->ptr, prop) : -1; + + if (vert_index != -1) { + *r_ele = (BMElem *)BM_vert_at_index_find(bm, vert_index); + } + else if (edge_index != -1) { + *r_ele = (BMElem *)BM_edge_at_index_find(bm, edge_index); + } + else if (face_index != -1) { + *r_ele = (BMElem *)BM_face_at_index_find(bm, face_index); + } + } +} + +/** \} */ -- cgit v1.2.3