2014-10-06 07:27:06 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <unistd.h>
|
|
|
|
#include <stdio.h>
|
|
|
|
|
|
|
|
#include "../../lib/evas/include/evas_common_private.h"
|
|
|
|
#include "../../lib/evas/include/evas_private.h"
|
|
|
|
#include "evas_suite.h"
|
|
|
|
#include "Evas.h"
|
|
|
|
#include "evas_tests_helpers.h"
|
|
|
|
|
|
|
|
#define TESTS_MESH_DIR TESTS_SRC_DIR"/meshes"
|
|
|
|
#define TESTS_OBJ_MESH_DIR TESTS_MESH_DIR"/obj"
|
|
|
|
#define TESTS_MD2_MESH_DIR TESTS_MESH_DIR"/md2"
|
|
|
|
|
|
|
|
#define COMPARE_GEOMETRICS(a, component) \
|
|
|
|
vb1 = &f1->vertices[a]; \
|
|
|
|
vb2 = &f2->vertices[a]; \
|
|
|
|
if ((vb1->data == NULL) || (vb2->data == NULL)) \
|
|
|
|
return 1; \
|
|
|
|
src1 = (float *)vb1->data; \
|
|
|
|
src2 = (float *)vb2->data; \
|
|
|
|
for (i = 0; i < pd1->vertex_count; i++) \
|
|
|
|
{ \
|
|
|
|
if ((src1[0] != src2[0]) || (src1[1] != src2[1])) \
|
|
|
|
return 1; \
|
|
|
|
if (a != EVAS_3D_VERTEX_TEXCOORD) \
|
|
|
|
if (src1[2] != src2[2]) \
|
|
|
|
return 1; \
|
|
|
|
src1 += f1->vertices[a].element_count; \
|
|
|
|
src2 += f2->vertices[a].element_count; \
|
|
|
|
}
|
|
|
|
|
|
|
|
#define CHECK_MESHES_IN_FOLDER(folder, type) \
|
|
|
|
it = eina_file_direct_ls(folder); \
|
|
|
|
EINA_ITERATOR_FOREACH(it, file) \
|
|
|
|
{ \
|
|
|
|
mesh = eo_add(EVAS_3D_MESH_CLASS, e); \
|
|
|
|
mesh2 = eo_add(EVAS_3D_MESH_CLASS, e); \
|
|
|
|
fail_if(mesh == NULL); \
|
2014-10-21 01:08:13 -07:00
|
|
|
fail_if(mesh2 == NULL); \
|
|
|
|
eo_do(mesh, evas_3d_mesh_file_set(type, file->path, NULL)); \
|
2014-10-06 07:27:06 -07:00
|
|
|
eo_do(mesh, evas_3d_mesh_save(EVAS_3D_MESH_FILE_TYPE_EET, buffer, NULL)); \
|
|
|
|
eo_do(mesh2, evas_3d_mesh_file_set(EVAS_3D_MESH_FILE_TYPE_EET, buffer, NULL)); \
|
|
|
|
res = _compare_meshes(mesh, mesh2); \
|
|
|
|
fail_if(res == 1); \
|
2014-10-21 01:08:13 -07:00
|
|
|
eo_del(mesh2); \
|
|
|
|
eo_del(mesh); \
|
2014-10-06 07:27:06 -07:00
|
|
|
}
|
|
|
|
|
|
|
|
static Evas_3D_Mesh_Frame *
|
|
|
|
return_zero_frame(Evas_3D_Mesh_Data *pd)
|
|
|
|
{
|
|
|
|
Eina_List *l;
|
|
|
|
Evas_3D_Mesh_Frame *f;
|
|
|
|
|
|
|
|
EINA_LIST_FOREACH(pd->frames, l, f)
|
|
|
|
{
|
|
|
|
if (f->frame == 0)
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
|
|
|
static int _compare_meshes(Evas_3D_Mesh *mesh1, Evas_3D_Mesh *mesh2)
|
|
|
|
{
|
|
|
|
Evas_3D_Mesh_Data *pd1, *pd2;
|
|
|
|
Evas_3D_Mesh_Frame *f1, *f2;
|
|
|
|
int i;
|
|
|
|
float *src1, *src2;
|
|
|
|
Evas_3D_Vertex_Buffer *vb1, *vb2;
|
|
|
|
|
|
|
|
pd1 = eo_data_scope_get(mesh1, EVAS_3D_MESH_CLASS);
|
|
|
|
f1 = return_zero_frame(pd1);
|
|
|
|
if ((pd1 == NULL) || (f1 == NULL))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
pd2 = eo_data_scope_get(mesh2, EVAS_3D_MESH_CLASS);
|
|
|
|
f2 = return_zero_frame(pd2);
|
|
|
|
if ((pd2 == NULL) || (f2 == NULL))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if ((pd1->vertex_count) != (pd2->vertex_count))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
COMPARE_GEOMETRICS(EVAS_3D_VERTEX_POSITION, position)
|
|
|
|
COMPARE_GEOMETRICS(EVAS_3D_VERTEX_NORMAL, normal)
|
|
|
|
COMPARE_GEOMETRICS(EVAS_3D_VERTEX_TEXCOORD, texcoord)
|
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
|
|
|
START_TEST(evas_object_mesh_loader_saver)
|
|
|
|
{
|
|
|
|
char buffer[PATH_MAX];
|
|
|
|
Evas *e = _setup_evas();
|
|
|
|
Eina_Tmpstr *tmp;
|
|
|
|
Eo *mesh;
|
|
|
|
Eo *mesh2;
|
|
|
|
Eina_Iterator *it;
|
|
|
|
char *file_mask = strdup("evas_test_mesh_XXXXXX");
|
|
|
|
int res = 0, tmpfd;
|
|
|
|
const Eina_File_Direct_Info *file;
|
|
|
|
|
|
|
|
tmpfd = eina_file_mkstemp(file_mask, &tmp);
|
|
|
|
fail_if(tmpfd == -1);
|
|
|
|
fail_if(!!close(tmpfd));
|
|
|
|
|
|
|
|
snprintf(buffer, PATH_MAX, "%s", tmp);
|
|
|
|
|
|
|
|
CHECK_MESHES_IN_FOLDER(TESTS_OBJ_MESH_DIR, EVAS_3D_MESH_FILE_TYPE_OBJ)
|
|
|
|
CHECK_MESHES_IN_FOLDER(TESTS_MD2_MESH_DIR, EVAS_3D_MESH_FILE_TYPE_MD2)
|
|
|
|
|
|
|
|
eina_iterator_free(it);
|
|
|
|
|
|
|
|
evas_free(e);
|
|
|
|
evas_shutdown();
|
|
|
|
}
|
|
|
|
END_TEST
|
|
|
|
|
|
|
|
void evas_test_mesh(TCase *tc)
|
|
|
|
{
|
|
|
|
tcase_add_test(tc, evas_object_mesh_loader_saver);
|
|
|
|
}
|