cedric pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=720a3726e988d5a2293836a816a1c10254246c89
commit 720a3726e988d5a2293836a816a1c10254246c89 Author: Dmytro Dadyka <d.dad...@samsung.com> Date: Wed Dec 3 09:48:55 2014 +0100 Evas: Evas_3D - Add check of visibilty node. If the node is not visible, it is not rendered, which improves performance. @feature. Reviewers: raster, Hermet, cedric Reviewed By: cedric Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D1722 Signed-off-by: Cedric BAIL <ced...@osg.samsung.com> --- src/modules/evas/engines/gl_common/evas_gl_3d.c | 88 ++++++++++++++----------- 1 file changed, 51 insertions(+), 37 deletions(-) diff --git a/src/modules/evas/engines/gl_common/evas_gl_3d.c b/src/modules/evas/engines/gl_common/evas_gl_3d.c index 7b19939..ac17007 100644 --- a/src/modules/evas/engines/gl_common/evas_gl_3d.c +++ b/src/modules/evas/engines/gl_common/evas_gl_3d.c @@ -1239,6 +1239,7 @@ void _shadowmap_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_S Evas_3D_Node *n; Evas_3D_Shade_Mode shade_mode; Evas_Color c = {1.0, 1.0, 1.0}; + Evas_Mat4 matrix_vp; glEnable(GL_POLYGON_OFFSET_FILL); glPolygonOffset(4.0, 10000.0); @@ -1249,6 +1250,10 @@ void _shadowmap_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_S Evas_3D_Node_Data *pd_light_node = eo_data_scope_get(light, EVAS_3D_NODE_CLASS); Evas_3D_Light_Data *pd = eo_data_scope_get(pd_light_node->data.light.light, EVAS_3D_LIGHT_CLASS); + Evas_Vec4 planes[6]; + evas_mat4_multiply(&matrix_vp, &pd->projection, matrix_light_eye); + evas_frustum_calculate(planes, &matrix_vp); + EINA_LIST_FOREACH(data->mesh_nodes, l, n) { Evas_Mat4 matrix_mv; @@ -1257,23 +1262,27 @@ void _shadowmap_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3D_S void *ptr; Evas_3D_Node_Data *pd_mesh_node = eo_data_scope_get(n, EVAS_3D_NODE_CLASS); - evas_mat4_multiply(&matrix_mv, matrix_light_eye, &pd_mesh_node->data.mesh.matrix_local_to_world); - evas_mat4_multiply(&matrix_mvp, &pd->projection, + + if (evas_is_sphere_in_frustum(&pd_mesh_node->bsphere, planes)) + { + + evas_mat4_multiply(&matrix_mv, matrix_light_eye, &pd_mesh_node->data.mesh.matrix_local_to_world); + evas_mat4_multiply(&matrix_mvp, &pd->projection, &matrix_mv); - it = eina_hash_iterator_data_new(pd_mesh_node->data.mesh.node_meshes); + it = eina_hash_iterator_data_new(pd_mesh_node->data.mesh.node_meshes); - while (eina_iterator_next(it, &ptr)) - { - Evas_3D_Node_Mesh *nm = (Evas_3D_Node_Mesh *)ptr; - Evas_3D_Mesh_Data *pdmesh = eo_data_scope_get(nm->mesh, EVAS_3D_MESH_CLASS); - shade_mode = pdmesh->shade_mode; - pdmesh->shade_mode = EVAS_3D_SHADE_MODE_SHADOW_MAP_RENDER; - _mesh_draw(renderer, nm->mesh, nm->frame, light, matrix_light_eye, &matrix_mv, &matrix_mvp, &matrix_mvp); - pdmesh->shade_mode = shade_mode; + while (eina_iterator_next(it, &ptr)) + { + Evas_3D_Node_Mesh *nm = (Evas_3D_Node_Mesh *)ptr; + Evas_3D_Mesh_Data *pdmesh = eo_data_scope_get(nm->mesh, EVAS_3D_MESH_CLASS); + shade_mode = pdmesh->shade_mode; + pdmesh->shade_mode = EVAS_3D_SHADE_MODE_SHADOW_MAP_RENDER; + _mesh_draw(renderer, nm->mesh, nm->frame, light, matrix_light_eye, &matrix_mv, &matrix_mvp, &matrix_mvp); + pdmesh->shade_mode = shade_mode; + } + eina_iterator_free(it); } - - eina_iterator_free(it); } glDisable(GL_POLYGON_OFFSET_FILL); @@ -1287,9 +1296,10 @@ e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3 Evas_3D_Node *n; const Evas_Mat4 *matrix_eye; Evas_3D_Node *light; - Evas_Mat4 matrix_light_eye; + Evas_Mat4 matrix_light_eye, matrix_vp;; Evas_3D_Light_Data *ld = NULL; Evas_3D_Node_Data *pd_light_node; + Evas_Vec4 planes[6]; /* Get eye matrix. */ Evas_3D_Node_Data *pd_camera_node = eo_data_scope_get(data->camera_node, EVAS_3D_NODE_CLASS); @@ -1311,6 +1321,9 @@ e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3 /* Set up render target. */ e3d_renderer_target_set(renderer, drawable); e3d_renderer_clear(renderer, &data->bg_color); + + evas_mat4_multiply(&matrix_vp, &pd->projection, matrix_eye); + evas_frustum_calculate(planes, &matrix_vp); EINA_LIST_FOREACH(data->mesh_nodes, l, n) { Evas_Mat4 matrix_mv; @@ -1320,36 +1333,37 @@ e3d_drawable_scene_render(E3D_Drawable *drawable, E3D_Renderer *renderer, Evas_3 void *ptr; Evas_3D_Node_Data *pd_mesh_node = eo_data_scope_get(n, EVAS_3D_NODE_CLASS); - if (data->shadows_enabled) + // TODO Add other frustum shapes + if (evas_is_sphere_in_frustum(&pd_mesh_node->bsphere, planes)) { - evas_mat4_multiply(&matrix_mv, &matrix_light_eye, - &pd_mesh_node->data.mesh.matrix_local_to_world); - if (ld) - evas_mat4_multiply(&matrix_light, &ld->projection, - &matrix_mv); - } - evas_mat4_multiply(&matrix_mv, matrix_eye, &pd_mesh_node->data.mesh.matrix_local_to_world); - evas_mat4_multiply(&matrix_mvp, &pd->projection, - &matrix_mv); + if (data->shadows_enabled) + { + evas_mat4_multiply(&matrix_mv, &matrix_light_eye, + &pd_mesh_node->data.mesh.matrix_local_to_world); + evas_mat4_multiply(&matrix_light, &ld->projection, + &matrix_mv); + } - it = eina_hash_iterator_data_new(pd_mesh_node->data.mesh.node_meshes); + evas_mat4_multiply(&matrix_mv, matrix_eye, &pd_mesh_node->data.mesh.matrix_local_to_world); + evas_mat4_multiply(&matrix_mvp, &pd->projection, + &matrix_mv); - while (eina_iterator_next(it, &ptr)) - { - Evas_3D_Node_Mesh *nm = (Evas_3D_Node_Mesh *)ptr; - Evas_3D_Mesh_Data *pdmesh = eo_data_scope_get(nm->mesh, EVAS_3D_MESH_CLASS); - if (data->shadows_enabled) + it = eina_hash_iterator_data_new(pd_mesh_node->data.mesh.node_meshes); + while (eina_iterator_next(it, &ptr)) { - pdmesh->shadowed = EINA_TRUE; - _mesh_draw(renderer, nm->mesh, nm->frame, light, matrix_eye, &matrix_mv, &matrix_mvp, &matrix_light); - pdmesh->shadowed = EINA_FALSE; + Evas_3D_Node_Mesh *nm = (Evas_3D_Node_Mesh *)ptr; + Evas_3D_Mesh_Data *pdmesh = eo_data_scope_get(nm->mesh, EVAS_3D_MESH_CLASS); + if (data->shadows_enabled) + { + pdmesh->shadowed = EINA_TRUE; + _mesh_draw(renderer, nm->mesh, nm->frame, light, matrix_eye, &matrix_mv, &matrix_mvp, &matrix_light); + pdmesh->shadowed = EINA_FALSE; + } + else _mesh_draw(renderer, nm->mesh, nm->frame, light, matrix_eye, &matrix_mv, &matrix_mvp, NULL); } - else _mesh_draw(renderer, nm->mesh, nm->frame, light, matrix_eye, &matrix_mv, &matrix_mvp, NULL); + eina_iterator_free(it); } - - eina_iterator_free(it); } - e3d_renderer_flush(renderer); } --