From 4370f8ffbde44442855275204689cc9ff3596306 Mon Sep 17 00:00:00 2001 From: Sergey Sharybin Date: Tue, 11 Oct 2016 11:54:04 +0200 Subject: [PATCH] Fix T49623: Immediately crash trying to render attached file in Cycles Original fix in this area was not really complete (but was the safest at the release time). Now all the crazy configurations of slots going out of sync should be handled here. --- source/blender/blenkernel/intern/mesh.c | 27 ++++++------------------- 1 file changed, 6 insertions(+), 21 deletions(-) diff --git a/source/blender/blenkernel/intern/mesh.c b/source/blender/blenkernel/intern/mesh.c index 2c6ed0df04b..446aef9be65 100644 --- a/source/blender/blenkernel/intern/mesh.c +++ b/source/blender/blenkernel/intern/mesh.c @@ -2368,14 +2368,9 @@ Mesh *BKE_mesh_new_from_object( if (tmpcu->mat) { for (i = tmpcu->totcol; i-- > 0; ) { /* are we an object material or data based? */ - if (ob->matbits[i] && i >= ob->totcol) { - tmpmesh->mat[i] = NULL; - } - else { - tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : tmpcu->mat[i]; - } + tmpmesh->mat[i] = give_current_material(ob, i + 1); - if ((ob->matbits[i] || do_mat_id_data_us) && tmpmesh->mat[i]) { + if (((ob->matbits && ob->matbits[i]) || do_mat_id_data_us) && tmpmesh->mat[i]) { id_us_plus(&tmpmesh->mat[i]->id); } } @@ -2392,14 +2387,9 @@ Mesh *BKE_mesh_new_from_object( if (tmpmb->mat) { for (i = tmpmb->totcol; i-- > 0; ) { /* are we an object material or data based? */ - if (ob->matbits[i] && i >= ob->totcol) { - tmpmesh->mat[i] = NULL; - } - else { - tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : tmpmb->mat[i]; - } + tmpmesh->mat[i] = give_current_material(ob, i + 1); - if ((ob->matbits[i] || do_mat_id_data_us) && tmpmesh->mat[i]) { + if (((ob->matbits[i] && ob->matbits) || do_mat_id_data_us) && tmpmesh->mat[i]) { id_us_plus(&tmpmesh->mat[i]->id); } } @@ -2417,14 +2407,9 @@ Mesh *BKE_mesh_new_from_object( if (origmesh->mat) { for (i = origmesh->totcol; i-- > 0; ) { /* are we an object material or data based? */ - if (ob->matbits[i] && i >= ob->totcol) { - tmpmesh->mat[i] = NULL; - } - else { - tmpmesh->mat[i] = ob->matbits[i] ? ob->mat[i] : origmesh->mat[i]; - } + tmpmesh->mat[i] = give_current_material(ob, i + 1); - if ((ob->matbits[i] || do_mat_id_data_us) && tmpmesh->mat[i]) { + if (((ob->matbits && ob->matbits[i]) || do_mat_id_data_us) && tmpmesh->mat[i]) { id_us_plus(&tmpmesh->mat[i]->id); } }