cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=9b7e22f5a5a2ee734264265267e2186cbebce65c

commit 9b7e22f5a5a2ee734264265267e2186cbebce65c
Author: Bogdan Devichev <[email protected]>
Date:   Thu Nov 27 13:27:01 2014 +0200

    evas: replace and rename savers/loaders.
---
 src/Makefile_Evas.am                               |  21 +-
 src/lib/evas/canvas/evas_3d_mesh_loader_eet.c      | 131 ------
 src/lib/evas/canvas/evas_3d_mesh_loader_md2.c      | 446 --------------------
 src/lib/evas/canvas/evas_3d_mesh_loader_obj.c      | 401 ------------------
 src/lib/evas/canvas/evas_3d_mesh_loader_ply.c      | 401 ------------------
 src/lib/evas/canvas/evas_3d_mesh_saver_eet.c       | 197 ---------
 src/lib/evas/canvas/evas_3d_mesh_saver_obj.c       | 137 -------
 src/lib/evas/canvas/evas_3d_mesh_saver_ply.c       |  61 ---
 .../evas/model_loaders/eet/evas_model_load_eet.c   | 132 +++++-
 .../evas/model_loaders/md2/evas_model_load_md2.c   | 447 ++++++++++++++++++++-
 .../evas/model_loaders/obj/evas_model_load_obj.c   | 402 +++++++++++++++++-
 .../evas/model_loaders/ply/evas_model_load_ply.c   | 402 +++++++++++++++++-
 .../evas/model_savers/eet/evas_model_save_eet.c    | 198 ++++++++-
 .../evas/model_savers/obj/evas_model_save_obj.c    | 138 ++++++-
 .../evas/model_savers/ply/evas_model_save_ply.c    |  62 ++-
 15 files changed, 1786 insertions(+), 1790 deletions(-)

diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am
index b40ce7d..57bdc67 100644
--- a/src/Makefile_Evas.am
+++ b/src/Makefile_Evas.am
@@ -188,15 +188,18 @@ lib/evas/canvas/evas_3d_camera.c \
 lib/evas/canvas/evas_3d_light.c \
 lib/evas/canvas/evas_3d_mesh.c \
 lib/evas/canvas/evas_3d_texture.c \
-lib/evas/canvas/evas_3d_material.c \
-lib/evas/canvas/evas_3d_mesh_loader_md2.c \
-lib/evas/canvas/evas_3d_mesh_loader_obj.c \
-lib/evas/canvas/evas_3d_mesh_saver_obj.c \
-lib/evas/canvas/evas_3d_mesh_loader_eet.c \
-lib/evas/canvas/evas_3d_mesh_saver_eet.c \
-lib/evas/canvas/evas_3d_eet.c \
-lib/evas/canvas/evas_3d_mesh_loader_ply.c \
-lib/evas/canvas/evas_3d_mesh_saver_ply.c
+lib/evas/canvas/evas_3d_material.c 
+
+# Model savers/loaders (will be replaced to modules in next commits)
+lib_evas_libevas_la_SOURCES += \
+modules/evas/model_loaders/eet/evas_model_load_eet.c \
+modules/evas/model_loaders/md2/evas_model_load_md2.c \
+modules/evas/model_loaders/obj/evas_model_load_obj.c \
+modules/evas/model_loaders/ply/evas_model_load_ply.c \
+modules/evas/model_savers/eet/evas_model_save_eet.c \
+modules/evas/model_savers/obj/evas_model_save_obj.c \
+modules/evas/model_savers/ply/evas_model_save_ply.c \
+lib/evas/canvas/evas_3d_eet.c
 
 # Engine
 lib_evas_libevas_la_SOURCES += \
diff --git a/src/lib/evas/canvas/evas_3d_mesh_loader_eet.c 
b/src/lib/evas/canvas/evas_3d_mesh_loader_eet.c
deleted file mode 100644
index 26c3569..0000000
--- a/src/lib/evas/canvas/evas_3d_mesh_loader_eet.c
+++ /dev/null
@@ -1,131 +0,0 @@
-#ifdef HAVE_CONFIG_H
-   #include "config.h"
-#endif
-
-#include <Eo.h>
-#include <stdio.h>
-#include "evas_common_private.h"
-#include "evas_private.h"
-
-extern Evas_3D_File_Eet* eet_file;
-extern const char EVAS_3D_FILE_CACHE_FILE_ENTRY[];
-extern Eet_Data_Descriptor *_file_descriptor;
-
-void
-_set_geometry_to_mesh_from_eet_file(Evas_3D_Mesh *mesh,
-                                    Evas_3D_Mesh_Eet *eet_mesh)
-{
-   float *pos, *nor, *tex;
-   int stride_pos, stride_nor, stride_tex, j;
-
-   eo_do(mesh,
-         evas_3d_mesh_vertex_count_set(eet_mesh->geometries->vertices_count),
-         evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
-         evas_3d_mesh_frame_add(0),
-
-         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_POSITION, 
0, NULL),
-         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_NORMAL,   
0, NULL),
-         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_TEXCOORD, 
0, NULL),
-
-         pos = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_POSITION),
-         nor = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_NORMAL),
-         tex = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_TEXCOORD),
-
-         stride_pos = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_POSITION),
-         stride_nor = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_NORMAL),
-         stride_tex = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_TEXCOORD));
-
-   if (stride_pos == 0) stride_pos = sizeof(float) * 3;
-   if (stride_nor == 0) stride_nor = sizeof(float) * 3;
-   if (stride_tex == 0) stride_tex = sizeof(float) * 2;
-
-        /* set data to vertex buffer */
-   for (j = 0; j < eet_mesh->geometries->vertices_count; j++)
-     {
-        float *p, *n, *t;
-
-        p = (float *)((char *)pos + stride_pos * j);
-        n = (float *)((char *)nor + stride_nor * j);
-        t = (float *)((char *)tex + stride_tex * j);
-
-        p[0] = eet_mesh->geometries->vertices[j].position.x;
-        p[1] = eet_mesh->geometries->vertices[j].position.y;
-        p[2] = eet_mesh->geometries->vertices[j].position.z;
-
-        n[0] = eet_mesh->geometries->vertices[j].normal.x;
-        n[1] = eet_mesh->geometries->vertices[j].normal.y;
-        n[2] = eet_mesh->geometries->vertices[j].normal.z;
-
-        t[0] = eet_mesh->geometries->vertices[j].texcoord.x;
-        t[1] = eet_mesh->geometries->vertices[j].texcoord.y;
-     }
-
-        /* unmap vertex buffer */
-   eo_do(mesh,
-         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_POSITION),
-         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_NORMAL),
-         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_TEXCOORD));
-}
-
-void
-_set_material_to_mesh_from_eet_file(Evas_3D_Mesh *mesh,
-                                    Evas_3D_Mesh_Eet *eet_mesh)
-{
-   Evas_3D_Object_Data *pd = eo_data_scope_get(mesh, EVAS_3D_OBJECT_CLASS);
-   Eo *material = NULL;
-   material = eo_add(EVAS_3D_MATERIAL_CLASS, pd->evas);
-
-   eo_do(material,
-         evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT,
-                                     !!(eet_mesh->materials->colors[0].a > 0)),
-         evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE,
-                                     !!(eet_mesh->materials->colors[1].a > 0)),
-         evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR,
-                                     !!(eet_mesh->materials->colors[2].a > 0)),
-         evas_3d_material_enable_set(EVAS_3D_MATERIAL_NORMAL, EINA_TRUE),
-         evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT,
-                                    eet_mesh->materials->colors[0].r,
-                                    eet_mesh->materials->colors[0].g,
-                                    eet_mesh->materials->colors[0].b,
-                                    eet_mesh->materials->colors[0].a),
-         evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE,
-                                    eet_mesh->materials->colors[1].r,
-                                    eet_mesh->materials->colors[1].g,
-                                    eet_mesh->materials->colors[1].b,
-                                    eet_mesh->materials->colors[1].a),
-         evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR,
-                                    eet_mesh->materials->colors[2].r,
-                                    eet_mesh->materials->colors[2].g,
-                                    eet_mesh->materials->colors[2].b,
-                                    eet_mesh->materials->colors[2].a),
-         evas_3d_material_shininess_set(eet_mesh->materials->shininess));
-
-   eo_do(mesh, evas_3d_mesh_frame_material_set(0, material));
-}
-
-void
-evas_3d_mesh_file_eet_set(Evas_3D_Mesh *mesh, const char *file)
-{
-   Eet_File *ef;
-
-   _evas_3d_eet_file_init();
-   ef = eet_open(file, EET_FILE_MODE_READ);
-   eet_file = eet_data_read(ef,
-                            _file_descriptor,
-                            EVAS_3D_FILE_CACHE_FILE_ENTRY);
-
-   eet_close(ef);
-
-   if ((eet_file->mesh == NULL) || (eet_file->header == NULL))
-     {
-        ERR("Reading of file is failed.");
-        _evas_3d_eet_file_free();
-        return;
-     }
-
-   _set_geometry_to_mesh_from_eet_file(mesh, eet_file->mesh);
-   _set_material_to_mesh_from_eet_file(mesh, eet_file->mesh);
-
-   _evas_3d_eet_file_free();
-}
-
diff --git a/src/lib/evas/canvas/evas_3d_mesh_loader_md2.c 
b/src/lib/evas/canvas/evas_3d_mesh_loader_md2.c
deleted file mode 100644
index 4a356b7..0000000
--- a/src/lib/evas/canvas/evas_3d_mesh_loader_md2.c
+++ /dev/null
@@ -1,446 +0,0 @@
-#include "evas_common_private.h"
-#include "evas_private.h"
-
-#define PACKED __attribute__((__packed__))
-
-#define MD2_MAGIC_NUMBER   844121161
-#define MD2_VERSION        8
-#define MD2_FRAME_SCALE    256
-
-/* Structures for reading data from file. */
-typedef struct _MD2_Header    MD2_Header;
-typedef struct _MD2_Vertex    MD2_Vertex;
-typedef struct _MD2_Frame     MD2_Frame;
-typedef struct _MD2_Triangle  MD2_Triangle;
-typedef struct _MD2_Texcoord  MD2_Texcoord;
-
-struct PACKED _MD2_Header
-{
-   int   magic;
-   int   version;
-
-   int   skin_width;
-   int   skin_height;
-
-   int   frame_size;
-
-   int   skins_count;
-   int   vertex_count;
-   int   texcoord_count;
-   int   triangle_count;
-   int   glcmd_count;
-   int   frame_count;
-
-   int   offset_skins;
-   int   offset_texcoords;
-   int   offset_triangles;
-   int   offset_frames;
-   int   offset_glcmds;
-   int   offset_end;
-};
-
-struct PACKED _MD2_Vertex
-{
-   unsigned char  pos[3];
-   unsigned char  normal_idx;
-};
-
-struct PACKED _MD2_Frame
-{
-   float       scale[3];
-   float       trans[3];
-   char        name[16];
-   MD2_Vertex  vertices[1];
-};
-
-struct PACKED _MD2_Triangle
-{
-   unsigned short vertex_idx[3];
-   unsigned short texcoord_idx[3];
-};
-
-struct PACKED _MD2_Texcoord
-{
-   short s;
-   short t;
-};
-
-typedef struct _MD2_Loader
-{
-   Eina_File     *file;
-   char          *map;
-   int            size;
-
-   int            skin_width;
-   int            skin_height;
-
-   int            frame_count;
-   int            frame_size;
-   char          *frames;
-
-   int            vertex_count;
-   int            triangle_count;
-   int            texcoord_count;
-
-   MD2_Triangle  *triangles;
-   MD2_Texcoord   *texcoords;
-} MD2_Loader;
-
-static const float normal_table[162][3] =
-{
-     {-0.525731f,  0.000000f,  0.850651f},
-     {-0.442863f,  0.238856f,  0.864188f},
-     {-0.295242f,  0.000000f,  0.955423f},
-     {-0.309017f,  0.500000f,  0.809017f},
-     {-0.162460f,  0.262866f,  0.951056f},
-     { 0.000000f,  0.000000f,  1.000000f},
-     { 0.000000f,  0.850651f,  0.525731f},
-     {-0.147621f,  0.716567f,  0.681718f},
-     { 0.147621f,  0.716567f,  0.681718f},
-     { 0.000000f,  0.525731f,  0.850651f},
-     { 0.309017f,  0.500000f,  0.809017f},
-     { 0.525731f,  0.000000f,  0.850651f},
-     { 0.295242f,  0.000000f,  0.955423f},
-     { 0.442863f,  0.238856f,  0.864188f},
-     { 0.162460f,  0.262866f,  0.951056f},
-     {-0.681718f,  0.147621f,  0.716567f},
-     {-0.809017f,  0.309017f,  0.500000f},
-     {-0.587785f,  0.425325f,  0.688191f},
-     {-0.850651f,  0.525731f,  0.000000f},
-     {-0.864188f,  0.442863f,  0.238856f},
-     {-0.716567f,  0.681718f,  0.147621f},
-     {-0.688191f,  0.587785f,  0.425325f},
-     {-0.500000f,  0.809017f,  0.309017f},
-     {-0.238856f,  0.864188f,  0.442863f},
-     {-0.425325f,  0.688191f,  0.587785f},
-     {-0.716567f,  0.681718f, -0.147621f},
-     {-0.500000f,  0.809017f, -0.309017f},
-     {-0.525731f,  0.850651f,  0.000000f},
-     { 0.000000f,  0.850651f, -0.525731f},
-     {-0.238856f,  0.864188f, -0.442863f},
-     { 0.000000f,  0.955423f, -0.295242f},
-     {-0.262866f,  0.951056f, -0.162460f},
-     { 0.000000f,  1.000000f,  0.000000f},
-     { 0.000000f,  0.955423f,  0.295242f},
-     {-0.262866f,  0.951056f,  0.162460f},
-     { 0.238856f,  0.864188f,  0.442863f},
-     { 0.262866f,  0.951056f,  0.162460f},
-     { 0.500000f,  0.809017f,  0.309017f},
-     { 0.238856f,  0.864188f, -0.442863f},
-     { 0.262866f,  0.951056f, -0.162460f},
-     { 0.500000f,  0.809017f, -0.309017f},
-     { 0.850651f,  0.525731f,  0.000000f},
-     { 0.716567f,  0.681718f,  0.147621f},
-     { 0.716567f,  0.681718f, -0.147621f},
-     { 0.525731f,  0.850651f,  0.000000f},
-     { 0.425325f,  0.688191f,  0.587785f},
-     { 0.864188f,  0.442863f,  0.238856f},
-     { 0.688191f,  0.587785f,  0.425325f},
-     { 0.809017f,  0.309017f,  0.500000f},
-     { 0.681718f,  0.147621f,  0.716567f},
-     { 0.587785f,  0.425325f,  0.688191f},
-     { 0.955423f,  0.295242f,  0.000000f},
-     { 1.000000f,  0.000000f,  0.000000f},
-     { 0.951056f,  0.162460f,  0.262866f},
-     { 0.850651f, -0.525731f,  0.000000f},
-     { 0.955423f, -0.295242f,  0.000000f},
-     { 0.864188f, -0.442863f,  0.238856f},
-     { 0.951056f, -0.162460f,  0.262866f},
-     { 0.809017f, -0.309017f,  0.500000f},
-     { 0.681718f, -0.147621f,  0.716567f},
-     { 0.850651f,  0.000000f,  0.525731f},
-     { 0.864188f,  0.442863f, -0.238856f},
-     { 0.809017f,  0.309017f, -0.500000f},
-     { 0.951056f,  0.162460f, -0.262866f},
-     { 0.525731f,  0.000000f, -0.850651f},
-     { 0.681718f,  0.147621f, -0.716567f},
-     { 0.681718f, -0.147621f, -0.716567f},
-     { 0.850651f,  0.000000f, -0.525731f},
-     { 0.809017f, -0.309017f, -0.500000f},
-     { 0.864188f, -0.442863f, -0.238856f},
-     { 0.951056f, -0.162460f, -0.262866f},
-     { 0.147621f,  0.716567f, -0.681718f},
-     { 0.309017f,  0.500000f, -0.809017f},
-     { 0.425325f,  0.688191f, -0.587785f},
-     { 0.442863f,  0.238856f, -0.864188f},
-     { 0.587785f,  0.425325f, -0.688191f},
-     { 0.688191f,  0.587785f, -0.425325f},
-     {-0.147621f,  0.716567f, -0.681718f},
-     {-0.309017f,  0.500000f, -0.809017f},
-     { 0.000000f,  0.525731f, -0.850651f},
-     {-0.525731f,  0.000000f, -0.850651f},
-     {-0.442863f,  0.238856f, -0.864188f},
-     {-0.295242f,  0.000000f, -0.955423f},
-     {-0.162460f,  0.262866f, -0.951056f},
-     { 0.000000f,  0.000000f, -1.000000f},
-     { 0.295242f,  0.000000f, -0.955423f},
-     { 0.162460f,  0.262866f, -0.951056f},
-     {-0.442863f, -0.238856f, -0.864188f},
-     {-0.309017f, -0.500000f, -0.809017f},
-     {-0.162460f, -0.262866f, -0.951056f},
-     { 0.000000f, -0.850651f, -0.525731f},
-     {-0.147621f, -0.716567f, -0.681718f},
-     { 0.147621f, -0.716567f, -0.681718f},
-     { 0.000000f, -0.525731f, -0.850651f},
-     { 0.309017f, -0.500000f, -0.809017f},
-     { 0.442863f, -0.238856f, -0.864188f},
-     { 0.162460f, -0.262866f, -0.951056f},
-     { 0.238856f, -0.864188f, -0.442863f},
-     { 0.500000f, -0.809017f, -0.309017f},
-     { 0.425325f, -0.688191f, -0.587785f},
-     { 0.716567f, -0.681718f, -0.147621f},
-     { 0.688191f, -0.587785f, -0.425325f},
-     { 0.587785f, -0.425325f, -0.688191f},
-     { 0.000000f, -0.955423f, -0.295242f},
-     { 0.000000f, -1.000000f,  0.000000f},
-     { 0.262866f, -0.951056f, -0.162460f},
-     { 0.000000f, -0.850651f,  0.525731f},
-     { 0.000000f, -0.955423f,  0.295242f},
-     { 0.238856f, -0.864188f,  0.442863f},
-     { 0.262866f, -0.951056f,  0.162460f},
-     { 0.500000f, -0.809017f,  0.309017f},
-     { 0.716567f, -0.681718f,  0.147621f},
-     { 0.525731f, -0.850651f,  0.000000f},
-     {-0.238856f, -0.864188f, -0.442863f},
-     {-0.500000f, -0.809017f, -0.309017f},
-     {-0.262866f, -0.951056f, -0.162460f},
-     {-0.850651f, -0.525731f,  0.000000f},
-     {-0.716567f, -0.681718f, -0.147621f},
-     {-0.716567f, -0.681718f,  0.147621f},
-     {-0.525731f, -0.850651f,  0.000000f},
-     {-0.500000f, -0.809017f,  0.309017f},
-     {-0.238856f, -0.864188f,  0.442863f},
-     {-0.262866f, -0.951056f,  0.162460f},
-     {-0.864188f, -0.442863f,  0.238856f},
-     {-0.809017f, -0.309017f,  0.500000f},
-     {-0.688191f, -0.587785f,  0.425325f},
-     {-0.681718f, -0.147621f,  0.716567f},
-     {-0.442863f, -0.238856f,  0.864188f},
-     {-0.587785f, -0.425325f,  0.688191f},
-     {-0.309017f, -0.500000f,  0.809017f},
-     {-0.147621f, -0.716567f,  0.681718f},
-     {-0.425325f, -0.688191f,  0.587785f},
-     {-0.162460f, -0.262866f,  0.951056f},
-     { 0.442863f, -0.238856f,  0.864188f},
-     { 0.162460f, -0.262866f,  0.951056f},
-     { 0.309017f, -0.500000f,  0.809017f},
-     { 0.147621f, -0.716567f,  0.681718f},
-     { 0.000000f, -0.525731f,  0.850651f},
-     { 0.425325f, -0.688191f,  0.587785f},
-     { 0.587785f, -0.425325f,  0.688191f},
-     { 0.688191f, -0.587785f,  0.425325f},
-     {-0.955423f,  0.295242f,  0.000000f},
-     {-0.951056f,  0.162460f,  0.262866f},
-     {-1.000000f,  0.000000f,  0.000000f},
-     {-0.850651f,  0.000000f,  0.525731f},
-     {-0.955423f, -0.295242f,  0.000000f},
-     {-0.951056f, -0.162460f,  0.262866f},
-     {-0.864188f,  0.442863f, -0.238856f},
-     {-0.951056f,  0.162460f, -0.262866f},
-     {-0.809017f,  0.309017f, -0.500000f},
-     {-0.864188f, -0.442863f, -0.238856f},
-     {-0.951056f, -0.162460f, -0.262866f},
-     {-0.809017f, -0.309017f, -0.500000f},
-     {-0.681718f,  0.147621f, -0.716567f},
-     {-0.681718f, -0.147621f, -0.716567f},
-     {-0.850651f,  0.000000f, -0.525731f},
-     {-0.688191f,  0.587785f, -0.425325f},
-     {-0.587785f,  0.425325f, -0.688191f},
-     {-0.425325f,  0.688191f, -0.587785f},
-     {-0.425325f, -0.688191f, -0.587785f},
-     {-0.587785f, -0.425325f, -0.688191f},
-     {-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_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;
-     }
-
-   /* Check file size. We require a file larger than MD2 header size. */
-   loader->size = eina_file_size_get(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));
-
-   /* Check identity */
-   if (header.magic != MD2_MAGIC_NUMBER || header.version != MD2_VERSION)
-     goto error;
-
-   /* Check offsets */
-   if (header.offset_skins > header.offset_end)
-     goto error;
-
-   if (header.offset_texcoords > header.offset_end)
-     goto error;
-
-   if (header.offset_triangles > header.offset_end)
-     goto error;
-
-   if (header.offset_frames > header.offset_end)
-     goto error;
-
-   if (header.offset_glcmds > header.offset_end)
-     goto error;
-
-   if (header.offset_end > loader->size)
-     goto error;
-
-   loader->skin_width = header.skin_width;
-   loader->skin_height = header.skin_height;
-
-   loader->frame_count = header.frame_count;
-   loader->frame_size = header.frame_size;
-   loader->frames = 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);
-   return EINA_TRUE;
-
-error:
-   _md2_loader_fini(loader);
-   return EINA_FALSE;
-}
-
-void
-evas_3d_mesh_file_md2_set(Evas_3D_Mesh *mesh, const char *file)
-{
-   MD2_Loader           loader;
-   int                  i, j, k;
-   float               *pos, *nor, *tex;
-   int                  stride_pos, stride_nor, stride_tex;
-   float                s_scale, t_scale;
-   Evas_3D_Mesh_Data *pd;
-
-   /* Initialize MD2 loader (Open file and read MD2 head ant etc) */
-   if (!_md2_loader_init(&loader, file))
-     {
-        ERR("Failed to initialize MD2 loader.");
-        return;
-     }
-
-   s_scale = 1.0 / (float)(loader.skin_width - 1);
-   t_scale = 1.0 / (float)(loader.skin_height - 1);
-
-   eo_do(mesh,
-         evas_3d_mesh_vertex_count_set(loader.triangle_count * 3),
-         evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES));
-
-   /* Load frames */
-   for (i = 0; i < loader.frame_count; i++)
-     {
-        const MD2_Frame *frame = (const MD2_Frame *)(loader.frames + 
loader.frame_size * i);
-        int              f = i * MD2_FRAME_SCALE;
-
-        eo_do(mesh,
-              /* Add a mesh frame. */
-              evas_3d_mesh_frame_add(f),
-
-              /* Allocate vertex buffer for the frame. */
-              evas_3d_mesh_frame_vertex_data_copy_set(f, 
EVAS_3D_VERTEX_POSITION, 0, NULL),
-              evas_3d_mesh_frame_vertex_data_copy_set(f, 
EVAS_3D_VERTEX_NORMAL,   0, NULL),
-              evas_3d_mesh_frame_vertex_data_copy_set(f, 
EVAS_3D_VERTEX_TEXCOORD, 0, NULL),
-
-              /* Map vertex buffer. */
-              pos = (float *)evas_3d_mesh_frame_vertex_data_map(f, 
EVAS_3D_VERTEX_POSITION),
-              nor = (float *)evas_3d_mesh_frame_vertex_data_map(f, 
EVAS_3D_VERTEX_NORMAL),
-              tex = (float *)evas_3d_mesh_frame_vertex_data_map(f, 
EVAS_3D_VERTEX_TEXCOORD),
-
-              stride_pos = evas_3d_mesh_frame_vertex_stride_get(f, 
EVAS_3D_VERTEX_POSITION),
-              stride_nor = evas_3d_mesh_frame_vertex_stride_get(f, 
EVAS_3D_VERTEX_NORMAL),
-              stride_tex = evas_3d_mesh_frame_vertex_stride_get(f, 
EVAS_3D_VERTEX_TEXCOORD));
-
-        if (stride_pos == 0)
-          stride_pos = sizeof(float) * 3;
-
-        if (stride_nor == 0)
-          stride_nor = sizeof(float) * 3;
-
-        if (stride_tex == 0)
-          stride_tex = sizeof(float) * 2;
-
-        for (j = 0; j < loader.triangle_count; j++)
-          {
-             const MD2_Triangle *tri   = &loader.triangles[j];
-
-             for (k = 0; k < 3; k++)
-               {
-                  unsigned int tidx, vidx;
-                  float *p, *n, *t;
-
-                  tidx = tri->texcoord_idx[k];
-                  vidx = tri->vertex_idx[k];
-
-                  p = (float *)((char *)pos + stride_pos * (j * 3 + k));
-                  n = (float *)((char *)nor + stride_nor * (j * 3 + k));
-                  t = (float *)((char *)tex + stride_tex * (j * 3 + k));
-
-                  p[0] = frame->vertices[vidx].pos[0] * frame->scale[0] + 
frame->trans[0];
-                  p[1] = frame->vertices[vidx].pos[1] * frame->scale[1] + 
frame->trans[1];
-                  p[2] = frame->vertices[vidx].pos[2] * frame->scale[2] + 
frame->trans[2];
-
-                  n[0] = normal_table[frame->vertices[vidx].normal_idx][0];
-                  n[1] = normal_table[frame->vertices[vidx].normal_idx][1];
-                  n[2] = normal_table[frame->vertices[vidx].normal_idx][2];
-
-                  t[0] = loader.texcoords[tidx].s * s_scale;
-                  t[1] = 1.0 - loader.texcoords[tidx].t * t_scale;
-               }
-          }
-
-        /* Unmap vertex buffer. */
-        eo_do(mesh,
-              evas_3d_mesh_frame_vertex_data_unmap(f, EVAS_3D_VERTEX_POSITION),
-              evas_3d_mesh_frame_vertex_data_unmap(f, EVAS_3D_VERTEX_NORMAL),
-              evas_3d_mesh_frame_vertex_data_unmap(f, 
EVAS_3D_VERTEX_TEXCOORD));
-
-        pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
-
-        if (!evas_3d_mesh_aabb_add_to_frame(pd, f, stride_pos))
-          {
-             ERR("Axis-Aligned Bounding Box wasn't added in frame %d ", f);
-          }
-     }
-
-   _md2_loader_fini(&loader);
-}
diff --git a/src/lib/evas/canvas/evas_3d_mesh_loader_obj.c 
b/src/lib/evas/canvas/evas_3d_mesh_loader_obj.c
deleted file mode 100644
index c6733a7..0000000
--- a/src/lib/evas/canvas/evas_3d_mesh_loader_obj.c
+++ /dev/null
@@ -1,401 +0,0 @@
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#include "stdio.h"
-#include "evas_common_private.h"
-#include "evas_private.h"
-
-/* set value to position [x][y] to array name which have. */
-#define ARRAY_2D(name, x, y, count_y) (*(name + x * count_y + y))
-
-/* read 3 float values in string and put it in array */
-#define PUT_DATA_TO_ARRAY(array_name, name)                         \
-        sscanf (current,"%f %f %f",                         \
-        &ARRAY_2D(_##array_name##_obj, counts.current_##name##_counter, 0, 3), 
  \
-        &ARRAY_2D(_##array_name##_obj, counts.current_##name##_counter, 1, 3), 
  \
-        &ARRAY_2D(_##array_name##_obj, counts.current_##name##_counter, 2, 
3));  \
-     counts.current_##name##_counter++;
-
-/* Structures for reading data from file. */
-typedef struct _OBJ_Counts    OBJ_Counts;
-
-struct _OBJ_Counts
-{
-   int _vertex_counter;
-   int _normal_counter;
-   int _texture_point_counter;
-   int _triangles_counter;
-
-   int current_vertex_counter;
-   int current_normal_counter;
-   int current_texture_point_counter;
-   int current_triangles_counter;
-
-   Eina_Bool existence_of_normal;
-   Eina_Bool existence_of_tex_point;
-};
-
-static inline char*
-_file_to_buf(const char *file, long *length)//prepare text file for reading
-{
-   FILE *file_for_print;
-   char *buf;
-   int unused __attribute__((unused));//this variable fixes warning "ignoring 
return value of fread"
-
-   *length = 0;
-   file_for_print = fopen(file, "rb");
-   if (!file_for_print) return NULL;
-   fseek(file_for_print, 0, SEEK_END);//set file_for_print to the end of file
-   *length = ftell(file_for_print);//set current position of file_for_print
-   if (*length < 0)
-     {
-        fclose(file_for_print);
-        return NULL;
-     }
-   buf = malloc(*length + 1);
-   fseek(file_for_print, 0, SEEK_SET);//set file_for_print to the begining of 
file
-   unused = fread(buf, *length, 1, file_for_print);
-   fclose(file_for_print);
-   buf[*length] = '\0';
-   return buf;
-}
-
-/* create new counter */
-static inline OBJ_Counts
-_new_count_elements()
-{
-   OBJ_Counts counts;
-
-   counts._vertex_counter = 0;
-   counts._normal_counter = 0;
-   counts._texture_point_counter = 0;
-   counts._triangles_counter = 0;
-
-   counts.current_vertex_counter = 0;
-   counts.current_normal_counter = 0;
-   counts.current_texture_point_counter = 0;
-   counts.current_triangles_counter = 0;
-
-   counts.existence_of_normal = EINA_FALSE;
-   counts.existence_of_tex_point = EINA_FALSE;
-   return counts;
-}
-
-/* count triangles in face */
-static void
-_analyze_face_line(char * face_analyzer,
-                   int * count_of_triangles_in_line)
-{
-   int polygon_checker = -2;
-   Eina_Bool previous_is_space = EINA_TRUE;
-   while ((*face_analyzer != '\n') && (*face_analyzer != '#'))
-     {
-        if (*face_analyzer == ' ')
-          {
-             previous_is_space = EINA_TRUE;
-          }
-        else if ((previous_is_space) && (*face_analyzer  >= '0') && 
(*face_analyzer  <= '9'))
-          {
-             polygon_checker++;
-             previous_is_space = EINA_FALSE;
-          }
-        face_analyzer++;
-     }
-   *count_of_triangles_in_line = polygon_checker;
-}
-
-static inline OBJ_Counts
-_count_elements(char *start, long length)//count elements of mesh in .obj
-{
-   OBJ_Counts counts = _new_count_elements();
-
-   char * current = start;
-   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;
-   Eina_Bool first_char_is_f = EINA_FALSE;
-   Eina_Bool previous_is_space = EINA_FALSE;
-
-   long i = 0;
-   /* count elements of mesh in .obj */
-   for (; length > i; i++)
-     {
-        if (will_check_next_char)
-          {
-             if (first_char_is_v)
-               {
-                  switch (*current)
-                    {
-                     case ' ':
-                       counts._vertex_counter++;
-                       break;
-                     case 't':
-                       counts._texture_point_counter++;
-                       counts.existence_of_tex_point = EINA_TRUE;
-                       break;
-                     case 'n':
-                       counts._normal_counter++;
-                       counts.existence_of_normal = EINA_TRUE;
-                       break;
-                     default:
-                       break;
-                    }
-                  first_char_is_v = EINA_FALSE;
-                  will_check_next_char = EINA_FALSE;
-               }
-             else if (first_char_is_f)
-               {
-                  switch (*current)
-                    {
-                     case '\n':
-                       first_char_is_f = EINA_FALSE;
-                       counts._triangles_counter += polygon_checker;
-                       polygon_checker = -2;
-                       previous_is_space = EINA_FALSE;
-                       break;
-                     case '#':
-                       first_char_is_f = EINA_FALSE;
-                       counts._triangles_counter += polygon_checker;
-                       polygon_checker = -2;
-                       previous_is_space = EINA_FALSE;
-                       break;
-                     case ' ':
-                       previous_is_space = EINA_TRUE;
-                       break;
-                     default:
-                       if ((previous_is_space) && (*current  >= '0') && 
(*current  <= '9'))
-                         {
-                            polygon_checker++;
-                            previous_is_space = EINA_FALSE;
-                         }
-                       break;
-                    }
-               }
-             else
-               {
-                  switch (*current)
-                    {
-                     case 'v':
-                       first_char_is_v = EINA_TRUE;
-                       break;
-                     case 'f':
-                       first_char_is_f = EINA_TRUE;
-                       break;
-                     case 'm':
-                       will_check_next_char = EINA_FALSE;
-                       break;
-                     default:
-                       will_check_next_char = EINA_FALSE;
-                       break;
-                    }
-               }
-          }
-        else if (*current == '\n')
-          {
-             will_check_next_char = EINA_TRUE;
-          }
-        current++;
-     }
-   return counts;
-}
-
-void
-evas_3d_mesh_file_obj_set(Evas_3D_Mesh *mesh, const char *file)
-{
-   long length, i;
-   char * start = _file_to_buf(file, &length);
-   OBJ_Counts counts = _count_elements(start, length);//count elements of mesh 
in .obj
-   Eina_Bool will_check_next_char = EINA_FALSE;
-   Eina_Bool first_char_is_v = EINA_FALSE;
-   Eina_Bool first_char_is_f = EINA_FALSE;
-   float *pos, *nor, *tex;
-   int stride_pos, stride_nor, stride_tex;
-   int j, k;
-   char * current;
-
-   float *_vertices_obj = malloc(counts._vertex_counter * 3 * sizeof(float));
-   float *_normales_obj = malloc(counts._normal_counter * 3 * sizeof(float));
-   float *_tex_coords_obj = malloc(counts._texture_point_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 ((start == NULL) || (_vertices_obj == NULL) ||
-        (_normales_obj == NULL) || (_tex_coords_obj == NULL) || (_triangles == 
NULL))
-     {
-        ERR("Allocate memory is failed.");
-        free(start);
-        free(_vertices_obj);
-        free(_normales_obj);
-        free(_tex_coords_obj);
-        free(_triangles);
-        return;
-     }
-
-   current = start;
-   i = 0;
-
-   /* put data to arrays */
-   for (; length > i; i++)
-     {
-        if (will_check_next_char)
-          {
-             if (first_char_is_v)
-               {
-                  switch (*current)
-                    {
-                     case ' ':
-                       PUT_DATA_TO_ARRAY(vertices, vertex)
-                       i--;
-                       break;
-                     case 't':
-                       current++;
-                       PUT_DATA_TO_ARRAY(tex_coords, texture_point)
-                       break;
-                     case 'n':
-                       current++;
-                       PUT_DATA_TO_ARRAY(normales, normal)
-                       break;
-                     default:
-                       break;
-                    }
-                  first_char_is_v = EINA_FALSE;
-                  will_check_next_char = EINA_FALSE;
-               }
-             else if (first_char_is_f)
-               {
-                  char * auxiliary_pointer = current;
-                  int count_of_triangles_in_line;
-
-                  _analyze_face_line(auxiliary_pointer,
-                                   &count_of_triangles_in_line);
-                  current++;
-                  i++;
-                  int first_pos, first_tex, first_norm;
-                  sscanf (current,"%i/%i/%i",
-                            &first_pos,
-                            &first_tex,
-                            &first_norm);
-
-                  do
-                    {
-                       current++;
-                       i++;
-                    }
-                  while (*current != ' ');
-
-                  current++;
-                  i++;
-
-                  for (j = 0; j < count_of_triangles_in_line; j++)
-                    {
-                       auxiliary_pointer = current;
-                       ARRAY_2D(_triangles, counts.current_triangles_counter, 
0, 9) = first_pos;
-                       ARRAY_2D(_triangles, counts.current_triangles_counter, 
1, 9) = first_tex;
-                       ARRAY_2D(_triangles, counts.current_triangles_counter, 
2, 9) = first_norm;
-                       sscanf (auxiliary_pointer,"%i/%i/%i %i/%i/%i",
-                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 3, 9),
-                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 4, 9),
-                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 5, 9),
-                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 6, 9),
-                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 7, 9),
-                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 8, 9));
-
-                       while (*current != ' ')
-                         {
-                            current++;
-                            i++;
-                         }
-
-                       counts.current_triangles_counter++;
-                    }
-                  first_char_is_f = EINA_FALSE;
-               }
-             else
-               {
-                  switch (*current)
-                    {
-                     case 'v':
-                       first_char_is_v = EINA_TRUE;
-                       break;
-                     case 'f':
-                       first_char_is_f = EINA_TRUE;
-                       break;
-                     case 'm':
-                       will_check_next_char = EINA_FALSE;
-                       break;
-                     default:
-                       will_check_next_char = EINA_FALSE;
-                       break;
-                    }
-               }
-          }
-        else if (*current == '\n')
-          {
-             will_check_next_char = EINA_TRUE;
-          }
-        current++;
-     }
-   free(start);
-
-   /* prepare of mesh and take pointers to data which must be read */
-   eo_do(mesh,
-         evas_3d_mesh_vertex_count_set(counts._triangles_counter * 3),
-         evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
-         evas_3d_mesh_frame_add(0),
-         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_POSITION, 
0, NULL),
-         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_NORMAL,   
0, NULL),
-         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_TEXCOORD, 
0, NULL),
-
-         pos = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_POSITION),
-         nor = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_NORMAL),
-         tex = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_TEXCOORD),
-
-         stride_pos = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_POSITION),
-         stride_nor = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_NORMAL),
-         stride_tex = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_TEXCOORD));
-
-   if (stride_pos == 0) stride_pos = sizeof(float) * 3;
-   if (stride_nor == 0) stride_nor = sizeof(float) * 3;
-   if (stride_tex == 0) stride_tex = sizeof(float) * 2;
-
-   for (j = 0; j < counts._triangles_counter; j++)
-     {
-        for (k = 0; k < 3; k++)
-          {
-             float *p, *n, *t;
-
-             p = (float *)((char *)pos + stride_pos * (j * 3 + k));
-             n = (float *)((char *)nor + stride_nor * (j * 3 + k));
-             t = (float *)((char *)tex + stride_tex * (j * 3 + k));
-
-             p[0] = ARRAY_2D(_vertices_obj, (ARRAY_2D(_triangles, j, (3 * k), 
9) - 1), 0, 3);
-             p[1] = ARRAY_2D(_vertices_obj, (ARRAY_2D(_triangles, j, (3 * k), 
9) - 1), 1, 3);
-             p[2] = ARRAY_2D(_vertices_obj, (ARRAY_2D(_triangles, j, (3 * k), 
9) - 1), 2, 3);
-
-             n[0] = ARRAY_2D(_normales_obj, (ARRAY_2D(_triangles, j, (3 * k + 
2), 9) - 1), 0, 3);
-             n[1] = ARRAY_2D(_normales_obj, (ARRAY_2D(_triangles, j, (3 * k + 
2), 9) - 1), 1, 3);
-             n[2] = ARRAY_2D(_normales_obj, (ARRAY_2D(_triangles, j, (3 * k + 
2), 9) - 1), 2, 3);
-
-             t[0] = ARRAY_2D(_tex_coords_obj, (ARRAY_2D(_triangles, j, (3 * k 
+ 1), 9) - 1), 0, 3);
-             t[1] = ARRAY_2D(_tex_coords_obj, (ARRAY_2D(_triangles, j, (3 * k 
+ 1), 9) - 1), 1, 3);
-          }
-     }
-   free(_vertices_obj);
-   free(_normales_obj);
-   free(_tex_coords_obj);
-   free(_triangles);
-        /* Unmap vertex buffer. */
-   eo_do(mesh,
-     evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_POSITION),
-     evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_NORMAL),
-     evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_TEXCOORD));
-
-   Evas_3D_Mesh_Data *pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
-
-   if (!evas_3d_mesh_aabb_add_to_frame(pd, 0, stride_pos))
-     {
-        ERR("Axis-Aligned Bounding Box wan't added in frame %d ", 0);
-     }
-}
diff --git a/src/lib/evas/canvas/evas_3d_mesh_loader_ply.c 
b/src/lib/evas/canvas/evas_3d_mesh_loader_ply.c
deleted file mode 100644
index b4bbe18..0000000
--- a/src/lib/evas/canvas/evas_3d_mesh_loader_ply.c
+++ /dev/null
@@ -1,401 +0,0 @@
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#include "stdio.h"
-#include "evas_common_private.h"
-#include "evas_private.h"
-#include <Eina.h>
-
-/* set value to position [x][y] to array name which have. */
-#define ARRAY_2D(name, x, y, count_y) (*(name + x * count_y + y))
-
-/* Structures for reading data from file. */
-typedef struct _PLY_Header    PLY_Header;
-
-struct _PLY_Header
-{
-   int vertices_count;
-   int triangles_count;
-   Eina_Bool existence_of_geometries;
-   Eina_Bool existence_of_normals;
-   Eina_Bool existence_of_texcoords;
-   Eina_Bool existence_of_colors;
-};
-
-static inline char*
-_file_to_buf(const char *file, long *length)//prepare text file for reading
-{
-   FILE *file_for_print;
-   char *buf;
-   int unused __attribute__((unused));//this variable fixes warning "ignoring 
return value of fread"
-
-   *length = 0;
-   file_for_print = fopen(file, "rb");
-   if (!file_for_print) return NULL;
-   fseek(file_for_print, 0, SEEK_END);//set file_for_print to the end of file
-   *length = ftell(file_for_print);//set current position of file_for_print
-   buf = malloc(*length + 1);
-   fseek(file_for_print, 0, SEEK_SET);//set file_for_print to the begining of 
file
-   unused = fread(buf, *length, 1, file_for_print);
-   fclose(file_for_print);
-   buf[*length] = '\0';
-   return buf;
-}
-
-/* create new header */
-static inline PLY_Header
-_new_ply_header()
-{
-   PLY_Header header;
-
-   header.vertices_count = 0;
-   header.triangles_count = 0;
-   header.existence_of_geometries = EINA_FALSE;
-   header.existence_of_normals = EINA_FALSE;
-   header.existence_of_texcoords = EINA_FALSE;
-   header.existence_of_colors = EINA_FALSE;
-
-   return header;
-}
-
-static inline char *
-_to_next_line(char *current)
-{
-   while (*current != '\n') current++;
-   current++;
-   return current;
-}
-
-static inline char *
-_to_begin_of_line(char *current)
-{
-   while (*current != '\n') current--;
-   current++;
-   return current;
-}
-
-static inline char *
-_to_next_number(char *current, int count)
-{
-   int i;
-   for (i = 0; i < count; i++)
-     {
-        while (*current != ' ') current++;
-        current++;
-     }
-   return current;
-}
-
-static inline char *
-_read_data(float *array, int place, int count, char *current, float divider)
-{
-   int i;
-   for (i = 0; i < count; i++)
-     {
-        sscanf (current,"%f", &ARRAY_2D(array, place, i, count));
-        ARRAY_2D(array, place, i, count) /= divider;
-        current = _to_next_number(current, 1);
-     }
-   return current;
-}
-
-static inline PLY_Header
-_read_header(char *start)//Check properties of mesh in .ply file.
-{
-   eina_init();
-
-   Eina_Bool reading_vertices = EINA_TRUE, check_next_char = EINA_FALSE;
-   int vertex_lines, triangles = 0, vertices_in_current_face = 0;
-   char **helping_pointer;
-   char *current;
-   PLY_Header header;
-
-   header = _new_ply_header();
-   helping_pointer = eina_str_split(start, "vertex ", 0);
-
-   if (helping_pointer == NULL)
-     {
-        ERR("File have not kayword vertex. It is necessary.");
-        return header;
-     }
-
-   sscanf(helping_pointer[1], "%d", &header.vertices_count);
-
-   free(helping_pointer);
-   helping_pointer = eina_str_split(start, "end_header\n", 0);
-
-   if (helping_pointer == NULL)
-     {
-        ERR("File have not kayword end_header. It is necessary.");
-        return header;
-     }
-
-   current = helping_pointer[1];
-
-   vertex_lines = header.vertices_count;
-   while (*current != '\0')
-     {
-        if (vertex_lines == 1)
-          reading_vertices = EINA_FALSE;
-        if (*current == '\n')
-          {
-             if (reading_vertices)
-               vertex_lines--;
-             else
-               check_next_char = EINA_TRUE;
-          }
-        if (check_next_char)
-          {
-             if ((*current <= '9') && (*current >= '0'))
-               vertices_in_current_face = (vertices_in_current_face * 10) + 
(*current - '0');
-             else if (*current >= ' ')
-               {
-                  triangles += (vertices_in_current_face - 2);
-                  vertices_in_current_face = 0;
-                  check_next_char = EINA_FALSE;
-               }
-          }
-        current++;
-     }
-
-   header.triangles_count = triangles;
-   free(helping_pointer);
-
-      /* analyse flags used when file was saved in blender */
-   helping_pointer = eina_str_split(start, "property float ", 0);
-
-   if ((helping_pointer[1] != NULL) && (*helping_pointer[1] == 'x') &&
-       (helping_pointer[2] != NULL) && (*helping_pointer[2] == 'y') &&
-       (helping_pointer[3] != NULL) && (*helping_pointer[3] == 'z'))
-     header.existence_of_geometries = EINA_TRUE;
-   else return header;
-
-   if ((helping_pointer[4] != NULL) && (*helping_pointer[4] == 'n') &&
-       (helping_pointer[5] != NULL) && (*helping_pointer[5] == 'n') &&
-       (helping_pointer[6] != NULL) && (*helping_pointer[6] == 'n'))
-     header.existence_of_normals = EINA_TRUE;
-
-   if ((header.existence_of_normals &&
-       ((helping_pointer[7] != NULL) && (*helping_pointer[7] == 's') &&
-       (helping_pointer[8] != NULL) && (*helping_pointer[8] == 't'))) ||
-       (!header.existence_of_normals &&
-       ((helping_pointer[4] != NULL) && (*helping_pointer[4] == 's') &&
-       (helping_pointer[5] != NULL) && (*helping_pointer[5] == 't'))))
-     header.existence_of_texcoords = EINA_TRUE;
-
-   helping_pointer = eina_str_split(start, "property uchar ", 0);
-
-   if ((helping_pointer[1] != NULL) && (*helping_pointer[1] == 'r') &&
-       (helping_pointer[2] != NULL) && (*helping_pointer[2] == 'g') &&
-       (helping_pointer[3] != NULL) && (*helping_pointer[3] == 'b'))
-     header.existence_of_colors = EINA_TRUE;
-
-   free(helping_pointer);
-
-   return header;
-}
-
-void
-evas_3d_mesh_file_ply_set(Evas_3D_Mesh *mesh, const char *file)
-{
-   long length;
-   Evas_3D_Mesh_Data *pd;
-   int i = 0, j = 0, k = 0, count_of_triangles_in_line = 0;
-   float *pos, *nor, *tex, *col;
-   int stride_pos, stride_nor, stride_tex, stride_col;
-   char *start, *current;
-   PLY_Header header;
-   float *_vertices_ply = NULL, *_normals_ply = NULL, *_tex_coords_ply = NULL, 
*_colors_ply = NULL;
-   char **helping_pointer;
-
-   start = _file_to_buf(file, &length);
-
-   if (start == NULL)
-     {
-        ERR("Buffer is empty after preparation file for reading.");
-        return;
-     }
-
-   header = _read_header(start);
-
-   if (!header.existence_of_geometries)
-     {
-        ERR("File have not x, y, or z field as the first 3 float fields. They 
are necessary.");
-        return;
-     }
-
-   helping_pointer = eina_str_split(start, "end_header\n", 0);
-
-   if (helping_pointer == NULL)
-     {
-        ERR("File have not kayword end_header. It is necessary.");
-        return;
-     }
-
-   current = helping_pointer[1];
-
-   _vertices_ply = malloc(header.vertices_count * 3 * sizeof(float));
-   if (header.existence_of_normals)
-     _normals_ply = malloc(header.vertices_count * 3 * sizeof(float));
-   if (header.existence_of_texcoords)
-     _tex_coords_ply = malloc(header.vertices_count * 2 * sizeof(float));
-   if (header.existence_of_colors)
-     _colors_ply = malloc(header.vertices_count * 3 * sizeof(float));
-   int *_triangles = malloc(header.triangles_count * 3 * sizeof(int));
-
-   if ((header.existence_of_geometries && (_vertices_ply == NULL)) ||
-       (header.existence_of_normals && (_normals_ply == NULL)) ||
-       (header.existence_of_texcoords && (_tex_coords_ply == NULL)) ||
-       (header.existence_of_colors && (_colors_ply == NULL)) ||
-       (_triangles == NULL))
-     {
-        ERR("Allocate memory is failed.");
-        free(start);
-        free(_vertices_ply);
-        free(_normals_ply);
-        free(_tex_coords_ply);
-        free(_colors_ply);
-        free(_triangles);
-        return;
-     }
-
-   for (i = 0; i < header.vertices_count; i++)
-     {
-        current = _read_data(_vertices_ply, i, 3, current, 1.0);
-        if (header.existence_of_normals)
-          current = _read_data(_normals_ply, i, 3, current, 1.0);
-        if (header.existence_of_texcoords)
-          current = _read_data(_tex_coords_ply, i, 2, current, 1.0);
-        if (header.existence_of_colors)
-          current = _read_data(_colors_ply, i, 3, current, 255.0);
-        current = _to_begin_of_line(current);
-     }
-
-   for (i = 0; i < header.triangles_count;)
-     {
-        sscanf (current,"%d", &count_of_triangles_in_line);
-        count_of_triangles_in_line -= 2;
-        current = _to_next_number(current, 1);
-
-        sscanf (current,"%i", &ARRAY_2D(_triangles, i, 0, 3));
-
-        for (j = 0; j < count_of_triangles_in_line; j++)
-          {
-             if (j > 0)
-               ARRAY_2D(_triangles, i, 0, 3) = ARRAY_2D(_triangles, (i - 1), 
0, 3);
-             current = _to_next_number(current, 1);
-             sscanf (current,"%i %i",
-                     &ARRAY_2D(_triangles, i, 1, 3),
-                     &ARRAY_2D(_triangles, i, 2, 3));
-             i++;
-          }
-        current = _to_next_line(current);
-     }
-
-   /* prepare of mesh and take pointers to data which must be read */
-   eo_do(mesh,
-         evas_3d_mesh_vertex_count_set(header.triangles_count * 3),
-         evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
-         evas_3d_mesh_frame_add(0),
-         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_POSITION, 
0, NULL),
-         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_NORMAL,   
0, NULL),
-         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_TEXCOORD, 
0, NULL),
-         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_COLOR,    
0, NULL),
-
-         pos = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_POSITION),
-         nor = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_NORMAL),
-         tex = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_TEXCOORD),
-         col = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_COLOR),
-
-         stride_pos = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_POSITION),
-         stride_nor = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_NORMAL),
-         stride_tex = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_TEXCOORD),
-         stride_col = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_COLOR));
-
-   if (stride_pos == 0) stride_pos = sizeof(float) * 3;
-   if (stride_nor == 0) stride_nor = sizeof(float) * 3;
-   if (stride_tex == 0) stride_tex = sizeof(float) * 2;
-   if (stride_col == 0) stride_col = sizeof(float) * 4;
-
-   for (j = 0; j < header.triangles_count; j++)
-     {
-        for (k = 0; k < 3; k++)
-          {
-             float *p, *n, *t, *c;
-
-             p = (float *)((char *)pos + stride_pos * (j * 3 + k));
-             n = (float *)((char *)nor + stride_nor * (j * 3 + k));
-             t = (float *)((char *)tex + stride_tex * (j * 3 + k));
-             c = (float *)((char *)col + stride_col * (j * 3 + k));
-
-             p[0] = ARRAY_2D(_vertices_ply, ARRAY_2D(_triangles, j, k, 3), 0, 
3);
-             p[1] = ARRAY_2D(_vertices_ply, ARRAY_2D(_triangles, j, k, 3), 1, 
3);
-             p[2] = ARRAY_2D(_vertices_ply, ARRAY_2D(_triangles, j, k, 3), 2, 
3);
-
-             if (header.existence_of_normals)
-               {
-                  n[0] = ARRAY_2D(_normals_ply, ARRAY_2D(_triangles, j, k, 3), 
0, 3);
-                  n[1] = ARRAY_2D(_normals_ply, ARRAY_2D(_triangles, j, k, 3), 
1, 3);
-                  n[2] = ARRAY_2D(_normals_ply, ARRAY_2D(_triangles, j, k, 3), 
2, 3);
-               }
-             else
-               {
-                  n[0] = 0.0;
-                  n[1] = 0.0;
-                  n[2] = 0.0;
-               }
-
-             if (header.existence_of_texcoords)
-               {
-                  t[0] = ARRAY_2D(_tex_coords_ply, ARRAY_2D(_triangles, j, k, 
3), 0, 2);
-                  t[1] = ARRAY_2D(_tex_coords_ply, ARRAY_2D(_triangles, j, k, 
3), 1, 2);
-               }
-             else
-               {
-                  t[0] = 0.0;
-                  t[1] = 0.0;
-               }
-
-             if (header.existence_of_colors)
-               {
-                  c[0] = ARRAY_2D(_colors_ply, ARRAY_2D(_triangles, j, k, 3), 
0, 3);
-                  c[1] = ARRAY_2D(_colors_ply, ARRAY_2D(_triangles, j, k, 3), 
1, 3);
-                  c[2] = ARRAY_2D(_colors_ply, ARRAY_2D(_triangles, j, k, 3), 
2, 3);
-                  c[3] = 1.0;
-               }
-             else
-               {
-                  c[0] = 0.0;
-                  c[1] = 0.0;
-                  c[2] = 0.0;
-                  c[3] = 1.0;
-               }
-          }
-     }
-
-   free(helping_pointer);
-   free(_vertices_ply);
-   if (header.existence_of_normals)
-     free(_normals_ply);
-   if (header.existence_of_texcoords)
-     free(_tex_coords_ply);
-   if (header.existence_of_colors)
-     free(_colors_ply);
-   free(_triangles);
-
-        /* Unmap vertex buffer. */
-   eo_do(mesh,
-         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_POSITION),
-         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_NORMAL),
-         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_TEXCOORD),
-         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_COLOR));
-
-   pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
-
-   if (!evas_3d_mesh_aabb_add_to_frame(pd, 0, stride_pos))
-     {
-        ERR("Axis-Aligned Bounding Box wan't added in frame %d ", 0);
-     }
-}
diff --git a/src/lib/evas/canvas/evas_3d_mesh_saver_eet.c 
b/src/lib/evas/canvas/evas_3d_mesh_saver_eet.c
deleted file mode 100644
index c801ac1..0000000
--- a/src/lib/evas/canvas/evas_3d_mesh_saver_eet.c
+++ /dev/null
@@ -1,197 +0,0 @@
-#ifdef HAVE_CONFIG_H
-   #include "config.h"
-#endif
-
-#include <stdio.h>
-#include "evas_common_private.h"
-#include "evas_private.h"
-
-#define COMPONENT_OF_DEFAULT_GREY_COLOR 0.3
-#define TRANSPARENCY_OF_DEFAULT_GREY_COLOR 0.5
-
-extern Evas_3D_File_Eet* eet_file;
-extern const char EVAS_3D_FILE_CACHE_FILE_ENTRY[];
-extern Eet_Data_Descriptor *_file_descriptor;
-
-void
-_set_geometry_to_eet_file_from_mesh(Evas_3D_Mesh_Data *mesh,
-                                    Evas_3D_Mesh_Eet *eet_mesh,
-                                    Evas_3D_Header_Eet *eet_header,
-                                    Evas_3D_Mesh_Frame *f)
-{
-   Evas_3D_Vertex_Buffer *vb;
-   int i;
-   float *src;
-   Evas_3D_Vertex_Eet *vertices =
-      malloc(sizeof(Evas_3D_Vertex_Eet) * mesh->vertex_count);
-   Evas_3D_Geometry_Eet *geometry =
-      malloc(sizeof(Evas_3D_Geometry_Eet));
-   int *geometries = malloc(sizeof(int));
-
-   if ((vertices == NULL) || (geometry == NULL))
-     {
-        ERR("Allocating of memory is failed.");
-        free(vertices);
-        free(geometry);
-        free(geometries);
-        return;
-     }
-
-   geometry->vertices_count = mesh->vertex_count;
-   geometries[0] = mesh->vertex_count;
-
-#define SAVE_GEOMETRICS(a, component)\
-   vb = &f->vertices[a];\
-   if (vb->data == NULL)\
-     {\
-        ERR("Reading of geometrics is failed.");\
-        free(vertices);\
-        free(geometry);\
-        free(geometries);\
-        return;\
-     }\
-   src = (float *)vb->data;\
-   for (i = 0; i < mesh->vertex_count; i++)\
-     {\
-        vertices[i].component.x = src[0];\
-        vertices[i].component.y = src[1];\
-        vertices[i].component.z = src[2];\
-        src += f->vertices[a].element_count;\
-     }
-
-   geometry->vertices = vertices;
-   SAVE_GEOMETRICS(EVAS_3D_VERTEX_POSITION, position)
-   SAVE_GEOMETRICS(EVAS_3D_VERTEX_NORMAL, normal)
-   SAVE_GEOMETRICS(EVAS_3D_VERTEX_TEXCOORD, texcoord)
-
-#undef SAVE_GEOMETRICS
-
-   eet_mesh->geometries = geometry;
-   eet_header->geometries = geometries;
-}
-
-void
-_set_material_to_eet_file_from_mesh(Evas_3D_Mesh_Eet *eet_mesh,
-                                    Evas_3D_Header_Eet *eet_header,
-                                    Evas_3D_Mesh_Frame *f)
-{
-   int i;
-   Evas_3D_Material_Data *material =
-      eo_data_scope_get(f->material, EVAS_3D_MATERIAL_CLASS);
-   Evas_3D_Material_Eet *saved_materials =
-      malloc(sizeof(Evas_3D_Material_Eet));
-   Evas_3D_Color_Eet *saved_colors =
-      malloc(sizeof(Evas_3D_Color_Eet) * EVAS_3D_MATERIAL_ATTRIB_COUNT);
-   int *materials = malloc(sizeof(int));
-
-   if ((saved_materials == NULL) || (saved_colors == NULL))
-     {
-        ERR("Allocating of memory is failed.");
-        free(material);
-        free(saved_materials);
-        free(saved_colors);
-        free(materials);
-        return;
-     }
-
-   if (material == NULL)
-     {
-        ERR("Default material is set to saved file, because custom material \
-             was not saved before using of function evas_3d_mesh_save.");
-
-        for (i = 0; i < 5; i++)
-          {
-             saved_colors[i].r = COMPONENT_OF_DEFAULT_GREY_COLOR;
-             saved_colors[i].g = COMPONENT_OF_DEFAULT_GREY_COLOR;
-             saved_colors[i].b = COMPONENT_OF_DEFAULT_GREY_COLOR;
-             saved_colors[i].a = TRANSPARENCY_OF_DEFAULT_GREY_COLOR;
-          }
-
-        saved_materials->shininess = 50;
-     }
-   else
-     {
-
-        for (i = 0; i < 5; i++)
-          {
-             saved_colors[i].r = material->attribs[i].color.r;
-             saved_colors[i].g = material->attribs[i].color.g;
-             saved_colors[i].b = material->attribs[i].color.b;
-             saved_colors[i].a = material->attribs[i].color.a;
-          }
-
-        saved_materials->shininess = material->shininess;
-     }
-
-   saved_materials->colors_count = EVAS_3D_MATERIAL_ATTRIB_COUNT;
-   materials[0] = EVAS_3D_MATERIAL_ATTRIB_COUNT;
-   saved_materials->id = 1;
-   saved_materials->colors = saved_colors;
-   eet_mesh->materials = saved_materials;
-   eet_header->materials = materials;
-}
-
-void
-_set_frame_to_eet_file_from_mesh(Evas_3D_Mesh_Eet *eet_mesh)
-{
-   eet_mesh->frames = malloc(sizeof(Evas_3D_Frame_Eet));
-
-   if (eet_mesh->frames == NULL)
-     {
-        ERR("Allocating of memory is failed.");
-        return;
-     }
-
-   eet_mesh->frames->id = 1;
-   eet_mesh->frames->geometry_id = 1;
-   eet_mesh->frames->material_id = 1;
-}
-
-void
-evas_3d_mesh_save_eet(Evas_3D_Mesh *mesh,
-                      const char *file,
-                      Evas_3D_Mesh_Frame *f)
-{
-   Evas_3D_Mesh_Data *pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
-   Eet_File *ef = eet_open(file, EET_FILE_MODE_WRITE);
-   Evas_3D_Mesh_Eet* eet_mesh = malloc(sizeof(Evas_3D_Mesh_Eet));
-   Evas_3D_Header_Eet* eet_header = malloc(sizeof(Evas_3D_Header_Eet));
-
-   _evas_3d_eet_file_init();
-
-   eet_file = _evas_3d_eet_file_new();
-
-   eet_mesh->materials_count = 1;
-   eet_header->materials_count = 1;
-   eet_mesh->frames_count = 1;
-   eet_header->frames = 1;
-   eet_mesh->geometries_count = 1;
-   eet_header->geometries_count = 1;
-   eet_header->version = 1;
-
-   _set_geometry_to_eet_file_from_mesh(pd, eet_mesh, eet_header, f);
-   _set_material_to_eet_file_from_mesh(eet_mesh, eet_header, f);
-   _set_frame_to_eet_file_from_mesh(eet_mesh);
-
-   if (ef == NULL)
-     {
-        ERR("Opening of file is failed.");
-        free(eet_mesh);
-        free(eet_header);
-        _evas_3d_eet_file_free();
-        return;
-     }
-
-   eet_file->mesh = eet_mesh;
-   eet_file->header = eet_header;
-
-   eet_data_write(ef,
-                  _file_descriptor,
-                  EVAS_3D_FILE_CACHE_FILE_ENTRY,
-                  eet_file,
-                  EINA_TRUE);
-   eet_close(ef);
-
-   _evas_3d_eet_file_free();
-}
-
diff --git a/src/lib/evas/canvas/evas_3d_mesh_saver_obj.c 
b/src/lib/evas/canvas/evas_3d_mesh_saver_obj.c
deleted file mode 100644
index c7699b3..0000000
--- a/src/lib/evas/canvas/evas_3d_mesh_saver_obj.c
+++ /dev/null
@@ -1,137 +0,0 @@
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <time.h>
-#include "stdio.h"
-#include "evas_common_private.h"
-#include "evas_private.h"
-
-#define OPEN_FILE(extension)\
-   int length=strlen(file);\
-   char * extension = "."#extension;\
-   char * _##extension##_file_name = (char *)malloc(length+4);\
-   strcpy(_##extension##_file_name,file);\
-   strcpy(_##extension##_file_name+length,extension);\
-   FILE * _##extension##_file = fopen(_##extension##_file_name, "w+");\
-   free(_##extension##_file_name);
-
-#define SAVE_GEOMETRICS(a, format)\
-   vb = &f->vertices[a];\
-   fprintf(_obj_file, "o %s\n",file);\
-   if (vb->data == NULL)\
-     {\
-        ERR("Reading of geometrics is failed.");\
-        fclose(_obj_file);\
-        return;\
-     }\
-   src = (float *)vb->data;\
-   for (i = 0; i < pd->vertex_count; i++)\
-     {\
-        fprintf(_obj_file, format, src[0], src[1], src[2]);\
-        src += f->vertices[a].element_count;\
-     }
-
-static void
-_save_mesh(Evas_3D_Mesh_Data *pd, const char *file, Evas_3D_Mesh_Frame *f)
-{
-   Evas_3D_Vertex_Buffer *vb;
-   time_t current_time;
-   char* c_time_string;
-   int    i;
-   float *src;
-
-   OPEN_FILE(obj)
-   if (!_obj_file)
-     {
-        ERR("File open '%s' for save failed", file);
-        return;
-     }
-   fprintf(_obj_file, "# Evas_3D saver OBJ v0.03 \n");//_obj_file created in 
macro
-   /* Adding time comment to .obj file. */
-   current_time = time(NULL);
-
-   if (current_time == ((time_t)-1))
-     {
-        ERR("Failure to compute the current time.");
-        fclose(_obj_file);
-        return;
-     }
-
-   c_time_string = ctime(&current_time);
-
-   if (c_time_string == NULL)
-     {
-        ERR("Failure to convert the current time.");
-        fclose(_obj_file);
-        return;
-     }
-
-   fprintf(_obj_file,"# Current time is %s \n", c_time_string);
-   fprintf(_obj_file,"mtllib %s.mtl \n\n", file);
-
-   /* Adding geometrics to file. */
-   if (f == NULL)
-     {
-        ERR("Not existing mesh frame.");
-        fclose(_obj_file);
-        return;
-     }
-
-   SAVE_GEOMETRICS(EVAS_3D_VERTEX_POSITION, "v %.4f %.4f %.4f \n")
-   SAVE_GEOMETRICS(EVAS_3D_VERTEX_NORMAL, "vn %.4f %.4f %.4f \n")
-   SAVE_GEOMETRICS(EVAS_3D_VERTEX_TEXCOORD, "vt %.4f %.4f %.4f \n")
-   fprintf(_obj_file,"usemtl Material\n s off\n");
-   for (i = 1; i <= pd->vertex_count; i++)//numeration of faces in .obj 
started from 1
-     {
-        fprintf(_obj_file,"f %i/%i/%i ", i, i, i);
-        i++;
-        fprintf(_obj_file,"%i/%i/%i ", i, i, i);
-        i++;
-        fprintf(_obj_file,"%i/%i/%i \n", i, i, i);
-     }
-   fclose(_obj_file);
-}
-
-static void
-_save_material(Evas_3D_Mesh_Data *pd EINA_UNUSED, const char *file, 
Evas_3D_Mesh_Frame *f)
-{
-   Evas_3D_Material_Data *mat = eo_data_scope_get(f->material, 
EVAS_3D_MATERIAL_CLASS);
-
-   OPEN_FILE(mtl)
-   if (!_mtl_file)
-     {
-        ERR("File open '%s' for save failed", file);
-        return;
-     }
-   fprintf(_mtl_file, "# Evas_3D saver OBJ v0.03 \n");//_mtl_file created in 
macro
-   fprintf(_mtl_file, "# Material Count: 1 \n\n");
-   fprintf(_mtl_file, "newmtl Material \n");
-   fprintf(_mtl_file, "Ns 1.000000 \n");//exp factor for specular highlight
-   fprintf(_mtl_file, "Ka %.6f %.6f %.6f \n",
-           (float)mat->attribs[EVAS_3D_MATERIAL_AMBIENT].color.r,
-           (float)mat->attribs[EVAS_3D_MATERIAL_AMBIENT].color.g,
-           (float)mat->attribs[EVAS_3D_MATERIAL_AMBIENT].color.b);
-   fprintf(_mtl_file, "Kd %.6f %.6f %.6f \n",
-           (float)mat->attribs[EVAS_3D_MATERIAL_DIFFUSE].color.r,
-           (float)mat->attribs[EVAS_3D_MATERIAL_DIFFUSE].color.g,
-           (float)mat->attribs[EVAS_3D_MATERIAL_DIFFUSE].color.b);
-   fprintf(_mtl_file, "Ks %.6f %.6f %.6f \n",
-           (float)mat->attribs[EVAS_3D_MATERIAL_SPECULAR].color.r,
-           (float)mat->attribs[EVAS_3D_MATERIAL_SPECULAR].color.g,
-           (float)mat->attribs[EVAS_3D_MATERIAL_SPECULAR].color.b);
-   fprintf(_mtl_file, "Ni 1.000000 \n");//optical density
-   fprintf(_mtl_file, "d 1.000000 \n");//a factor d of 1.0 is fully opaque 
material
-   fprintf(_mtl_file, "illum 2 \n");//illumination properties
-
-   fclose(_mtl_file);
-}
-
-void
-evas_3d_mesh_save_obj(Evas_3D_Mesh *mesh, const char *file, Evas_3D_Mesh_Frame 
*f)
-{
-   Evas_3D_Mesh_Data *pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
-   _save_mesh(pd, file, f);
-   _save_material(pd, file, f);
-}
diff --git a/src/lib/evas/canvas/evas_3d_mesh_saver_ply.c 
b/src/lib/evas/canvas/evas_3d_mesh_saver_ply.c
deleted file mode 100644
index a0ba945..0000000
--- a/src/lib/evas/canvas/evas_3d_mesh_saver_ply.c
+++ /dev/null
@@ -1,61 +0,0 @@
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <stdlib.h>
-#include <time.h>
-#include "stdio.h"
-#include "math.h"
-#include "evas_common_private.h"
-#include "evas_private.h"
-
-void
-evas_3d_mesh_save_ply(Evas_3D_Mesh *mesh, const char *file, Evas_3D_Mesh_Frame 
*f)
-{
-   float *src_pos, *src_nor, *src_tex, *src_col;
-   int    i;
-
-   Evas_3D_Mesh_Data *pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
-   FILE *_ply_file = fopen(file, "w+");
-   if (!_ply_file)
-     {
-        ERR("File open '%s' for save failed", file);
-        return;
-     }
-
-   fprintf(_ply_file,"ply\nformat ascii 1.0\ncomment Created by EFL 
evas_3d_mesh_saver_ply.c" \
-                      "version 1 (sub 0) - www.enlightenment.org, source file: 
''\n");
-   fprintf(_ply_file,"element vertex %d\n", pd->vertex_count);
-   fprintf(_ply_file,"property float x\nproperty float y\nproperty float z\n" \
-                     "property float nx\nproperty float ny\nproperty float 
nz\n" \
-                     "property float s\nproperty float t\n" \
-                     "property uchar red\nproperty uchar green\nproperty uchar 
blue\n");
-   fprintf(_ply_file,"element face %d\nproperty list uchar uint 
vertex_indices\nend_header\n",
-           pd->vertex_count / 3);
-
-   src_pos = (float*)(&f->vertices[EVAS_3D_VERTEX_POSITION])->data;
-   src_nor = (float*)(&f->vertices[EVAS_3D_VERTEX_NORMAL])->data;
-   src_tex = (float*)(&f->vertices[EVAS_3D_VERTEX_TEXCOORD])->data;
-   src_col = (float*)(&f->vertices[EVAS_3D_VERTEX_COLOR])->data;
-
-   for (i = 0; i < pd->vertex_count; i++)
-     {
-        fprintf(_ply_file,"%f %f %f %f %f %f %f %f %.0f %.0f %.0f\n",
-                src_pos[0], src_pos[1], src_pos[2],
-                src_nor[0], src_nor[1], src_nor[2],
-                src_tex[0], src_tex[1],
-                round(src_col[0] * 255), round(src_col[1] * 255), 
round(src_col[2] * 255));
-        src_pos += 3;
-        src_nor += 3;
-        src_tex += 2;
-        src_col += 4;
-     }
-
-   for (i = 0; i < pd->vertex_count;)
-     {
-        fprintf(_ply_file,"3 %d %d %d\n", i, i + 1, i + 2);
-        i += 3;
-     }
-
-   fclose(_ply_file);
-}
diff --git a/src/modules/evas/model_loaders/eet/evas_model_load_eet.c 
b/src/modules/evas/model_loaders/eet/evas_model_load_eet.c
index 8940b65..26c3569 100644
--- a/src/modules/evas/model_loaders/eet/evas_model_load_eet.c
+++ b/src/modules/evas/model_loaders/eet/evas_model_load_eet.c
@@ -1 +1,131 @@
-//dummy of saver/loader
+#ifdef HAVE_CONFIG_H
+   #include "config.h"
+#endif
+
+#include <Eo.h>
+#include <stdio.h>
+#include "evas_common_private.h"
+#include "evas_private.h"
+
+extern Evas_3D_File_Eet* eet_file;
+extern const char EVAS_3D_FILE_CACHE_FILE_ENTRY[];
+extern Eet_Data_Descriptor *_file_descriptor;
+
+void
+_set_geometry_to_mesh_from_eet_file(Evas_3D_Mesh *mesh,
+                                    Evas_3D_Mesh_Eet *eet_mesh)
+{
+   float *pos, *nor, *tex;
+   int stride_pos, stride_nor, stride_tex, j;
+
+   eo_do(mesh,
+         evas_3d_mesh_vertex_count_set(eet_mesh->geometries->vertices_count),
+         evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
+         evas_3d_mesh_frame_add(0),
+
+         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_POSITION, 
0, NULL),
+         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_NORMAL,   
0, NULL),
+         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_TEXCOORD, 
0, NULL),
+
+         pos = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_POSITION),
+         nor = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_NORMAL),
+         tex = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_TEXCOORD),
+
+         stride_pos = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_POSITION),
+         stride_nor = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_NORMAL),
+         stride_tex = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_TEXCOORD));
+
+   if (stride_pos == 0) stride_pos = sizeof(float) * 3;
+   if (stride_nor == 0) stride_nor = sizeof(float) * 3;
+   if (stride_tex == 0) stride_tex = sizeof(float) * 2;
+
+        /* set data to vertex buffer */
+   for (j = 0; j < eet_mesh->geometries->vertices_count; j++)
+     {
+        float *p, *n, *t;
+
+        p = (float *)((char *)pos + stride_pos * j);
+        n = (float *)((char *)nor + stride_nor * j);
+        t = (float *)((char *)tex + stride_tex * j);
+
+        p[0] = eet_mesh->geometries->vertices[j].position.x;
+        p[1] = eet_mesh->geometries->vertices[j].position.y;
+        p[2] = eet_mesh->geometries->vertices[j].position.z;
+
+        n[0] = eet_mesh->geometries->vertices[j].normal.x;
+        n[1] = eet_mesh->geometries->vertices[j].normal.y;
+        n[2] = eet_mesh->geometries->vertices[j].normal.z;
+
+        t[0] = eet_mesh->geometries->vertices[j].texcoord.x;
+        t[1] = eet_mesh->geometries->vertices[j].texcoord.y;
+     }
+
+        /* unmap vertex buffer */
+   eo_do(mesh,
+         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_POSITION),
+         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_NORMAL),
+         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_TEXCOORD));
+}
+
+void
+_set_material_to_mesh_from_eet_file(Evas_3D_Mesh *mesh,
+                                    Evas_3D_Mesh_Eet *eet_mesh)
+{
+   Evas_3D_Object_Data *pd = eo_data_scope_get(mesh, EVAS_3D_OBJECT_CLASS);
+   Eo *material = NULL;
+   material = eo_add(EVAS_3D_MATERIAL_CLASS, pd->evas);
+
+   eo_do(material,
+         evas_3d_material_enable_set(EVAS_3D_MATERIAL_AMBIENT,
+                                     !!(eet_mesh->materials->colors[0].a > 0)),
+         evas_3d_material_enable_set(EVAS_3D_MATERIAL_DIFFUSE,
+                                     !!(eet_mesh->materials->colors[1].a > 0)),
+         evas_3d_material_enable_set(EVAS_3D_MATERIAL_SPECULAR,
+                                     !!(eet_mesh->materials->colors[2].a > 0)),
+         evas_3d_material_enable_set(EVAS_3D_MATERIAL_NORMAL, EINA_TRUE),
+         evas_3d_material_color_set(EVAS_3D_MATERIAL_AMBIENT,
+                                    eet_mesh->materials->colors[0].r,
+                                    eet_mesh->materials->colors[0].g,
+                                    eet_mesh->materials->colors[0].b,
+                                    eet_mesh->materials->colors[0].a),
+         evas_3d_material_color_set(EVAS_3D_MATERIAL_DIFFUSE,
+                                    eet_mesh->materials->colors[1].r,
+                                    eet_mesh->materials->colors[1].g,
+                                    eet_mesh->materials->colors[1].b,
+                                    eet_mesh->materials->colors[1].a),
+         evas_3d_material_color_set(EVAS_3D_MATERIAL_SPECULAR,
+                                    eet_mesh->materials->colors[2].r,
+                                    eet_mesh->materials->colors[2].g,
+                                    eet_mesh->materials->colors[2].b,
+                                    eet_mesh->materials->colors[2].a),
+         evas_3d_material_shininess_set(eet_mesh->materials->shininess));
+
+   eo_do(mesh, evas_3d_mesh_frame_material_set(0, material));
+}
+
+void
+evas_3d_mesh_file_eet_set(Evas_3D_Mesh *mesh, const char *file)
+{
+   Eet_File *ef;
+
+   _evas_3d_eet_file_init();
+   ef = eet_open(file, EET_FILE_MODE_READ);
+   eet_file = eet_data_read(ef,
+                            _file_descriptor,
+                            EVAS_3D_FILE_CACHE_FILE_ENTRY);
+
+   eet_close(ef);
+
+   if ((eet_file->mesh == NULL) || (eet_file->header == NULL))
+     {
+        ERR("Reading of file is failed.");
+        _evas_3d_eet_file_free();
+        return;
+     }
+
+   _set_geometry_to_mesh_from_eet_file(mesh, eet_file->mesh);
+   _set_material_to_mesh_from_eet_file(mesh, eet_file->mesh);
+
+   _evas_3d_eet_file_free();
+}
+
diff --git a/src/modules/evas/model_loaders/md2/evas_model_load_md2.c 
b/src/modules/evas/model_loaders/md2/evas_model_load_md2.c
index 8940b65..4a356b7 100644
--- a/src/modules/evas/model_loaders/md2/evas_model_load_md2.c
+++ b/src/modules/evas/model_loaders/md2/evas_model_load_md2.c
@@ -1 +1,446 @@
-//dummy of saver/loader
+#include "evas_common_private.h"
+#include "evas_private.h"
+
+#define PACKED __attribute__((__packed__))
+
+#define MD2_MAGIC_NUMBER   844121161
+#define MD2_VERSION        8
+#define MD2_FRAME_SCALE    256
+
+/* Structures for reading data from file. */
+typedef struct _MD2_Header    MD2_Header;
+typedef struct _MD2_Vertex    MD2_Vertex;
+typedef struct _MD2_Frame     MD2_Frame;
+typedef struct _MD2_Triangle  MD2_Triangle;
+typedef struct _MD2_Texcoord  MD2_Texcoord;
+
+struct PACKED _MD2_Header
+{
+   int   magic;
+   int   version;
+
+   int   skin_width;
+   int   skin_height;
+
+   int   frame_size;
+
+   int   skins_count;
+   int   vertex_count;
+   int   texcoord_count;
+   int   triangle_count;
+   int   glcmd_count;
+   int   frame_count;
+
+   int   offset_skins;
+   int   offset_texcoords;
+   int   offset_triangles;
+   int   offset_frames;
+   int   offset_glcmds;
+   int   offset_end;
+};
+
+struct PACKED _MD2_Vertex
+{
+   unsigned char  pos[3];
+   unsigned char  normal_idx;
+};
+
+struct PACKED _MD2_Frame
+{
+   float       scale[3];
+   float       trans[3];
+   char        name[16];
+   MD2_Vertex  vertices[1];
+};
+
+struct PACKED _MD2_Triangle
+{
+   unsigned short vertex_idx[3];
+   unsigned short texcoord_idx[3];
+};
+
+struct PACKED _MD2_Texcoord
+{
+   short s;
+   short t;
+};
+
+typedef struct _MD2_Loader
+{
+   Eina_File     *file;
+   char          *map;
+   int            size;
+
+   int            skin_width;
+   int            skin_height;
+
+   int            frame_count;
+   int            frame_size;
+   char          *frames;
+
+   int            vertex_count;
+   int            triangle_count;
+   int            texcoord_count;
+
+   MD2_Triangle  *triangles;
+   MD2_Texcoord   *texcoords;
+} MD2_Loader;
+
+static const float normal_table[162][3] =
+{
+     {-0.525731f,  0.000000f,  0.850651f},
+     {-0.442863f,  0.238856f,  0.864188f},
+     {-0.295242f,  0.000000f,  0.955423f},
+     {-0.309017f,  0.500000f,  0.809017f},
+     {-0.162460f,  0.262866f,  0.951056f},
+     { 0.000000f,  0.000000f,  1.000000f},
+     { 0.000000f,  0.850651f,  0.525731f},
+     {-0.147621f,  0.716567f,  0.681718f},
+     { 0.147621f,  0.716567f,  0.681718f},
+     { 0.000000f,  0.525731f,  0.850651f},
+     { 0.309017f,  0.500000f,  0.809017f},
+     { 0.525731f,  0.000000f,  0.850651f},
+     { 0.295242f,  0.000000f,  0.955423f},
+     { 0.442863f,  0.238856f,  0.864188f},
+     { 0.162460f,  0.262866f,  0.951056f},
+     {-0.681718f,  0.147621f,  0.716567f},
+     {-0.809017f,  0.309017f,  0.500000f},
+     {-0.587785f,  0.425325f,  0.688191f},
+     {-0.850651f,  0.525731f,  0.000000f},
+     {-0.864188f,  0.442863f,  0.238856f},
+     {-0.716567f,  0.681718f,  0.147621f},
+     {-0.688191f,  0.587785f,  0.425325f},
+     {-0.500000f,  0.809017f,  0.309017f},
+     {-0.238856f,  0.864188f,  0.442863f},
+     {-0.425325f,  0.688191f,  0.587785f},
+     {-0.716567f,  0.681718f, -0.147621f},
+     {-0.500000f,  0.809017f, -0.309017f},
+     {-0.525731f,  0.850651f,  0.000000f},
+     { 0.000000f,  0.850651f, -0.525731f},
+     {-0.238856f,  0.864188f, -0.442863f},
+     { 0.000000f,  0.955423f, -0.295242f},
+     {-0.262866f,  0.951056f, -0.162460f},
+     { 0.000000f,  1.000000f,  0.000000f},
+     { 0.000000f,  0.955423f,  0.295242f},
+     {-0.262866f,  0.951056f,  0.162460f},
+     { 0.238856f,  0.864188f,  0.442863f},
+     { 0.262866f,  0.951056f,  0.162460f},
+     { 0.500000f,  0.809017f,  0.309017f},
+     { 0.238856f,  0.864188f, -0.442863f},
+     { 0.262866f,  0.951056f, -0.162460f},
+     { 0.500000f,  0.809017f, -0.309017f},
+     { 0.850651f,  0.525731f,  0.000000f},
+     { 0.716567f,  0.681718f,  0.147621f},
+     { 0.716567f,  0.681718f, -0.147621f},
+     { 0.525731f,  0.850651f,  0.000000f},
+     { 0.425325f,  0.688191f,  0.587785f},
+     { 0.864188f,  0.442863f,  0.238856f},
+     { 0.688191f,  0.587785f,  0.425325f},
+     { 0.809017f,  0.309017f,  0.500000f},
+     { 0.681718f,  0.147621f,  0.716567f},
+     { 0.587785f,  0.425325f,  0.688191f},
+     { 0.955423f,  0.295242f,  0.000000f},
+     { 1.000000f,  0.000000f,  0.000000f},
+     { 0.951056f,  0.162460f,  0.262866f},
+     { 0.850651f, -0.525731f,  0.000000f},
+     { 0.955423f, -0.295242f,  0.000000f},
+     { 0.864188f, -0.442863f,  0.238856f},
+     { 0.951056f, -0.162460f,  0.262866f},
+     { 0.809017f, -0.309017f,  0.500000f},
+     { 0.681718f, -0.147621f,  0.716567f},
+     { 0.850651f,  0.000000f,  0.525731f},
+     { 0.864188f,  0.442863f, -0.238856f},
+     { 0.809017f,  0.309017f, -0.500000f},
+     { 0.951056f,  0.162460f, -0.262866f},
+     { 0.525731f,  0.000000f, -0.850651f},
+     { 0.681718f,  0.147621f, -0.716567f},
+     { 0.681718f, -0.147621f, -0.716567f},
+     { 0.850651f,  0.000000f, -0.525731f},
+     { 0.809017f, -0.309017f, -0.500000f},
+     { 0.864188f, -0.442863f, -0.238856f},
+     { 0.951056f, -0.162460f, -0.262866f},
+     { 0.147621f,  0.716567f, -0.681718f},
+     { 0.309017f,  0.500000f, -0.809017f},
+     { 0.425325f,  0.688191f, -0.587785f},
+     { 0.442863f,  0.238856f, -0.864188f},
+     { 0.587785f,  0.425325f, -0.688191f},
+     { 0.688191f,  0.587785f, -0.425325f},
+     {-0.147621f,  0.716567f, -0.681718f},
+     {-0.309017f,  0.500000f, -0.809017f},
+     { 0.000000f,  0.525731f, -0.850651f},
+     {-0.525731f,  0.000000f, -0.850651f},
+     {-0.442863f,  0.238856f, -0.864188f},
+     {-0.295242f,  0.000000f, -0.955423f},
+     {-0.162460f,  0.262866f, -0.951056f},
+     { 0.000000f,  0.000000f, -1.000000f},
+     { 0.295242f,  0.000000f, -0.955423f},
+     { 0.162460f,  0.262866f, -0.951056f},
+     {-0.442863f, -0.238856f, -0.864188f},
+     {-0.309017f, -0.500000f, -0.809017f},
+     {-0.162460f, -0.262866f, -0.951056f},
+     { 0.000000f, -0.850651f, -0.525731f},
+     {-0.147621f, -0.716567f, -0.681718f},
+     { 0.147621f, -0.716567f, -0.681718f},
+     { 0.000000f, -0.525731f, -0.850651f},
+     { 0.309017f, -0.500000f, -0.809017f},
+     { 0.442863f, -0.238856f, -0.864188f},
+     { 0.162460f, -0.262866f, -0.951056f},
+     { 0.238856f, -0.864188f, -0.442863f},
+     { 0.500000f, -0.809017f, -0.309017f},
+     { 0.425325f, -0.688191f, -0.587785f},
+     { 0.716567f, -0.681718f, -0.147621f},
+     { 0.688191f, -0.587785f, -0.425325f},
+     { 0.587785f, -0.425325f, -0.688191f},
+     { 0.000000f, -0.955423f, -0.295242f},
+     { 0.000000f, -1.000000f,  0.000000f},
+     { 0.262866f, -0.951056f, -0.162460f},
+     { 0.000000f, -0.850651f,  0.525731f},
+     { 0.000000f, -0.955423f,  0.295242f},
+     { 0.238856f, -0.864188f,  0.442863f},
+     { 0.262866f, -0.951056f,  0.162460f},
+     { 0.500000f, -0.809017f,  0.309017f},
+     { 0.716567f, -0.681718f,  0.147621f},
+     { 0.525731f, -0.850651f,  0.000000f},
+     {-0.238856f, -0.864188f, -0.442863f},
+     {-0.500000f, -0.809017f, -0.309017f},
+     {-0.262866f, -0.951056f, -0.162460f},
+     {-0.850651f, -0.525731f,  0.000000f},
+     {-0.716567f, -0.681718f, -0.147621f},
+     {-0.716567f, -0.681718f,  0.147621f},
+     {-0.525731f, -0.850651f,  0.000000f},
+     {-0.500000f, -0.809017f,  0.309017f},
+     {-0.238856f, -0.864188f,  0.442863f},
+     {-0.262866f, -0.951056f,  0.162460f},
+     {-0.864188f, -0.442863f,  0.238856f},
+     {-0.809017f, -0.309017f,  0.500000f},
+     {-0.688191f, -0.587785f,  0.425325f},
+     {-0.681718f, -0.147621f,  0.716567f},
+     {-0.442863f, -0.238856f,  0.864188f},
+     {-0.587785f, -0.425325f,  0.688191f},
+     {-0.309017f, -0.500000f,  0.809017f},
+     {-0.147621f, -0.716567f,  0.681718f},
+     {-0.425325f, -0.688191f,  0.587785f},
+     {-0.162460f, -0.262866f,  0.951056f},
+     { 0.442863f, -0.238856f,  0.864188f},
+     { 0.162460f, -0.262866f,  0.951056f},
+     { 0.309017f, -0.500000f,  0.809017f},
+     { 0.147621f, -0.716567f,  0.681718f},
+     { 0.000000f, -0.525731f,  0.850651f},
+     { 0.425325f, -0.688191f,  0.587785f},
+     { 0.587785f, -0.425325f,  0.688191f},
+     { 0.688191f, -0.587785f,  0.425325f},
+     {-0.955423f,  0.295242f,  0.000000f},
+     {-0.951056f,  0.162460f,  0.262866f},
+     {-1.000000f,  0.000000f,  0.000000f},
+     {-0.850651f,  0.000000f,  0.525731f},
+     {-0.955423f, -0.295242f,  0.000000f},
+     {-0.951056f, -0.162460f,  0.262866f},
+     {-0.864188f,  0.442863f, -0.238856f},
+     {-0.951056f,  0.162460f, -0.262866f},
+     {-0.809017f,  0.309017f, -0.500000f},
+     {-0.864188f, -0.442863f, -0.238856f},
+     {-0.951056f, -0.162460f, -0.262866f},
+     {-0.809017f, -0.309017f, -0.500000f},
+     {-0.681718f,  0.147621f, -0.716567f},
+     {-0.681718f, -0.147621f, -0.716567f},
+     {-0.850651f,  0.000000f, -0.525731f},
+     {-0.688191f,  0.587785f, -0.425325f},
+     {-0.587785f,  0.425325f, -0.688191f},
+     {-0.425325f,  0.688191f, -0.587785f},
+     {-0.425325f, -0.688191f, -0.587785f},
+     {-0.587785f, -0.425325f, -0.688191f},
+     {-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_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;
+     }
+
+   /* Check file size. We require a file larger than MD2 header size. */
+   loader->size = eina_file_size_get(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));
+
+   /* Check identity */
+   if (header.magic != MD2_MAGIC_NUMBER || header.version != MD2_VERSION)
+     goto error;
+
+   /* Check offsets */
+   if (header.offset_skins > header.offset_end)
+     goto error;
+
+   if (header.offset_texcoords > header.offset_end)
+     goto error;
+
+   if (header.offset_triangles > header.offset_end)
+     goto error;
+
+   if (header.offset_frames > header.offset_end)
+     goto error;
+
+   if (header.offset_glcmds > header.offset_end)
+     goto error;
+
+   if (header.offset_end > loader->size)
+     goto error;
+
+   loader->skin_width = header.skin_width;
+   loader->skin_height = header.skin_height;
+
+   loader->frame_count = header.frame_count;
+   loader->frame_size = header.frame_size;
+   loader->frames = 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);
+   return EINA_TRUE;
+
+error:
+   _md2_loader_fini(loader);
+   return EINA_FALSE;
+}
+
+void
+evas_3d_mesh_file_md2_set(Evas_3D_Mesh *mesh, const char *file)
+{
+   MD2_Loader           loader;
+   int                  i, j, k;
+   float               *pos, *nor, *tex;
+   int                  stride_pos, stride_nor, stride_tex;
+   float                s_scale, t_scale;
+   Evas_3D_Mesh_Data *pd;
+
+   /* Initialize MD2 loader (Open file and read MD2 head ant etc) */
+   if (!_md2_loader_init(&loader, file))
+     {
+        ERR("Failed to initialize MD2 loader.");
+        return;
+     }
+
+   s_scale = 1.0 / (float)(loader.skin_width - 1);
+   t_scale = 1.0 / (float)(loader.skin_height - 1);
+
+   eo_do(mesh,
+         evas_3d_mesh_vertex_count_set(loader.triangle_count * 3),
+         evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES));
+
+   /* Load frames */
+   for (i = 0; i < loader.frame_count; i++)
+     {
+        const MD2_Frame *frame = (const MD2_Frame *)(loader.frames + 
loader.frame_size * i);
+        int              f = i * MD2_FRAME_SCALE;
+
+        eo_do(mesh,
+              /* Add a mesh frame. */
+              evas_3d_mesh_frame_add(f),
+
+              /* Allocate vertex buffer for the frame. */
+              evas_3d_mesh_frame_vertex_data_copy_set(f, 
EVAS_3D_VERTEX_POSITION, 0, NULL),
+              evas_3d_mesh_frame_vertex_data_copy_set(f, 
EVAS_3D_VERTEX_NORMAL,   0, NULL),
+              evas_3d_mesh_frame_vertex_data_copy_set(f, 
EVAS_3D_VERTEX_TEXCOORD, 0, NULL),
+
+              /* Map vertex buffer. */
+              pos = (float *)evas_3d_mesh_frame_vertex_data_map(f, 
EVAS_3D_VERTEX_POSITION),
+              nor = (float *)evas_3d_mesh_frame_vertex_data_map(f, 
EVAS_3D_VERTEX_NORMAL),
+              tex = (float *)evas_3d_mesh_frame_vertex_data_map(f, 
EVAS_3D_VERTEX_TEXCOORD),
+
+              stride_pos = evas_3d_mesh_frame_vertex_stride_get(f, 
EVAS_3D_VERTEX_POSITION),
+              stride_nor = evas_3d_mesh_frame_vertex_stride_get(f, 
EVAS_3D_VERTEX_NORMAL),
+              stride_tex = evas_3d_mesh_frame_vertex_stride_get(f, 
EVAS_3D_VERTEX_TEXCOORD));
+
+        if (stride_pos == 0)
+          stride_pos = sizeof(float) * 3;
+
+        if (stride_nor == 0)
+          stride_nor = sizeof(float) * 3;
+
+        if (stride_tex == 0)
+          stride_tex = sizeof(float) * 2;
+
+        for (j = 0; j < loader.triangle_count; j++)
+          {
+             const MD2_Triangle *tri   = &loader.triangles[j];
+
+             for (k = 0; k < 3; k++)
+               {
+                  unsigned int tidx, vidx;
+                  float *p, *n, *t;
+
+                  tidx = tri->texcoord_idx[k];
+                  vidx = tri->vertex_idx[k];
+
+                  p = (float *)((char *)pos + stride_pos * (j * 3 + k));
+                  n = (float *)((char *)nor + stride_nor * (j * 3 + k));
+                  t = (float *)((char *)tex + stride_tex * (j * 3 + k));
+
+                  p[0] = frame->vertices[vidx].pos[0] * frame->scale[0] + 
frame->trans[0];
+                  p[1] = frame->vertices[vidx].pos[1] * frame->scale[1] + 
frame->trans[1];
+                  p[2] = frame->vertices[vidx].pos[2] * frame->scale[2] + 
frame->trans[2];
+
+                  n[0] = normal_table[frame->vertices[vidx].normal_idx][0];
+                  n[1] = normal_table[frame->vertices[vidx].normal_idx][1];
+                  n[2] = normal_table[frame->vertices[vidx].normal_idx][2];
+
+                  t[0] = loader.texcoords[tidx].s * s_scale;
+                  t[1] = 1.0 - loader.texcoords[tidx].t * t_scale;
+               }
+          }
+
+        /* Unmap vertex buffer. */
+        eo_do(mesh,
+              evas_3d_mesh_frame_vertex_data_unmap(f, EVAS_3D_VERTEX_POSITION),
+              evas_3d_mesh_frame_vertex_data_unmap(f, EVAS_3D_VERTEX_NORMAL),
+              evas_3d_mesh_frame_vertex_data_unmap(f, 
EVAS_3D_VERTEX_TEXCOORD));
+
+        pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
+
+        if (!evas_3d_mesh_aabb_add_to_frame(pd, f, stride_pos))
+          {
+             ERR("Axis-Aligned Bounding Box wasn't added in frame %d ", f);
+          }
+     }
+
+   _md2_loader_fini(&loader);
+}
diff --git a/src/modules/evas/model_loaders/obj/evas_model_load_obj.c 
b/src/modules/evas/model_loaders/obj/evas_model_load_obj.c
index 8940b65..c6733a7 100644
--- a/src/modules/evas/model_loaders/obj/evas_model_load_obj.c
+++ b/src/modules/evas/model_loaders/obj/evas_model_load_obj.c
@@ -1 +1,401 @@
-//dummy of saver/loader
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include "stdio.h"
+#include "evas_common_private.h"
+#include "evas_private.h"
+
+/* set value to position [x][y] to array name which have. */
+#define ARRAY_2D(name, x, y, count_y) (*(name + x * count_y + y))
+
+/* read 3 float values in string and put it in array */
+#define PUT_DATA_TO_ARRAY(array_name, name)                         \
+        sscanf (current,"%f %f %f",                         \
+        &ARRAY_2D(_##array_name##_obj, counts.current_##name##_counter, 0, 3), 
  \
+        &ARRAY_2D(_##array_name##_obj, counts.current_##name##_counter, 1, 3), 
  \
+        &ARRAY_2D(_##array_name##_obj, counts.current_##name##_counter, 2, 
3));  \
+     counts.current_##name##_counter++;
+
+/* Structures for reading data from file. */
+typedef struct _OBJ_Counts    OBJ_Counts;
+
+struct _OBJ_Counts
+{
+   int _vertex_counter;
+   int _normal_counter;
+   int _texture_point_counter;
+   int _triangles_counter;
+
+   int current_vertex_counter;
+   int current_normal_counter;
+   int current_texture_point_counter;
+   int current_triangles_counter;
+
+   Eina_Bool existence_of_normal;
+   Eina_Bool existence_of_tex_point;
+};
+
+static inline char*
+_file_to_buf(const char *file, long *length)//prepare text file for reading
+{
+   FILE *file_for_print;
+   char *buf;
+   int unused __attribute__((unused));//this variable fixes warning "ignoring 
return value of fread"
+
+   *length = 0;
+   file_for_print = fopen(file, "rb");
+   if (!file_for_print) return NULL;
+   fseek(file_for_print, 0, SEEK_END);//set file_for_print to the end of file
+   *length = ftell(file_for_print);//set current position of file_for_print
+   if (*length < 0)
+     {
+        fclose(file_for_print);
+        return NULL;
+     }
+   buf = malloc(*length + 1);
+   fseek(file_for_print, 0, SEEK_SET);//set file_for_print to the begining of 
file
+   unused = fread(buf, *length, 1, file_for_print);
+   fclose(file_for_print);
+   buf[*length] = '\0';
+   return buf;
+}
+
+/* create new counter */
+static inline OBJ_Counts
+_new_count_elements()
+{
+   OBJ_Counts counts;
+
+   counts._vertex_counter = 0;
+   counts._normal_counter = 0;
+   counts._texture_point_counter = 0;
+   counts._triangles_counter = 0;
+
+   counts.current_vertex_counter = 0;
+   counts.current_normal_counter = 0;
+   counts.current_texture_point_counter = 0;
+   counts.current_triangles_counter = 0;
+
+   counts.existence_of_normal = EINA_FALSE;
+   counts.existence_of_tex_point = EINA_FALSE;
+   return counts;
+}
+
+/* count triangles in face */
+static void
+_analyze_face_line(char * face_analyzer,
+                   int * count_of_triangles_in_line)
+{
+   int polygon_checker = -2;
+   Eina_Bool previous_is_space = EINA_TRUE;
+   while ((*face_analyzer != '\n') && (*face_analyzer != '#'))
+     {
+        if (*face_analyzer == ' ')
+          {
+             previous_is_space = EINA_TRUE;
+          }
+        else if ((previous_is_space) && (*face_analyzer  >= '0') && 
(*face_analyzer  <= '9'))
+          {
+             polygon_checker++;
+             previous_is_space = EINA_FALSE;
+          }
+        face_analyzer++;
+     }
+   *count_of_triangles_in_line = polygon_checker;
+}
+
+static inline OBJ_Counts
+_count_elements(char *start, long length)//count elements of mesh in .obj
+{
+   OBJ_Counts counts = _new_count_elements();
+
+   char * current = start;
+   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;
+   Eina_Bool first_char_is_f = EINA_FALSE;
+   Eina_Bool previous_is_space = EINA_FALSE;
+
+   long i = 0;
+   /* count elements of mesh in .obj */
+   for (; length > i; i++)
+     {
+        if (will_check_next_char)
+          {
+             if (first_char_is_v)
+               {
+                  switch (*current)
+                    {
+                     case ' ':
+                       counts._vertex_counter++;
+                       break;
+                     case 't':
+                       counts._texture_point_counter++;
+                       counts.existence_of_tex_point = EINA_TRUE;
+                       break;
+                     case 'n':
+                       counts._normal_counter++;
+                       counts.existence_of_normal = EINA_TRUE;
+                       break;
+                     default:
+                       break;
+                    }
+                  first_char_is_v = EINA_FALSE;
+                  will_check_next_char = EINA_FALSE;
+               }
+             else if (first_char_is_f)
+               {
+                  switch (*current)
+                    {
+                     case '\n':
+                       first_char_is_f = EINA_FALSE;
+                       counts._triangles_counter += polygon_checker;
+                       polygon_checker = -2;
+                       previous_is_space = EINA_FALSE;
+                       break;
+                     case '#':
+                       first_char_is_f = EINA_FALSE;
+                       counts._triangles_counter += polygon_checker;
+                       polygon_checker = -2;
+                       previous_is_space = EINA_FALSE;
+                       break;
+                     case ' ':
+                       previous_is_space = EINA_TRUE;
+                       break;
+                     default:
+                       if ((previous_is_space) && (*current  >= '0') && 
(*current  <= '9'))
+                         {
+                            polygon_checker++;
+                            previous_is_space = EINA_FALSE;
+                         }
+                       break;
+                    }
+               }
+             else
+               {
+                  switch (*current)
+                    {
+                     case 'v':
+                       first_char_is_v = EINA_TRUE;
+                       break;
+                     case 'f':
+                       first_char_is_f = EINA_TRUE;
+                       break;
+                     case 'm':
+                       will_check_next_char = EINA_FALSE;
+                       break;
+                     default:
+                       will_check_next_char = EINA_FALSE;
+                       break;
+                    }
+               }
+          }
+        else if (*current == '\n')
+          {
+             will_check_next_char = EINA_TRUE;
+          }
+        current++;
+     }
+   return counts;
+}
+
+void
+evas_3d_mesh_file_obj_set(Evas_3D_Mesh *mesh, const char *file)
+{
+   long length, i;
+   char * start = _file_to_buf(file, &length);
+   OBJ_Counts counts = _count_elements(start, length);//count elements of mesh 
in .obj
+   Eina_Bool will_check_next_char = EINA_FALSE;
+   Eina_Bool first_char_is_v = EINA_FALSE;
+   Eina_Bool first_char_is_f = EINA_FALSE;
+   float *pos, *nor, *tex;
+   int stride_pos, stride_nor, stride_tex;
+   int j, k;
+   char * current;
+
+   float *_vertices_obj = malloc(counts._vertex_counter * 3 * sizeof(float));
+   float *_normales_obj = malloc(counts._normal_counter * 3 * sizeof(float));
+   float *_tex_coords_obj = malloc(counts._texture_point_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 ((start == NULL) || (_vertices_obj == NULL) ||
+        (_normales_obj == NULL) || (_tex_coords_obj == NULL) || (_triangles == 
NULL))
+     {
+        ERR("Allocate memory is failed.");
+        free(start);
+        free(_vertices_obj);
+        free(_normales_obj);
+        free(_tex_coords_obj);
+        free(_triangles);
+        return;
+     }
+
+   current = start;
+   i = 0;
+
+   /* put data to arrays */
+   for (; length > i; i++)
+     {
+        if (will_check_next_char)
+          {
+             if (first_char_is_v)
+               {
+                  switch (*current)
+                    {
+                     case ' ':
+                       PUT_DATA_TO_ARRAY(vertices, vertex)
+                       i--;
+                       break;
+                     case 't':
+                       current++;
+                       PUT_DATA_TO_ARRAY(tex_coords, texture_point)
+                       break;
+                     case 'n':
+                       current++;
+                       PUT_DATA_TO_ARRAY(normales, normal)
+                       break;
+                     default:
+                       break;
+                    }
+                  first_char_is_v = EINA_FALSE;
+                  will_check_next_char = EINA_FALSE;
+               }
+             else if (first_char_is_f)
+               {
+                  char * auxiliary_pointer = current;
+                  int count_of_triangles_in_line;
+
+                  _analyze_face_line(auxiliary_pointer,
+                                   &count_of_triangles_in_line);
+                  current++;
+                  i++;
+                  int first_pos, first_tex, first_norm;
+                  sscanf (current,"%i/%i/%i",
+                            &first_pos,
+                            &first_tex,
+                            &first_norm);
+
+                  do
+                    {
+                       current++;
+                       i++;
+                    }
+                  while (*current != ' ');
+
+                  current++;
+                  i++;
+
+                  for (j = 0; j < count_of_triangles_in_line; j++)
+                    {
+                       auxiliary_pointer = current;
+                       ARRAY_2D(_triangles, counts.current_triangles_counter, 
0, 9) = first_pos;
+                       ARRAY_2D(_triangles, counts.current_triangles_counter, 
1, 9) = first_tex;
+                       ARRAY_2D(_triangles, counts.current_triangles_counter, 
2, 9) = first_norm;
+                       sscanf (auxiliary_pointer,"%i/%i/%i %i/%i/%i",
+                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 3, 9),
+                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 4, 9),
+                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 5, 9),
+                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 6, 9),
+                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 7, 9),
+                         &ARRAY_2D(_triangles, 
counts.current_triangles_counter, 8, 9));
+
+                       while (*current != ' ')
+                         {
+                            current++;
+                            i++;
+                         }
+
+                       counts.current_triangles_counter++;
+                    }
+                  first_char_is_f = EINA_FALSE;
+               }
+             else
+               {
+                  switch (*current)
+                    {
+                     case 'v':
+                       first_char_is_v = EINA_TRUE;
+                       break;
+                     case 'f':
+                       first_char_is_f = EINA_TRUE;
+                       break;
+                     case 'm':
+                       will_check_next_char = EINA_FALSE;
+                       break;
+                     default:
+                       will_check_next_char = EINA_FALSE;
+                       break;
+                    }
+               }
+          }
+        else if (*current == '\n')
+          {
+             will_check_next_char = EINA_TRUE;
+          }
+        current++;
+     }
+   free(start);
+
+   /* prepare of mesh and take pointers to data which must be read */
+   eo_do(mesh,
+         evas_3d_mesh_vertex_count_set(counts._triangles_counter * 3),
+         evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
+         evas_3d_mesh_frame_add(0),
+         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_POSITION, 
0, NULL),
+         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_NORMAL,   
0, NULL),
+         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_TEXCOORD, 
0, NULL),
+
+         pos = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_POSITION),
+         nor = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_NORMAL),
+         tex = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_TEXCOORD),
+
+         stride_pos = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_POSITION),
+         stride_nor = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_NORMAL),
+         stride_tex = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_TEXCOORD));
+
+   if (stride_pos == 0) stride_pos = sizeof(float) * 3;
+   if (stride_nor == 0) stride_nor = sizeof(float) * 3;
+   if (stride_tex == 0) stride_tex = sizeof(float) * 2;
+
+   for (j = 0; j < counts._triangles_counter; j++)
+     {
+        for (k = 0; k < 3; k++)
+          {
+             float *p, *n, *t;
+
+             p = (float *)((char *)pos + stride_pos * (j * 3 + k));
+             n = (float *)((char *)nor + stride_nor * (j * 3 + k));
+             t = (float *)((char *)tex + stride_tex * (j * 3 + k));
+
+             p[0] = ARRAY_2D(_vertices_obj, (ARRAY_2D(_triangles, j, (3 * k), 
9) - 1), 0, 3);
+             p[1] = ARRAY_2D(_vertices_obj, (ARRAY_2D(_triangles, j, (3 * k), 
9) - 1), 1, 3);
+             p[2] = ARRAY_2D(_vertices_obj, (ARRAY_2D(_triangles, j, (3 * k), 
9) - 1), 2, 3);
+
+             n[0] = ARRAY_2D(_normales_obj, (ARRAY_2D(_triangles, j, (3 * k + 
2), 9) - 1), 0, 3);
+             n[1] = ARRAY_2D(_normales_obj, (ARRAY_2D(_triangles, j, (3 * k + 
2), 9) - 1), 1, 3);
+             n[2] = ARRAY_2D(_normales_obj, (ARRAY_2D(_triangles, j, (3 * k + 
2), 9) - 1), 2, 3);
+
+             t[0] = ARRAY_2D(_tex_coords_obj, (ARRAY_2D(_triangles, j, (3 * k 
+ 1), 9) - 1), 0, 3);
+             t[1] = ARRAY_2D(_tex_coords_obj, (ARRAY_2D(_triangles, j, (3 * k 
+ 1), 9) - 1), 1, 3);
+          }
+     }
+   free(_vertices_obj);
+   free(_normales_obj);
+   free(_tex_coords_obj);
+   free(_triangles);
+        /* Unmap vertex buffer. */
+   eo_do(mesh,
+     evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_POSITION),
+     evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_NORMAL),
+     evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_TEXCOORD));
+
+   Evas_3D_Mesh_Data *pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
+
+   if (!evas_3d_mesh_aabb_add_to_frame(pd, 0, stride_pos))
+     {
+        ERR("Axis-Aligned Bounding Box wan't added in frame %d ", 0);
+     }
+}
diff --git a/src/modules/evas/model_loaders/ply/evas_model_load_ply.c 
b/src/modules/evas/model_loaders/ply/evas_model_load_ply.c
index 8940b65..b4bbe18 100644
--- a/src/modules/evas/model_loaders/ply/evas_model_load_ply.c
+++ b/src/modules/evas/model_loaders/ply/evas_model_load_ply.c
@@ -1 +1,401 @@
-//dummy of saver/loader
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include "stdio.h"
+#include "evas_common_private.h"
+#include "evas_private.h"
+#include <Eina.h>
+
+/* set value to position [x][y] to array name which have. */
+#define ARRAY_2D(name, x, y, count_y) (*(name + x * count_y + y))
+
+/* Structures for reading data from file. */
+typedef struct _PLY_Header    PLY_Header;
+
+struct _PLY_Header
+{
+   int vertices_count;
+   int triangles_count;
+   Eina_Bool existence_of_geometries;
+   Eina_Bool existence_of_normals;
+   Eina_Bool existence_of_texcoords;
+   Eina_Bool existence_of_colors;
+};
+
+static inline char*
+_file_to_buf(const char *file, long *length)//prepare text file for reading
+{
+   FILE *file_for_print;
+   char *buf;
+   int unused __attribute__((unused));//this variable fixes warning "ignoring 
return value of fread"
+
+   *length = 0;
+   file_for_print = fopen(file, "rb");
+   if (!file_for_print) return NULL;
+   fseek(file_for_print, 0, SEEK_END);//set file_for_print to the end of file
+   *length = ftell(file_for_print);//set current position of file_for_print
+   buf = malloc(*length + 1);
+   fseek(file_for_print, 0, SEEK_SET);//set file_for_print to the begining of 
file
+   unused = fread(buf, *length, 1, file_for_print);
+   fclose(file_for_print);
+   buf[*length] = '\0';
+   return buf;
+}
+
+/* create new header */
+static inline PLY_Header
+_new_ply_header()
+{
+   PLY_Header header;
+
+   header.vertices_count = 0;
+   header.triangles_count = 0;
+   header.existence_of_geometries = EINA_FALSE;
+   header.existence_of_normals = EINA_FALSE;
+   header.existence_of_texcoords = EINA_FALSE;
+   header.existence_of_colors = EINA_FALSE;
+
+   return header;
+}
+
+static inline char *
+_to_next_line(char *current)
+{
+   while (*current != '\n') current++;
+   current++;
+   return current;
+}
+
+static inline char *
+_to_begin_of_line(char *current)
+{
+   while (*current != '\n') current--;
+   current++;
+   return current;
+}
+
+static inline char *
+_to_next_number(char *current, int count)
+{
+   int i;
+   for (i = 0; i < count; i++)
+     {
+        while (*current != ' ') current++;
+        current++;
+     }
+   return current;
+}
+
+static inline char *
+_read_data(float *array, int place, int count, char *current, float divider)
+{
+   int i;
+   for (i = 0; i < count; i++)
+     {
+        sscanf (current,"%f", &ARRAY_2D(array, place, i, count));
+        ARRAY_2D(array, place, i, count) /= divider;
+        current = _to_next_number(current, 1);
+     }
+   return current;
+}
+
+static inline PLY_Header
+_read_header(char *start)//Check properties of mesh in .ply file.
+{
+   eina_init();
+
+   Eina_Bool reading_vertices = EINA_TRUE, check_next_char = EINA_FALSE;
+   int vertex_lines, triangles = 0, vertices_in_current_face = 0;
+   char **helping_pointer;
+   char *current;
+   PLY_Header header;
+
+   header = _new_ply_header();
+   helping_pointer = eina_str_split(start, "vertex ", 0);
+
+   if (helping_pointer == NULL)
+     {
+        ERR("File have not kayword vertex. It is necessary.");
+        return header;
+     }
+
+   sscanf(helping_pointer[1], "%d", &header.vertices_count);
+
+   free(helping_pointer);
+   helping_pointer = eina_str_split(start, "end_header\n", 0);
+
+   if (helping_pointer == NULL)
+     {
+        ERR("File have not kayword end_header. It is necessary.");
+        return header;
+     }
+
+   current = helping_pointer[1];
+
+   vertex_lines = header.vertices_count;
+   while (*current != '\0')
+     {
+        if (vertex_lines == 1)
+          reading_vertices = EINA_FALSE;
+        if (*current == '\n')
+          {
+             if (reading_vertices)
+               vertex_lines--;
+             else
+               check_next_char = EINA_TRUE;
+          }
+        if (check_next_char)
+          {
+             if ((*current <= '9') && (*current >= '0'))
+               vertices_in_current_face = (vertices_in_current_face * 10) + 
(*current - '0');
+             else if (*current >= ' ')
+               {
+                  triangles += (vertices_in_current_face - 2);
+                  vertices_in_current_face = 0;
+                  check_next_char = EINA_FALSE;
+               }
+          }
+        current++;
+     }
+
+   header.triangles_count = triangles;
+   free(helping_pointer);
+
+      /* analyse flags used when file was saved in blender */
+   helping_pointer = eina_str_split(start, "property float ", 0);
+
+   if ((helping_pointer[1] != NULL) && (*helping_pointer[1] == 'x') &&
+       (helping_pointer[2] != NULL) && (*helping_pointer[2] == 'y') &&
+       (helping_pointer[3] != NULL) && (*helping_pointer[3] == 'z'))
+     header.existence_of_geometries = EINA_TRUE;
+   else return header;
+
+   if ((helping_pointer[4] != NULL) && (*helping_pointer[4] == 'n') &&
+       (helping_pointer[5] != NULL) && (*helping_pointer[5] == 'n') &&
+       (helping_pointer[6] != NULL) && (*helping_pointer[6] == 'n'))
+     header.existence_of_normals = EINA_TRUE;
+
+   if ((header.existence_of_normals &&
+       ((helping_pointer[7] != NULL) && (*helping_pointer[7] == 's') &&
+       (helping_pointer[8] != NULL) && (*helping_pointer[8] == 't'))) ||
+       (!header.existence_of_normals &&
+       ((helping_pointer[4] != NULL) && (*helping_pointer[4] == 's') &&
+       (helping_pointer[5] != NULL) && (*helping_pointer[5] == 't'))))
+     header.existence_of_texcoords = EINA_TRUE;
+
+   helping_pointer = eina_str_split(start, "property uchar ", 0);
+
+   if ((helping_pointer[1] != NULL) && (*helping_pointer[1] == 'r') &&
+       (helping_pointer[2] != NULL) && (*helping_pointer[2] == 'g') &&
+       (helping_pointer[3] != NULL) && (*helping_pointer[3] == 'b'))
+     header.existence_of_colors = EINA_TRUE;
+
+   free(helping_pointer);
+
+   return header;
+}
+
+void
+evas_3d_mesh_file_ply_set(Evas_3D_Mesh *mesh, const char *file)
+{
+   long length;
+   Evas_3D_Mesh_Data *pd;
+   int i = 0, j = 0, k = 0, count_of_triangles_in_line = 0;
+   float *pos, *nor, *tex, *col;
+   int stride_pos, stride_nor, stride_tex, stride_col;
+   char *start, *current;
+   PLY_Header header;
+   float *_vertices_ply = NULL, *_normals_ply = NULL, *_tex_coords_ply = NULL, 
*_colors_ply = NULL;
+   char **helping_pointer;
+
+   start = _file_to_buf(file, &length);
+
+   if (start == NULL)
+     {
+        ERR("Buffer is empty after preparation file for reading.");
+        return;
+     }
+
+   header = _read_header(start);
+
+   if (!header.existence_of_geometries)
+     {
+        ERR("File have not x, y, or z field as the first 3 float fields. They 
are necessary.");
+        return;
+     }
+
+   helping_pointer = eina_str_split(start, "end_header\n", 0);
+
+   if (helping_pointer == NULL)
+     {
+        ERR("File have not kayword end_header. It is necessary.");
+        return;
+     }
+
+   current = helping_pointer[1];
+
+   _vertices_ply = malloc(header.vertices_count * 3 * sizeof(float));
+   if (header.existence_of_normals)
+     _normals_ply = malloc(header.vertices_count * 3 * sizeof(float));
+   if (header.existence_of_texcoords)
+     _tex_coords_ply = malloc(header.vertices_count * 2 * sizeof(float));
+   if (header.existence_of_colors)
+     _colors_ply = malloc(header.vertices_count * 3 * sizeof(float));
+   int *_triangles = malloc(header.triangles_count * 3 * sizeof(int));
+
+   if ((header.existence_of_geometries && (_vertices_ply == NULL)) ||
+       (header.existence_of_normals && (_normals_ply == NULL)) ||
+       (header.existence_of_texcoords && (_tex_coords_ply == NULL)) ||
+       (header.existence_of_colors && (_colors_ply == NULL)) ||
+       (_triangles == NULL))
+     {
+        ERR("Allocate memory is failed.");
+        free(start);
+        free(_vertices_ply);
+        free(_normals_ply);
+        free(_tex_coords_ply);
+        free(_colors_ply);
+        free(_triangles);
+        return;
+     }
+
+   for (i = 0; i < header.vertices_count; i++)
+     {
+        current = _read_data(_vertices_ply, i, 3, current, 1.0);
+        if (header.existence_of_normals)
+          current = _read_data(_normals_ply, i, 3, current, 1.0);
+        if (header.existence_of_texcoords)
+          current = _read_data(_tex_coords_ply, i, 2, current, 1.0);
+        if (header.existence_of_colors)
+          current = _read_data(_colors_ply, i, 3, current, 255.0);
+        current = _to_begin_of_line(current);
+     }
+
+   for (i = 0; i < header.triangles_count;)
+     {
+        sscanf (current,"%d", &count_of_triangles_in_line);
+        count_of_triangles_in_line -= 2;
+        current = _to_next_number(current, 1);
+
+        sscanf (current,"%i", &ARRAY_2D(_triangles, i, 0, 3));
+
+        for (j = 0; j < count_of_triangles_in_line; j++)
+          {
+             if (j > 0)
+               ARRAY_2D(_triangles, i, 0, 3) = ARRAY_2D(_triangles, (i - 1), 
0, 3);
+             current = _to_next_number(current, 1);
+             sscanf (current,"%i %i",
+                     &ARRAY_2D(_triangles, i, 1, 3),
+                     &ARRAY_2D(_triangles, i, 2, 3));
+             i++;
+          }
+        current = _to_next_line(current);
+     }
+
+   /* prepare of mesh and take pointers to data which must be read */
+   eo_do(mesh,
+         evas_3d_mesh_vertex_count_set(header.triangles_count * 3),
+         evas_3d_mesh_vertex_assembly_set(EVAS_3D_VERTEX_ASSEMBLY_TRIANGLES),
+         evas_3d_mesh_frame_add(0),
+         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_POSITION, 
0, NULL),
+         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_NORMAL,   
0, NULL),
+         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_TEXCOORD, 
0, NULL),
+         evas_3d_mesh_frame_vertex_data_copy_set(0, EVAS_3D_VERTEX_COLOR,    
0, NULL),
+
+         pos = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_POSITION),
+         nor = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_NORMAL),
+         tex = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_TEXCOORD),
+         col = (float *)evas_3d_mesh_frame_vertex_data_map(0, 
EVAS_3D_VERTEX_COLOR),
+
+         stride_pos = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_POSITION),
+         stride_nor = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_NORMAL),
+         stride_tex = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_TEXCOORD),
+         stride_col = evas_3d_mesh_frame_vertex_stride_get(0, 
EVAS_3D_VERTEX_COLOR));
+
+   if (stride_pos == 0) stride_pos = sizeof(float) * 3;
+   if (stride_nor == 0) stride_nor = sizeof(float) * 3;
+   if (stride_tex == 0) stride_tex = sizeof(float) * 2;
+   if (stride_col == 0) stride_col = sizeof(float) * 4;
+
+   for (j = 0; j < header.triangles_count; j++)
+     {
+        for (k = 0; k < 3; k++)
+          {
+             float *p, *n, *t, *c;
+
+             p = (float *)((char *)pos + stride_pos * (j * 3 + k));
+             n = (float *)((char *)nor + stride_nor * (j * 3 + k));
+             t = (float *)((char *)tex + stride_tex * (j * 3 + k));
+             c = (float *)((char *)col + stride_col * (j * 3 + k));
+
+             p[0] = ARRAY_2D(_vertices_ply, ARRAY_2D(_triangles, j, k, 3), 0, 
3);
+             p[1] = ARRAY_2D(_vertices_ply, ARRAY_2D(_triangles, j, k, 3), 1, 
3);
+             p[2] = ARRAY_2D(_vertices_ply, ARRAY_2D(_triangles, j, k, 3), 2, 
3);
+
+             if (header.existence_of_normals)
+               {
+                  n[0] = ARRAY_2D(_normals_ply, ARRAY_2D(_triangles, j, k, 3), 
0, 3);
+                  n[1] = ARRAY_2D(_normals_ply, ARRAY_2D(_triangles, j, k, 3), 
1, 3);
+                  n[2] = ARRAY_2D(_normals_ply, ARRAY_2D(_triangles, j, k, 3), 
2, 3);
+               }
+             else
+               {
+                  n[0] = 0.0;
+                  n[1] = 0.0;
+                  n[2] = 0.0;
+               }
+
+             if (header.existence_of_texcoords)
+               {
+                  t[0] = ARRAY_2D(_tex_coords_ply, ARRAY_2D(_triangles, j, k, 
3), 0, 2);
+                  t[1] = ARRAY_2D(_tex_coords_ply, ARRAY_2D(_triangles, j, k, 
3), 1, 2);
+               }
+             else
+               {
+                  t[0] = 0.0;
+                  t[1] = 0.0;
+               }
+
+             if (header.existence_of_colors)
+               {
+                  c[0] = ARRAY_2D(_colors_ply, ARRAY_2D(_triangles, j, k, 3), 
0, 3);
+                  c[1] = ARRAY_2D(_colors_ply, ARRAY_2D(_triangles, j, k, 3), 
1, 3);
+                  c[2] = ARRAY_2D(_colors_ply, ARRAY_2D(_triangles, j, k, 3), 
2, 3);
+                  c[3] = 1.0;
+               }
+             else
+               {
+                  c[0] = 0.0;
+                  c[1] = 0.0;
+                  c[2] = 0.0;
+                  c[3] = 1.0;
+               }
+          }
+     }
+
+   free(helping_pointer);
+   free(_vertices_ply);
+   if (header.existence_of_normals)
+     free(_normals_ply);
+   if (header.existence_of_texcoords)
+     free(_tex_coords_ply);
+   if (header.existence_of_colors)
+     free(_colors_ply);
+   free(_triangles);
+
+        /* Unmap vertex buffer. */
+   eo_do(mesh,
+         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_POSITION),
+         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_NORMAL),
+         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_TEXCOORD),
+         evas_3d_mesh_frame_vertex_data_unmap(0, EVAS_3D_VERTEX_COLOR));
+
+   pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
+
+   if (!evas_3d_mesh_aabb_add_to_frame(pd, 0, stride_pos))
+     {
+        ERR("Axis-Aligned Bounding Box wan't added in frame %d ", 0);
+     }
+}
diff --git a/src/modules/evas/model_savers/eet/evas_model_save_eet.c 
b/src/modules/evas/model_savers/eet/evas_model_save_eet.c
index 8940b65..c801ac1 100644
--- a/src/modules/evas/model_savers/eet/evas_model_save_eet.c
+++ b/src/modules/evas/model_savers/eet/evas_model_save_eet.c
@@ -1 +1,197 @@
-//dummy of saver/loader
+#ifdef HAVE_CONFIG_H
+   #include "config.h"
+#endif
+
+#include <stdio.h>
+#include "evas_common_private.h"
+#include "evas_private.h"
+
+#define COMPONENT_OF_DEFAULT_GREY_COLOR 0.3
+#define TRANSPARENCY_OF_DEFAULT_GREY_COLOR 0.5
+
+extern Evas_3D_File_Eet* eet_file;
+extern const char EVAS_3D_FILE_CACHE_FILE_ENTRY[];
+extern Eet_Data_Descriptor *_file_descriptor;
+
+void
+_set_geometry_to_eet_file_from_mesh(Evas_3D_Mesh_Data *mesh,
+                                    Evas_3D_Mesh_Eet *eet_mesh,
+                                    Evas_3D_Header_Eet *eet_header,
+                                    Evas_3D_Mesh_Frame *f)
+{
+   Evas_3D_Vertex_Buffer *vb;
+   int i;
+   float *src;
+   Evas_3D_Vertex_Eet *vertices =
+      malloc(sizeof(Evas_3D_Vertex_Eet) * mesh->vertex_count);
+   Evas_3D_Geometry_Eet *geometry =
+      malloc(sizeof(Evas_3D_Geometry_Eet));
+   int *geometries = malloc(sizeof(int));
+
+   if ((vertices == NULL) || (geometry == NULL))
+     {
+        ERR("Allocating of memory is failed.");
+        free(vertices);
+        free(geometry);
+        free(geometries);
+        return;
+     }
+
+   geometry->vertices_count = mesh->vertex_count;
+   geometries[0] = mesh->vertex_count;
+
+#define SAVE_GEOMETRICS(a, component)\
+   vb = &f->vertices[a];\
+   if (vb->data == NULL)\
+     {\
+        ERR("Reading of geometrics is failed.");\
+        free(vertices);\
+        free(geometry);\
+        free(geometries);\
+        return;\
+     }\
+   src = (float *)vb->data;\
+   for (i = 0; i < mesh->vertex_count; i++)\
+     {\
+        vertices[i].component.x = src[0];\
+        vertices[i].component.y = src[1];\
+        vertices[i].component.z = src[2];\
+        src += f->vertices[a].element_count;\
+     }
+
+   geometry->vertices = vertices;
+   SAVE_GEOMETRICS(EVAS_3D_VERTEX_POSITION, position)
+   SAVE_GEOMETRICS(EVAS_3D_VERTEX_NORMAL, normal)
+   SAVE_GEOMETRICS(EVAS_3D_VERTEX_TEXCOORD, texcoord)
+
+#undef SAVE_GEOMETRICS
+
+   eet_mesh->geometries = geometry;
+   eet_header->geometries = geometries;
+}
+
+void
+_set_material_to_eet_file_from_mesh(Evas_3D_Mesh_Eet *eet_mesh,
+                                    Evas_3D_Header_Eet *eet_header,
+                                    Evas_3D_Mesh_Frame *f)
+{
+   int i;
+   Evas_3D_Material_Data *material =
+      eo_data_scope_get(f->material, EVAS_3D_MATERIAL_CLASS);
+   Evas_3D_Material_Eet *saved_materials =
+      malloc(sizeof(Evas_3D_Material_Eet));
+   Evas_3D_Color_Eet *saved_colors =
+      malloc(sizeof(Evas_3D_Color_Eet) * EVAS_3D_MATERIAL_ATTRIB_COUNT);
+   int *materials = malloc(sizeof(int));
+
+   if ((saved_materials == NULL) || (saved_colors == NULL))
+     {
+        ERR("Allocating of memory is failed.");
+        free(material);
+        free(saved_materials);
+        free(saved_colors);
+        free(materials);
+        return;
+     }
+
+   if (material == NULL)
+     {
+        ERR("Default material is set to saved file, because custom material \
+             was not saved before using of function evas_3d_mesh_save.");
+
+        for (i = 0; i < 5; i++)
+          {
+             saved_colors[i].r = COMPONENT_OF_DEFAULT_GREY_COLOR;
+             saved_colors[i].g = COMPONENT_OF_DEFAULT_GREY_COLOR;
+             saved_colors[i].b = COMPONENT_OF_DEFAULT_GREY_COLOR;
+             saved_colors[i].a = TRANSPARENCY_OF_DEFAULT_GREY_COLOR;
+          }
+
+        saved_materials->shininess = 50;
+     }
+   else
+     {
+
+        for (i = 0; i < 5; i++)
+          {
+             saved_colors[i].r = material->attribs[i].color.r;
+             saved_colors[i].g = material->attribs[i].color.g;
+             saved_colors[i].b = material->attribs[i].color.b;
+             saved_colors[i].a = material->attribs[i].color.a;
+          }
+
+        saved_materials->shininess = material->shininess;
+     }
+
+   saved_materials->colors_count = EVAS_3D_MATERIAL_ATTRIB_COUNT;
+   materials[0] = EVAS_3D_MATERIAL_ATTRIB_COUNT;
+   saved_materials->id = 1;
+   saved_materials->colors = saved_colors;
+   eet_mesh->materials = saved_materials;
+   eet_header->materials = materials;
+}
+
+void
+_set_frame_to_eet_file_from_mesh(Evas_3D_Mesh_Eet *eet_mesh)
+{
+   eet_mesh->frames = malloc(sizeof(Evas_3D_Frame_Eet));
+
+   if (eet_mesh->frames == NULL)
+     {
+        ERR("Allocating of memory is failed.");
+        return;
+     }
+
+   eet_mesh->frames->id = 1;
+   eet_mesh->frames->geometry_id = 1;
+   eet_mesh->frames->material_id = 1;
+}
+
+void
+evas_3d_mesh_save_eet(Evas_3D_Mesh *mesh,
+                      const char *file,
+                      Evas_3D_Mesh_Frame *f)
+{
+   Evas_3D_Mesh_Data *pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
+   Eet_File *ef = eet_open(file, EET_FILE_MODE_WRITE);
+   Evas_3D_Mesh_Eet* eet_mesh = malloc(sizeof(Evas_3D_Mesh_Eet));
+   Evas_3D_Header_Eet* eet_header = malloc(sizeof(Evas_3D_Header_Eet));
+
+   _evas_3d_eet_file_init();
+
+   eet_file = _evas_3d_eet_file_new();
+
+   eet_mesh->materials_count = 1;
+   eet_header->materials_count = 1;
+   eet_mesh->frames_count = 1;
+   eet_header->frames = 1;
+   eet_mesh->geometries_count = 1;
+   eet_header->geometries_count = 1;
+   eet_header->version = 1;
+
+   _set_geometry_to_eet_file_from_mesh(pd, eet_mesh, eet_header, f);
+   _set_material_to_eet_file_from_mesh(eet_mesh, eet_header, f);
+   _set_frame_to_eet_file_from_mesh(eet_mesh);
+
+   if (ef == NULL)
+     {
+        ERR("Opening of file is failed.");
+        free(eet_mesh);
+        free(eet_header);
+        _evas_3d_eet_file_free();
+        return;
+     }
+
+   eet_file->mesh = eet_mesh;
+   eet_file->header = eet_header;
+
+   eet_data_write(ef,
+                  _file_descriptor,
+                  EVAS_3D_FILE_CACHE_FILE_ENTRY,
+                  eet_file,
+                  EINA_TRUE);
+   eet_close(ef);
+
+   _evas_3d_eet_file_free();
+}
+
diff --git a/src/modules/evas/model_savers/obj/evas_model_save_obj.c 
b/src/modules/evas/model_savers/obj/evas_model_save_obj.c
index 8940b65..c7699b3 100644
--- a/src/modules/evas/model_savers/obj/evas_model_save_obj.c
+++ b/src/modules/evas/model_savers/obj/evas_model_save_obj.c
@@ -1 +1,137 @@
-//dummy of saver/loader
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <time.h>
+#include "stdio.h"
+#include "evas_common_private.h"
+#include "evas_private.h"
+
+#define OPEN_FILE(extension)\
+   int length=strlen(file);\
+   char * extension = "."#extension;\
+   char * _##extension##_file_name = (char *)malloc(length+4);\
+   strcpy(_##extension##_file_name,file);\
+   strcpy(_##extension##_file_name+length,extension);\
+   FILE * _##extension##_file = fopen(_##extension##_file_name, "w+");\
+   free(_##extension##_file_name);
+
+#define SAVE_GEOMETRICS(a, format)\
+   vb = &f->vertices[a];\
+   fprintf(_obj_file, "o %s\n",file);\
+   if (vb->data == NULL)\
+     {\
+        ERR("Reading of geometrics is failed.");\
+        fclose(_obj_file);\
+        return;\
+     }\
+   src = (float *)vb->data;\
+   for (i = 0; i < pd->vertex_count; i++)\
+     {\
+        fprintf(_obj_file, format, src[0], src[1], src[2]);\
+        src += f->vertices[a].element_count;\
+     }
+
+static void
+_save_mesh(Evas_3D_Mesh_Data *pd, const char *file, Evas_3D_Mesh_Frame *f)
+{
+   Evas_3D_Vertex_Buffer *vb;
+   time_t current_time;
+   char* c_time_string;
+   int    i;
+   float *src;
+
+   OPEN_FILE(obj)
+   if (!_obj_file)
+     {
+        ERR("File open '%s' for save failed", file);
+        return;
+     }
+   fprintf(_obj_file, "# Evas_3D saver OBJ v0.03 \n");//_obj_file created in 
macro
+   /* Adding time comment to .obj file. */
+   current_time = time(NULL);
+
+   if (current_time == ((time_t)-1))
+     {
+        ERR("Failure to compute the current time.");
+        fclose(_obj_file);
+        return;
+     }
+
+   c_time_string = ctime(&current_time);
+
+   if (c_time_string == NULL)
+     {
+        ERR("Failure to convert the current time.");
+        fclose(_obj_file);
+        return;
+     }
+
+   fprintf(_obj_file,"# Current time is %s \n", c_time_string);
+   fprintf(_obj_file,"mtllib %s.mtl \n\n", file);
+
+   /* Adding geometrics to file. */
+   if (f == NULL)
+     {
+        ERR("Not existing mesh frame.");
+        fclose(_obj_file);
+        return;
+     }
+
+   SAVE_GEOMETRICS(EVAS_3D_VERTEX_POSITION, "v %.4f %.4f %.4f \n")
+   SAVE_GEOMETRICS(EVAS_3D_VERTEX_NORMAL, "vn %.4f %.4f %.4f \n")
+   SAVE_GEOMETRICS(EVAS_3D_VERTEX_TEXCOORD, "vt %.4f %.4f %.4f \n")
+   fprintf(_obj_file,"usemtl Material\n s off\n");
+   for (i = 1; i <= pd->vertex_count; i++)//numeration of faces in .obj 
started from 1
+     {
+        fprintf(_obj_file,"f %i/%i/%i ", i, i, i);
+        i++;
+        fprintf(_obj_file,"%i/%i/%i ", i, i, i);
+        i++;
+        fprintf(_obj_file,"%i/%i/%i \n", i, i, i);
+     }
+   fclose(_obj_file);
+}
+
+static void
+_save_material(Evas_3D_Mesh_Data *pd EINA_UNUSED, const char *file, 
Evas_3D_Mesh_Frame *f)
+{
+   Evas_3D_Material_Data *mat = eo_data_scope_get(f->material, 
EVAS_3D_MATERIAL_CLASS);
+
+   OPEN_FILE(mtl)
+   if (!_mtl_file)
+     {
+        ERR("File open '%s' for save failed", file);
+        return;
+     }
+   fprintf(_mtl_file, "# Evas_3D saver OBJ v0.03 \n");//_mtl_file created in 
macro
+   fprintf(_mtl_file, "# Material Count: 1 \n\n");
+   fprintf(_mtl_file, "newmtl Material \n");
+   fprintf(_mtl_file, "Ns 1.000000 \n");//exp factor for specular highlight
+   fprintf(_mtl_file, "Ka %.6f %.6f %.6f \n",
+           (float)mat->attribs[EVAS_3D_MATERIAL_AMBIENT].color.r,
+           (float)mat->attribs[EVAS_3D_MATERIAL_AMBIENT].color.g,
+           (float)mat->attribs[EVAS_3D_MATERIAL_AMBIENT].color.b);
+   fprintf(_mtl_file, "Kd %.6f %.6f %.6f \n",
+           (float)mat->attribs[EVAS_3D_MATERIAL_DIFFUSE].color.r,
+           (float)mat->attribs[EVAS_3D_MATERIAL_DIFFUSE].color.g,
+           (float)mat->attribs[EVAS_3D_MATERIAL_DIFFUSE].color.b);
+   fprintf(_mtl_file, "Ks %.6f %.6f %.6f \n",
+           (float)mat->attribs[EVAS_3D_MATERIAL_SPECULAR].color.r,
+           (float)mat->attribs[EVAS_3D_MATERIAL_SPECULAR].color.g,
+           (float)mat->attribs[EVAS_3D_MATERIAL_SPECULAR].color.b);
+   fprintf(_mtl_file, "Ni 1.000000 \n");//optical density
+   fprintf(_mtl_file, "d 1.000000 \n");//a factor d of 1.0 is fully opaque 
material
+   fprintf(_mtl_file, "illum 2 \n");//illumination properties
+
+   fclose(_mtl_file);
+}
+
+void
+evas_3d_mesh_save_obj(Evas_3D_Mesh *mesh, const char *file, Evas_3D_Mesh_Frame 
*f)
+{
+   Evas_3D_Mesh_Data *pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
+   _save_mesh(pd, file, f);
+   _save_material(pd, file, f);
+}
diff --git a/src/modules/evas/model_savers/ply/evas_model_save_ply.c 
b/src/modules/evas/model_savers/ply/evas_model_save_ply.c
index 8940b65..a0ba945 100644
--- a/src/modules/evas/model_savers/ply/evas_model_save_ply.c
+++ b/src/modules/evas/model_savers/ply/evas_model_save_ply.c
@@ -1 +1,61 @@
-//dummy of saver/loader
+#ifdef HAVE_CONFIG_H
+# include "config.h"
+#endif
+
+#include <stdlib.h>
+#include <time.h>
+#include "stdio.h"
+#include "math.h"
+#include "evas_common_private.h"
+#include "evas_private.h"
+
+void
+evas_3d_mesh_save_ply(Evas_3D_Mesh *mesh, const char *file, Evas_3D_Mesh_Frame 
*f)
+{
+   float *src_pos, *src_nor, *src_tex, *src_col;
+   int    i;
+
+   Evas_3D_Mesh_Data *pd = eo_data_scope_get(mesh, EVAS_3D_MESH_CLASS);
+   FILE *_ply_file = fopen(file, "w+");
+   if (!_ply_file)
+     {
+        ERR("File open '%s' for save failed", file);
+        return;
+     }
+
+   fprintf(_ply_file,"ply\nformat ascii 1.0\ncomment Created by EFL 
evas_3d_mesh_saver_ply.c" \
+                      "version 1 (sub 0) - www.enlightenment.org, source file: 
''\n");
+   fprintf(_ply_file,"element vertex %d\n", pd->vertex_count);
+   fprintf(_ply_file,"property float x\nproperty float y\nproperty float z\n" \
+                     "property float nx\nproperty float ny\nproperty float 
nz\n" \
+                     "property float s\nproperty float t\n" \
+                     "property uchar red\nproperty uchar green\nproperty uchar 
blue\n");
+   fprintf(_ply_file,"element face %d\nproperty list uchar uint 
vertex_indices\nend_header\n",
+           pd->vertex_count / 3);
+
+   src_pos = (float*)(&f->vertices[EVAS_3D_VERTEX_POSITION])->data;
+   src_nor = (float*)(&f->vertices[EVAS_3D_VERTEX_NORMAL])->data;
+   src_tex = (float*)(&f->vertices[EVAS_3D_VERTEX_TEXCOORD])->data;
+   src_col = (float*)(&f->vertices[EVAS_3D_VERTEX_COLOR])->data;
+
+   for (i = 0; i < pd->vertex_count; i++)
+     {
+        fprintf(_ply_file,"%f %f %f %f %f %f %f %f %.0f %.0f %.0f\n",
+                src_pos[0], src_pos[1], src_pos[2],
+                src_nor[0], src_nor[1], src_nor[2],
+                src_tex[0], src_tex[1],
+                round(src_col[0] * 255), round(src_col[1] * 255), 
round(src_col[2] * 255));
+        src_pos += 3;
+        src_nor += 3;
+        src_tex += 2;
+        src_col += 4;
+     }
+
+   for (i = 0; i < pd->vertex_count;)
+     {
+        fprintf(_ply_file,"3 %d %d %d\n", i, i + 1, i + 2);
+        i += 3;
+     }
+
+   fclose(_ply_file);
+}

-- 


Reply via email to