diff options
author | Jeroen Bakker <jeroen@blender.org> | 2019-12-03 10:27:55 +0300 |
---|---|---|
committer | Jeroen Bakker <jeroen@blender.org> | 2019-12-04 17:17:09 +0300 |
commit | 9c337fcfe2a46b2ccfb8a4960b7af0eac5c615de (patch) | |
tree | d85b5e66174d01ef509fa49745fecf70a9043955 /source/blender/draw/intern/draw_cache_extract_mesh.c | |
parent | 186d74020e50f894982fb678434716dc2646171b (diff) |
Fix T72130: Wireframe Visible After Disabling
The lines index buffer can contain all edges (edit mode) or only loose
edges (object mode). When switching between these modes the wrong
content of the index buffer can be used.
This patch will clear the lines index buffer when a `loose_edges` is requested. Making sure it is always up to date.
Note that this is supporting an exising hack where the IBO is truncated
during the creation. We should find a different way how to solve these
kind of issues.
Reviewed By: fclem
Differential Revision: https://developer.blender.org/D6349
Diffstat (limited to 'source/blender/draw/intern/draw_cache_extract_mesh.c')
-rw-r--r-- | source/blender/draw/intern/draw_cache_extract_mesh.c | 70 |
1 files changed, 58 insertions, 12 deletions
diff --git a/source/blender/draw/intern/draw_cache_extract_mesh.c b/source/blender/draw/intern/draw_cache_extract_mesh.c index 2c6eb7e0b1d..06c2bfc301a 100644 --- a/source/blender/draw/intern/draw_cache_extract_mesh.c +++ b/source/blender/draw/intern/draw_cache_extract_mesh.c @@ -634,21 +634,10 @@ static void extract_lines_ledge_mesh(const MeshRenderData *mr, GPU_indexbuf_set_line_restart(elb, edge_idx); } -static void extract_lines_finish(const MeshRenderData *mr, void *ibo, void *elb) +static void extract_lines_finish(const MeshRenderData *UNUSED(mr), void *ibo, void *elb) { GPU_indexbuf_build_in_place(elb, ibo); MEM_freeN(elb); - /* HACK Create ibo subranges and assign them to GPUBatch. */ - if (mr->use_final_mesh && mr->cache->batch.loose_edges) { - BLI_assert(mr->cache->batch.loose_edges->elem == ibo); - /* Multiply by 2 because these are edges indices. */ - int start = mr->edge_len * 2; - int len = mr->edge_loose_len * 2; - GPUIndexBuf *sub_ibo = GPU_indexbuf_create_subrange(ibo, start, len); - /* WARNING: We modify the GPUBatch here! */ - GPU_batch_elembuf_set(mr->cache->batch.loose_edges, sub_ibo, true); - mr->cache->no_loose_wire = (len == 0); - } } static const MeshExtract extract_lines = { @@ -669,6 +658,56 @@ static const MeshExtract extract_lines = { /** \} */ /* ---------------------------------------------------------------------- */ +/** \name Extract Loose Edges Indices + * \{ */ + +static void *extract_lines_loose_init(const MeshRenderData *UNUSED(mr), void *UNUSED(buf)) +{ + return NULL; +} + +static void extract_lines_loose_ledge_mesh(const MeshRenderData *UNUSED(mr), + int UNUSED(e), + const MEdge *UNUSED(medge), + void *UNUSED(elb)) +{ + /* This function is intentionally empty. The existence of this functions ensures that + * `iter_type` `MR_ITER_LVERT` is set when initializing the `MeshRenderData` (See + * `mesh_extract_iter_type`). This flag ensures that `mr->edge_loose_len` field is filled. This + * field we use in the `extract_lines_loose_finish` function to create a subrange from the + * `ibo.lines`. */ +} + +static void extract_lines_loose_finish(const MeshRenderData *mr, + void *UNUSED(ibo), + void *UNUSED(elb)) +{ + /* Multiply by 2 because these are edges indices. */ + const int start = mr->edge_len * 2; + const int len = mr->edge_loose_len * 2; + GPU_indexbuf_create_subrange_in_place( + mr->cache->final.ibo.lines_loose, mr->cache->final.ibo.lines, start, len); + mr->cache->no_loose_wire = (len == 0); +} + +static const MeshExtract extract_lines_loose = { + extract_lines_loose_init, + NULL, + NULL, + NULL, + NULL, + NULL, + extract_lines_loose_ledge_mesh, + NULL, + NULL, + extract_lines_loose_finish, + 0, + false, +}; + +/** \} */ + +/* ---------------------------------------------------------------------- */ /** \name Extract Point Indices * \{ */ @@ -4370,6 +4409,7 @@ void mesh_buffer_cache_create_requested(MeshBatchCache *cache, TEST_ASSIGN(IBO, ibo, fdots); TEST_ASSIGN(IBO, ibo, lines_paint_mask); TEST_ASSIGN(IBO, ibo, lines_adjacency); + TEST_ASSIGN(IBO, ibo, lines_loose); TEST_ASSIGN(IBO, ibo, edituv_tris); TEST_ASSIGN(IBO, ibo, edituv_lines); TEST_ASSIGN(IBO, ibo, edituv_points); @@ -4451,6 +4491,12 @@ void mesh_buffer_cache_create_requested(MeshBatchCache *cache, BLI_task_pool_work_and_wait(task_pool); BLI_task_pool_free(task_pool); + /* The `lines_loose` is a sub buffer from `ibo.lines`. + * We don't use the extract mechanism due to potential synchronization issues.*/ + if (mbc.ibo.lines_loose) { + extract_task_create(NULL, mr, &extract_lines_loose, mbc.ibo.lines_loose, task_counters); + } + MEM_freeN(task_counters); mesh_render_data_free(mr); |