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.
This commit is contained in:
Sergey Sharybin 2016-10-11 11:54:04 +02:00
parent 3e460b68d9
commit 4370f8ffbd

@ -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);
}
}