| 
									
										
										
										
											2022-02-11 09:07:11 +11:00
										 |  |  | /* SPDX-License-Identifier: GPL-2.0-or-later
 | 
					
						
							|  |  |  |  * Copyright 2016 Blender Foundation. */ | 
					
						
							| 
									
										
										
										
											2019-08-07 12:43:04 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  | /** \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; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  | typedef struct SELECTID_ObjectData { | 
					
						
							|  |  |  |   DrawData dd; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   uint drawn_index; | 
					
						
							|  |  |  |   bool is_drawn; | 
					
						
							|  |  |  | } SELECTID_ObjectData; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-12 12:29:18 -03:00
										 |  |  | struct ObjectOffsets { | 
					
						
							| 
									
										
										
										
											2019-08-12 12:10:44 -03:00
										 |  |  |   /* For convenience only. */ | 
					
						
							|  |  |  |   union { | 
					
						
							|  |  |  |     uint offset; | 
					
						
							|  |  |  |     uint face_start; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   union { | 
					
						
							|  |  |  |     uint face; | 
					
						
							|  |  |  |     uint edge_start; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   union { | 
					
						
							|  |  |  |     uint edge; | 
					
						
							|  |  |  |     uint vert_start; | 
					
						
							|  |  |  |   }; | 
					
						
							|  |  |  |   uint vert; | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 12:08:55 -03:00
										 |  |  | typedef struct SELECTID_Context { | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  |   /* 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; | 
					
						
							| 
									
										
										
										
											2020-06-17 12:08:55 -03:00
										 |  |  |   struct ObjectOffsets *index_offsets; | 
					
						
							|  |  |  |   uint objects_len; | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  |   uint objects_drawn_len; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   /** Total number of element indices `index_offsets[object_drawn_len - 1].vert`. */ | 
					
						
							|  |  |  |   uint index_drawn_len; | 
					
						
							| 
									
										
										
										
											2019-08-12 12:10:44 -03:00
										 |  |  | 
 | 
					
						
							|  |  |  |   short select_mode; | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-06-17 12:08:55 -03:00
										 |  |  |   /* rect is used to check which objects whose indexes need to be drawn. */ | 
					
						
							|  |  |  |   rcti last_rect; | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  |   /* To check for updates. */ | 
					
						
							|  |  |  |   float persmat[4][4]; | 
					
						
							|  |  |  |   bool is_dirty; | 
					
						
							| 
									
										
										
										
											2020-06-17 12:08:55 -03:00
										 |  |  | } SELECTID_Context; | 
					
						
							| 
									
										
										
										
											2019-08-12 12:10:44 -03:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  | /* draw_select_buffer.c */ | 
					
						
							| 
									
										
										
										
											2021-12-08 20:29:39 +11:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-01-07 11:38:08 +11:00
										 |  |  | bool DRW_select_buffer_elem_get(uint sel_id, uint *r_elem, uint *r_base_index, char *r_elem_type); | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  | uint DRW_select_buffer_context_offset_for_object_elem(struct Depsgraph *depsgraph, | 
					
						
							|  |  |  |                                                       struct Object *object, | 
					
						
							|  |  |  |                                                       char elem_type); | 
					
						
							| 
									
										
										
										
											2021-12-08 20:29:39 +11:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Main function to read a block of pixels from the select frame buffer. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  | uint *DRW_select_buffer_read(struct Depsgraph *depsgraph, | 
					
						
							| 
									
										
										
										
											2020-03-06 16:56:42 +01:00
										 |  |  |                              struct ARegion *region, | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  |                              struct View3D *v3d, | 
					
						
							|  |  |  |                              const rcti *rect, | 
					
						
							|  |  |  |                              uint *r_buf_len); | 
					
						
							| 
									
										
										
										
											2021-12-08 20:29:39 +11:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * \param rect: The rectangle to sample indices from (min/max inclusive). | 
					
						
							|  |  |  |  * \returns a #BLI_bitmap the length of \a bitmap_len or NULL on failure. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  | uint *DRW_select_buffer_bitmap_from_rect(struct Depsgraph *depsgraph, | 
					
						
							| 
									
										
										
										
											2020-03-06 16:56:42 +01:00
										 |  |  |                                          struct ARegion *region, | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  |                                          struct View3D *v3d, | 
					
						
							|  |  |  |                                          const struct rcti *rect, | 
					
						
							|  |  |  |                                          uint *r_bitmap_len); | 
					
						
							| 
									
										
										
										
											2021-12-08 20:29:39 +11:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * \param center: Circle center. | 
					
						
							|  |  |  |  * \param radius: Circle radius. | 
					
						
							|  |  |  |  * \param r_bitmap_len: Number of indices in the selection id buffer. | 
					
						
							|  |  |  |  * \returns a #BLI_bitmap the length of \a r_bitmap_len or NULL on failure. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  | uint *DRW_select_buffer_bitmap_from_circle(struct Depsgraph *depsgraph, | 
					
						
							| 
									
										
										
										
											2020-03-06 16:56:42 +01:00
										 |  |  |                                            struct ARegion *region, | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  |                                            struct View3D *v3d, | 
					
						
							|  |  |  |                                            const int center[2], | 
					
						
							| 
									
										
										
										
											2022-01-07 11:38:08 +11:00
										 |  |  |                                            int radius, | 
					
						
							| 
									
										
										
										
											2019-08-07 12:43:04 -03:00
										 |  |  |                                            uint *r_bitmap_len); | 
					
						
							| 
									
										
										
										
											2021-12-08 20:29:39 +11:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * \param poly: The polygon coordinates. | 
					
						
							|  |  |  |  * \param poly_len: Length of the polygon. | 
					
						
							|  |  |  |  * \param rect: Polygon boundaries. | 
					
						
							|  |  |  |  * \returns a #BLI_bitmap. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  | uint *DRW_select_buffer_bitmap_from_poly(struct Depsgraph *depsgraph, | 
					
						
							| 
									
										
										
										
											2020-03-06 16:56:42 +01:00
										 |  |  |                                          struct ARegion *region, | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  |                                          struct View3D *v3d, | 
					
						
							|  |  |  |                                          const int poly[][2], | 
					
						
							| 
									
										
										
										
											2022-01-07 11:38:08 +11:00
										 |  |  |                                          int poly_len, | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  |                                          const struct rcti *rect, | 
					
						
							|  |  |  |                                          uint *r_bitmap_len); | 
					
						
							| 
									
										
										
										
											2021-12-08 20:29:39 +11:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Samples a single pixel. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  | uint DRW_select_buffer_sample_point(struct Depsgraph *depsgraph, | 
					
						
							| 
									
										
										
										
											2020-03-06 16:56:42 +01:00
										 |  |  |                                     struct ARegion *region, | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  |                                     struct View3D *v3d, | 
					
						
							|  |  |  |                                     const int center[2]); | 
					
						
							| 
									
										
										
										
											2021-12-08 20:29:39 +11:00
										 |  |  | /**
 | 
					
						
							|  |  |  |  * Find the selection id closest to \a center. | 
					
						
							|  |  |  |  * \param dist: Use to initialize the distance, | 
					
						
							|  |  |  |  * when found, this value is set to the distance of the selection that's returned. | 
					
						
							|  |  |  |  */ | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  | uint DRW_select_buffer_find_nearest_to_point(struct Depsgraph *depsgraph, | 
					
						
							| 
									
										
										
										
											2020-03-06 16:56:42 +01:00
										 |  |  |                                              struct ARegion *region, | 
					
						
							| 
									
										
										
										
											2019-08-15 10:31:54 -03:00
										 |  |  |                                              struct View3D *v3d, | 
					
						
							|  |  |  |                                              const int center[2], | 
					
						
							| 
									
										
										
										
											2022-01-07 11:38:08 +11:00
										 |  |  |                                              uint id_min, | 
					
						
							|  |  |  |                                              uint id_max, | 
					
						
							| 
									
										
										
										
											2019-08-07 12:43:04 -03:00
										 |  |  |                                              uint *dist); | 
					
						
							| 
									
										
										
										
											2022-01-07 11:38:08 +11:00
										 |  |  | void DRW_select_buffer_context_create(struct Base **bases, uint bases_len, short select_mode); |