196 lines
6.9 KiB
C
196 lines
6.9 KiB
C
#ifdef HAVE_CONFIG_H
|
|
# include "config.h"
|
|
#endif
|
|
|
|
#include <stdio.h>
|
|
#include <unistd.h>
|
|
|
|
#include "../../lib/evas/include/evas_common_private.h"
|
|
#include "../../lib/evas/include/evas_private.h"
|
|
|
|
#include "evas_suite.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 TESTS_PLY_MESH_DIR TESTS_MESH_DIR"/ply"
|
|
|
|
#define COMPARE_GEOMETRICS(a) \
|
|
vb1 = &f1->vertices[a]; \
|
|
vb2 = &f2->vertices[a]; \
|
|
if ((a == EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION) && \
|
|
((vb1->data == NULL) || (vb2->data == NULL))) \
|
|
return 1; \
|
|
if ((vb1->data != NULL) && (vb2->data != NULL)) \
|
|
{ \
|
|
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_CANVAS3D_VERTEX_ATTRIB_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, ext) \
|
|
it = eina_file_direct_ls(folder); \
|
|
EINA_ITERATOR_FOREACH(it, file) \
|
|
{ \
|
|
int set_ok, save_ok; \
|
|
Eina_File *f; \
|
|
const Eina_File *f_get = NULL; \
|
|
const char *filename = NULL; \
|
|
const char *key = NULL; \
|
|
mesh = efl_add(EVAS_CANVAS3D_MESH_CLASS, e); \
|
|
mesh2 = efl_add(EVAS_CANVAS3D_MESH_CLASS, e); \
|
|
fail_if(mesh == NULL); \
|
|
fail_if(mesh2 == NULL); \
|
|
snprintf(buffer, PATH_MAX, "%s%s", tmp, ext); \
|
|
set_ok = efl_file_simple_load(mesh, file->path, NULL); \
|
|
save_ok = efl_file_save(mesh, buffer, NULL, NULL); \
|
|
fail_if(!set_ok); \
|
|
fail_if(!save_ok); \
|
|
set_ok = efl_file_simple_load(mesh2, buffer, NULL); \
|
|
fail_if(!set_ok); \
|
|
efl_file_simple_get(mesh2, &filename, &key); \
|
|
fail_if(!filename); \
|
|
fail_if(!!key); \
|
|
res = _compare_meshes(mesh, mesh2); \
|
|
fail_if(res == 1); \
|
|
f = eina_file_open(file->path, 0); \
|
|
fail_if(!f); \
|
|
set_ok = efl_file_simple_mmap_load(mesh, f, NULL); \
|
|
efl_file_simple_mmap_get(mesh, &f_get, &key); \
|
|
fail_if(!f_get); \
|
|
fail_if(!!key); \
|
|
eina_file_close(f); \
|
|
save_ok = efl_file_save(mesh, buffer, NULL, NULL); \
|
|
fail_if(!set_ok); \
|
|
fail_if(!save_ok); \
|
|
f = eina_file_open(buffer, 0); \
|
|
fail_if(!f); \
|
|
set_ok = efl_file_simple_mmap_load(mesh2, f, NULL); \
|
|
eina_file_close(f); \
|
|
fail_if(!set_ok); \
|
|
res = _compare_meshes(mesh, mesh2); \
|
|
fail_if(res == 1); \
|
|
efl_del(mesh2); \
|
|
efl_del(mesh); \
|
|
unlink(buffer); \
|
|
} \
|
|
eina_iterator_free(it);
|
|
|
|
static Evas_Canvas3D_Mesh_Frame *
|
|
return_zero_frame(Evas_Canvas3D_Mesh_Data *pd)
|
|
{
|
|
Eina_List *l;
|
|
Evas_Canvas3D_Mesh_Frame *f;
|
|
|
|
EINA_LIST_FOREACH(pd->frames, l, f)
|
|
{
|
|
if (f->frame == 0)
|
|
return f;
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
static int _compare_meshes(Evas_Canvas3D_Mesh *mesh1, Evas_Canvas3D_Mesh *mesh2)
|
|
{
|
|
Evas_Canvas3D_Mesh_Data *pd1, *pd2;
|
|
Evas_Canvas3D_Mesh_Frame *f1, *f2;
|
|
int i;
|
|
float *src1, *src2;
|
|
Evas_Canvas3D_Vertex_Buffer *vb1, *vb2;
|
|
|
|
pd1 = efl_data_scope_get(mesh1, EVAS_CANVAS3D_MESH_CLASS);
|
|
f1 = return_zero_frame(pd1);
|
|
if ((pd1 == NULL) || (f1 == NULL))
|
|
return 1;
|
|
|
|
pd2 = efl_data_scope_get(mesh2, EVAS_CANVAS3D_MESH_CLASS);
|
|
f2 = return_zero_frame(pd2);
|
|
if ((pd2 == NULL) || (f2 == NULL))
|
|
return 1;
|
|
|
|
if ((pd1->vertex_count) != (pd2->vertex_count))
|
|
return 1;
|
|
|
|
#ifdef __clang__
|
|
#pragma clang diagnostic push
|
|
#pragma clang diagnostic ignored "-Wtautological-compare"
|
|
#endif
|
|
|
|
COMPARE_GEOMETRICS(EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION)
|
|
COMPARE_GEOMETRICS(EVAS_CANVAS3D_VERTEX_ATTRIB_NORMAL)
|
|
COMPARE_GEOMETRICS(EVAS_CANVAS3D_VERTEX_ATTRIB_TEXCOORD)
|
|
|
|
#ifdef __clang__
|
|
#pragma clang diagnostic pop
|
|
#endif
|
|
|
|
return 0;
|
|
}
|
|
|
|
EFL_START_TEST(evas_object_mesh_loader_saver)
|
|
{
|
|
char buffer[PATH_MAX];
|
|
Evas *e = _setup_evas();
|
|
Eina_Tmpstr *tmp;
|
|
Eo *mesh, *mesh2;
|
|
Eina_Iterator *it;
|
|
char *file_mask = strdup("evas_test_mesh_XXXXXX");
|
|
int res = 0, tmpfd;
|
|
const Eina_File_Direct_Info *file;
|
|
struct
|
|
{
|
|
const char *dir;
|
|
const char *fmt;
|
|
} values[4] =
|
|
{
|
|
{ TESTS_OBJ_MESH_DIR, ".eet" },
|
|
{ TESTS_MD2_MESH_DIR, ".eet" },
|
|
{ TESTS_PLY_MESH_DIR, ".eet" },
|
|
{ TESTS_PLY_MESH_DIR, ".ply" },
|
|
};
|
|
|
|
/* create tmp file name, assume tmp.eet and tmp.ply also work */
|
|
tmpfd = eina_file_mkstemp(file_mask, &tmp);
|
|
fail_if(tmpfd == -1);
|
|
fail_if(!!close(tmpfd));
|
|
|
|
CHECK_MESHES_IN_FOLDER(values[_i].dir, values[_i].fmt)
|
|
|
|
unlink(tmp);
|
|
|
|
free(file_mask);
|
|
evas_free(e);
|
|
}
|
|
EFL_END_TEST
|
|
|
|
void evas_test_mesh(TCase *tc)
|
|
{
|
|
tcase_add_loop_test(tc, evas_object_mesh_loader_saver, 0, 1);
|
|
}
|
|
|
|
void evas_test_mesh1(TCase *tc)
|
|
{
|
|
tcase_add_loop_test(tc, evas_object_mesh_loader_saver, 1, 2);
|
|
}
|
|
|
|
void evas_test_mesh2(TCase *tc)
|
|
{
|
|
tcase_add_loop_test(tc, evas_object_mesh_loader_saver, 2, 3);
|
|
}
|
|
|
|
void evas_test_mesh3(TCase *tc)
|
|
{
|
|
tcase_add_loop_test(tc, evas_object_mesh_loader_saver, 3, 4);
|
|
}
|