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:
authormano-wii <germano.costa@ig.com.br>2019-06-14 05:40:49 +0300
committermano-wii <germano.costa@ig.com.br>2019-06-14 06:03:00 +0300
commita4bd3f7d7e5634c96fd15d4bd8c2ed0211dc990a (patch)
tree60ca6fef990d1c8155786da0e3f8e3004421c9c2 /source/blender/editors/mesh/editmesh_select.c
parentaccd8d005bba1a78566b19f368b6485a698c9f68 (diff)
Mesh Selection: Move Selection ID Context Utilities to ED_view3d.
This patch does not bring functional changes, but it is a good change if we want to use these utilities in areas other than those using BMesh (eg painting editors). This is also a step to replace `ED_view3d_select_id_validate`. That function erroneously checks `V3D_INVALID_BACKBUF` which causes it to update unnecessarily. Reviewers: campbellbarton Differential Revision: https://developer.blender.org/D5072
Diffstat (limited to 'source/blender/editors/mesh/editmesh_select.c')
-rw-r--r--source/blender/editors/mesh/editmesh_select.c207
1 files changed, 31 insertions, 176 deletions
diff --git a/source/blender/editors/mesh/editmesh_select.c b/source/blender/editors/mesh/editmesh_select.c
index 75d685fb9c6..7b770f055b4 100644
--- a/source/blender/editors/mesh/editmesh_select.c
+++ b/source/blender/editors/mesh/editmesh_select.c
@@ -68,8 +68,6 @@
#include "DEG_depsgraph.h"
#include "DEG_depsgraph_query.h"
-#include "DRW_engine.h"
-
#include "mesh_intern.h" /* own include */
/* use bmesh operator flags for a few operators */
@@ -199,177 +197,34 @@ void EDBM_automerge(Scene *scene, Object *obedit, bool update, const char hflag)
/** \name Back-Buffer OpenGL Selection
* \{ */
-struct EDBMBaseOffset {
- /* For convenience only. */
- union {
- uint offset;
- uint face_start;
- };
- union {
- uint face;
- uint edge_start;
- };
- union {
- uint edge;
- uint vert_start;
- };
- uint vert;
-};
-
-struct EDBMSelectID_Context {
- struct EDBMBaseOffset *base_array_index_offsets;
- /** Borrow from caller (not freed). */
- struct Base **bases;
- uint bases_len;
- /** Total number of items `base_array_index_offsets[bases_len - 1].vert`. */
- uint base_array_index_len;
-};
-
-static bool check_ob_drawface_dot(short select_mode, const View3D *v3d, char dt)
+static BMElem *EDBM_select_id_bm_elem_get(struct EDSelectID_Context *sel_id_ctx,
+ Base **bases,
+ const uint sel_id,
+ uint *r_base_index)
{
- if (select_mode & SCE_SELECT_FACE) {
- if ((dt < OB_SOLID) || XRAY_FLAG_ENABLED(v3d)) {
- return true;
- }
- if (v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_FACE_DOT) {
- return true;
- }
- if ((v3d->overlay.edit_flag & V3D_OVERLAY_EDIT_EDGES) == 0) {
- /* Since we can't deduce face selection when edges aren't visible - show dots. */
- return true;
- }
- }
- return false;
-}
-
-static void edbm_select_pick_draw_bases(struct EDBMSelectID_Context *sel_id_ctx,
- ViewContext *vc,
- short select_mode)
-{
- Scene *scene_eval = (Scene *)DEG_get_evaluated_id(vc->depsgraph, &vc->scene->id);
- DRW_framebuffer_select_id_setup(vc->ar, true);
-
- uint offset = 1;
- for (uint base_index = 0; base_index < sel_id_ctx->bases_len; base_index++) {
- Object *ob_eval = DEG_get_evaluated_object(vc->depsgraph,
- sel_id_ctx->bases[base_index]->object);
-
- struct EDBMBaseOffset *base_ofs = &sel_id_ctx->base_array_index_offsets[base_index];
- bool draw_facedot = check_ob_drawface_dot(select_mode, vc->v3d, ob_eval->dt);
-
- DRW_draw_select_id_object(scene_eval,
- vc->rv3d,
- ob_eval,
- select_mode,
- draw_facedot,
- offset,
- &base_ofs->vert,
- &base_ofs->edge,
- &base_ofs->face);
-
- base_ofs->offset = offset;
- offset = base_ofs->vert;
- }
-
- sel_id_ctx->base_array_index_len = offset;
-
- DRW_framebuffer_select_id_release(vc->ar);
-}
-
-BMElem *EDBM_select_id_bm_elem_get(struct EDBMSelectID_Context *sel_id_ctx,
- const uint sel_id,
- uint *r_base_index)
-{
- char elem_type = 0;
uint elem_id;
- uint base_index = 0;
- for (; base_index < sel_id_ctx->bases_len; base_index++) {
- struct EDBMBaseOffset *base_ofs = &sel_id_ctx->base_array_index_offsets[base_index];
- if (base_ofs->face > sel_id) {
- elem_id = sel_id - base_ofs->face_start;
- elem_type = BM_FACE;
- break;
- }
- if (base_ofs->edge > sel_id) {
- elem_id = sel_id - base_ofs->edge_start;
- elem_type = BM_EDGE;
- break;
- }
- if (base_ofs->vert > sel_id) {
- elem_id = sel_id - base_ofs->vert_start;
- elem_type = BM_VERT;
- break;
- }
- }
-
- if (base_index >= sel_id_ctx->bases_len) {
- BLI_assert(0);
- return NULL;
- }
-
- if (r_base_index) {
- *r_base_index = base_index;
- }
-
- Object *obedit = sel_id_ctx->bases[base_index]->object;
- BMEditMesh *em = BKE_editmesh_from_object(obedit);
+ char elem_type = 0;
+ bool success = ED_view3d_select_id_elem_get(
+ sel_id_ctx, sel_id, &elem_id, r_base_index, &elem_type);
- switch (elem_type) {
- case BM_FACE:
- return (BMElem *)BM_face_at_index_find_or_table(em->bm, elem_id);
- case BM_EDGE:
- return (BMElem *)BM_edge_at_index_find_or_table(em->bm, elem_id);
- case BM_VERT:
- return (BMElem *)BM_vert_at_index_find_or_table(em->bm, elem_id);
- default:
- BLI_assert(0);
- return NULL;
- }
-}
+ if (success) {
+ Object *obedit = bases[*r_base_index]->object;
+ BMEditMesh *em = BKE_editmesh_from_object(obedit);
-uint EDBM_select_id_context_offset_for_object_elem(const struct EDBMSelectID_Context *sel_id_ctx,
- int base_index,
- char htype)
-{
- struct EDBMBaseOffset *base_ofs = &sel_id_ctx->base_array_index_offsets[base_index];
- if (htype == BM_VERT) {
- return base_ofs->vert_start - 1;
- }
- if (htype == BM_EDGE) {
- return base_ofs->edge_start - 1;
- }
- if (htype == BM_FACE) {
- return base_ofs->face_start - 1;
+ switch (elem_type) {
+ case SCE_SELECT_FACE:
+ return (BMElem *)BM_face_at_index_find_or_table(em->bm, elem_id);
+ case SCE_SELECT_EDGE:
+ return (BMElem *)BM_edge_at_index_find_or_table(em->bm, elem_id);
+ case SCE_SELECT_VERTEX:
+ return (BMElem *)BM_vert_at_index_find_or_table(em->bm, elem_id);
+ default:
+ BLI_assert(0);
+ return NULL;
+ }
}
- BLI_assert(0);
- return 0;
-}
-uint EDBM_select_id_context_elem_len(const struct EDBMSelectID_Context *sel_id_ctx)
-{
- return sel_id_ctx->base_array_index_len;
-}
-
-struct EDBMSelectID_Context *EDBM_select_id_context_create(ViewContext *vc,
- Base **bases,
- const uint bases_len,
- short select_mode)
-{
- struct EDBMSelectID_Context *sel_id_ctx = MEM_mallocN(sizeof(*sel_id_ctx), __func__);
- sel_id_ctx->base_array_index_offsets = MEM_mallocN(sizeof(struct EDBMBaseOffset) * bases_len,
- __func__);
- sel_id_ctx->bases = bases;
- sel_id_ctx->bases_len = bases_len;
-
- edbm_select_pick_draw_bases(sel_id_ctx, vc, select_mode);
-
- return sel_id_ctx;
-}
-
-void EDBM_select_id_context_destroy(struct EDBMSelectID_Context *sel_id_ctx)
-{
- MEM_freeN(sel_id_ctx->base_array_index_offsets);
- MEM_freeN(sel_id_ctx);
+ return NULL;
}
/** \} */
@@ -480,19 +335,19 @@ BMVert *EDBM_vert_find_nearest_ex(ViewContext *vc,
{
FAKE_SELECT_MODE_BEGIN(vc, fake_select_mode, select_mode, SCE_SELECT_VERTEX);
- struct EDBMSelectID_Context *sel_id_ctx = EDBM_select_id_context_create(
+ struct EDSelectID_Context *sel_id_ctx = ED_view3d_select_id_context_create(
vc, bases, bases_len, select_mode);
index = ED_select_buffer_find_nearest_to_point(vc->mval, 1, UINT_MAX, &dist_px);
if (index) {
- eve = (BMVert *)EDBM_select_id_bm_elem_get(sel_id_ctx, index, &base_index);
+ eve = (BMVert *)EDBM_select_id_bm_elem_get(sel_id_ctx, bases, index, &base_index);
}
else {
eve = NULL;
}
- EDBM_select_id_context_destroy(sel_id_ctx);
+ ED_view3d_select_id_context_destroy(sel_id_ctx);
FAKE_SELECT_MODE_END(vc, fake_select_mode);
}
@@ -709,19 +564,19 @@ BMEdge *EDBM_edge_find_nearest_ex(ViewContext *vc,
{
FAKE_SELECT_MODE_BEGIN(vc, fake_select_mode, select_mode, SCE_SELECT_EDGE);
- struct EDBMSelectID_Context *sel_id_ctx = EDBM_select_id_context_create(
+ struct EDSelectID_Context *sel_id_ctx = ED_view3d_select_id_context_create(
vc, bases, bases_len, select_mode);
index = ED_select_buffer_find_nearest_to_point(vc->mval, 1, UINT_MAX, &dist_px);
if (index) {
- eed = (BMEdge *)EDBM_select_id_bm_elem_get(sel_id_ctx, index, &base_index);
+ eed = (BMEdge *)EDBM_select_id_bm_elem_get(sel_id_ctx, bases, index, &base_index);
}
else {
eed = NULL;
}
- EDBM_select_id_context_destroy(sel_id_ctx);
+ ED_view3d_select_id_context_destroy(sel_id_ctx);
FAKE_SELECT_MODE_END(vc, fake_select_mode);
}
@@ -922,19 +777,19 @@ BMFace *EDBM_face_find_nearest_ex(ViewContext *vc,
{
FAKE_SELECT_MODE_BEGIN(vc, fake_select_mode, select_mode, SCE_SELECT_FACE);
- struct EDBMSelectID_Context *sel_id_ctx = EDBM_select_id_context_create(
+ struct EDSelectID_Context *sel_id_ctx = ED_view3d_select_id_context_create(
vc, bases, bases_len, select_mode);
index = ED_select_buffer_sample_point(vc->mval);
if (index) {
- efa = (BMFace *)EDBM_select_id_bm_elem_get(sel_id_ctx, index, &base_index);
+ efa = (BMFace *)EDBM_select_id_bm_elem_get(sel_id_ctx, bases, index, &base_index);
}
else {
efa = NULL;
}
- EDBM_select_id_context_destroy(sel_id_ctx);
+ ED_view3d_select_id_context_destroy(sel_id_ctx);
FAKE_SELECT_MODE_END(vc, fake_select_mode);
}