Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/space_view3d/view3d_select.c
| Show First 20 Lines • Show All 132 Lines • ▼ Show 20 Lines | |||||
| struct EDSelectID_Context { | struct EDSelectID_Context { | ||||
| struct EDBaseOffset *base_array_index_offsets; | struct EDBaseOffset *base_array_index_offsets; | ||||
| /** Borrow from caller (not freed). */ | /** Borrow from caller (not freed). */ | ||||
| struct Base **bases; | struct Base **bases; | ||||
| uint bases_len; | uint bases_len; | ||||
| /** Total number of items `base_array_index_offsets[bases_len - 1].vert`. */ | /** Total number of items `base_array_index_offsets[bases_len - 1].vert`. */ | ||||
| uint base_array_index_len; | uint base_array_index_len; | ||||
| /** Used to check for changes. (Use depsgraph instead?). */ | |||||
| float persmat[4][4]; | |||||
| short select_mode; | |||||
| }; | }; | ||||
| static bool check_ob_drawface_dot(short select_mode, const View3D *v3d, char dt) | static bool check_ob_drawface_dot(short select_mode, const View3D *v3d, char dt) | ||||
| { | { | ||||
| if (select_mode & SCE_SELECT_FACE) { | if (select_mode & SCE_SELECT_FACE) { | ||||
| if ((dt < OB_SOLID) || XRAY_FLAG_ENABLED(v3d)) { | if ((dt < OB_SOLID) || XRAY_FLAG_ENABLED(v3d)) { | ||||
| return true; | return true; | ||||
| } | } | ||||
| Show All 37 Lines | for (uint base_index = 0; base_index < sel_id_ctx->bases_len; base_index++) { | ||||
| offset = base_ofs->vert; | offset = base_ofs->vert; | ||||
| } | } | ||||
| sel_id_ctx->base_array_index_len = offset; | sel_id_ctx->base_array_index_len = offset; | ||||
| DRW_framebuffer_select_id_release(vc->ar); | DRW_framebuffer_select_id_release(vc->ar); | ||||
| } | } | ||||
| void ED_view3d_select_id_validate_view_matrices(const struct EDSelectID_Context *sel_id_ctx, | |||||
| ViewContext *vc) | |||||
| { | |||||
| if (!compare_m4m4(sel_id_ctx->persmat, vc->rv3d->persmat, FLT_EPSILON)) { | |||||
| ed_select_id_draw_bases(sel_id_ctx, vc, sel_id_ctx->select_mode); | |||||
| } | |||||
| } | |||||
| uint ED_view3d_select_id_context_offset_for_object_elem( | uint ED_view3d_select_id_context_offset_for_object_elem( | ||||
| const struct EDSelectID_Context *sel_id_ctx, int base_index, char elem_type) | const struct EDSelectID_Context *sel_id_ctx, int base_index, char elem_type) | ||||
| { | { | ||||
| struct EDBaseOffset *base_ofs = &sel_id_ctx->base_array_index_offsets[base_index]; | struct EDBaseOffset *base_ofs = &sel_id_ctx->base_array_index_offsets[base_index]; | ||||
| if (elem_type == SCE_SELECT_VERTEX) { | if (elem_type == SCE_SELECT_VERTEX) { | ||||
| return base_ofs->vert_start - 1; | return base_ofs->vert_start - 1; | ||||
| } | } | ||||
| if (elem_type == SCE_SELECT_EDGE) { | if (elem_type == SCE_SELECT_EDGE) { | ||||
| Show All 16 Lines | struct EDSelectID_Context *ED_view3d_select_id_context_create(ViewContext *vc, | ||||
| const uint bases_len, | const uint bases_len, | ||||
| short select_mode) | short select_mode) | ||||
| { | { | ||||
| struct EDSelectID_Context *sel_id_ctx = MEM_mallocN(sizeof(*sel_id_ctx), __func__); | struct EDSelectID_Context *sel_id_ctx = MEM_mallocN(sizeof(*sel_id_ctx), __func__); | ||||
| sel_id_ctx->base_array_index_offsets = MEM_mallocN(sizeof(struct EDBaseOffset) * bases_len, | sel_id_ctx->base_array_index_offsets = MEM_mallocN(sizeof(struct EDBaseOffset) * bases_len, | ||||
| __func__); | __func__); | ||||
| sel_id_ctx->bases = bases; | sel_id_ctx->bases = bases; | ||||
| sel_id_ctx->bases_len = bases_len; | sel_id_ctx->bases_len = bases_len; | ||||
| copy_m4_m4(sel_id_ctx->persmat, vc->rv3d->persmat); | |||||
| sel_id_ctx->select_mode = select_mode; | |||||
| ed_select_id_draw_bases(sel_id_ctx, vc, select_mode); | ed_select_id_draw_bases(sel_id_ctx, vc, select_mode); | ||||
| return sel_id_ctx; | return sel_id_ctx; | ||||
| } | } | ||||
| void ED_view3d_select_id_context_destroy(struct EDSelectID_Context *sel_id_ctx) | void ED_view3d_select_id_context_destroy(struct EDSelectID_Context *sel_id_ctx) | ||||
| { | { | ||||
| MEM_freeN(sel_id_ctx->base_array_index_offsets); | MEM_freeN(sel_id_ctx->base_array_index_offsets); | ||||
| ▲ Show 20 Lines • Show All 3,280 Lines • ▼ Show 20 Lines | static bool mesh_circle_select(ViewContext *vc, | ||||
| if (use_zbuf) { | if (use_zbuf) { | ||||
| if (wm_userdata->data == NULL) { | if (wm_userdata->data == NULL) { | ||||
| editselect_buf_cache_init_with_generic_userdata(wm_userdata, vc); | editselect_buf_cache_init_with_generic_userdata(wm_userdata, vc); | ||||
| } | } | ||||
| } | } | ||||
| struct EditSelectBuf_Cache *esel = wm_userdata->data; | struct EditSelectBuf_Cache *esel = wm_userdata->data; | ||||
| if (use_zbuf) { | if (use_zbuf) { | ||||
| ED_view3d_select_id_validate_view_matrices(esel->sel_id_ctx, vc); | |||||
| const uint buffer_len = ED_view3d_select_id_context_elem_len(esel->sel_id_ctx); | const uint buffer_len = ED_view3d_select_id_context_elem_len(esel->sel_id_ctx); | ||||
| esel->select_bitmap = ED_select_buffer_bitmap_from_circle(buffer_len, mval, (int)(rad + 1.0f)); | esel->select_bitmap = ED_select_buffer_bitmap_from_circle(buffer_len, mval, (int)(rad + 1.0f)); | ||||
| } | } | ||||
| if (ts->selectmode & SCE_SELECT_VERTEX) { | if (ts->selectmode & SCE_SELECT_VERTEX) { | ||||
| if (use_zbuf) { | if (use_zbuf) { | ||||
| if (esel->select_bitmap != NULL) { | if (esel->select_bitmap != NULL) { | ||||
| changed |= edbm_backbuf_check_and_select_verts( | changed |= edbm_backbuf_check_and_select_verts( | ||||
| ▲ Show 20 Lines • Show All 647 Lines • Show Last 20 Lines | |||||