diff options
author | Campbell Barton <ideasman42@gmail.com> | 2018-12-03 06:58:29 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2018-12-03 06:58:29 +0300 |
commit | ff3601b9aed6ed4a711271b71d66629e79eba7db (patch) | |
tree | edf35af0cc0c6d752e38b14396c091d6ee54c5f5 | |
parent | 085e5765df5a6e5664db4932ca2ade84be4dfc8e (diff) |
Fix/workaround T58368: Crash w/ mapped mesh + autosmooth
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_mesh.c | 14 |
1 files changed, 13 insertions, 1 deletions
diff --git a/source/blender/draw/intern/draw_cache_impl_mesh.c b/source/blender/draw/intern/draw_cache_impl_mesh.c index bc3bb0e322e..80d4debcf76 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -72,6 +72,8 @@ #include "draw_cache_impl.h" /* own include */ +// #define USE_BM_MAPPED_LOOPNORMAL + static void mesh_batch_cache_clear(Mesh *me); /* ---------------------------------------------------------------------- */ @@ -490,6 +492,7 @@ static MeshRenderData *mesh_render_data_create_ex( } if (types & MR_DATATYPE_LOOP) { int totloop = bm->totloop; +#ifdef USE_BM_MAPPED_LOOPNORMAL if (is_auto_smooth) { rdata->loop_normals = MEM_mallocN(sizeof(*rdata->loop_normals) * totloop, __func__); int cd_loop_clnors_offset = CustomData_get_offset(&bm->ldata, CD_CUSTOMLOOPNORMAL); @@ -497,6 +500,7 @@ static MeshRenderData *mesh_render_data_create_ex( bm, NULL, NULL, NULL, true, split_angle, rdata->loop_normals, NULL, NULL, cd_loop_clnors_offset, false); } +#endif rdata->loop_len = totloop; bm_ensure_types |= BM_LOOP; } @@ -1787,9 +1791,17 @@ static void add_overlay_tri_mapped( } if (vbo_nor) { +#ifdef USE_BM_MAPPED_LOOPNORMAL float (*lnors)[3] = rdata->loop_normals; +#endif for (uint i = 0; i < 3; i++) { - const float *nor = (lnors) ? lnors[mlt->tri[i]] : poly_normal; + /* We don't have 'l_origindex', so use the polygons normal. */ +#ifdef USE_BM_MAPPED_LOOPNORMAL + const int l_orig = l_origindex[mlt->tri[i]]; + const float *nor = (lnors && (l_orig != ORIGINDEX_NONE)) ? lnors[l_orig] : poly_normal; +#else + const float *nor = poly_normal; +#endif GPUPackedNormal lnor = GPU_normal_convert_i10_v3(nor); GPU_vertbuf_attr_set(vbo_nor, lnor_id, base_vert_idx + i, &lnor); GPUPackedNormal vnor = GPU_normal_convert_i10_s3(mvert[mloop[mlt->tri[i]].v].no); |