hermet pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=32c405f8fae84b713e9d39b355fdd52a131e17a7
commit 32c405f8fae84b713e9d39b355fdd52a131e17a7 Author: perepelits.m <perepelit...@samsung.com> Date: Mon Aug 31 19:04:26 2015 +0900 [Evas] Counting of tangent space (fix) Summary: It is counting here, so we can avoid using glsl functions dFdx, dFdy. Reviewers: cedric, raster, Hermet Subscribers: Oleksander, cedric, artem.popov Differential Revision: https://phab.enlightenment.org/D2923 --- src/lib/evas/canvas/evas_canvas3d_node.c | 53 ++++++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) diff --git a/src/lib/evas/canvas/evas_canvas3d_node.c b/src/lib/evas/canvas/evas_canvas3d_node.c index 707625c..03f985d 100644 --- a/src/lib/evas/canvas/evas_canvas3d_node.c +++ b/src/lib/evas/canvas/evas_canvas3d_node.c @@ -1029,8 +1029,61 @@ _node_is_visible(Evas_Canvas3D_Node *node EINA_UNUSED, Evas_Canvas3D_Node *camer Eina_Bool evas_canvas3d_node_mesh_collect(Evas_Canvas3D_Node *node, void *data) { + Eina_List *list_meshes, *l; + Evas_Canvas3D_Mesh *mesh = NULL; + Evas_Canvas3D_Mesh_Data *mesh_pd; + Evas_Canvas3D_Mesh_Frame *f; Evas_Canvas3D_Scene_Public_Data *scene_data = (Evas_Canvas3D_Scene_Public_Data *)data; Evas_Canvas3D_Node_Data *pd = eo_data_scope_get(node, MY_CLASS); + unsigned short int *index; + int stride, tex_stride, normal_stride; + + if (pd->type == EVAS_CANVAS3D_NODE_TYPE_MESH) + { + scene_data->mesh_nodes = eina_list_append(scene_data->mesh_nodes, node); + + /* calculation of tangent space for all meshes */ + eo_do (node, list_meshes = (Eina_List *)evas_canvas3d_node_mesh_list_get()); + EINA_LIST_FOREACH(list_meshes, l, mesh) + { + mesh_pd = eo_data_scope_get(mesh, MY_CLASS); + f = evas_canvas3d_mesh_frame_find(mesh_pd, 0); + if (f == NULL) + ERR("Not existing mesh frame."); + + float *tangent_data = (float *)f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_TANGENT].data; + if (!tangent_data && ((mesh_pd->shade_mode == EVAS_CANVAS3D_SHADE_MODE_NORMAL_MAP) || + (mesh_pd->shade_mode == EVAS_CANVAS3D_SHADE_MODE_PARALLAX_OCCLUSION))) + { + index = (unsigned short int *)mesh_pd->indices; + tangent_data = (float*) malloc((3 * mesh_pd->vertex_count) * sizeof(float)); + + float *vertex_data = (float *)f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].data; + if (f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].stride != 0) + stride = f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_POSITION].stride / sizeof(float); + else + stride = 3; + + float *tex_data = (float *)f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_TEXCOORD].data; + if (f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_TEXCOORD].stride != 0) + tex_stride = f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_TEXCOORD].stride / sizeof(float); + else + tex_stride = 2; + + float *normal_data = (float *)f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_NORMAL].data; + if (f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_NORMAL].stride != 0) + normal_stride = f->vertices[EVAS_CANVAS3D_VERTEX_ATTRIB_NORMAL].stride / sizeof(float); + else + normal_stride = 2; + + evas_tangent_space_get(vertex_data, tex_data, normal_data, index, mesh_pd->vertex_count, + mesh_pd->index_count, stride, tex_stride, normal_stride, &tangent_data); + + eo_do(mesh, evas_canvas3d_mesh_frame_vertex_data_copy_set(0, EVAS_CANVAS3D_VERTEX_ATTRIB_TANGENT, 3 * sizeof(float), tangent_data)); + free(tangent_data); + } + } + } if (!_node_is_visible(node, scene_data->camera_node)) { /* Skip entire sub-tree of this node. */ --