From deb3b8301ab3e94b34b990a434332501e39ae77a Mon Sep 17 00:00:00 2001 From: Jeroen Bakker Date: Thu, 28 Mar 2019 14:51:29 +0100 Subject: DrawManager: Add Edge Detection To DisplayLists Objects that internally uses DispList do not cast shadow in the workbench. Their outline is also not visible in object mode. The reason for this is that edge detection was not implemented for Display Lists. This patch will implement the edge detection. Reviewed By: fclem Maniphest Tasks: T62479 Differential Revision: https://developer.blender.org/D4605 --- source/blender/draw/intern/draw_cache_impl_curve.c | 24 ++++++++++++++++++++++ 1 file changed, 24 insertions(+) (limited to 'source/blender/draw/intern/draw_cache_impl_curve.c') diff --git a/source/blender/draw/intern/draw_cache_impl_curve.c b/source/blender/draw/intern/draw_cache_impl_curve.c index ebffedf9454..eecb6c3dd6a 100644 --- a/source/blender/draw/intern/draw_cache_impl_curve.c +++ b/source/blender/draw/intern/draw_cache_impl_curve.c @@ -366,6 +366,7 @@ typedef struct CurveBatchCache { GPUIndexBuf *surfaces_tris; GPUIndexBuf *surfaces_lines; GPUIndexBuf *curves_lines; + GPUIndexBuf *edges_adj_lines; /* Edit mode */ GPUIndexBuf *edit_verts_points; /* Only control points. Not handles. */ GPUIndexBuf *edit_lines; @@ -380,6 +381,7 @@ typedef struct CurveBatchCache { GPUBatch *edit_verts; GPUBatch *edit_handles_verts; GPUBatch *edit_normals; + GPUBatch *edge_detection; } batch; GPUIndexBuf **surf_per_mat_tris; @@ -390,6 +392,9 @@ typedef struct CurveBatchCache { /* settings to determine if cache is invalid */ bool is_dirty; bool is_editmode; + + /* Valid only if edge_detection is up to date. */ + bool is_manifold; } CurveBatchCache; /* GPUBatch cache management. */ @@ -880,6 +885,17 @@ GPUBatch *DRW_curve_batch_cache_get_wireframes_face(Curve *cu) return DRW_batch_request(&cache->batch.surfaces_edges); } +GPUBatch *DRW_curve_batch_cache_get_edge_detection(Curve *cu, bool *r_is_manifold) +{ + CurveBatchCache *cache = curve_batch_cache_get(cu); + /* Even if is_manifold is not correct (not updated), + * the default (not manifold) is just the worst case. */ + if (r_is_manifold) { + *r_is_manifold = cache->is_manifold; + } + return DRW_batch_request(&cache->batch.edge_detection); +} + /** \} */ /* -------------------------------------------------------------------- */ @@ -922,6 +938,10 @@ void DRW_curve_batch_cache_create_requested(Object *ob) DRW_ibo_request(cache->batch.curves, &cache->ibo.curves_lines); DRW_vbo_request(cache->batch.curves, &cache->ordered.curves_pos); } + if (DRW_batch_requested(cache->batch.edge_detection, GPU_PRIM_LINES_ADJ)) { + DRW_ibo_request(cache->batch.edge_detection, &cache->ibo.edges_adj_lines); + DRW_vbo_request(cache->batch.edge_detection, &cache->ordered.pos_nor); + } /* Edit mode */ if (DRW_batch_requested(cache->batch.edit_edges, GPU_PRIM_LINES)) { @@ -963,6 +983,7 @@ void DRW_curve_batch_cache_create_requested(Object *ob) DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.surfaces_tris, CU_DATATYPE_SURFACE); DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.surfaces_lines, CU_DATATYPE_SURFACE); DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.curves_lines, CU_DATATYPE_WIRE); + DRW_ADD_FLAG_FROM_IBO_REQUEST(mr_flag, cache->ibo.edges_adj_lines, CU_DATATYPE_SURFACE); DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->edit.pos, CU_DATATYPE_OVERLAY); DRW_ADD_FLAG_FROM_VBO_REQUEST(mr_flag, cache->edit.data, CU_DATATYPE_OVERLAY); @@ -1010,6 +1031,9 @@ void DRW_curve_batch_cache_create_requested(Object *ob) if (DRW_ibo_requested(cache->ibo.surfaces_lines)) { DRW_displist_indexbuf_create_lines_in_order(lb, cache->ibo.surfaces_lines); } + if (DRW_ibo_requested(cache->ibo.edges_adj_lines)) { + DRW_displist_indexbuf_create_edges_adjacency_lines(lb, cache->ibo.edges_adj_lines, &cache->is_manifold); + } if (DRW_vbo_requested(cache->edit.pos) || DRW_vbo_requested(cache->edit.data) || -- cgit v1.2.3