OpenGL Select: integer rect for passing region
This commit is contained in:
parent
9af0c8b00a
commit
c24d045a23
@ -241,7 +241,7 @@ void ED_view3d_smooth_view_force_finish(
|
||||
struct bContext *C,
|
||||
struct View3D *v3d, struct ARegion *ar);
|
||||
|
||||
void view3d_winmatrix_set(ARegion *ar, const View3D *v3d, const rctf *rect);
|
||||
void view3d_winmatrix_set(ARegion *ar, const View3D *v3d, const rcti *rect);
|
||||
void view3d_viewmatrix_set(Scene *scene, const View3D *v3d, RegionView3D *rv3d);
|
||||
|
||||
void fly_modal_keymap(struct wmKeyConfig *keyconf);
|
||||
|
@ -908,7 +908,7 @@ void ED_view3d_polygon_offset(const RegionView3D *rv3d, const float dist)
|
||||
/**
|
||||
* \param rect optional for picking (can be NULL).
|
||||
*/
|
||||
void view3d_winmatrix_set(ARegion *ar, const View3D *v3d, const rctf *rect)
|
||||
void view3d_winmatrix_set(ARegion *ar, const View3D *v3d, const rcti *rect)
|
||||
{
|
||||
RegionView3D *rv3d = ar->regiondata;
|
||||
rctf viewplane;
|
||||
@ -1175,7 +1175,7 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b
|
||||
Scene *scene = vc->scene;
|
||||
View3D *v3d = vc->v3d;
|
||||
ARegion *ar = vc->ar;
|
||||
rctf rect;
|
||||
rcti rect;
|
||||
short hits;
|
||||
const bool use_obedit_skip = (scene->obedit != NULL) && (vc->obedit == NULL);
|
||||
const bool do_passes = do_nearest && GPU_select_query_check_active();
|
||||
@ -1185,10 +1185,10 @@ short view3d_opengl_select(ViewContext *vc, unsigned int *buffer, unsigned int b
|
||||
/* case not a border select */
|
||||
if (input->xmin == input->xmax) {
|
||||
/* seems to be default value for bones only now */
|
||||
BLI_rctf_init_pt_radius(&rect, (const float[2]){input->xmin, input->ymin}, 12);
|
||||
BLI_rcti_init_pt_radius(&rect, (const int[2]){input->xmin, input->ymin}, 12);
|
||||
}
|
||||
else {
|
||||
BLI_rctf_rcti_copy(&rect, input);
|
||||
rect = *input;
|
||||
}
|
||||
|
||||
view3d_winmatrix_set(ar, v3d, &rect);
|
||||
|
@ -1724,14 +1724,14 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, const int mval[2], fl
|
||||
{
|
||||
View3D *v3d = sa->spacedata.first;
|
||||
RegionView3D *rv3d = ar->regiondata;
|
||||
rctf rect, selrect;
|
||||
rcti rect;
|
||||
GLuint buffer[64]; // max 4 items per select, so large enuf
|
||||
short hits;
|
||||
const bool is_picksel = true;
|
||||
const bool do_passes = GPU_select_query_check_active();
|
||||
|
||||
/* XXX check a bit later on this... (ton) */
|
||||
extern void view3d_winmatrix_set(ARegion *ar, View3D *v3d, rctf *rect);
|
||||
extern void view3d_winmatrix_set(ARegion *ar, View3D *v3d, const rcti *rect);
|
||||
|
||||
/* when looking through a selected camera, the manipulator can be at the
|
||||
* exact same position as the view, skip so we don't break selection */
|
||||
@ -1743,15 +1743,13 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, const int mval[2], fl
|
||||
rect.ymin = mval[1] - hotspot;
|
||||
rect.ymax = mval[1] + hotspot;
|
||||
|
||||
selrect = rect;
|
||||
|
||||
view3d_winmatrix_set(ar, v3d, &rect);
|
||||
mul_m4_m4m4(rv3d->persmat, rv3d->winmat, rv3d->viewmat);
|
||||
|
||||
if (do_passes)
|
||||
GPU_select_begin(buffer, 64, &selrect, GPU_SELECT_NEAREST_FIRST_PASS, 0);
|
||||
GPU_select_begin(buffer, 64, &rect, GPU_SELECT_NEAREST_FIRST_PASS, 0);
|
||||
else
|
||||
GPU_select_begin(buffer, 64, &selrect, GPU_SELECT_ALL, 0);
|
||||
GPU_select_begin(buffer, 64, &rect, GPU_SELECT_ALL, 0);
|
||||
|
||||
/* do the drawing */
|
||||
if (v3d->twtype & V3D_MANIP_ROTATE) {
|
||||
@ -1766,7 +1764,7 @@ static int manipulator_selectbuf(ScrArea *sa, ARegion *ar, const int mval[2], fl
|
||||
hits = GPU_select_end();
|
||||
|
||||
if (do_passes) {
|
||||
GPU_select_begin(buffer, 64, &selrect, GPU_SELECT_NEAREST_SECOND_PASS, hits);
|
||||
GPU_select_begin(buffer, 64, &rect, GPU_SELECT_NEAREST_SECOND_PASS, hits);
|
||||
|
||||
/* do the drawing */
|
||||
if (v3d->twtype & V3D_MANIP_ROTATE) {
|
||||
|
@ -32,7 +32,7 @@
|
||||
|
||||
#include "BLI_sys_types.h"
|
||||
|
||||
struct rctf;
|
||||
struct rcti;
|
||||
|
||||
/* flags for mode of operation */
|
||||
enum {
|
||||
@ -41,7 +41,7 @@ enum {
|
||||
GPU_SELECT_NEAREST_SECOND_PASS = 3,
|
||||
};
|
||||
|
||||
void GPU_select_begin(unsigned int *buffer, unsigned int bufsize, const struct rctf *input, char mode, int oldhits);
|
||||
void GPU_select_begin(unsigned int *buffer, unsigned int bufsize, const struct rcti *input, char mode, int oldhits);
|
||||
bool GPU_select_load_id(unsigned int id);
|
||||
unsigned int GPU_select_end(void);
|
||||
bool GPU_select_query_check_active(void);
|
||||
|
@ -37,6 +37,8 @@
|
||||
|
||||
#include "DNA_userdef_types.h"
|
||||
|
||||
#include "BLI_rect.h"
|
||||
|
||||
#include "BLI_utildefines.h"
|
||||
|
||||
/* Ad hoc number of queries to allocate to skip doing many glGenQueries */
|
||||
@ -72,7 +74,7 @@ static GPUQueryState g_query_state = {0};
|
||||
/**
|
||||
* initialize and provide buffer for results
|
||||
*/
|
||||
void GPU_select_begin(unsigned int *buffer, unsigned int bufsize, const rctf *input, char mode, int oldhits)
|
||||
void GPU_select_begin(unsigned int *buffer, unsigned int bufsize, const rcti *input, char mode, int oldhits)
|
||||
{
|
||||
g_query_state.select_is_active = true;
|
||||
g_query_state.query_issued = false;
|
||||
@ -109,7 +111,7 @@ void GPU_select_begin(unsigned int *buffer, unsigned int bufsize, const rctf *in
|
||||
* get rejected before the depth test. Should probably cull rect against
|
||||
* scissor for viewport but this is a rare case I think */
|
||||
glGetFloatv(GL_SCISSOR_BOX, viewport);
|
||||
glViewport(viewport[0], viewport[1], (int)(input->xmax - input->xmin), (int)(input->ymax - input->ymin));
|
||||
glViewport(viewport[0], viewport[1], BLI_rcti_size_x(input), BLI_rcti_size_y(input));
|
||||
|
||||
/* occlusion queries operates on fragments that pass tests and since we are interested on all
|
||||
* objects in the view frustum independently of their order, we need to disable the depth test */
|
||||
|
Loading…
Reference in New Issue
Block a user