90 #define MAX_GPU_ATTR 256
149 return idx != -1 ? cdata->
layers + idx :
NULL;
155 return idx != -1 ? cdata->
layers + idx :
NULL;
216 const int *sculpt_face_sets)
228 const int *sculpt_face_sets,
229 int face_sets_color_seed,
230 int face_sets_color_default,
232 const float (*vert_normals)[3])
257 actcol ? actcol->
type : 0,
280 const bool show_face_sets = sculpt_face_sets &&
282 bool empty_mask =
true;
283 bool default_face_set =
true;
286 const int totelem = buffers->
tot_tri * 3;
304 short no[3] = {0, 0, 0};
307 for (
int uv_i = 0; uv_i < totuv; uv_i++) {
321 for (
uint j = 0; j < 3; j++) {
330 for (
int col_i = 0; col_i < totcol; col_i++) {
351 const uint vtri[3] = {
361 for (
uint j = 0; j < 3; j++) {
363 const uint loop_index = lt->
tri[j];
365 ushort scol[4] = {USHRT_MAX, USHRT_MAX, USHRT_MAX, USHRT_MAX};
368 MPropCol *pcol2 = pcol + (color_loops ? loop_index : vtri[j]);
376 const MLoopCol *mcol2 = mcol + (color_loops ? loop_index : vtri[j]);
391 const uint vtri[3] = {
402 if (lt->
poly != mpoly_prev && !buffers->
smooth) {
407 mpoly_prev = lt->
poly;
410 uchar face_set_color[4] = {UCHAR_MAX, UCHAR_MAX, UCHAR_MAX, UCHAR_MAX};
411 if (show_face_sets) {
412 const int fset =
abs(sculpt_face_sets[lt->
poly]);
414 if (fset != face_sets_color_default) {
416 default_face_set =
false;
422 if (show_mask && !buffers->
smooth) {
423 fmask = (vmask[vtri[0]] + vmask[vtri[1]] + vmask[vtri[2]]) / 3.0f;
424 cmask = (
uchar)(fmask * 255);
427 for (
uint j = 0; j < 3; j++) {
428 const MVert *
v = &mvert[vtri[j]];
436 if (show_mask && buffers->
smooth) {
437 cmask = (
uchar)(vmask[vtri[j]] * 255);
441 empty_mask = empty_mask && (cmask == 0);
456 buffers->
show_overlay = !empty_mask || !default_face_set;
457 buffers->
mvert = mvert;
464 const int *face_indices,
465 const int *sculpt_face_sets,
466 const int face_indices_len,
471 int tot_real_edges = 0;
481 for (i = 0, tottri = 0; i < face_indices_len; i++) {
482 const MLoopTri *lt = &looptri[face_indices[i]];
486 for (
int j = 0; j < 3; j++) {
487 if (r_edges[j] != -1) {
498 buffers->
mpoly = mpoly;
499 buffers->
mloop = mloop;
512 for (i = 0; i < face_indices_len; i++) {
513 const MLoopTri *lt = &looptri[face_indices[i]];
522 if (r_edges[0] != -1) {
525 if (r_edges[1] != -1) {
528 if (r_edges[2] != -1) {
538 buffers->
mpoly = mpoly;
539 buffers->
mloop = mloop;
556 const int *
UNUSED(face_sets),
557 const int *grid_indices,
558 uint visible_quad_len,
572 const uint grid_vert_len = gridsize * gridsize;
573 for (
int i = 0; i < totgrid; i++,
offset += grid_vert_len) {
575 bool grid_visible =
false;
579 for (
int j = 0; j < gridsize - 1; j++) {
580 for (
int k = 0; k < gridsize - 1; k++) {
586 v0 =
offset + j * gridsize + k;
597 if (j + 2 == gridsize) {
613 v3 =
offset + grid_vert_len - gridsize;
628 for (
int i = 0; i < totgrid; i++,
offset += grid_vert_len) {
629 bool grid_visible =
false;
633 for (
int j = 0; j < gridsize - 1; j++) {
634 for (
int k = 0; k < gridsize - 1; k++) {
640 v0 =
offset + (j * (gridsize - 1) + k) * 4;
651 if (j + 2 == gridsize) {
665 v1 =
offset + (gridsize - 1) * 4 - 3;
667 v3 =
offset + grid_vert_len - (gridsize - 1) * 4 + 3;
688 const int *grid_indices)
713 const int *sculpt_face_sets,
714 const int face_sets_color_seed,
715 const int face_sets_color_default,
717 const int update_flags)
721 const bool show_face_sets = sculpt_face_sets &&
723 bool empty_mask =
true;
724 bool default_face_set =
true;
732 uint vert_count = totgrid * vert_per_grid;
739 if (visible_quad_len == 0) {
752 uint vbo_index_offset = 0;
761 for (i = 0; i < totgrid; i++) {
762 const int grid_index = grid_indices[i];
763 CCGElem *grid = grids[grid_index];
764 int vbo_index = vbo_index_offset;
766 uchar face_set_color[4] = {UCHAR_MAX, UCHAR_MAX, UCHAR_MAX, UCHAR_MAX};
768 if (show_face_sets && subdiv_ccg && sculpt_face_sets) {
771 const int fset =
abs(sculpt_face_sets[face_index]);
773 if (fset != face_sets_color_default) {
775 default_face_set =
false;
790 if (has_mask && show_mask) {
794 empty_mask = empty_mask && (cmask == 0);
798 const ushort vcol[4] = {USHRT_MAX, USHRT_MAX, USHRT_MAX, USHRT_MAX};
810 for (j = 0; j < key->
grid_size - 1; j++) {
811 for (k = 0; k < key->
grid_size - 1; k++) {
840 if (has_mask && show_mask) {
849 empty_mask = empty_mask && (cmask == 0);
852 const ushort vcol[4] = {USHRT_MAX, USHRT_MAX, USHRT_MAX, USHRT_MAX};
876 buffers->
grids = grids;
881 buffers->
show_overlay = !empty_mask || !default_face_set;
898 #undef FILL_QUAD_BUFFER
913 const int cd_vert_mask_offset,
914 const bool show_mask,
915 const bool show_vcol,
932 *empty_mask = *empty_mask && (cmask == 0);
936 const ushort vcol[4] = {USHRT_MAX, USHRT_MAX, USHRT_MAX, USHRT_MAX};
941 const uchar face_set[3] = {UCHAR_MAX, UCHAR_MAX, UCHAR_MAX};
1003 GSet *bm_unique_verts,
1004 GSet *bm_other_verts,
1005 const int update_flags)
1009 int tottri, totvert;
1010 bool empty_mask =
true;
1021 totvert = tottri * 3;
1063 for (
int i = 0; i < 3; i++) {
1075 cd_vert_mask_offset,
1127 for (i = 0; i < 3; i++) {
1136 for (i = 0; i < 3; i++) {
1143 cd_vert_mask_offset,
1175 buffers->
smooth = smooth_shading;
1204 if (!cdata_active) {
1209 int idx = active_layer ? active_layer - cdata_active->
layers : -1;
1211 if (idx >= 0 && idx < cdata_active->totlayer) {
1212 r_cd_attrs[0].cd_offset = cdata_active->
layers[idx].
offset;
1213 r_cd_attrs[0].domain = active_domain;
1214 r_cd_attrs[0].type = active_type;
1215 r_cd_attrs[0].layer_idx = idx;
1223 const CustomData *datas[4] = {vdata, edata, pdata, ldata};
1226 for (
eAttrDomain domain = 0; domain < 4; domain++) {
1229 if (!cdata || !((1 << domain) & domain_mask)) {
1253 for (
int i = 0; i <
count; i++) {
1270 bad |=
a->active_attrs_only !=
b->active_attrs_only;
1272 bad |=
a->pos !=
b->pos;
1273 bad |=
a->fset !=
b->fset;
1274 bad |=
a->msk !=
b->msk;
1275 bad |=
a->nor !=
b->nor;
1277 for (
int i = 0; i <
MIN2(
a->totuv,
b->totuv); i++) {
1278 bad |=
a->uv[i] !=
b->uv[i];
1281 for (
int i = 0; i <
MIN2(
a->totcol,
b->totcol); i++) {
1282 bad |=
a->col[i] !=
b->col[i];
1285 bad |=
a->totuv !=
b->totuv;
1286 bad |=
a->totcol !=
b->totcol;
1295 bool active_attrs_only)
1297 const bool active_only = active_attrs_only;
1324 eAttrDomain active_color_domain = active_color_layer ?
1326 active_color_layer) :
1338 active_color_layer ? active_color_layer->
type : -1,
1339 active_color_domain,
1341 render_color_layer);
1343 for (
int i = 0; i < totlayer; i++) {
1354 bool is_render = render_color_layer == layer;
1355 bool is_active = active_color_layer == layer;
1363 if (vbo_id->
totcol == 0) {
1395 vbo_id->
totuv = totlayer;
1397 for (
int i = 0; i < totlayer; i++) {
Generic geometry attributes built on CustomData.
struct CustomDataLayer * BKE_id_attributes_active_color_get(const struct ID *id)
@ ATTR_DOMAIN_MASK_CORNER
struct CustomDataLayer * BKE_id_attributes_render_color_get(const struct ID *id)
eAttrDomain BKE_id_attribute_domain(const struct ID *id, const struct CustomDataLayer *layer)
#define ATTR_DOMAIN_MASK_COLOR
void BKE_id_attribute_copy_domains_temp(short id_type, const struct CustomData *vdata, const struct CustomData *edata, const struct CustomData *ldata, const struct CustomData *pdata, const struct CustomData *cdata, struct ID *r_id)
BLI_INLINE CCGElem * CCG_grid_elem(const CCGKey *key, CCGElem *elem, int x, int y)
BLI_INLINE float * CCG_elem_mask(const CCGKey *key, CCGElem *elem)
BLI_INLINE float * CCG_elem_no(const CCGKey *key, CCGElem *elem)
BLI_INLINE float * CCG_elem_co(const CCGKey *key, CCGElem *elem)
CustomData interface, see also DNA_customdata_types.h.
int CustomData_get_active_layer_index(const struct CustomData *data, int type)
int CustomData_get_render_layer_index(const struct CustomData *data, int type)
bool CustomData_has_layer(const struct CustomData *data, int type)
#define CD_TYPE_AS_MASK(_type)
int CustomData_get_offset(const struct CustomData *data, int type)
void BKE_mesh_looptri_get_real_edges(const struct Mesh *mesh, const struct MLoopTri *looptri, int r_edges[3])
void BKE_mesh_calc_poly_normal(const struct MPoly *mpoly, const struct MLoop *loopstart, const struct MVert *mvarray, float r_no[3])
bool paint_is_face_hidden(const struct MLoopTri *lt, const struct MVert *mvert, const struct MLoop *mloop)
void BKE_paint_face_set_overlay_color_get(int face_set, int seed, uchar r_color[4])
#define SCULPT_FACE_SET_NONE
bool paint_is_grid_face_hidden(const unsigned int *grid_hidden, int gridsize, int x, int y)
A BVH for high poly meshes.
int BKE_pbvh_count_grid_quads(BLI_bitmap **grid_hidden, const int *grid_indices, int totgrid, int gridsize)
int BKE_subdiv_ccg_grid_to_face_index(const SubdivCCG *subdiv_ccg, int grid_index)
GHash * BLI_ghash_int_new_ex(const char *info, unsigned int nentries_reserve) ATTR_MALLOC ATTR_WARN_UNUSED_RESULT
unsigned int BLI_gset_len(const GSet *gs) ATTR_WARN_UNUSED_RESULT
#define GSET_ITER(gs_iter_, gset_)
void BLI_ghash_free(GHash *gh, GHashKeyFreeFP keyfreefp, GHashValFreeFP valfreefp)
BLI_INLINE void * BLI_gsetIterator_getKey(GSetIterator *gsi)
bool BLI_ghash_ensure_p(GHash *gh, void *key, void ***r_val) ATTR_WARN_UNUSED_RESULT
MINLINE int square_i(int a)
MINLINE unsigned int square_uint(unsigned int a)
float normal_quad_v3(float n[3], const float v1[3], const float v2[3], const float v3[3], const float v4[3])
MINLINE void normal_float_to_short_v3(short r[3], const float n[3])
MINLINE void copy_v3_v3(float r[3], const float a[3])
MINLINE void copy_v3_v3_short(short r[3], const short a[3])
#define POINTER_AS_UINT(i)
#define POINTER_FROM_UINT(i)
#define CD_MASK_COLOR_ALL
void DRW_cdlayer_attr_aliases_add(struct GPUVertFormat *format, const char *base_name, const struct CustomData *data, const struct CustomDataLayer *cl, bool is_active_render, bool is_active_layer)
#define GPU_batch_create(prim, verts, elem)
#define GPU_BATCH_DISCARD_SAFE(batch)
@ GPU_PBVH_BUFFERS_SHOW_MASK
@ GPU_PBVH_BUFFERS_SHOW_VCOL
@ GPU_PBVH_BUFFERS_SHOW_SCULPT_FACE_SETS
struct GPUIndexBuf GPUIndexBuf
#define GPU_INDEXBUF_DISCARD_SAFE(elem)
void GPU_indexbuf_init(GPUIndexBufBuilder *, GPUPrimType, uint prim_len, uint vertex_len)
GPUIndexBuf * GPU_indexbuf_build(GPUIndexBufBuilder *)
void GPU_indexbuf_add_line_verts(GPUIndexBufBuilder *, uint v1, uint v2)
void GPU_indexbuf_build_in_place(GPUIndexBufBuilder *, GPUIndexBuf *)
void GPU_indexbuf_add_tri_verts(GPUIndexBufBuilder *, uint v1, uint v2, uint v3)
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint y
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum type
_GL_VOID GLfloat value _GL_VOID_RET _GL_VOID const GLuint GLboolean *residences _GL_BOOL_RET _GL_VOID GLsizei GLfloat GLfloat GLfloat GLfloat const GLubyte *bitmap _GL_VOID_RET _GL_VOID GLenum const void *lists _GL_VOID_RET _GL_VOID const GLdouble *equation _GL_VOID_RET _GL_VOID GLdouble GLdouble blue _GL_VOID_RET _GL_VOID GLfloat GLfloat blue _GL_VOID_RET _GL_VOID GLint GLint blue _GL_VOID_RET _GL_VOID GLshort GLshort blue _GL_VOID_RET _GL_VOID GLubyte GLubyte blue _GL_VOID_RET _GL_VOID GLuint GLuint blue _GL_VOID_RET _GL_VOID GLushort GLushort blue _GL_VOID_RET _GL_VOID GLbyte GLbyte GLbyte alpha _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble alpha _GL_VOID_RET _GL_VOID GLfloat GLfloat GLfloat alpha _GL_VOID_RET _GL_VOID GLint GLint GLint alpha _GL_VOID_RET _GL_VOID GLshort GLshort GLshort alpha _GL_VOID_RET _GL_VOID GLubyte GLubyte GLubyte alpha _GL_VOID_RET _GL_VOID GLuint GLuint GLuint alpha _GL_VOID_RET _GL_VOID GLushort GLushort GLushort alpha _GL_VOID_RET _GL_VOID GLenum mode _GL_VOID_RET _GL_VOID GLint GLsizei GLsizei GLenum type _GL_VOID_RET _GL_VOID GLsizei GLenum GLenum const void *pixels _GL_VOID_RET _GL_VOID const void *pointer _GL_VOID_RET _GL_VOID GLdouble v _GL_VOID_RET _GL_VOID GLfloat v _GL_VOID_RET _GL_VOID GLint GLint i2 _GL_VOID_RET _GL_VOID GLint j _GL_VOID_RET _GL_VOID GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLdouble GLdouble GLdouble GLdouble GLdouble zFar _GL_VOID_RET _GL_UINT GLdouble *equation _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLenum GLfloat *v _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLfloat *values _GL_VOID_RET _GL_VOID GLushort *values _GL_VOID_RET _GL_VOID GLenum GLfloat *params _GL_VOID_RET _GL_VOID GLenum GLdouble *params _GL_VOID_RET _GL_VOID GLenum GLint *params _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_VOID GLsizei const void *pointer _GL_VOID_RET _GL_BOOL GLfloat param _GL_VOID_RET _GL_VOID GLint param _GL_VOID_RET _GL_VOID GLenum GLfloat param _GL_VOID_RET _GL_VOID GLenum GLint param _GL_VOID_RET _GL_VOID GLushort pattern _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint const GLdouble *points _GL_VOID_RET _GL_VOID GLdouble GLdouble GLint GLint GLdouble v1
uint GPU_vertbuf_get_vertex_len(const GPUVertBuf *verts)
struct GPUVertBuf GPUVertBuf
void GPU_vertbuf_data_alloc(GPUVertBuf *, uint v_len)
void * GPU_vertbuf_get_data(const GPUVertBuf *verts)
#define GPU_VERTBUF_DISCARD_SAFE(verts)
void GPU_vertbuf_use(GPUVertBuf *)
GPUVertBuf * GPU_vertbuf_create_with_format_ex(const GPUVertFormat *, GPUUsageType)
GPU_INLINE void * GPU_vertbuf_raw_step(GPUVertBufRaw *a)
void GPU_vertbuf_attr_get_raw_data(GPUVertBuf *, uint a_idx, GPUVertBufRaw *access)
void GPU_vertbuf_attr_set(GPUVertBuf *, uint a_idx, uint v_idx, const void *data)
Read Guarded memory(de)allocation.
#define BM_ELEM_CD_GET_FLOAT(ele, offset)
#define BM_elem_flag_test(ele, hflag)
ATTR_WARN_UNUSED_RESULT BMesh * bm
void BM_face_as_array_vert_tri(BMFace *f, BMVert *r_verts[3])
ATTR_WARN_UNUSED_RESULT const BMVert * v2
ATTR_WARN_UNUSED_RESULT const BMVert * v
short GPU_pbvh_buffers_material_index_get(GPU_PBVH_Buffers *buffers)
static CustomDataLayer * get_render_layer(const CustomData *cdata, int type)
static bool gpu_pbvh_vert_buf_data_set(PBVHGPUFormat *vbo_id, GPU_PBVH_Buffers *buffers, uint vert_len)
static void gpu_pbvh_batch_init(GPU_PBVH_Buffers *buffers, GPUPrimType prim)
static void gpu_bmesh_vert_to_buffer_copy(PBVHGPUFormat *vbo_id, BMVert *v, GPUVertBuf *vert_buf, int v_index, const float fno[3], const float *fmask, const int cd_vert_mask_offset, const bool show_mask, const bool show_vcol, bool *empty_mask)
static int gpu_bmesh_vert_visible_count(GSet *bm_unique_verts, GSet *bm_other_verts)
struct GPUAttrRef GPUAttrRef
void GPU_pbvh_buffers_free(GPU_PBVH_Buffers *buffers)
GPU_PBVH_Buffers * GPU_pbvh_grid_buffers_build(int totgrid, BLI_bitmap **grid_hidden, bool smooth)
struct PBVHGPUFormat PBVHGPUFormat
static bool gpu_pbvh_format_equals(PBVHGPUFormat *a, PBVHGPUFormat *b)
static void gpu_pbvh_grid_fill_index_buffers(GPU_PBVH_Buffers *buffers, SubdivCCG *UNUSED(subdiv_ccg), const int *UNUSED(face_sets), const int *grid_indices, uint visible_quad_len, int totgrid, int gridsize)
void GPU_pbvh_bmesh_buffers_update_free(GPU_PBVH_Buffers *buffers)
static bool gpu_pbvh_is_looptri_visible(const MLoopTri *lt, const MVert *mvert, const MLoop *mloop, const int *sculpt_face_sets)
void GPU_pbvh_free_format(PBVHGPUFormat *vbo_id)
bool GPU_pbvh_attribute_names_update(PBVHType pbvh_type, PBVHGPUFormat *vbo_id, const CustomData *vdata, const CustomData *ldata, bool active_attrs_only)
bool GPU_pbvh_buffers_has_overlays(GPU_PBVH_Buffers *buffers)
void GPU_pbvh_buffers_update_flush(GPU_PBVH_Buffers *buffers)
static int gpu_bmesh_face_visible_count(GSet *bm_faces)
void GPU_pbvh_bmesh_buffers_update(PBVHGPUFormat *vbo_id, GPU_PBVH_Buffers *buffers, BMesh *bm, GSet *bm_faces, GSet *bm_unique_verts, GSet *bm_other_verts, const int update_flags)
static void gpu_pbvh_buffers_clear(GPU_PBVH_Buffers *buffers)
GPUBatch * GPU_pbvh_buffers_batch_get(GPU_PBVH_Buffers *buffers, bool fast, bool wires)
static CustomDataLayer * get_active_layer(const CustomData *cdata, int type)
GPU_PBVH_Buffers * GPU_pbvh_bmesh_buffers_build(bool smooth_shading)
static int gpu_pbvh_make_attr_offs(eAttrDomainMask domain_mask, eCustomDataMask type_mask, const CustomData *vdata, const CustomData *edata, const CustomData *ldata, const CustomData *pdata, GPUAttrRef r_cd_attrs[MAX_GPU_ATTR], bool active_only, int active_type, int active_domain, const CustomDataLayer *active_layer, const CustomDataLayer *render_layer)
void GPU_pbvh_grid_buffers_update_free(GPU_PBVH_Buffers *buffers, const struct DMFlagMat *grid_flag_mats, const int *grid_indices)
void GPU_pbvh_mesh_buffers_update(PBVHGPUFormat *vbo_id, GPU_PBVH_Buffers *buffers, const MVert *mvert, const CustomData *vdata, const CustomData *ldata, const float *vmask, const int *sculpt_face_sets, int face_sets_color_seed, int face_sets_color_default, int update_flags, const float(*vert_normals)[3])
PBVHGPUFormat * GPU_pbvh_make_format(void)
GPU_PBVH_Buffers * GPU_pbvh_mesh_buffers_build(const MPoly *mpoly, const MLoop *mloop, const MLoopTri *looptri, const MVert *mvert, const int *face_indices, const int *sculpt_face_sets, const int face_indices_len, const struct Mesh *mesh)
void GPU_pbvh_grid_buffers_update(PBVHGPUFormat *vbo_id, GPU_PBVH_Buffers *buffers, SubdivCCG *subdiv_ccg, CCGElem **grids, const struct DMFlagMat *grid_flag_mats, int *grid_indices, int totgrid, const int *sculpt_face_sets, const int face_sets_color_seed, const int face_sets_color_default, const struct CCGKey *key, const int update_flags)
ccl_gpu_kernel_postfix ccl_global float int int int int float bool int offset
void(* MEM_freeN)(void *vmemh)
void *(* MEM_callocN)(size_t len, const char *str)
MINLINE unsigned short unit_float_to_ushort_clamp(float val)
float BLI_color_from_srgb_table[256]
bool active
all scheduled work for the GPU.
static const pxr::TfToken b("b", pxr::TfToken::Immortal)
smooth(Type::FLOAT, "mask_weight")
GPUIndexBuf * index_lines_buf_fast
GPUBatch * triangles_fast
GPUIndexBuf * index_lines_buf
bool clear_bmesh_on_flush
GPUIndexBuf * index_buf_fast
const DMFlagMat * grid_flag_mats
BLI_bitmap *const * grid_hidden