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:
authorBastien Montagne <montagne29@wanadoo.fr>2018-05-21 18:58:52 +0300
committerBastien Montagne <montagne29@wanadoo.fr>2018-05-21 19:00:50 +0300
commit13d2df32c7d43b04564298de90567fb0907c001a (patch)
treef393a8ae868e74ef48c395f3a1d6ab0ff4f5a3ca /source/blender/draw/intern/draw_cache_impl_mesh.c
parentf0fda91a5591ebb2161922f35777a32cc374964a (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.c62
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;
+ }
}
}