From 0c4de0235c0a0ff14896c6e1ba49c1664f908999 Mon Sep 17 00:00:00 2001 From: Oleksandr Shcherbina Date: Thu, 5 Feb 2015 15:17:43 +0100 Subject: [PATCH] evas: Evas_3D - fix evas_3d_scene_pick when trying to get empty texcoords from mesh. Summary: During filling evas pick public data by API evas_3d_scene_pick segfault can occur if mesh was created without texcoords. See functions - _pick_data_mesh_add, _pick_data_texcoord_update @fix Reviewers: cedric, Hermet, raster Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D1941 Signed-off-by: Cedric BAIL --- src/lib/evas/canvas/evas_3d_scene.c | 27 ++++++++++++++++++--------- 1 file changed, 18 insertions(+), 9 deletions(-) diff --git a/src/lib/evas/canvas/evas_3d_scene.c b/src/lib/evas/canvas/evas_3d_scene.c index c8a2c67d93..0e177a74ca 100644 --- a/src/lib/evas/canvas/evas_3d_scene.c +++ b/src/lib/evas/canvas/evas_3d_scene.c @@ -352,7 +352,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const Evas_Ray3 *ray, if (_pick_data_triangle_add(data, ray, &tri)) { - _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i0, i1, i2); + if (tex0.data) + _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i0, i1, i2); data->mesh = mesh; data->node = node; } @@ -399,7 +400,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const Evas_Ray3 *ray, i1 = ((unsigned char *)pdmesh->indices)[i + 1]; } - _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i0, i1, i2); + if (tex0.data) + _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i0, i1, i2); data->mesh = mesh; data->node = node; } @@ -439,7 +441,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const Evas_Ray3 *ray, else i1 = ((unsigned char *)pdmesh->indices)[i]; - _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i0, i1, i2); + if (tex0.data) + _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i0, i1, i2); data->mesh = mesh; data->node = node; } @@ -458,7 +461,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const Evas_Ray3 *ray, if (_pick_data_triangle_add(data, ray, &tri)) { - _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i, i + 1, i + 2); + if (tex0.data) + _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i, i + 1, i + 2); data->mesh = mesh; data->node = node; } @@ -478,7 +482,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const Evas_Ray3 *ray, if (_pick_data_triangle_add(data, ray, &tri)) { - _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i, i + 1, i + 2); + if (tex0.data) + _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i, i + 1, i + 2); data->mesh = mesh; data->node = node; } @@ -497,7 +502,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const Evas_Ray3 *ray, if (_pick_data_triangle_add(data, ray, &tri)) { - _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, 0, i, i + 1); + if (tex0.data) + _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, 0, i, i + 1); data->mesh = mesh; data->node = node; } @@ -516,7 +522,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const Evas_Ray3 *ray, if (_pick_data_triangle_add(data, ray, &tri)) { - _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i, i + 1, i + 2); + if (tex0.data) + _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i, i + 1, i + 2); data->mesh = mesh; data->node = node; } @@ -536,7 +543,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const Evas_Ray3 *ray, if (_pick_data_triangle_add(data, ray, &tri)) { - _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i, i + 1, i + 2); + if (tex0.data) + _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, i, i + 1, i + 2); data->mesh = mesh; data->node = node; } @@ -555,7 +563,8 @@ _pick_data_mesh_add(Evas_3D_Pick_Data *data, const Evas_Ray3 *ray, if (_pick_data_triangle_add(data, ray, &tri)) { - _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, 0, i, i + 1); + if (tex0.data) + _pick_data_texcoord_update(data, &tex0, &tex1, tex_weight, 0, i, i + 1); data->mesh = mesh; data->node = node; }