Fix T76126 Overlay: Glitch when hiding Nurb vertices

This commit is contained in:
Clément Foucault 2020-05-13 21:20:18 +02:00
parent 97f50c71b9
commit c233271b0b
7 changed files with 40 additions and 38 deletions

@ -66,6 +66,7 @@ void OVERLAY_edit_curve_cache_init(OVERLAY_Data *vedata)
sh = OVERLAY_shader_edit_curve_point(); sh = OVERLAY_shader_edit_curve_point();
pd->edit_curve_points_grp = grp = DRW_shgroup_create(sh, psl->edit_curve_handle_ps); pd->edit_curve_points_grp = grp = DRW_shgroup_create(sh, psl->edit_curve_handle_ps);
DRW_shgroup_uniform_bool_copy(grp, "showCurveHandles", pd->edit_curve.show_handles);
DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo); DRW_shgroup_uniform_block(grp, "globalsBlock", G_draw.block_ubo);
} }
} }
@ -94,7 +95,7 @@ void OVERLAY_edit_curve_cache_populate(OVERLAY_Data *vedata, Object *ob)
DRW_shgroup_call_no_cull(pd->edit_curve_handle_grp, geom, ob); DRW_shgroup_call_no_cull(pd->edit_curve_handle_grp, geom, ob);
} }
geom = DRW_cache_curve_vert_overlay_get(ob, pd->edit_curve.show_handles); geom = DRW_cache_curve_vert_overlay_get(ob);
if (geom) { if (geom) {
DRW_shgroup_call_no_cull(pd->edit_curve_points_grp, geom, ob); DRW_shgroup_call_no_cull(pd->edit_curve_points_grp, geom, ob);
} }
@ -110,7 +111,7 @@ void OVERLAY_edit_surf_cache_populate(OVERLAY_Data *vedata, Object *ob)
DRW_shgroup_call_no_cull(pd->edit_curve_handle_grp, geom, ob); DRW_shgroup_call_no_cull(pd->edit_curve_handle_grp, geom, ob);
} }
geom = DRW_cache_curve_vert_overlay_get(ob, false); geom = DRW_cache_curve_vert_overlay_get(ob);
if (geom) { if (geom) {
DRW_shgroup_call_no_cull(pd->edit_curve_points_grp, geom, ob); DRW_shgroup_call_no_cull(pd->edit_curve_points_grp, geom, ob);
} }

@ -1,7 +1,8 @@
/* Keep the same value of `ACTIVE_NURB` in `draw_cache_imp_curve.c` */ /* Keep the same value of `ACTIVE_NURB` in `draw_cache_imp_curve.c` */
#define ACTIVE_NURB 1 << 2 #define ACTIVE_NURB 1 << 2
#define EVEN_U_BIT 1 << 3 #define EVEN_U_BIT 1 << 4
#define COLOR_SHIFT 5
layout(lines) in; layout(lines) in;
layout(triangle_strip, max_vertices = 10) out; layout(triangle_strip, max_vertices = 10) out;
@ -37,7 +38,7 @@ void main()
vec4 v2 = gl_in[1].gl_Position; vec4 v2 = gl_in[1].gl_Position;
int is_active_nurb = (vertFlag[1] & ACTIVE_NURB); int is_active_nurb = (vertFlag[1] & ACTIVE_NURB);
int color_id = (vertFlag[1] >> 4); int color_id = (vertFlag[1] >> COLOR_SHIFT);
/* Don't output any edges if we don't show handles */ /* Don't output any edges if we don't show handles */
if (!showCurveHandles && (color_id < 5)) { if (!showCurveHandles && (color_id < 5)) {

@ -1,4 +1,9 @@
/* Keep the same value of `BEZIER_HANDLE` in `draw_cache_imp_curve.c` */
#define BEZIER_HANDLE 1 << 3
uniform bool showCurveHandles;
in vec3 pos; in vec3 pos;
in int data; in int data;
@ -26,4 +31,9 @@ void main()
#ifdef USE_WORLD_CLIP_PLANES #ifdef USE_WORLD_CLIP_PLANES
world_clip_planes_calc_clip_distance(world_pos); world_clip_planes_calc_clip_distance(world_pos);
#endif #endif
if (!showCurveHandles && ((data & BEZIER_HANDLE) != 0)) {
/* We set the vertex at the camera origin to generate 0 fragments. */
gl_Position = vec4(0.0, 0.0, -3e36, 0.0);
}
} }

@ -2898,12 +2898,12 @@ GPUBatch *DRW_cache_curve_edge_overlay_get(Object *ob)
return DRW_curve_batch_cache_get_edit_edges(cu); return DRW_curve_batch_cache_get_edit_edges(cu);
} }
GPUBatch *DRW_cache_curve_vert_overlay_get(Object *ob, bool handles) GPUBatch *DRW_cache_curve_vert_overlay_get(Object *ob)
{ {
BLI_assert(ELEM(ob->type, OB_CURVE, OB_SURF)); BLI_assert(ELEM(ob->type, OB_CURVE, OB_SURF));
struct Curve *cu = ob->data; struct Curve *cu = ob->data;
return DRW_curve_batch_cache_get_edit_verts(cu, handles); return DRW_curve_batch_cache_get_edit_verts(cu);
} }
GPUBatch *DRW_cache_curve_surface_get(Object *ob) GPUBatch *DRW_cache_curve_surface_get(Object *ob)

@ -150,7 +150,7 @@ struct GPUBatch *DRW_cache_curve_edge_detection_get(struct Object *ob, bool *r_i
/* edit-mode */ /* edit-mode */
struct GPUBatch *DRW_cache_curve_edge_normal_get(struct Object *ob); struct GPUBatch *DRW_cache_curve_edge_normal_get(struct Object *ob);
struct GPUBatch *DRW_cache_curve_edge_overlay_get(struct Object *ob); struct GPUBatch *DRW_cache_curve_edge_overlay_get(struct Object *ob);
struct GPUBatch *DRW_cache_curve_vert_overlay_get(struct Object *ob, bool handles); struct GPUBatch *DRW_cache_curve_vert_overlay_get(struct Object *ob);
/* Font */ /* Font */
struct GPUBatch *DRW_cache_text_surface_get(struct Object *ob); struct GPUBatch *DRW_cache_text_surface_get(struct Object *ob);

@ -93,7 +93,7 @@ struct GPUBatch *DRW_curve_batch_cache_get_wire_edge(struct Curve *cu);
struct GPUBatch *DRW_curve_batch_cache_get_normal_edge(struct Curve *cu); struct GPUBatch *DRW_curve_batch_cache_get_normal_edge(struct Curve *cu);
struct GPUBatch *DRW_curve_batch_cache_get_edge_detection(struct Curve *cu, bool *r_is_manifold); struct GPUBatch *DRW_curve_batch_cache_get_edge_detection(struct Curve *cu, bool *r_is_manifold);
struct GPUBatch *DRW_curve_batch_cache_get_edit_edges(struct Curve *cu); struct GPUBatch *DRW_curve_batch_cache_get_edit_edges(struct Curve *cu);
struct GPUBatch *DRW_curve_batch_cache_get_edit_verts(struct Curve *cu, bool handles); struct GPUBatch *DRW_curve_batch_cache_get_edit_verts(struct Curve *cu);
struct GPUBatch *DRW_curve_batch_cache_get_triangles_with_normals(struct Curve *cu); struct GPUBatch *DRW_curve_batch_cache_get_triangles_with_normals(struct Curve *cu);
struct GPUBatch **DRW_curve_batch_cache_get_surface_shaded(struct Curve *cu, struct GPUBatch **DRW_curve_batch_cache_get_surface_shaded(struct Curve *cu,

@ -49,7 +49,9 @@
#define SELECT 1 #define SELECT 1
#define ACTIVE_NURB 1 << 2 #define ACTIVE_NURB 1 << 2
#define EVEN_U_BIT 1 << 3 /* Alternate this bit for every U vert. */ #define BEZIER_HANDLE 1 << 3
#define EVEN_U_BIT 1 << 4 /* Alternate this bit for every U vert. */
#define COLOR_SHIFT 5
/* Used as values of `color_id` in `edit_curve_overlay_handle_geom.glsl` */ /* Used as values of `color_id` in `edit_curve_overlay_handle_geom.glsl` */
enum { enum {
@ -376,7 +378,7 @@ typedef struct CurveBatchCache {
GPUIndexBuf *curves_lines; GPUIndexBuf *curves_lines;
GPUIndexBuf *edges_adj_lines; GPUIndexBuf *edges_adj_lines;
/* Edit mode */ /* Edit mode */
GPUIndexBuf *edit_verts_points; /* Only control points. Not handles. */ GPUIndexBuf *edit_verts;
GPUIndexBuf *edit_lines; GPUIndexBuf *edit_lines;
} ibo; } ibo;
@ -387,7 +389,6 @@ typedef struct CurveBatchCache {
/* control handles and vertices */ /* control handles and vertices */
GPUBatch *edit_edges; GPUBatch *edit_edges;
GPUBatch *edit_verts; GPUBatch *edit_verts;
GPUBatch *edit_handles_verts;
GPUBatch *edit_normals; GPUBatch *edit_normals;
GPUBatch *edge_detection; GPUBatch *edge_detection;
} batch; } batch;
@ -497,7 +498,6 @@ void DRW_curve_batch_cache_dirty_tag(Curve *cu, int mode)
GPU_BATCH_DISCARD_SAFE(cache->batch.edit_edges); GPU_BATCH_DISCARD_SAFE(cache->batch.edit_edges);
GPU_BATCH_DISCARD_SAFE(cache->batch.edit_verts); GPU_BATCH_DISCARD_SAFE(cache->batch.edit_verts);
GPU_BATCH_DISCARD_SAFE(cache->batch.edit_handles_verts);
break; break;
default: default:
BLI_assert(0); BLI_assert(0);
@ -686,14 +686,15 @@ static void curve_create_edit_curves_nor(CurveRenderData *rdata, GPUVertBuf *vbo
} }
static char beztriple_vflag_get( static char beztriple_vflag_get(
CurveRenderData *rdata, char flag, char col_id, int v_idx, int nu_id) CurveRenderData *rdata, char flag, char col_id, int v_idx, int nu_id, bool handle_point)
{ {
char vflag = 0; char vflag = 0;
SET_FLAG_FROM_TEST(vflag, (flag & SELECT), VFLAG_VERT_SELECTED); SET_FLAG_FROM_TEST(vflag, (flag & SELECT), VFLAG_VERT_SELECTED);
SET_FLAG_FROM_TEST(vflag, (v_idx == rdata->actvert && nu_id == rdata->actnu), VFLAG_VERT_ACTIVE); SET_FLAG_FROM_TEST(vflag, (v_idx == rdata->actvert && nu_id == rdata->actnu), VFLAG_VERT_ACTIVE);
SET_FLAG_FROM_TEST(vflag, (nu_id == rdata->actnu), ACTIVE_NURB); SET_FLAG_FROM_TEST(vflag, (nu_id == rdata->actnu), ACTIVE_NURB);
SET_FLAG_FROM_TEST(vflag, handle_point, BEZIER_HANDLE);
/* handle color id */ /* handle color id */
vflag |= col_id << 4; /* << 4 because of EVEN_U_BIT */ vflag |= col_id << COLOR_SHIFT;
return vflag; return vflag;
} }
@ -704,7 +705,7 @@ static char bpoint_vflag_get(CurveRenderData *rdata, char flag, int v_idx, int n
SET_FLAG_FROM_TEST(vflag, (v_idx == rdata->actvert && nu_id == rdata->actnu), VFLAG_VERT_ACTIVE); SET_FLAG_FROM_TEST(vflag, (v_idx == rdata->actvert && nu_id == rdata->actnu), VFLAG_VERT_ACTIVE);
SET_FLAG_FROM_TEST(vflag, (nu_id == rdata->actnu), ACTIVE_NURB); SET_FLAG_FROM_TEST(vflag, (nu_id == rdata->actnu), ACTIVE_NURB);
SET_FLAG_FROM_TEST(vflag, ((u % 2) == 0), EVEN_U_BIT); SET_FLAG_FROM_TEST(vflag, ((u % 2) == 0), EVEN_U_BIT);
vflag |= COLOR_NURB_ULINE_ID << 4; /* << 4 because of EVEN_U_BIT */ vflag |= COLOR_NURB_ULINE_ID << COLOR_SHIFT;
return vflag; return vflag;
} }
@ -760,7 +761,9 @@ static void curve_create_edit_data_and_handles(CurveRenderData *rdata,
} }
if (elbp_verts) { if (elbp_verts) {
GPU_indexbuf_add_point_vert(elbp_verts, vbo_len_used + 0);
GPU_indexbuf_add_point_vert(elbp_verts, vbo_len_used + 1); GPU_indexbuf_add_point_vert(elbp_verts, vbo_len_used + 1);
GPU_indexbuf_add_point_vert(elbp_verts, vbo_len_used + 2);
} }
if (elbp_lines) { if (elbp_lines) {
GPU_indexbuf_add_line_verts(elbp_lines, vbo_len_used + 1, vbo_len_used + 0); GPU_indexbuf_add_line_verts(elbp_lines, vbo_len_used + 1, vbo_len_used + 0);
@ -768,9 +771,9 @@ static void curve_create_edit_data_and_handles(CurveRenderData *rdata,
} }
if (vbo_data) { if (vbo_data) {
const char vflag[3] = { const char vflag[3] = {
beztriple_vflag_get(rdata, bezt->f1, bezt->h1, a, nu_id), beztriple_vflag_get(rdata, bezt->f1, bezt->h1, a, nu_id, true),
beztriple_vflag_get(rdata, bezt->f2, bezt->h1, a, nu_id), beztriple_vflag_get(rdata, bezt->f2, bezt->h1, a, nu_id, false),
beztriple_vflag_get(rdata, bezt->f3, bezt->h2, a, nu_id), beztriple_vflag_get(rdata, bezt->f3, bezt->h2, a, nu_id, true),
}; };
for (int j = 0; j < 3; j++) { for (int j = 0; j < 3; j++) {
GPU_vertbuf_attr_set(vbo_data, attr_id.data, vbo_len_used + j, &vflag[j]); GPU_vertbuf_attr_set(vbo_data, attr_id.data, vbo_len_used + j, &vflag[j]);
@ -859,15 +862,10 @@ GPUBatch *DRW_curve_batch_cache_get_edit_edges(Curve *cu)
return DRW_batch_request(&cache->batch.edit_edges); return DRW_batch_request(&cache->batch.edit_edges);
} }
GPUBatch *DRW_curve_batch_cache_get_edit_verts(Curve *cu, bool handles) GPUBatch *DRW_curve_batch_cache_get_edit_verts(Curve *cu)
{ {
CurveBatchCache *cache = curve_batch_cache_get(cu); CurveBatchCache *cache = curve_batch_cache_get(cu);
if (handles) {
return DRW_batch_request(&cache->batch.edit_handles_verts);
}
else {
return DRW_batch_request(&cache->batch.edit_verts); return DRW_batch_request(&cache->batch.edit_verts);
}
} }
GPUBatch *DRW_curve_batch_cache_get_triangles_with_normals(struct Curve *cu) GPUBatch *DRW_curve_batch_cache_get_triangles_with_normals(struct Curve *cu)
@ -965,14 +963,10 @@ void DRW_curve_batch_cache_create_requested(Object *ob)
DRW_vbo_request(cache->batch.edit_edges, &cache->edit.data); DRW_vbo_request(cache->batch.edit_edges, &cache->edit.data);
} }
if (DRW_batch_requested(cache->batch.edit_verts, GPU_PRIM_POINTS)) { if (DRW_batch_requested(cache->batch.edit_verts, GPU_PRIM_POINTS)) {
DRW_ibo_request(cache->batch.edit_verts, &cache->ibo.edit_verts_points); DRW_ibo_request(cache->batch.edit_verts, &cache->ibo.edit_verts);
DRW_vbo_request(cache->batch.edit_verts, &cache->edit.pos); DRW_vbo_request(cache->batch.edit_verts, &cache->edit.pos);
DRW_vbo_request(cache->batch.edit_verts, &cache->edit.data); DRW_vbo_request(cache->batch.edit_verts, &cache->edit.data);
} }
if (DRW_batch_requested(cache->batch.edit_handles_verts, GPU_PRIM_POINTS)) {
DRW_vbo_request(cache->batch.edit_handles_verts, &cache->edit.pos);
DRW_vbo_request(cache->batch.edit_handles_verts, &cache->edit.data);
}
if (DRW_batch_requested(cache->batch.edit_normals, GPU_PRIM_LINES)) { if (DRW_batch_requested(cache->batch.edit_normals, GPU_PRIM_LINES)) {
DRW_vbo_request(cache->batch.edit_normals, &cache->edit.curves_nor); DRW_vbo_request(cache->batch.edit_normals, &cache->edit.curves_nor);
} }
@ -1012,7 +1006,7 @@ void DRW_curve_batch_cache_create_requested(Object *ob)
DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->edit.data, CU_DATATYPE_OVERLAY); DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->edit.data, CU_DATATYPE_OVERLAY);
DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->edit.curves_nor, CU_DATATYPE_NORMAL); DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->edit.curves_nor, CU_DATATYPE_NORMAL);
DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->edit.curves_weight, CU_DATATYPE_OVERLAY); DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->edit.curves_weight, CU_DATATYPE_OVERLAY);
DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.edit_verts_points, CU_DATATYPE_OVERLAY); DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.edit_verts, CU_DATATYPE_OVERLAY);
DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.edit_lines, CU_DATATYPE_OVERLAY); DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.edit_lines, CU_DATATYPE_OVERLAY);
for (int i = 0; i < cache->mat_len; i++) { for (int i = 0; i < cache->mat_len; i++) {
@ -1065,13 +1059,9 @@ void DRW_curve_batch_cache_create_requested(Object *ob)
} }
if (DRW_vbo_requested(cache->edit.pos) || DRW_vbo_requested(cache->edit.data) || if (DRW_vbo_requested(cache->edit.pos) || DRW_vbo_requested(cache->edit.data) ||
DRW_ibo_requested(cache->ibo.edit_verts_points) || DRW_ibo_requested(cache->ibo.edit_verts) || DRW_ibo_requested(cache->ibo.edit_lines)) {
DRW_ibo_requested(cache->ibo.edit_lines)) { curve_create_edit_data_and_handles(
curve_create_edit_data_and_handles(rdata, rdata, cache->edit.pos, cache->edit.data, cache->ibo.edit_verts, cache->ibo.edit_lines);
cache->edit.pos,
cache->edit.data,
cache->ibo.edit_verts_points,
cache->ibo.edit_lines);
} }
if (DRW_vbo_requested(cache->edit.curves_nor)) { if (DRW_vbo_requested(cache->edit.curves_nor)) {
curve_create_edit_curves_nor(rdata, cache->edit.curves_nor); curve_create_edit_curves_nor(rdata, cache->edit.curves_nor);