Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorClément Foucault <foucault.clem@gmail.com>2020-01-13 19:29:31 +0300
committerClément Foucault <foucault.clem@gmail.com>2020-01-13 19:29:31 +0300
commit2359979141862cdffa8072f7dd8fc1e67ee228cf (patch)
tree7b45881a3b00cc0dc05c65e8ca9070c34674e15d /source/blender/draw/intern/draw_cache_impl_mesh.c
parent84825e4b50c19bfbb081499129d7cb4fd4ba1cdf (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.c44
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;
}
}