Commit: 13d2df32c7d43b04564298de90567fb0907c001a
Author: Bastien Montagne
Date:   Mon May 21 17:58:52 2018 +0200
Branches: blender2.8
https://developer.blender.org/rB13d2df32c7d43b04564298de90567fb0907c001a

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!

===================================================================

M       source/blender/draw/intern/draw_cache_impl_mesh.c

===================================================================

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;
+                       }
                }
        }

_______________________________________________
Bf-blender-cvs mailing list
[email protected]
https://lists.blender.org/mailman/listinfo/bf-blender-cvs

Reply via email to