3D View: use cache for armature select

This commit is contained in:
Campbell Barton 2017-03-09 09:22:56 +11:00
parent c837bd5ea5
commit 4ab322fdd2
2 changed files with 47 additions and 9 deletions

@ -53,6 +53,8 @@
#include "ED_screen.h"
#include "ED_view3d.h"
#include "GPU_select.h"
#include "armature_intern.h"
/* utility macros for storing a temp int in the bone (selection flag) */
@ -275,6 +277,19 @@ void ARMATURE_OT_select_linked(wmOperatorType *ot)
RNA_def_boolean(ot->srna, "extend", false, "Extend", "Extend selection instead of deselecting everything first");
}
/* utility function for get_nearest_editbonepoint */
static int selectbuffer_ret_hits_12(unsigned int *UNUSED(buffer), const int hits12)
{
return hits12;
}
static int selectbuffer_ret_hits_5(unsigned int *buffer, const int hits12, const int hits5)
{
const int offs = 4 * hits12;
memcpy(buffer, buffer + offs, 4 * hits5 * sizeof(unsigned int));
return hits5;
}
/* does bones and points */
/* note that BONE ROOT only gets drawn for root bones (or without IK) */
static EditBone *get_nearest_editbonepoint(
@ -289,7 +304,8 @@ static EditBone *get_nearest_editbonepoint(
unsigned int buffer[MAXPICKBUF];
unsigned int hitresult, besthitresult = BONESEL_NOSEL;
int i, mindep = 5;
short hits;
int hits12, hits5 = 0;
static int last_mval[2] = {-100, -100};
/* find the bone after the current active bone, so as to bump up its chances in selection.
@ -322,19 +338,41 @@ static EditBone *get_nearest_editbonepoint(
}
}
/* matching logic from 'mixed_bones_object_selectbuffer' */
const int select_mode = (do_nearest ? VIEW3D_SELECT_PICK_NEAREST : VIEW3D_SELECT_PICK_ALL);
int hits = 0;
/* TODO: select larger region first (so we can use GPU_select_cache) */
BLI_rcti_init_pt_radius(&rect, mval, 5);
hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, &rect, select_mode);
/* we _must_ end cache before return, use 'goto cache_end' */
GPU_select_cache_begin();
if (hits == 0) {
BLI_rcti_init_pt_radius(&rect, mval, 12);
hits = view3d_opengl_select(vc, buffer, MAXPICKBUF, &rect, select_mode);
BLI_rcti_init_pt_radius(&rect, mval, 12);
hits12 = view3d_opengl_select(vc, buffer, MAXPICKBUF, &rect, select_mode);
if (hits12 == 1) {
hits = selectbuffer_ret_hits_12(buffer, hits12);
goto cache_end;
}
else if (hits12 > 0) {
int offs;
offs = 4 * hits12;
BLI_rcti_init_pt_radius(&rect, mval, 5);
hits5 = view3d_opengl_select(vc, buffer + offs, MAXPICKBUF - offs, &rect, select_mode);
if (hits5 == 1) {
hits = selectbuffer_ret_hits_5(buffer, hits12, hits5);
goto cache_end;
}
if (hits5 > 0) { hits = selectbuffer_ret_hits_5(buffer, hits12, hits5); goto cache_end; }
else { hits = selectbuffer_ret_hits_12(buffer, hits12); goto cache_end; }
}
cache_end:
GPU_select_cache_end();
/* See if there are any selected bones in this group */
if (hits > 0) {
if (hits == 1) {
if (!(buffer[3] & BONESEL_NOSEL))
besthitresult = buffer[3];

@ -1211,7 +1211,6 @@ static int mixed_bones_object_selectbuffer(
bool *r_do_nearest)
{
rcti rect;
int offs;
int hits15, hits9 = 0, hits5 = 0;
bool has_bones15 = false, has_bones9 = false, has_bones5 = false;
static int last_mval[2] = {-100, -100};
@ -1253,6 +1252,7 @@ static int mixed_bones_object_selectbuffer(
goto finally;
}
else if (hits15 > 0) {
int offs;
has_bones15 = selectbuffer_has_bones(buffer, hits15);
offs = 4 * hits15;