diff options
author | Campbell Barton <ideasman42@gmail.com> | 2017-07-19 13:12:24 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2017-07-19 13:12:24 +0300 |
commit | abe0527e0fa77f15de4ebc7a7752a4c1375de1f1 (patch) | |
tree | faf9cec7e670d6d067e6f81bc0aebfcd174ca4a2 /source/blender | |
parent | dd64cedd0b6b2bda4819e7093029f2a216f3082d (diff) |
Manipulators: use nearest manipulator
Add utility function to get the nearest hit
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/gpu/GPU_select.h | 3 | ||||
-rw-r--r-- | source/blender/gpu/intern/gpu_select.c | 26 | ||||
-rw-r--r-- | source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c | 5 |
3 files changed, 32 insertions, 2 deletions
diff --git a/source/blender/gpu/GPU_select.h b/source/blender/gpu/GPU_select.h index cf5b8bf7d8f..0617d58f3b6 100644 --- a/source/blender/gpu/GPU_select.h +++ b/source/blender/gpu/GPU_select.h @@ -56,4 +56,7 @@ void GPU_select_cache_begin(void); void GPU_select_cache_load_id(void); void GPU_select_cache_end(void); +/* utilities */ +const uint *GPU_select_buffer_near(const uint *buffer, int hits); + #endif diff --git a/source/blender/gpu/intern/gpu_select.c b/source/blender/gpu/intern/gpu_select.c index 162a605ef3d..affc96b2843 100644 --- a/source/blender/gpu/intern/gpu_select.c +++ b/source/blender/gpu/intern/gpu_select.c @@ -227,3 +227,29 @@ bool GPU_select_is_cached(void) { return g_select_state.use_cache && gpu_select_pick_is_cached(); } + + +/* ---------------------------------------------------------------------------- + * Utilities + */ + +/** + * Helper function, nothing special but avoids doing inline since hit's aren't sorted by depth + * and purpose of 4x buffer indices isn't so clear. + * + * Note that comparing depth as uint is fine. + */ +const uint *GPU_select_buffer_near(const uint *buffer, int hits) +{ + const uint *buffer_near = NULL; + uint depth_min = (uint)-1; + for (int i = 0; i < hits; i++) { + if (buffer[1] < depth_min) { + BLI_assert(buffer[3] != -1); + depth_min = buffer[1]; + buffer_near = buffer; + } + buffer += 4; + } + return buffer_near; +}
\ No newline at end of file diff --git a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c index f5ef5572fd4..9507282192f 100644 --- a/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c +++ b/source/blender/windowmanager/manipulators/intern/wm_manipulator_map.c @@ -367,7 +367,6 @@ static int manipulator_find_intersected_3d_intern( GLuint buffer[MAXPICKBUF]; short hits; const bool do_passes = GPU_select_query_check_active(); - rect.xmin = co[0] - hotspot; rect.xmax = co[0] + hotspot; rect.ymin = co[1] - hotspot; @@ -392,7 +391,9 @@ static int manipulator_find_intersected_3d_intern( ED_view3d_draw_setup_view(CTX_wm_window(C), CTX_data_scene(C), ar, v3d, NULL, NULL, NULL); - return hits > 0 ? buffer[3] : -1; + const GLuint *hit_near = GPU_select_buffer_near(buffer, hits); + + return hit_near ? hit_near[3] : -1; } /** |