diff options
author | Clément Foucault <foucault.clem@gmail.com> | 2020-01-13 19:29:31 +0300 |
---|---|---|
committer | Clément Foucault <foucault.clem@gmail.com> | 2020-01-13 19:29:31 +0300 |
commit | 2359979141862cdffa8072f7dd8fc1e67ee228cf (patch) | |
tree | 7b45881a3b00cc0dc05c65e8ca9070c34674e15d /source/blender/draw/intern/draw_cache_impl_mesh.c | |
parent | 84825e4b50c19bfbb081499129d7cb4fd4ba1cdf (diff) |
Fix T73044 Crash in UV editor when changing UV selection modes
Thanks to @campbellbarton for the fix.
Diffstat (limited to 'source/blender/draw/intern/draw_cache_impl_mesh.c')
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_mesh.c | 44 |
1 files changed, 22 insertions, 22 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index abff8911697..a3897148802 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -1055,6 +1055,7 @@ void DRW_mesh_batch_cache_create_requested( ts = scene->toolsettings; } MeshBatchCache *cache = mesh_batch_cache_get(me); + bool cd_uv_update = false; /* Early out */ if (cache->batch_requested == 0) { @@ -1138,6 +1139,7 @@ void DRW_mesh_batch_cache_create_requested( { if ((cache->cd_used.uv & cache->cd_needed.uv) != cache->cd_needed.uv) { GPU_VERTBUF_DISCARD_SAFE(mbuffercache->vbo.uv); + cd_uv_update = true; } if ((cache->cd_used.tan & cache->cd_needed.tan) != cache->cd_needed.tan || cache->cd_used.tan_orco != cache->cd_needed.tan_orco) { @@ -1177,29 +1179,27 @@ void DRW_mesh_batch_cache_create_requested( if (batch_requested & MBC_EDITUV) { /* Discard UV batches if sync_selection changes */ - if (ts != NULL) { - const bool is_uvsyncsel = (ts->uv_flag & UV_SYNC_SELECTION); - if (cache->is_uvsyncsel != is_uvsyncsel) { - cache->is_uvsyncsel = is_uvsyncsel; - FOREACH_MESH_BUFFER_CACHE(cache, mbuffercache) - { - GPU_VERTBUF_DISCARD_SAFE(mbuffercache->vbo.edituv_data); - GPU_VERTBUF_DISCARD_SAFE(mbuffercache->vbo.fdots_uv); - GPU_INDEXBUF_DISCARD_SAFE(mbuffercache->ibo.edituv_tris); - GPU_INDEXBUF_DISCARD_SAFE(mbuffercache->ibo.edituv_lines); - GPU_INDEXBUF_DISCARD_SAFE(mbuffercache->ibo.edituv_points); - } - /* We only clear the batches as they may already have been - * referenced. */ - GPU_BATCH_CLEAR_SAFE(cache->batch.wire_loops_uvs); - GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_faces_stretch_area); - GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_faces_stretch_angle); - GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_faces); - GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_edges); - GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_verts); - GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_fdots); - cache->batch_ready &= ~MBC_EDITUV; + const bool is_uvsyncsel = ts && (ts->uv_flag & UV_SYNC_SELECTION); + if (cd_uv_update || (cache->is_uvsyncsel != is_uvsyncsel)) { + cache->is_uvsyncsel = is_uvsyncsel; + FOREACH_MESH_BUFFER_CACHE(cache, mbuffercache) + { + GPU_VERTBUF_DISCARD_SAFE(mbuffercache->vbo.edituv_data); + GPU_VERTBUF_DISCARD_SAFE(mbuffercache->vbo.fdots_uv); + GPU_INDEXBUF_DISCARD_SAFE(mbuffercache->ibo.edituv_tris); + GPU_INDEXBUF_DISCARD_SAFE(mbuffercache->ibo.edituv_lines); + GPU_INDEXBUF_DISCARD_SAFE(mbuffercache->ibo.edituv_points); } + /* We only clear the batches as they may already have been + * referenced. */ + GPU_BATCH_CLEAR_SAFE(cache->batch.wire_loops_uvs); + GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_faces_stretch_area); + GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_faces_stretch_angle); + GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_faces); + GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_edges); + GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_verts); + GPU_BATCH_CLEAR_SAFE(cache->batch.edituv_fdots); + cache->batch_ready &= ~MBC_EDITUV; } } |