Mesh: fix crash when creating mesh outline from QuadMesh

Since create_outline can only make outline for PRIMITIVE_TRIANGLES,
when QuadMesh (which is PRIMITIVE_TRIANGLE_FAN) is used to create
outline, will leave `arrays` empty, and crash when it is being indexed
for "indices" subarray.

This PR shows error when there's only one surface and it is not
TRIANGLES. Also prevent the crash if it has more than one surface
and none of them are TRIANGLES (and any other cases that could leave
`arrays` empty) by checking the size of `arrays` == 8 before indexing
it, since the method seems to expect `arrays` to be of that size.

(cherry picked from commit a492d22952)
This commit is contained in:
Poommetee Ketson 2018-04-01 22:06:47 +07:00 committed by Hein-Pieter van Braam
parent 640063334d
commit c5dfe6824c
2 changed files with 6 additions and 0 deletions

View File

@ -344,6 +344,10 @@ void MeshInstanceEditor::_create_outline_mesh() {
err_dialog->set_text(TTR("Mesh has not surface to create outlines from!")); err_dialog->set_text(TTR("Mesh has not surface to create outlines from!"));
err_dialog->popup_centered_minsize(); err_dialog->popup_centered_minsize();
return; return;
} else if (mesh->get_surface_count() == 1 && mesh->surface_get_primitive_type(0) != Mesh::PRIMITIVE_TRIANGLES) {
err_dialog->set_text(TTR("Mesh primitive type is not PRIMITIVE_TRIANGLES!"));
err_dialog->popup_centered_minsize();
return;
} }
Ref<Mesh> mesho = mesh->create_outline(outline_size->get_value()); Ref<Mesh> mesho = mesh->create_outline(outline_size->get_value());

View File

@ -315,6 +315,8 @@ Ref<Mesh> Mesh::create_outline(float p_margin) const {
} }
} }
ERR_FAIL_COND_V(arrays.size() != ARRAY_MAX, Ref<ArrayMesh>());
{ {
PoolVector<int>::Write ir; PoolVector<int>::Write ir;
PoolVector<int> indices = arrays[ARRAY_INDEX]; PoolVector<int> indices = arrays[ARRAY_INDEX];