2014-10-06 07:27:06 -07:00
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
# include "config.h"
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdio.h>
|
2016-02-04 06:11:52 -08:00
|
|
|
#include <unistd.h>
|
2014-10-06 07:27:06 -07:00
|
|
|
|
|
|
|
#include "../../lib/evas/include/evas_common_private.h"
|
|
|
|
#include "../../lib/evas/include/evas_private.h"
|
2016-02-04 06:11:52 -08:00
|
|
|
|
2014-10-06 07:27:06 -07:00
|
|
|
#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"
|
2014-11-13 22:11:09 -08:00
|
|
|
#define TESTS_PLY_MESH_DIR TESTS_MESH_DIR"/ply"
|
2014-10-06 07:27:06 -07:00
|
|
|
|
2015-12-28 20:28:55 -08:00
|
|
|
#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; \
|
|
|
|
} \
|
2014-10-06 07:27:06 -07:00
|
|
|
}
|
|
|
|
|
2015-04-03 07:23:13 -07:00
|
|
|
#define CHECK_MESHES_IN_FOLDER(folder, ext) \
|
|
|
|
it = eina_file_direct_ls(folder); \
|
|
|
|
EINA_ITERATOR_FOREACH(it, file) \
|
|
|
|
{ \
|
2015-12-28 22:02:52 -08:00
|
|
|
int set_ok, save_ok; \
|
2018-03-20 09:38:32 -07:00
|
|
|
Eina_File *f; \
|
2019-01-25 09:47:38 -08:00
|
|
|
const Eina_File *f_get = NULL; \
|
|
|
|
const char *filename = NULL; \
|
|
|
|
const char *key = NULL; \
|
2016-08-15 06:44:41 -07:00
|
|
|
mesh = efl_add(EVAS_CANVAS3D_MESH_CLASS, e); \
|
|
|
|
mesh2 = efl_add(EVAS_CANVAS3D_MESH_CLASS, e); \
|
2015-04-03 07:23:13 -07:00
|
|
|
fail_if(mesh == NULL); \
|
|
|
|
fail_if(mesh2 == NULL); \
|
2015-12-28 22:02:52 -08:00
|
|
|
snprintf(buffer, PATH_MAX, "%s%s", tmp, ext); \
|
2019-02-27 10:17:09 -08:00
|
|
|
set_ok = efl_file_simple_load(mesh, file->path, NULL); \
|
2016-03-01 10:06:28 -08:00
|
|
|
save_ok = efl_file_save(mesh, buffer, NULL, NULL); \
|
2015-12-28 22:02:52 -08:00
|
|
|
fail_if(!set_ok); \
|
|
|
|
fail_if(!save_ok); \
|
2019-02-27 10:17:09 -08:00
|
|
|
set_ok = efl_file_simple_load(mesh2, buffer, NULL); \
|
2015-12-28 22:02:52 -08:00
|
|
|
fail_if(!set_ok); \
|
2019-02-27 10:17:09 -08:00
|
|
|
efl_file_simple_get(mesh2, &filename, &key); \
|
|
|
|
fail_if(!filename); \
|
2019-01-25 09:47:38 -08:00
|
|
|
fail_if(!!key); \
|
2015-04-03 07:23:13 -07:00
|
|
|
res = _compare_meshes(mesh, mesh2); \
|
|
|
|
fail_if(res == 1); \
|
2018-03-20 09:38:32 -07:00
|
|
|
f = eina_file_open(file->path, 0); \
|
|
|
|
fail_if(!f); \
|
2019-02-27 10:17:09 -08:00
|
|
|
set_ok = efl_file_simple_mmap_load(mesh, f, NULL); \
|
|
|
|
efl_file_simple_mmap_get(mesh, &f_get, &key); \
|
|
|
|
fail_if(!f_get); \
|
2019-01-25 09:47:38 -08:00
|
|
|
fail_if(!!key); \
|
2018-03-20 09:38:32 -07:00
|
|
|
eina_file_close(f); \
|
2016-03-01 10:06:28 -08:00
|
|
|
save_ok = efl_file_save(mesh, buffer, NULL, NULL); \
|
2015-12-28 22:02:52 -08:00
|
|
|
fail_if(!set_ok); \
|
|
|
|
fail_if(!save_ok); \
|
2018-03-20 09:38:32 -07:00
|
|
|
f = eina_file_open(buffer, 0); \
|
|
|
|
fail_if(!f); \
|
2019-02-27 10:17:09 -08:00
|
|
|
set_ok = efl_file_simple_mmap_load(mesh2, f, NULL); \
|
2018-03-20 09:38:32 -07:00
|
|
|
eina_file_close(f); \
|
2015-12-28 22:02:52 -08:00
|
|
|
fail_if(!set_ok); \
|
2015-04-03 07:23:13 -07:00
|
|
|
res = _compare_meshes(mesh, mesh2); \
|
|
|
|
fail_if(res == 1); \
|
2016-08-10 07:23:04 -07:00
|
|
|
efl_del(mesh2); \
|
|
|
|
efl_del(mesh); \
|
2015-04-03 07:23:13 -07:00
|
|
|
unlink(buffer); \
|
2018-04-13 03:39:44 -07:00
|
|
|
} \
|
|
|
|
eina_iterator_free(it);
|
2014-10-06 07:27:06 -07:00
|
|
|
|
2015-06-17 09:29:51 -07:00
|
|
|
static Evas_Canvas3D_Mesh_Frame *
|
|
|
|
return_zero_frame(Evas_Canvas3D_Mesh_Data *pd)
|
2014-10-06 07:27:06 -07:00
|
|
|
{
|
|
|
|
Eina_List *l;
|
2015-06-17 09:29:51 -07:00
|
|
|
Evas_Canvas3D_Mesh_Frame *f;
|
2014-10-06 07:27:06 -07:00
|
|
|
|
|
|
|
EINA_LIST_FOREACH(pd->frames, l, f)
|
|
|
|
{
|
|
|
|
if (f->frame == 0)
|
|
|
|
return f;
|
|
|
|
}
|
|
|
|
|
|
|
|
return NULL;
|
|
|
|
}
|
|
|
|
|
2015-06-17 09:29:51 -07:00
|
|
|
static int _compare_meshes(Evas_Canvas3D_Mesh *mesh1, Evas_Canvas3D_Mesh *mesh2)
|
2014-10-06 07:27:06 -07:00
|
|
|
{
|
2015-06-17 09:29:51 -07:00
|
|
|
Evas_Canvas3D_Mesh_Data *pd1, *pd2;
|
|
|
|
Evas_Canvas3D_Mesh_Frame *f1, *f2;
|
2014-10-06 07:27:06 -07:00
|
|
|
int i;
|
|
|
|
float *src1, *src2;
|
2015-06-17 09:29:51 -07:00
|
|
|
Evas_Canvas3D_Vertex_Buffer *vb1, *vb2;
|
2014-10-06 07:27:06 -07:00
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
pd1 = efl_data_scope_get(mesh1, EVAS_CANVAS3D_MESH_CLASS);
|
2014-10-06 07:27:06 -07:00
|
|
|
f1 = return_zero_frame(pd1);
|
|
|
|
if ((pd1 == NULL) || (f1 == NULL))
|
|
|
|
return 1;
|
|
|
|
|
2016-08-15 06:44:41 -07:00
|
|
|
pd2 = efl_data_scope_get(mesh2, EVAS_CANVAS3D_MESH_CLASS);
|
2014-10-06 07:27:06 -07:00
|
|
|
f2 = return_zero_frame(pd2);
|
|
|
|
if ((pd2 == NULL) || (f2 == NULL))
|
|
|
|
return 1;
|
|
|
|
|
|
|
|
if ((pd1->vertex_count) != (pd2->vertex_count))
|
|
|
|
return 1;
|
|
|
|
|
2016-07-19 01:41:37 -07:00
|
|
|
#ifdef __clang__
|
2016-03-25 01:51:17 -07:00
|
|
|
#pragma clang diagnostic push
|
|
|
|
#pragma clang diagnostic ignored "-Wtautological-compare"
|
2016-07-19 01:41:37 -07:00
|
|
|
#endif
|
2016-03-25 01:51:17 -07:00
|
|
|
|
2015-07-14 03:19:35 -07:00
|
|
|
COMPARE_GEOMETRICS(EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION)
|
|
|
|
COMPARE_GEOMETRICS(EVAS_CANVAS3D_VERTEX_ATTRIB_NORMAL)
|
|
|
|
COMPARE_GEOMETRICS(EVAS_CANVAS3D_VERTEX_ATTRIB_TEXCOORD)
|
2014-11-13 22:11:09 -08:00
|
|
|
|
2016-07-19 01:41:37 -07:00
|
|
|
#ifdef __clang__
|
2016-03-25 01:51:17 -07:00
|
|
|
#pragma clang diagnostic pop
|
2016-07-19 01:41:37 -07:00
|
|
|
#endif
|
2016-03-25 01:51:17 -07:00
|
|
|
|
2014-10-06 07:27:06 -07:00
|
|
|
return 0;
|
|
|
|
}
|
|
|
|
|
2018-03-26 11:19:28 -07:00
|
|
|
EFL_START_TEST(evas_object_mesh_loader_saver)
|
2014-10-06 07:27:06 -07:00
|
|
|
{
|
|
|
|
char buffer[PATH_MAX];
|
|
|
|
Evas *e = _setup_evas();
|
|
|
|
Eina_Tmpstr *tmp;
|
2014-11-13 22:11:09 -08:00
|
|
|
Eo *mesh, *mesh2;
|
2014-10-06 07:27:06 -07:00
|
|
|
Eina_Iterator *it;
|
|
|
|
char *file_mask = strdup("evas_test_mesh_XXXXXX");
|
|
|
|
int res = 0, tmpfd;
|
|
|
|
const Eina_File_Direct_Info *file;
|
2018-05-03 05:55:36 -07:00
|
|
|
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" },
|
|
|
|
};
|
2014-10-06 07:27:06 -07:00
|
|
|
|
2015-12-28 22:02:52 -08:00
|
|
|
/* create tmp file name, assume tmp.eet and tmp.ply also work */
|
2014-10-06 07:27:06 -07:00
|
|
|
tmpfd = eina_file_mkstemp(file_mask, &tmp);
|
|
|
|
fail_if(tmpfd == -1);
|
|
|
|
fail_if(!!close(tmpfd));
|
|
|
|
|
2018-05-03 05:55:36 -07:00
|
|
|
CHECK_MESHES_IN_FOLDER(values[_i].dir, values[_i].fmt)
|
2014-10-06 07:27:06 -07:00
|
|
|
|
2015-12-28 22:02:52 -08:00
|
|
|
unlink(tmp);
|
2014-10-06 07:27:06 -07:00
|
|
|
|
2019-05-02 04:43:57 -07:00
|
|
|
free(file_mask);
|
2014-10-06 07:27:06 -07:00
|
|
|
evas_free(e);
|
|
|
|
}
|
2018-03-26 11:19:28 -07:00
|
|
|
EFL_END_TEST
|
2014-10-06 07:27:06 -07:00
|
|
|
|
|
|
|
void evas_test_mesh(TCase *tc)
|
|
|
|
{
|
2018-05-03 05:55:36 -07:00
|
|
|
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);
|
2014-10-06 07:27:06 -07:00
|
|
|
}
|