From 8815f2f11632ea84d706bacd18e60639cb13d6eb Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Mon, 31 Jan 2022 13:01:29 +1100 Subject: Cleanup: use struct for GPU the select buffer GPU_select originally used GL_SELECT which defined the format for storing the selection result. Now this is no longer the case, define our own struct - making the code easier to follow: - Avoid having to deal with arrays in both `uint*` and `uint(*)[4]` multiplying offsets by 4 in some cases & not others. - No magic numbers for the offsets of depth & selection-ID. - No need to allocate unused members to match GL_SELECT (halving the buffer size). --- source/blender/gpu/GPU_select.h | 24 ++++++++++++++++++++---- 1 file changed, 20 insertions(+), 4 deletions(-) (limited to 'source/blender/gpu/GPU_select.h') diff --git a/source/blender/gpu/GPU_select.h b/source/blender/gpu/GPU_select.h index e5dda23b98d..90bbde4976c 100644 --- a/source/blender/gpu/GPU_select.h +++ b/source/blender/gpu/GPU_select.h @@ -42,11 +42,27 @@ typedef enum eGPUSelectMode { GPU_SELECT_PICK_NEAREST = 5, } eGPUSelectMode; +/** + * The result of calling #GPU_select_begin & #GPU_select_end. + */ +typedef struct GPUSelectResult { + /** The selection identifier matching the value passed in by #GPU_select_load_id. */ + unsigned int id; + /** + * The nearest depth. + * - Only supported by picking modes (#GPU_SELECT_PICK_ALL and #GPU_SELECT_PICK_NEAREST) + * since occlusion quiries don't provide a convenient way of accessing the depth-buffer. + * - OpenGL's `GL_SELECT` supported both near and far depths, + * this has not been included as Blender doesn't need this however support could be added. + */ + unsigned int depth; +} GPUSelectResult; + /** * Initialize and provide buffer for results. */ -void GPU_select_begin(unsigned int *buffer, - unsigned int bufsize, +void GPU_select_begin(GPUSelectResult *buffer, + unsigned int buffer_len, const struct rcti *input, eGPUSelectMode mode, int oldhits); @@ -82,8 +98,8 @@ void GPU_select_cache_end(void); * * Note that comparing depth as uint is fine. */ -const uint *GPU_select_buffer_near(const uint *buffer, int hits); -uint GPU_select_buffer_remove_by_id(uint *buffer, int hits, uint select_id); +const GPUSelectResult *GPU_select_buffer_near(const GPUSelectResult *buffer, int hits); +uint GPU_select_buffer_remove_by_id(GPUSelectResult *buffer, int hits, uint select_id); /** * Part of the solution copied from `rect_subregion_stride_calc`. */ -- cgit v1.2.3