diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2018-05-21 18:58:52 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2018-05-21 19:00:50 +0300 |
commit | 13d2df32c7d43b04564298de90567fb0907c001a (patch) | |
tree | f393a8ae868e74ef48c395f3a1d6ab0ff4f5a3ca /source/blender/draw/intern/draw_cache_impl_mesh.c | |
parent | f0fda91a5591ebb2161922f35777a32cc374964a (diff) |
Fix broken draw code from last Thursday commit.
Seriously... Not all edges have faces!!!!!!!!
Quick fix to make it possible to load/use customshaped bones again, not
100% sure it is correct, but... At least it does not crash anymore!
Diffstat (limited to 'source/blender/draw/intern/draw_cache_impl_mesh.c')
-rw-r--r-- | source/blender/draw/intern/draw_cache_impl_mesh.c | 62 |
1 files changed, 40 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 bc805bfed0d..1722a4eedec 100644 --- a/source/blender/draw/intern/draw_cache_impl_mesh.c +++ b/source/blender/draw/intern/draw_cache_impl_mesh.c @@ -1232,11 +1232,16 @@ static bool mesh_render_data_edge_vcos_manifold_pnors( *r_pnor2 = eed->l->radial_next->f->no; *r_is_manifold = true; } - else { + else if (eed->l != NULL) { *r_pnor1 = eed->l->f->no; *r_pnor2 = eed->l->f->no; *r_is_manifold = false; } + else { + *r_pnor1 = eed->v1->no; + *r_pnor2 = eed->v1->no; + *r_is_manifold = false; + } } else { MVert *mvert = rdata->mvert; @@ -1248,9 +1253,14 @@ static bool mesh_render_data_edge_vcos_manifold_pnors( const MLoop *mloop = rdata->mloop; const MPoly *mpoly = rdata->mpoly; const int poly_len = rdata->poly_len; - const bool do_pnors = (pnors == NULL); + const bool do_pnors = (poly_len != 0 && pnors == NULL); - eap = rdata->edges_adjacent_polys = MEM_callocN(sizeof(*eap) * rdata->edge_len, __func__); + eap = rdata->edges_adjacent_polys = MEM_mallocN(sizeof(*eap) * rdata->edge_len, __func__); + for (int i = 0; i < rdata->edge_len; i++) { + eap[i].count = 0; + eap[i].face_index[0] = -1; + eap[i].face_index[1] = -1; + } if (do_pnors) { pnors = rdata->poly_normals = MEM_mallocN(sizeof(*pnors) * poly_len, __func__); } @@ -1270,32 +1280,40 @@ static bool mesh_render_data_edge_vcos_manifold_pnors( } } } - BLI_assert(eap && pnors); + BLI_assert(eap && (rdata->poly_len == 0 || pnors != NULL)); *r_vco1 = mvert[medge[edge_index].v1].co; *r_vco2 = mvert[medge[edge_index].v2].co; - *r_pnor1 = pnors[eap[edge_index].face_index[0]]; + if (eap[edge_index].face_index[0] == -1) { + /* Edge has no poly... */ + *r_pnor1 = *r_pnor2 = mvert[medge[edge_index].v1].co; /* XXX mvert.no are shorts... :( */ + *r_is_manifold = false; + } + else { + *r_pnor1 = pnors[eap[edge_index].face_index[0]]; - float nor[3], v1[3], v2[3], r_center[3]; - const MPoly *mpoly = rdata->mpoly + eap[edge_index].face_index[0]; - const MLoop *mloop = rdata->mloop + mpoly->loopstart; + float nor[3], v1[3], v2[3], r_center[3]; + const MPoly *mpoly = rdata->mpoly + eap[edge_index].face_index[0]; + const MLoop *mloop = rdata->mloop + mpoly->loopstart; - BKE_mesh_calc_poly_center(mpoly, mloop, mvert, r_center); - sub_v3_v3v3(v1, *r_vco2, *r_vco1); - sub_v3_v3v3(v2, r_center, *r_vco1); - cross_v3_v3v3(nor, v1, v2); + BKE_mesh_calc_poly_center(mpoly, mloop, mvert, r_center); + sub_v3_v3v3(v1, *r_vco2, *r_vco1); + sub_v3_v3v3(v2, r_center, *r_vco1); + cross_v3_v3v3(nor, v1, v2); - if (dot_v3v3(nor, *r_pnor1) < 0.0) { - SWAP(float *, *r_vco1, *r_vco2); - } + if (dot_v3v3(nor, *r_pnor1) < 0.0) { + SWAP(float *, *r_vco1, *r_vco2); + } - if (eap[edge_index].count == 2) { - *r_pnor2 = pnors[eap[edge_index].face_index[1]]; - *r_is_manifold = true; - } - else { - *r_pnor2 = pnors[eap[edge_index].face_index[0]]; - *r_is_manifold = false; + if (eap[edge_index].count == 2) { + BLI_assert(eap[edge_index].face_index[1] >= 0); + *r_pnor2 = pnors[eap[edge_index].face_index[1]]; + *r_is_manifold = true; + } + else { + *r_pnor2 = pnors[eap[edge_index].face_index[0]]; + *r_is_manifold = false; + } } } |