From fc8a7a44b200e37066a8753c514564c674eace30 Mon Sep 17 00:00:00 2001 From: Campbell Barton Date: Wed, 10 Jun 2020 17:50:11 +1000 Subject: Fix T77560: Bone selection crashes The was caused by 8b347fc2cdc67 as the old BONESEL_NOSEL flag handled the -1 case (used for none). Instead of checking for -1, remove these elements from the array as selection code makes decisions based on the number of hits detected. --- source/blender/gpu/GPU_select.h | 1 + source/blender/gpu/intern/gpu_select.c | 18 ++++++++++++++++++ 2 files changed, 19 insertions(+) (limited to 'source/blender/gpu') diff --git a/source/blender/gpu/GPU_select.h b/source/blender/gpu/GPU_select.h index 41d580f9b6d..d9a8e964a3d 100644 --- a/source/blender/gpu/GPU_select.h +++ b/source/blender/gpu/GPU_select.h @@ -57,6 +57,7 @@ void GPU_select_cache_end(void); /* utilities */ 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); void GPU_select_buffer_stride_realign(const struct rcti *src, const struct rcti *dst, uint *r_buf); #ifdef __cplusplus diff --git a/source/blender/gpu/intern/gpu_select.c b/source/blender/gpu/intern/gpu_select.c index 1776f0f391d..5766a176a96 100644 --- a/source/blender/gpu/intern/gpu_select.c +++ b/source/blender/gpu/intern/gpu_select.c @@ -213,6 +213,24 @@ const uint *GPU_select_buffer_near(const uint *buffer, int hits) return buffer_near; } +uint GPU_select_buffer_remove_by_id(uint *buffer, int hits, uint select_id) +{ + uint *buffer_src = buffer; + uint *buffer_dst = buffer; + int hits_final = 0; + for (int i = 0; i < hits; i++) { + if (buffer_src[3] != select_id) { + if (buffer_dst != buffer_src) { + memcpy(buffer_dst, buffer_src, sizeof(int[4])); + } + buffer_dst += 4; + hits_final += 1; + } + buffer_src += 4; + } + return hits_final; +} + /* Part of the solution copied from `rect_subregion_stride_calc`. */ void GPU_select_buffer_stride_realign(const rcti *src, const rcti *dst, uint *r_buf) { -- cgit v1.2.3