#include "evas_common_private.h"
#include "evas_private.h"
+static inline void
+_model_common_loader_fini(Model_Common_Loader *loader)
+{
+ if (loader->map)
+ {
+ eina_file_map_free(loader->file, loader->map);
+ loader->map = NULL;
+ }
+
+ if (loader->file)
+ {
+ eina_file_close(loader->file);
+ loader->file = NULL;
+ }
+}
+
+static inline Eina_Bool
+_model_common_loader_init(Model_Common_Loader *loader, const char *file)
+{
+ Eina_File *tmp_file = eina_file_open(file, 0);
+ memset(loader, 0x00, sizeof(Model_Common_Loader));
+
+ /* Open given file. */
+ loader->file = eina_file_dup(tmp_file);
+
+ if (loader->file == NULL)
+ {
+ ERR("Failed to open file %s\n", file);
+ goto error;
+ }
+
+ /* Map the file. */
+ loader->map = eina_file_map_all(loader->file, EINA_FILE_SEQUENTIAL);
+
+ if (loader->map == NULL)
+ {
+ ERR("Failed to create map from file %s\n", file);
+ goto error;
+ }
+
+ eina_file_close(tmp_file);
+ return EINA_TRUE;
+
+error:
+ eina_file_close(tmp_file);
+ _model_common_loader_fini(loader);
+ return EINA_FALSE;
+}
void
evas_common_load_model_to_file(Evas_3D_Mesh *model, const char *file)
{
char *p;
- char *loader = NULL;
+ char *loader_type = NULL;
+ Model_Common_Loader *loader = malloc(sizeof(Model_Common_Loader));
+
+ if (!_model_common_loader_init(loader, file))
+ {
+ ERR("Failed to initialize loader.");
+ return;
+ }
p = strrchr(file, '.');
if (p)
#define CHECK_EXTENTION_BY_FILE_NAME(extention) \
if (!strcasecmp(p, #extention)) \
{ \
- evas_model_load_file_##extention(model, file); \
- loader = #extention; \
+ evas_model_load_file_##extention(model, loader); \
+ loader_type = #extention; \
}
CHECK_EXTENTION_BY_FILE_NAME(eet)
CHECK_EXTENTION_BY_FILE_NAME(md2)
CHECK_EXTENTION_BY_FILE_NAME(ply)
#undef CHECK_EXTENTION_BY_FILE_NAME
}
- if (!loader) ERR("Invalid mesh file type.");
+ if (!loader_type) ERR("Invalid mesh file type.");
+
+ _model_common_loader_fini(loader);
+ free(loader);
}
+
Evas_3D_Header_Eet *header;
};//contain mesh data and information about mesh size
+typedef struct _Model_Common_Loader Model_Common_Loader;
+
+struct _Model_Common_Loader
+{
+ Eina_File *file;
+ char *map;
+};
+
typedef Eina_Bool (*Evas_3D_Node_Func)(Evas_3D_Node *, void *data);
/* Temporary save/load functions */
void evas_common_load_model_to_file(Evas_3D_Mesh *model, const char *file);
void evas_common_save_model_to_file(Evas_3D_Mesh *model, const char *file, Evas_3D_Mesh_Frame *f);
-void evas_model_load_file_eet(Evas_3D_Mesh *mesh, const char *file);
-void evas_model_load_file_md2(Evas_3D_Mesh *mesh, const char *file);
-void evas_model_load_file_obj(Evas_3D_Mesh *mesh, const char *file);
-void evas_model_load_file_ply(Evas_3D_Mesh *mesh, const char *file);
+void evas_model_load_file_eet(Evas_3D_Mesh *mesh, Model_Common_Loader *loader);
+void evas_model_load_file_md2(Evas_3D_Mesh *mesh, Model_Common_Loader *loader);
+void evas_model_load_file_obj(Evas_3D_Mesh *mesh, Model_Common_Loader *loader);
+void evas_model_load_file_ply(Evas_3D_Mesh *mesh, Model_Common_Loader *loader);
void evas_model_save_file_eet(Evas_3D_Mesh *mesh, const char *file, Evas_3D_Mesh_Frame *f);
void evas_model_save_file_obj(Evas_3D_Mesh *mesh, const char *file, Evas_3D_Mesh_Frame *f);
void evas_model_save_file_ply(Evas_3D_Mesh *mesh, const char *file, Evas_3D_Mesh_Frame *f);
}
#endif
#endif
+
}
void
-evas_model_load_file_eet(Evas_3D_Mesh *mesh, const char *file)
+evas_model_load_file_eet(Evas_3D_Mesh *mesh, Model_Common_Loader *loader)
{
Eet_File *ef;
_evas_3d_eet_file_init();
- ef = eet_open(file, EET_FILE_MODE_READ);
+ ef = eet_open(eina_file_filename_get(loader->file), EET_FILE_MODE_READ);
eet_file = eet_data_read(ef,
_file_descriptor,
EVAS_3D_FILE_CACHE_FILE_ENTRY);
_evas_3d_eet_file_free();
}
+
typedef struct _MD2_Loader
{
- Eina_File *file;
- char *map;
- int size;
+ Model_Common_Loader *common_loader;
+ int size;
- int skin_width;
- int skin_height;
+ int skin_width;
+ int skin_height;
- int frame_count;
- int frame_size;
- char *frames;
+ int frame_count;
+ int frame_size;
+ char *frames;
- int vertex_count;
- int triangle_count;
- int texcoord_count;
+ int vertex_count;
+ int triangle_count;
+ int texcoord_count;
- MD2_Triangle *triangles;
- MD2_Texcoord *texcoords;
+ MD2_Triangle *triangles;
+ MD2_Texcoord *texcoords;
} MD2_Loader;
static const float normal_table[162][3] =
{-0.688191f, -0.587785f, -0.425325f},
};
-static inline void
-_md2_loader_fini(MD2_Loader *loader)
-{
- if (loader->map)
- {
- eina_file_map_free(loader->file, loader->map);
- loader->map = NULL;
- }
-
- if (loader->file)
- {
- eina_file_close(loader->file);
- loader->file = NULL;
- }
-}
-
static inline Eina_Bool
-_md2_loader_init(MD2_Loader *loader, const char *file)
+_md2_loader_init(MD2_Loader *loader, Model_Common_Loader *common_loader)
{
MD2_Header header;
memset(loader, 0x00, sizeof(MD2_Loader));
-
- /* Open given file. */
- loader->file = eina_file_open(file, 0);
-
- if (loader->file == NULL)
- {
- ERR("Failed to open file %s\n", file);
- goto error;
- }
+ loader->common_loader = common_loader;
/* Check file size. We require a file larger than MD2 header size. */
- loader->size = eina_file_size_get(loader->file);
+ loader->size = eina_file_size_get(loader->common_loader->file);
if (loader->size < (int)sizeof(MD2_Header))
goto error;
- /* Map the file. */
- loader->map = eina_file_map_all(loader->file, EINA_FILE_SEQUENTIAL);
-
- if (loader->map == NULL)
- goto error;
-
/* Read header. */
- memcpy(&header, loader->map, sizeof(MD2_Header));
+ memcpy(&header, loader->common_loader->map, sizeof(MD2_Header));
/* Check identity */
if (header.magic != MD2_MAGIC_NUMBER || header.version != MD2_VERSION)
loader->frame_count = header.frame_count;
loader->frame_size = header.frame_size;
- loader->frames = loader->map + header.offset_frames;
+ loader->frames = loader->common_loader->map + header.offset_frames;
loader->vertex_count = header.vertex_count;
loader->triangle_count = header.triangle_count;
loader->texcoord_count = header.texcoord_count;
- loader->triangles = (MD2_Triangle *)(loader->map + header.offset_triangles);
- loader->texcoords = (MD2_Texcoord *)(loader->map + header.offset_texcoords);
+ loader->triangles = (MD2_Triangle *)(loader->common_loader->map + header.offset_triangles);
+ loader->texcoords = (MD2_Texcoord *)(loader->common_loader->map + header.offset_texcoords);
return EINA_TRUE;
error:
- _md2_loader_fini(loader);
return EINA_FALSE;
}
void
-evas_model_load_file_md2(Evas_3D_Mesh *mesh, const char *file)
+evas_model_load_file_md2(Evas_3D_Mesh *mesh, Model_Common_Loader *common_loader)
{
MD2_Loader loader;
int i, j, k;
Evas_3D_Mesh_Data *pd;
/* Initialize MD2 loader (Open file and read MD2 head ant etc) */
- if (!_md2_loader_init(&loader, file))
+ if (!_md2_loader_init(&loader, common_loader))
{
ERR("Failed to initialize MD2 loader.");
return;
ERR("Axis-Aligned Bounding Box wasn't added in frame %d ", f);
}
}
-
- _md2_loader_fini(&loader);
}
+
Eina_Bool existence_of_tex_point;
};
-typedef struct _OBJ_Loader
-{
- Eina_File *file;
- char *map;
-} OBJ_Loader;
-
-static inline void
-_obj_loader_fini(OBJ_Loader *loader)
-{
- if (loader->map)
- {
- eina_file_map_free(loader->file, loader->map);
- loader->map = NULL;
- }
-
- if (loader->file)
- {
- eina_file_close(loader->file);
- loader->file = NULL;
- }
-}
-
-static inline Eina_Bool
-_obj_loader_init(OBJ_Loader *loader, const char *file)
-{
- memset(loader, 0x00, sizeof(OBJ_Loader));
-
- /* Open given file. */
- loader->file = eina_file_open(file, 0);
-
- if (loader->file == NULL)
- {
- ERR("Failed to open file %s\n", file);
- goto error;
- }
-
- /* Map the file. */
- loader->map = eina_file_map_all(loader->file, EINA_FILE_SEQUENTIAL);
-
- if (loader->map == NULL)
- {
- ERR("Failed to create map from file %s\n", file);
- goto error;
- }
-
- return EINA_TRUE;
-
-error:
- _obj_loader_fini(loader);
- return EINA_FALSE;
-}
-
/* create new counter */
static inline OBJ_Counts
_new_count_elements()
}
static inline OBJ_Counts
-_count_elements(OBJ_Loader loader)//count elements of mesh in .obj
+_count_elements(Model_Common_Loader *loader)//count elements of mesh in .obj
{
OBJ_Counts counts = _new_count_elements();
- char * current = loader.map;
+ char * current = loader->map;
int polygon_checker = -2;//polygons with n vertices can be represented as n-2 triangles
Eina_Bool will_check_next_char = EINA_FALSE;
Eina_Bool first_char_is_v = EINA_FALSE;
}
void
-evas_model_load_file_obj(Evas_3D_Mesh *mesh, const char *file)
+evas_model_load_file_obj(Evas_3D_Mesh *mesh, Model_Common_Loader *loader)
{
long i;
OBJ_Counts counts;//count elements of mesh in .obj
- OBJ_Loader loader;
Eina_Bool will_check_next_char = EINA_FALSE;
Eina_Bool first_char_is_v = EINA_FALSE;
Eina_Bool first_char_is_f = EINA_FALSE;
int j, k;
char * current;
- /* Initialize PLY loader */
- if (!_obj_loader_init(&loader, file))
- {
- ERR("Failed to initialize PLY loader.");
- return;
- }
-
counts = _count_elements(loader);
float *_vertices_obj = malloc(counts._vertex_counter * 3 * sizeof(float));
/* triangle has 3 points, every point has 3(vertix, texture and normal) coord */
int *_triangles = malloc(counts._triangles_counter * 9 * sizeof(int));
- if ((loader.map == NULL) || (_vertices_obj == NULL) ||
+ if ((loader->map == NULL) || (_vertices_obj == NULL) ||
(_normales_obj == NULL) || (_tex_coords_obj == NULL) || (_triangles == NULL))
{
ERR("Allocate memory is failed.");
- _obj_loader_fini(&loader);
free(_vertices_obj);
free(_normales_obj);
free(_tex_coords_obj);
return;
}
- current = loader.map;
+ current = loader->map;
i = 0;
/* put data to arrays */
{
ERR("Axis-Aligned Bounding Box wan't added in frame %d ", 0);
}
- _obj_loader_fini(&loader);
}
+
Eina_Bool existence_of_colors;
};
-typedef struct _PLY_Loader
-{
- Eina_File *file;
- char *map;
-} PLY_Loader;
-
-static inline void
-_ply_loader_fini(PLY_Loader *loader)
-{
- if (loader->map)
- {
- eina_file_map_free(loader->file, loader->map);
- loader->map = NULL;
- }
-
- if (loader->file)
- {
- eina_file_close(loader->file);
- loader->file = NULL;
- }
-}
-
-static inline Eina_Bool
-_ply_loader_init(PLY_Loader *loader, const char *file)
-{
- memset(loader, 0x00, sizeof(PLY_Loader));
-
- /* Open given file. */
- loader->file = eina_file_open(file, 0);
-
- if (loader->file == NULL)
- {
- ERR("Failed to open file %s\n", file);
- goto error;
- }
-
- /* Map the file. */
- loader->map = eina_file_map_all(loader->file, EINA_FILE_SEQUENTIAL);
-
- if (loader->map == NULL)
- {
- ERR("Failed to create map from file %s\n", file);
- goto error;
- }
-
- return EINA_TRUE;
-
-error:
- _ply_loader_fini(loader);
- return EINA_FALSE;
-}
-
/* create new header */
static inline PLY_Header
_new_ply_header()
}
void
-evas_model_load_file_ply(Evas_3D_Mesh *mesh, const char *file)
+evas_model_load_file_ply(Evas_3D_Mesh *mesh, Model_Common_Loader *loader)
{
Evas_3D_Mesh_Data *pd;
int i = 0, j = 0, k = 0, count_of_triangles_in_line = 0;
float *_vertices_ply = NULL, *_normals_ply = NULL;
float *_tex_coords_ply = NULL, *_colors_ply = NULL;
char **helping_pointer;
- PLY_Loader loader;
- /* Initialize PLY loader */
- if (!_ply_loader_init(&loader, file))
- {
- ERR("Failed to initialize PLY loader.");
- return;
- }
-
- header = _read_header(loader.map);
+ header = _read_header(loader->map);
if (!header.existence_of_geometries)
{
return;
}
- helping_pointer = eina_str_split(loader.map, "end_header\n", 0);
+ helping_pointer = eina_str_split(loader->map, "end_header\n", 0);
if (helping_pointer == NULL)
{
(_triangles == NULL))
{
ERR("Allocate memory is failed.");
- _ply_loader_fini(&loader);
free(_vertices_ply);
free(_normals_ply);
free(_tex_coords_ply);
{
ERR("Axis-Aligned Bounding Box wan't added in frame %d ", 0);
}
-
- _ply_loader_fini(&loader);
}
+