/* * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License * as published by the Free Software Foundation; either version 2 * of the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software Foundation, * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. * * Copyright 2016, Blender Foundation. */ /** \file * \ingroup draw */ #pragma once #include "BLI_sys_types.h" /* for bool and uint */ struct ARegion; struct Base; struct Depsgraph; struct Object; struct View3D; struct rcti; typedef struct SELECTID_ObjectData { DrawData dd; uint drawn_index; bool is_drawn; } SELECTID_ObjectData; struct ObjectOffsets { /* For convenience only. */ union { uint offset; uint face_start; }; union { uint face; uint edge_start; }; union { uint edge; uint vert_start; }; uint vert; }; typedef struct SELECTID_Context { /* All context objects */ struct Object **objects; /* Array with only drawn objects. When a new object is found within the rect, * it is added to the end of the list. * The list is reset to any viewport or context update. */ struct Object **objects_drawn; struct ObjectOffsets *index_offsets; uint objects_len; uint objects_drawn_len; /** Total number of element indices `index_offsets[object_drawn_len - 1].vert`. */ uint index_drawn_len; short select_mode; /* rect is used to check which objects whose indexes need to be drawn. */ rcti last_rect; /* To check for updates. */ float persmat[4][4]; bool is_dirty; } SELECTID_Context; /* draw_select_buffer.c */ bool DRW_select_buffer_elem_get(const uint sel_id, uint *r_elem, uint *r_base_index, char *r_elem_type); uint DRW_select_buffer_context_offset_for_object_elem(struct Depsgraph *depsgraph, struct Object *object, char elem_type); uint *DRW_select_buffer_read(struct Depsgraph *depsgraph, struct ARegion *region, struct View3D *v3d, const rcti *rect, uint *r_buf_len); uint *DRW_select_buffer_bitmap_from_rect(struct Depsgraph *depsgraph, struct ARegion *region, struct View3D *v3d, const struct rcti *rect, uint *r_bitmap_len); uint *DRW_select_buffer_bitmap_from_circle(struct Depsgraph *depsgraph, struct ARegion *region, struct View3D *v3d, const int center[2], const int radius, uint *r_bitmap_len); uint *DRW_select_buffer_bitmap_from_poly(struct Depsgraph *depsgraph, struct ARegion *region, struct View3D *v3d, const int poly[][2], const int poly_len, const struct rcti *rect, uint *r_bitmap_len); uint DRW_select_buffer_sample_point(struct Depsgraph *depsgraph, struct ARegion *region, struct View3D *v3d, const int center[2]); uint DRW_select_buffer_find_nearest_to_point(struct Depsgraph *depsgraph, struct ARegion *region, struct View3D *v3d, const int center[2], const uint id_min, const uint id_max, uint *dist); void DRW_select_buffer_context_create(struct Base **bases, const uint bases_len, short select_mode);