evas: API for Convex Hull in Evas.Canvas3d

Summary: This API builds vertex and index data of convex hull around the given mesh.

Reviewers: raster, perepelits.m, Hermet, cedric

Reviewed By: cedric

Subscribers: cedric, artem.popov

Differential Revision: https://phab.enlightenment.org/D2799

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
This commit is contained in:
perepelits.m 2015-11-09 14:29:44 -08:00 committed by Cedric BAIL
parent 0c1bb7d7b3
commit 3031a4a5c6
3 changed files with 43 additions and 16 deletions

View File

@ -1127,5 +1127,23 @@ _evas_canvas3d_mesh_shadows_constant_bias_get(Eo *obj EINA_UNUSED, Evas_Canvas3D
{
return pd->shadows_constant_bias;
}
EOLIAN static void
_evas_canvas3d_mesh_convex_hull_data_get(Eo *obj EINA_UNUSED, Evas_Canvas3D_Mesh_Data *pd,
int frame, Eina_Inarray *vertex, Eina_Inarray *index)
{
int stride;
Evas_Canvas3D_Mesh_Frame *f = evas_canvas3d_mesh_frame_find(pd, frame);
if (f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].stride != 0)
stride = f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].stride / sizeof(float);
else
stride = 3;
float *data = (float *)f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].data;
evas_convex_hull_get(data, pd->vertex_count, stride, vertex, index);
return;
}
#include "canvas/evas_canvas3d_mesh.eo.c"

View File

@ -99,6 +99,15 @@ class Evas.Canvas3D.Mesh (Evas.Canvas3D.Object, Evas.Common_Interface, Efl.File)
}
}
convex_hull_data_get {
[[Get the vertex and index data of convex hull around the given mesh.
]]
params {
@in frame: int; [[ The number of the key frame.]]
@in vertex: Eina_Inarray*;
@in index: Eina_Inarray*;
}
}
index_data_copy_set {
[[Set the vertex index data of the given mesh by copying from a

View File

@ -2213,7 +2213,7 @@ tangent_new_basis(Evas_Vec3 *out, Evas_Triangle3 *triangle,
}
static inline void
convex_hull_vertex_set(Evas_Triangle3 *el, int *vertex_count, float **vertex,
convex_hull_vertex_set(Evas_Triangle3 *el, unsigned short int *vertex_count, float **vertex,
unsigned short int **index, unsigned int k, int *leader, int coord)
{
int color_coords, normal_coords;
@ -2404,8 +2404,8 @@ convex_hull_first_tr_get(float *data, int count, int stride)
}
static inline void
evas_convex_hull_get(float *data, int count, int stride, float **vertex,
unsigned short int **index, int *vertex_count, int *index_count)
evas_convex_hull_get(float *data, int count, int stride, Eina_Inarray *vertex,
Eina_Inarray *index)
{
Evas_Triangle3 first_elem, second_elem, *third_elem = NULL, *el = NULL;
@ -2424,7 +2424,7 @@ evas_convex_hull_get(float *data, int count, int stride, float **vertex,
int i = 0, j = 0, new_stride = 0, leader = 0;
int if_two = 0, first_exist_twice = 0, second_exist_twice = 0;
unsigned int k = 0;
unsigned short int *found_index = NULL;
unsigned short int *found_index = NULL, index_count, vertex_count = 0;
Eina_Bool exist1 = EINA_FALSE, pushed;
Eina_Bool equivalent_triangle = EINA_FALSE, triangle_chain = EINA_FALSE;
@ -2711,17 +2711,15 @@ evas_convex_hull_get(float *data, int count, int stride, float **vertex,
free (new_elem1);
}
*vertex_count = 0;
*index_count = 3 * eina_array_count(&arr_ch);
index_count = 3 * eina_array_count(&arr_ch);
found_vertex = (float*) malloc(10 * sizeof(float));
found_index = (unsigned short int*) malloc((*index_count) * sizeof(unsigned short int));
found_index = (unsigned short int*) malloc(index_count * sizeof(unsigned short int));
j = 0;
#define CHECK_AND_SET_VERTEX(coord) \
exist1 = EINA_FALSE; \
for (i = 0, new_stride = 0; i < (*vertex_count) && !exist1; i++, new_stride += 10) \
for (i = 0, new_stride = 0; (i < vertex_count) && !exist1; i++, new_stride += 10) \
{ \
if ((k > 0) && (el->p##coord.x == found_vertex[new_stride]) && \
(el->p##coord.y == found_vertex[new_stride + 1]) && \
@ -2732,7 +2730,7 @@ evas_convex_hull_get(float *data, int count, int stride, float **vertex,
} \
} \
if (!exist1) \
convex_hull_vertex_set(el, vertex_count, &found_vertex, \
convex_hull_vertex_set(el, &vertex_count, &found_vertex, \
&found_index, k, &leader, coord);
EINA_ARRAY_ITER_NEXT(&arr_ch, k, el, iterator)
@ -2744,12 +2742,14 @@ evas_convex_hull_get(float *data, int count, int stride, float **vertex,
j += 30;
}
*vertex = (float*) malloc((10 * (*vertex_count)) * sizeof(float));
memcpy(*vertex, found_vertex, (10 * (*vertex_count)) * sizeof(float));
for (i = 0; i < 10 * (vertex_count); i++)
eina_inarray_push(vertex, &found_vertex[i]);
for (i = 0; i < index_count; i++)
eina_inarray_push(index, &found_index[i]);
free(found_vertex);
*index = (unsigned short int*) malloc((*index_count) * sizeof(unsigned short int));
memcpy(*index, found_index, (*index_count) * sizeof(unsigned short int));
free(found_index);
EINA_ARRAY_ITER_NEXT(&arr_triangles, k, el, iterator)