Blender  V2.93
Classes | Typedefs | Enumerations | Functions | Variables
gpu_select.c File Reference
#include <stdlib.h>
#include <string.h>
#include "GPU_select.h"
#include "MEM_guardedalloc.h"
#include "BLI_rect.h"
#include "DNA_userdef_types.h"
#include "BLI_utildefines.h"
#include "gpu_select_private.h"

Go to the source code of this file.

Classes

struct  GPUSelectState
 

Typedefs

typedef struct GPUSelectState GPUSelectState
 

Enumerations

enum  { ALGO_GL_QUERY = 1 , ALGO_GL_PICK = 2 }
 

Functions

void GPU_select_begin (uint *buffer, uint bufsize, const rcti *input, char mode, int oldhits)
 
bool GPU_select_load_id (uint id)
 
uint GPU_select_end (void)
 
void GPU_select_cache_begin (void)
 
void GPU_select_cache_load_id (void)
 
void GPU_select_cache_end (void)
 
bool GPU_select_is_cached (void)
 
const uintGPU_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 rcti *src, const rcti *dst, uint *r_buf)
 

Variables

static GPUSelectState g_select_state = {0}
 

Detailed Description

Interface for accessing gpu-related methods for selection. The semantics are similar to glRenderMode(GL_SELECT) from older OpenGL versions.

Definition in file gpu_select.c.

Typedef Documentation

◆ GPUSelectState

Enumeration Type Documentation

◆ anonymous enum

anonymous enum
Enumerator
ALGO_GL_QUERY 

glBegin/EndQuery(GL_SAMPLES_PASSED... ), gpu_select_query.c Only sets 4th component (ID) correctly.

ALGO_GL_PICK 

Read depth buffer for every drawing pass and extract depths, gpu_select_pick.c Only sets 4th component (ID) correctly.

Definition at line 42 of file gpu_select.c.

Function Documentation

◆ GPU_select_begin()

void GPU_select_begin ( uint buffer,
uint  bufsize,
const rcti input,
char  mode,
int  oldhits 
)

◆ GPU_select_buffer_near()

const uint* GPU_select_buffer_near ( const uint buffer,
int  hits 
)

Helper function, nothing special but avoids doing inline since hits aren't sorted by depth and purpose of 4x buffer indices isn't so clear.

Note that comparing depth as uint is fine.

Definition at line 200 of file gpu_select.c.

References BLI_assert, buffer, and NULL.

Referenced by gizmo_find_intersected_3d_intern().

◆ GPU_select_buffer_remove_by_id()

uint GPU_select_buffer_remove_by_id ( uint buffer,
int  hits,
uint  select_id 
)

Definition at line 215 of file gpu_select.c.

References buffer.

Referenced by view3d_opengl_select_with_id_filter().

◆ GPU_select_buffer_stride_realign()

void GPU_select_buffer_stride_realign ( const rcti src,
const rcti dst,
uint r_buf 
)

◆ GPU_select_cache_begin()

void GPU_select_cache_begin ( void  )

◆ GPU_select_cache_end()

void GPU_select_cache_end ( void  )

◆ GPU_select_cache_load_id()

void GPU_select_cache_load_id ( void  )

◆ GPU_select_end()

uint GPU_select_end ( void  )

Cleanup and flush selection results to buffer. Return number of hits and hits in buffer. if dopass is true, we will do a second pass with occlusion queries to get the closest hit.

Definition at line 131 of file gpu_select.c.

References ALGO_GL_QUERY, GPUSelectState::algorithm, g_select_state, gpu_select_pick_end(), gpu_select_query_end(), and GPUSelectState::select_is_active.

Referenced by drw_select_loop_pass(), gizmo_find_intersected_3d_intern(), and view3d_opengl_select().

◆ GPU_select_is_cached()

bool GPU_select_is_cached ( void  )

◆ GPU_select_load_id()

bool GPU_select_load_id ( uint  id)

loads a new selection id and ends previous query, if any. In second pass of selection it also returns if id has been hit on the first pass already. Thus we can skip drawing un-hit objects.

Warning
We rely on the order of object rendering on passes to be the same for this to work.

Definition at line 108 of file gpu_select.c.

References ALGO_GL_QUERY, GPUSelectState::algorithm, g_select_state, gpu_select_pick_load_id(), gpu_select_query_load_id(), and GPUSelectState::select_is_active.

Referenced by draw_call_single_do(), draw_select_buffer(), ED_gizmo_draw_preset_facemap(), ed_gizmo_draw_preset_geometry(), gizmo_arrow_draw_select(), gizmo_button2d_draw_select(), gizmo_cage2d_draw_intern(), gizmo_cage3d_draw_intern(), gizmo_dial_draw_select(), gizmo_move_draw_select(), and gizmo_primitive_draw_select().

Variable Documentation

◆ g_select_state

GPUSelectState g_select_state = {0}
static