Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--source/blender/editors/include/ED_mesh.h6
-rw-r--r--source/blender/editors/mesh/editmesh_path.c13
-rw-r--r--source/blender/editors/mesh/editmesh_select.c139
-rw-r--r--source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c108
4 files changed, 144 insertions, 122 deletions
diff --git a/source/blender/editors/include/ED_mesh.h b/source/blender/editors/include/ED_mesh.h
index 3ad73091aa0..8f5f25f887f 100644
--- a/source/blender/editors/include/ED_mesh.h
+++ b/source/blender/editors/include/ED_mesh.h
@@ -173,15 +173,17 @@ struct BMFace *EDBM_face_find_nearest(
bool EDBM_unified_findnearest(
struct ViewContext *vc,
- struct Base **r_base,
+ struct Base **bases, uint bases_len,
+ int *r_base_index,
struct BMVert **r_eve,
struct BMEdge **r_eed,
struct BMFace **r_efa);
bool EDBM_unified_findnearest_from_raycast(
struct ViewContext *vc,
+ struct Base **bases, uint bases_len,
bool use_boundary,
- struct Base **r_base,
+ int *r_base_index,
struct BMVert **r_eve,
struct BMEdge **r_eed,
struct BMFace **r_efa);
diff --git a/source/blender/editors/mesh/editmesh_path.c b/source/blender/editors/mesh/editmesh_path.c
index 5795c8bb938..f127b85b19c 100644
--- a/source/blender/editors/mesh/editmesh_path.c
+++ b/source/blender/editors/mesh/editmesh_path.c
@@ -635,9 +635,16 @@ static int edbm_shortest_path_pick_invoke(bContext *C, wmOperator *op, const wmE
view3d_operator_needs_opengl(C);
- if (EDBM_unified_findnearest(&vc, &basact, &eve, &eed, &efa)) {
- ED_view3d_viewcontext_init_object(&vc, basact->object);
- em = vc.em;
+ {
+ int base_index = -1;
+ uint bases_len = 0;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc.view_layer, &bases_len);
+ if (EDBM_unified_findnearest(&vc, bases, bases_len, base_index, &eve, &eed, &efa)) {
+ basact = bases[base_index];
+ ED_view3d_viewcontext_init_object(&vc, basact->object);
+ em = vc.em;
+ }
+ MEM_freeN(bases);
}
/* If nothing is selected, let's select the picked vertex/edge/face. */
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index 86a1366bda3..b3ea28b595b 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -940,8 +940,8 @@ BMFace *EDBM_face_find_nearest(ViewContext *vc, float *r_dist)
* return 1 if found one
*/
static bool unified_findnearest(
- ViewContext *vc,
- Base **r_base, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
+ ViewContext *vc, Base **bases, const uint bases_len,
+ int *r_base_index, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
{
BMEditMesh *em = vc->em;
static short mval_prev[2] = {-1, -1};
@@ -955,22 +955,20 @@ static bool unified_findnearest(
struct {
struct {
BMVert *ele;
- Base *base;
+ int base_index;
} v;
struct {
BMEdge *ele;
- Base *base;
+ int base_index;
} e, e_zbuf;
struct {
BMFace *ele;
- Base *base;
+ int base_index;
} f, f_zbuf;
} hit = {{NULL}};
/* TODO(campbell): perform selection as one pass
* instead of many smaller passes (which doesn't work for zbuf occlusion). */
- uint bases_len = 0;
- Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc->view_layer, &bases_len);
/* no afterqueue (yet), so we check it now, otherwise the em_xxxofs indices are bad */
@@ -989,11 +987,11 @@ static bool unified_findnearest(
dist = min_ff(dist_margin, dist_center);
}
if (efa_test) {
- hit.f.base = base_iter;
+ hit.f.base_index = base_index;
hit.f.ele = efa_test;
}
if (efa_zbuf) {
- hit.f_zbuf.base = base_iter;
+ hit.f_zbuf.base_index = base_index;
hit.f_zbuf.ele = efa_zbuf;
}
} /* bases */
@@ -1014,11 +1012,11 @@ static bool unified_findnearest(
dist = min_ff(dist_margin, dist_center);
}
if (eed_test) {
- hit.e.base = base_iter;
+ hit.e.base_index = base_index;
hit.e.ele = eed_test;
}
if (eed_zbuf) {
- hit.e_zbuf.base = base_iter;
+ hit.e_zbuf.base_index = base_index;
hit.e_zbuf.ele = eed_zbuf;
}
} /* bases */
@@ -1032,14 +1030,12 @@ static bool unified_findnearest(
ED_view3d_backbuf_validate(vc);
BMVert *eve_test = EDBM_vert_find_nearest_ex(vc, &dist, true, use_cycle);
if (eve_test) {
- hit.v.base = base_iter;
+ hit.v.base_index = base_index;
hit.v.ele = eve_test;
}
} /* bases */
}
- MEM_SAFE_FREE(bases);
-
/* return only one of 3 pointers, for frontbuffer redraws */
if (hit.v.ele) {
hit.f.ele = NULL;
@@ -1053,11 +1049,11 @@ static bool unified_findnearest(
* use this if all else fails, it makes sense to select this */
if ((hit.v.ele || hit.e.ele || hit.f.ele) == 0) {
if (hit.e_zbuf.ele) {
- hit.e.base = hit.e_zbuf.base;
+ hit.e.base_index = hit.e_zbuf.base_index;
hit.e.ele = hit.e_zbuf.ele;
}
else if (hit.f_zbuf.ele) {
- hit.f.base = hit.f_zbuf.base;
+ hit.f.base_index = hit.f_zbuf.base_index;
hit.f.ele = hit.f_zbuf.ele;
}
}
@@ -1069,13 +1065,13 @@ static bool unified_findnearest(
BLI_assert(((hit.v.ele != NULL) + (hit.e.ele != NULL) + (hit.f.ele != NULL)) <= 1);
if (hit.v.ele) {
- *r_base = hit.v.base;
+ *r_base_index = hit.v.base_index;
}
if (hit.e.ele) {
- *r_base = hit.e.base;
+ *r_base_index = hit.e.base_index;
}
if (hit.f.ele) {
- *r_base = hit.f.base;
+ *r_base_index = hit.f.base_index;
}
*r_eve = hit.v.ele;
@@ -1089,10 +1085,10 @@ static bool unified_findnearest(
#undef FAKE_SELECT_MODE_END
bool EDBM_unified_findnearest(
- ViewContext *vc,
- Base **r_base, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
+ ViewContext *vc, Base **bases, const uint bases_len,
+ int *r_base_index, BMVert **r_eve, BMEdge **r_eed, BMFace **r_efa)
{
- return unified_findnearest(vc, r_base, r_eve, r_eed, r_efa);
+ return unified_findnearest(vc, bases, bases_len, r_base_index, r_eve, r_eed, r_efa);
}
/** \} */
@@ -1106,8 +1102,9 @@ bool EDBM_unified_findnearest(
bool EDBM_unified_findnearest_from_raycast(
ViewContext *vc,
+ Base **bases, const uint bases_len,
bool use_boundary,
- Base **r_base,
+ int *r_base_index,
struct BMVert **r_eve,
struct BMEdge **r_eed,
struct BMFace **r_efa)
@@ -1117,9 +1114,9 @@ bool EDBM_unified_findnearest_from_raycast(
float ray_origin[3], ray_direction[3];
struct {
- Base *base;
+ uint base_index;
BMElem *ele;
- } best = {NULL};
+ } best = {0, NULL};
if (ED_view3d_win_to_ray(
vc->depsgraph,
@@ -1132,8 +1129,6 @@ bool EDBM_unified_findnearest_from_raycast(
const bool use_edge = (r_eed != NULL);
const bool use_face = (r_efa != NULL);
- uint bases_len;
- Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc->view_layer, &bases_len);
for (uint base_index = 0; base_index < bases_len; base_index++) {
Base *base_iter = bases[base_index];
Object *obedit = base_iter->object;
@@ -1177,7 +1172,7 @@ bool EDBM_unified_findnearest_from_raycast(
point, &depth);
if (dist_sq_test < dist_sq_best) {
dist_sq_best = dist_sq_test;
- best.base = base_iter;
+ best.base_index = base_index;
best.ele = (BMElem *)v;
}
}
@@ -1203,7 +1198,7 @@ bool EDBM_unified_findnearest_from_raycast(
point, &depth);
if (dist_sq_test < dist_sq_best) {
dist_sq_best = dist_sq_test;
- best.base = base_iter;
+ best.base_index = base_index;
best.ele = (BMElem *)e;
}
#endif
@@ -1226,7 +1221,7 @@ bool EDBM_unified_findnearest_from_raycast(
v->co, &depth);
if (dist_sq_test < dist_sq_best) {
dist_sq_best = dist_sq_test;
- best.base = base_iter;
+ best.base_index = base_index;
best.ele = (BMElem *)v;
}
}
@@ -1251,7 +1246,7 @@ bool EDBM_unified_findnearest_from_raycast(
point, &depth);
if (dist_sq_test < dist_sq_best) {
dist_sq_best = dist_sq_test;
- best.base = base_iter;
+ best.base_index = base_index;
best.ele = (BMElem *)e;
}
}
@@ -1278,7 +1273,7 @@ bool EDBM_unified_findnearest_from_raycast(
point, &depth);
if (dist_sq_test < dist_sq_best) {
dist_sq_best = dist_sq_test;
- best.base = base_iter;
+ best.base_index = base_index;
best.ele = (BMElem *)f;
}
}
@@ -1287,7 +1282,7 @@ bool EDBM_unified_findnearest_from_raycast(
}
}
- *r_base = best.base;
+ *r_base_index = best.base_index;
if (r_eve) {
*r_eve = NULL;
}
@@ -1974,17 +1969,25 @@ static bool mouse_mesh_loop(bContext *C, const int mval[2], bool extend, bool de
const short selectmode = em_original->selectmode;
em_original->selectmode = SCE_SELECT_EDGE;
- if (EDBM_unified_findnearest(&vc, &basact, &eve, &eed, &efa)) {
- ED_view3d_viewcontext_init_object(&vc, basact->object);
- em = vc.em;
- }
- else {
- em = NULL;
+ uint bases_len;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc.view_layer, &bases_len);
+
+ {
+ int base_index = -1;
+ if (EDBM_unified_findnearest(&vc, bases, bases_len, &base_index, &eve, &eed, &efa)) {
+ basact = bases[base_index];
+ ED_view3d_viewcontext_init_object(&vc, basact->object);
+ em = vc.em;
+ }
+ else {
+ em = NULL;
+ }
}
em_original->selectmode = selectmode;
if (em == NULL || eed == NULL) {
+ MEM_freeN(bases);
return false;
}
@@ -2007,11 +2010,9 @@ static bool mouse_mesh_loop(bContext *C, const int mval[2], bool extend, bool de
}
if (select_clear) {
- ViewLayer *view_layer = CTX_data_view_layer(C);
- uint objects_len = 0;
- Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(view_layer, &objects_len);
- for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object *ob_iter = objects[ob_index];
+ for (uint base_index = 0; base_index < bases_len; base_index++) {
+ Base *base_iter = bases[base_index];
+ Object *ob_iter = base_iter->object;
BMEditMesh *em_iter = BKE_editmesh_from_object(ob_iter);
if (em_iter->bm->totvertsel == 0) {
@@ -2025,7 +2026,6 @@ static bool mouse_mesh_loop(bContext *C, const int mval[2], bool extend, bool de
EDBM_flag_disable_all(em_iter, BM_ELEM_SELECT);
DEG_id_tag_update(ob_iter->data, DEG_TAG_SELECT_UPDATE);
}
- MEM_freeN(objects);
}
if (em->selectmode & SCE_SELECT_FACE) {
@@ -2109,6 +2109,8 @@ static bool mouse_mesh_loop(bContext *C, const int mval[2], bool extend, bool de
}
}
+ MEM_freeN(bases);
+
DEG_id_tag_update(vc.obedit->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data);
@@ -2298,7 +2300,7 @@ bool EDBM_select_pick(bContext *C, const int mval[2], bool extend, bool deselect
{
ViewContext vc;
- Base *basact = NULL;
+ int base_index_active = -1;
BMVert *eve = NULL;
BMEdge *eed = NULL;
BMFace *efa = NULL;
@@ -2308,23 +2310,26 @@ bool EDBM_select_pick(bContext *C, const int mval[2], bool extend, bool deselect
vc.mval[0] = mval[0];
vc.mval[1] = mval[1];
- if (unified_findnearest(&vc, &basact, &eve, &eed, &efa)) {
+ uint bases_len = 0;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc.view_layer, &bases_len);
+
+ bool ok = false;
+
+ if (unified_findnearest(&vc, bases, bases_len, &base_index_active, &eve, &eed, &efa)) {
+ Base *basact = bases[base_index_active];
ED_view3d_viewcontext_init_object(&vc, basact->object);
/* Deselect everything */
if (extend == false && deselect == false && toggle == false) {
- uint objects_len = 0;
- Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(vc.view_layer, &objects_len);
-
- for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object *ob_iter = objects[ob_index];
+ for (uint base_index = 0; base_index < bases_len; base_index++) {
+ Base *base_iter = bases[base_index];
+ Object *ob_iter = base_iter->object;
EDBM_flag_disable_all(BKE_editmesh_from_object(ob_iter), BM_ELEM_SELECT);
if (basact->object != ob_iter) {
DEG_id_tag_update(ob_iter->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, ob_iter->data);
}
}
- MEM_freeN(objects);
}
if (efa) {
@@ -2444,10 +2449,12 @@ bool EDBM_select_pick(bContext *C, const int mval[2], bool extend, bool deselect
DEG_id_tag_update(vc.obedit->data, DEG_TAG_SELECT_UPDATE);
WM_event_add_notifier(C, NC_GEOM | ND_SELECT, vc.obedit->data);
- return true;
+ ok = true;
}
- return false;
+ MEM_freeN(bases);
+
+ return ok;
}
/** \} */
@@ -3388,19 +3395,20 @@ static int edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmE
/* setup view context for argument to callbacks */
em_setup_viewcontext(C, &vc);
+ uint bases_len;
+ Base **bases = BKE_view_layer_array_from_bases_in_edit_mode(vc.view_layer, &bases_len);
+
{
- uint objects_len = 0;
- Object **objects = BKE_view_layer_array_from_objects_in_edit_mode_unique_data(vc.view_layer, &objects_len);
bool has_edges = false;
- for (uint ob_index = 0; ob_index < objects_len; ob_index++) {
- Object *ob_iter = objects[ob_index];
+ for (uint base_index = 0; base_index < bases_len; base_index++) {
+ Object *ob_iter = bases[base_index]->object;
ED_view3d_viewcontext_init_object(&vc, ob_iter);
if (vc.em->bm->totedge) {
has_edges = true;
}
}
- MEM_freeN(objects);
if (has_edges == false) {
+ MEM_freeN(bases);
return OPERATOR_CANCELLED;
}
}
@@ -3409,9 +3417,16 @@ static int edbm_select_linked_pick_invoke(bContext *C, wmOperator *op, const wmE
vc.mval[1] = event->mval[1];
/* return warning! */
- if (unified_findnearest(&vc, &basact, &eve, &eed, &efa) == 0) {
- return OPERATOR_CANCELLED;
+ {
+ int base_index = -1;
+ const bool ok = unified_findnearest(&vc, bases, bases_len, &base_index, &eve, &eed, &efa);
+ if (!ok) {
+ MEM_freeN(bases);
+ return OPERATOR_CANCELLED;
+ }
+ basact = bases[base_index];
}
+
ED_view3d_viewcontext_init_object(&vc, basact->object);
BMEditMesh *em = vc.em;
BMesh *bm = em->bm;
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 0692c803904..6cd94830fe9 100644
--- a/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
+++ b/source/blender/editors/space_view3d/view3d_gizmo_preselect_type.c
@@ -62,9 +62,9 @@
typedef struct MeshElemGizmo3D {
wmGizmo gizmo;
- Object **objects;
- uint objects_len;
- int object_index;
+ Base **bases;
+ uint bases_len;
+ int base_index;
int vert_index;
int edge_index;
int face_index;
@@ -74,8 +74,8 @@ typedef struct MeshElemGizmo3D {
static void gizmo_preselect_elem_draw(const bContext *UNUSED(C), wmGizmo *gz)
{
MeshElemGizmo3D *gz_ele = (MeshElemGizmo3D *)gz;
- if (gz_ele->object_index != -1) {
- Object *ob = gz_ele->objects[gz_ele->object_index];
+ if (gz_ele->base_index != -1) {
+ Object *ob = gz_ele->bases[gz_ele->base_index]->object;
EDBM_preselect_elem_draw(gz_ele->psel, ob->obmat);
}
}
@@ -88,18 +88,18 @@ static int gizmo_preselect_elem_test_select(
Object *ob;
BMElem *ele;
float dist;
- int ob_index;
+ int base_index;
} best = {
.dist = ED_view3d_select_dist_px(),
};
struct {
- int object_index;
+ int base_index;
int vert_index;
int edge_index;
int face_index;
} prev = {
- .object_index = gz_ele->object_index,
+ .base_index = gz_ele->base_index,
.vert_index = gz_ele->vert_index,
.edge_index = gz_ele->edge_index,
.face_index = gz_ele->face_index,
@@ -107,11 +107,12 @@ static int gizmo_preselect_elem_test_select(
{
ViewLayer *view_layer = CTX_data_view_layer(C);
- if (((gz_ele->objects)) == NULL ||
- (gz_ele->objects[0] != OBEDIT_FROM_VIEW_LAYER(view_layer)))
+ if (((gz_ele->bases)) == NULL ||
+ (gz_ele->bases[0] != view_layer->basact))
{
- gz_ele->objects = BKE_view_layer_array_from_objects_in_edit_mode(
- view_layer, &gz_ele->objects_len);
+ MEM_SAFE_FREE(gz_ele->bases);
+ gz_ele->bases = BKE_view_layer_array_from_bases_in_edit_mode(
+ view_layer, &gz_ele->bases_len);
}
}
@@ -121,11 +122,15 @@ static int gizmo_preselect_elem_test_select(
{
/* TODO: support faces. */
- Base *base = NULL;
+ int base_index = -1;
BMVert *eve_test;
BMEdge *eed_test;
- if (EDBM_unified_findnearest_from_raycast(&vc, true, &base, &eve_test, &eed_test, NULL)) {
+ if (EDBM_unified_findnearest_from_raycast(
+ &vc, gz_ele->bases, gz_ele->bases_len,
+ true, &base_index, &eve_test, &eed_test, NULL))
+ {
+ Base *base = gz_ele->bases[base_index];
best.ob = base->object;
if (eve_test) {
best.ele = (BMElem *)eve_test;
@@ -136,30 +141,22 @@ static int gizmo_preselect_elem_test_select(
else {
BLI_assert(0);
}
- best.ob_index = -1;
- /* weak, we could ensure the arrays are aligned,
- * or allow EDBM_unified_findnearest_from_raycast to take an array arg. */
- for (int ob_index = 0; ob_index < gz_ele->objects_len; ob_index++) {
- if (best.ob == gz_ele->objects[ob_index]) {
- best.ob_index = ob_index;
- break;
- }
- }
+ best.base_index = base_index;
/* Check above should never fail, if it does it's an internal error. */
- BLI_assert(best.ob_index != -1);
+ BLI_assert(best.base_index != -1);
}
}
BMesh *bm = NULL;
- gz_ele->object_index = -1;
+ gz_ele->base_index = -1;
gz_ele->vert_index = -1;
gz_ele->edge_index = -1;
gz_ele->face_index = -1;
if (best.ele) {
- gz_ele->object_index = best.ob_index;
- bm = BKE_editmesh_from_object(gz_ele->objects[gz_ele->object_index])->bm;
+ gz_ele->base_index = best.base_index;
+ bm = BKE_editmesh_from_object(gz_ele->bases[gz_ele->base_index]->object)->bm;
BM_mesh_elem_index_ensure(bm, best.ele->head.htype);
if (best.ele->head.htype == BM_VERT) {
@@ -173,7 +170,7 @@ static int gizmo_preselect_elem_test_select(
}
}
- if ((prev.object_index == gz_ele->object_index) &&
+ if ((prev.base_index == gz_ele->base_index) &&
(prev.vert_index == gz_ele->vert_index) &&
(prev.edge_index == gz_ele->edge_index) &&
(prev.face_index == gz_ele->face_index))
@@ -184,7 +181,7 @@ static int gizmo_preselect_elem_test_select(
if (best.ele) {
const float (*coords)[3] = NULL;
{
- Object *ob = gz_ele->objects[gz_ele->object_index];
+ Object *ob = gz_ele->bases[gz_ele->base_index]->object;
Depsgraph *depsgraph = CTX_data_depsgraph(C);
Mesh *me_eval = (Mesh *)DEG_get_evaluated_id(depsgraph, ob->data);
if (me_eval->runtime.edit_data) {
@@ -197,7 +194,7 @@ static int gizmo_preselect_elem_test_select(
EDBM_preselect_elem_clear(gz_ele->psel);
}
- RNA_int_set(gz->ptr, "object_index", gz_ele->object_index);
+ RNA_int_set(gz->ptr, "object_index", gz_ele->base_index);
RNA_int_set(gz->ptr, "vert_index", gz_ele->vert_index);
RNA_int_set(gz->ptr, "edge_index", gz_ele->edge_index);
RNA_int_set(gz->ptr, "face_index", gz_ele->face_index);
@@ -216,7 +213,7 @@ static void gizmo_preselect_elem_setup(wmGizmo *gz)
if (gz_ele->psel == NULL) {
gz_ele->psel = EDBM_preselect_elem_create();
}
- gz_ele->object_index = -1;
+ gz_ele->base_index = -1;
}
static void gizmo_preselect_elem_free(wmGizmo *gz)
@@ -224,7 +221,7 @@ static void gizmo_preselect_elem_free(wmGizmo *gz)
MeshElemGizmo3D *gz_ele = (MeshElemGizmo3D *)gz;
EDBM_preselect_elem_destroy(gz_ele->psel);
gz_ele->psel = NULL;
- MEM_SAFE_FREE(gz_ele->objects);
+ MEM_SAFE_FREE(gz_ele->bases);
}
static int gizmo_preselect_elem_invoke(
@@ -262,9 +259,9 @@ static void GIZMO_GT_mesh_preselect_elem_3d(wmGizmoType *gzt)
typedef struct MeshEdgeRingGizmo3D {
wmGizmo gizmo;
- Object **objects;
- uint objects_len;
- int object_index;
+ Base **bases;
+ uint bases_len;
+ int base_index;
int edge_index;
struct EditMesh_PreSelEdgeRing *psel;
} MeshEdgeRingGizmo3D;
@@ -272,8 +269,8 @@ typedef struct MeshEdgeRingGizmo3D {
static void gizmo_preselect_edgering_draw(const bContext *UNUSED(C), wmGizmo *gz)
{
MeshEdgeRingGizmo3D *gz_ring = (MeshEdgeRingGizmo3D *)gz;
- if (gz_ring->object_index != -1) {
- Object *ob = gz_ring->objects[gz_ring->object_index];
+ if (gz_ring->base_index != -1) {
+ Object *ob = gz_ring->bases[gz_ring->base_index]->object;
EDBM_preselect_edgering_draw(gz_ring->psel, ob->obmat);
}
}
@@ -286,26 +283,27 @@ static int gizmo_preselect_edgering_test_select(
Object *ob;
BMEdge *eed;
float dist;
- int ob_index;
+ int base_index;
} best = {
.dist = ED_view3d_select_dist_px(),
};
struct {
- int object_index;
+ int base_index;
int edge_index;
} prev = {
- .object_index = gz_ring->object_index,
+ .base_index = gz_ring->base_index,
.edge_index = gz_ring->edge_index,
};
{
ViewLayer *view_layer = CTX_data_view_layer(C);
- if (((gz_ring->objects)) == NULL ||
- (gz_ring->objects[0] != OBEDIT_FROM_VIEW_LAYER(view_layer)))
+ if (((gz_ring->bases)) == NULL ||
+ (gz_ring->bases[0] != view_layer->basact))
{
- gz_ring->objects = BKE_view_layer_array_from_objects_in_edit_mode(
- view_layer, &gz_ring->objects_len);
+ MEM_SAFE_FREE(gz_ring->bases);
+ gz_ring->bases = BKE_view_layer_array_from_bases_in_edit_mode(
+ view_layer, &gz_ring->bases_len);
}
}
@@ -313,31 +311,31 @@ static int gizmo_preselect_edgering_test_select(
em_setup_viewcontext(C, &vc);
copy_v2_v2_int(vc.mval, mval);
- for (uint ob_index = 0; ob_index < gz_ring->objects_len; ob_index++) {
- Object *ob_iter = gz_ring->objects[ob_index];
+ for (uint base_index = 0; base_index < gz_ring->bases_len; base_index++) {
+ Object *ob_iter = gz_ring->bases[base_index]->object;
ED_view3d_viewcontext_init_object(&vc, ob_iter);
BMEdge *eed_test = EDBM_edge_find_nearest_ex(&vc, &best.dist, NULL, false, false, NULL);
if (eed_test) {
best.ob = ob_iter;
best.eed = eed_test;
- best.ob_index = ob_index;
+ best.base_index = base_index;
}
}
BMesh *bm = NULL;
if (best.eed) {
- gz_ring->object_index = best.ob_index;
- bm = BKE_editmesh_from_object(gz_ring->objects[gz_ring->object_index])->bm;
+ gz_ring->base_index = best.base_index;
+ bm = BKE_editmesh_from_object(gz_ring->bases[gz_ring->base_index]->object)->bm;
BM_mesh_elem_index_ensure(bm, BM_EDGE);
gz_ring->edge_index = BM_elem_index_get(best.eed);
}
else {
- gz_ring->object_index = -1;
+ gz_ring->base_index = -1;
gz_ring->edge_index = -1;
}
- if ((prev.object_index == gz_ring->object_index) &&
+ if ((prev.base_index == gz_ring->base_index) &&
(prev.edge_index == gz_ring->edge_index))
{
/* pass (only recalculate on change) */
@@ -346,7 +344,7 @@ static int gizmo_preselect_edgering_test_select(
if (best.eed) {
const float (*coords)[3] = NULL;
{
- Object *ob = gz_ring->objects[gz_ring->object_index];
+ Object *ob = gz_ring->bases[gz_ring->base_index]->object;
Depsgraph *depsgraph = CTX_data_depsgraph(C);
Mesh *me_eval = (Mesh *)DEG_get_evaluated_id(depsgraph, ob->data);
if (me_eval->runtime.edit_data) {
@@ -359,7 +357,7 @@ static int gizmo_preselect_edgering_test_select(
EDBM_preselect_edgering_clear(gz_ring->psel);
}
- RNA_int_set(gz->ptr, "object_index", gz_ring->object_index);
+ RNA_int_set(gz->ptr, "object_index", gz_ring->base_index);
RNA_int_set(gz->ptr, "edge_index", gz_ring->edge_index);
ARegion *ar = CTX_wm_region(C);
@@ -376,7 +374,7 @@ static void gizmo_preselect_edgering_setup(wmGizmo *gz)
if (gz_ring->psel == NULL) {
gz_ring->psel = EDBM_preselect_edgering_create();
}
- gz_ring->object_index = -1;
+ gz_ring->base_index = -1;
}
static void gizmo_preselect_edgering_free(wmGizmo *gz)
@@ -384,7 +382,7 @@ static void gizmo_preselect_edgering_free(wmGizmo *gz)
MeshEdgeRingGizmo3D *gz_ring = (MeshEdgeRingGizmo3D *)gz;
EDBM_preselect_edgering_destroy(gz_ring->psel);
gz_ring->psel = NULL;
- MEM_SAFE_FREE(gz_ring->objects);
+ MEM_SAFE_FREE(gz_ring->bases);
}
static int gizmo_preselect_edgering_invoke(