diff options
Diffstat (limited to 'source/blender/draw/intern/mesh_extractors')
-rw-r--r-- | source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc | 19 | ||||
-rw-r--r-- | source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc | 13 |
2 files changed, 20 insertions, 12 deletions
diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc index 0d422180288..4ced14ab11a 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_angle.cc @@ -224,6 +224,21 @@ static void extract_edituv_stretch_angle_init_subdiv(const DRWSubdivCache *subdi GPUVertBuf *pos_nor = cache->final.buff.vbo.pos_nor; GPUVertBuf *uvs = cache->final.buff.vbo.uv; + /* It may happen that the data for the UV editor is requested before (as a separate draw update) + * the data for the mesh when switching to the `UV Editing` workspace, and therefore the position + * buffer might not be created yet. In this case, create a buffer it locally, the subdivision + * data should already be evaluated if we are here. This can happen if the subsurf modifier is + * only enabled in edit-mode. See T96338. */ + if (!pos_nor) { + const DRWSubdivLooseGeom &loose_geom = subdiv_cache->loose_geom; + pos_nor = GPU_vertbuf_calloc(); + GPU_vertbuf_init_build_on_device(pos_nor, + draw_subdiv_get_pos_nor_format(), + subdiv_cache->num_subdiv_loops + loose_geom.loop_len); + + draw_subdiv_extract_pos_nor(subdiv_cache, pos_nor); + } + /* UVs are stored contiguously so we need to compute the offset in the UVs buffer for the active * UV layer. */ CustomData *cd_ldata = (mr->extract_type == MR_EXTRACT_MESH) ? &mr->me->ldata : &mr->bm->ldata; @@ -253,6 +268,10 @@ static void extract_edituv_stretch_angle_init_subdiv(const DRWSubdivCache *subdi draw_subdiv_build_edituv_stretch_angle_buffer( subdiv_cache, pos_nor, uvs, uvs_offset, refined_vbo); + + if (!cache->final.buff.vbo.pos_nor) { + GPU_vertbuf_discard(pos_nor); + } } constexpr MeshExtract create_extractor_edituv_edituv_stretch_angle() diff --git a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc index dd056891a94..ea46d9c4caa 100644 --- a/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc +++ b/source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_pos_nor.cc @@ -179,17 +179,6 @@ static void extract_pos_nor_finish(const MeshRenderData *UNUSED(mr), MEM_freeN(data->normals); } -static GPUVertFormat *get_pos_nor_format() -{ - static GPUVertFormat format = {0}; - if (format.attr_len == 0) { - GPU_vertformat_attr_add(&format, "pos", GPU_COMP_F32, 3, GPU_FETCH_FLOAT); - GPU_vertformat_attr_add(&format, "nor", GPU_COMP_F32, 4, GPU_FETCH_FLOAT); - GPU_vertformat_alias_add(&format, "vnor"); - } - return &format; -} - static GPUVertFormat *get_normals_format() { static GPUVertFormat format = {0}; @@ -221,7 +210,7 @@ static void extract_pos_nor_init_subdiv(const DRWSubdivCache *subdiv_cache, /* Initialize the vertex buffer, it was already allocated. */ GPU_vertbuf_init_build_on_device( - vbo, get_pos_nor_format(), subdiv_cache->num_subdiv_loops + loose_geom.loop_len); + vbo, draw_subdiv_get_pos_nor_format(), subdiv_cache->num_subdiv_loops + loose_geom.loop_len); if (subdiv_cache->num_subdiv_loops == 0) { return; |