From d45d7d3f224e00f3f4bf56c0f1e06910aa9c2d61 Mon Sep 17 00:00:00 2001 From: Dmytro Dadyka Date: Thu, 5 Feb 2015 15:32:11 +0100 Subject: [PATCH] evas: Evas_3D - improve node tree update method. Reviewers: cedric Reviewed By: cedric Subscribers: cedric Differential Revision: https://phab.enlightenment.org/D1862 Signed-off-by: Cedric BAIL --- src/lib/evas/Evas_Eo.h | 8 +++- src/lib/evas/canvas/evas_3d_node.c | 80 +++++++++++++++++++++++++++----------- 2 files changed, 64 insertions(+), 24 deletions(-) diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h index 088f15f..39c568b 100644 --- a/src/lib/evas/Evas_Eo.h +++ b/src/lib/evas/Evas_Eo.h @@ -499,7 +499,9 @@ typedef enum _Evas_3D_State EVAS_3D_STATE_LIGHT_ATTENUATION, EVAS_3D_STATE_LIGHT_PROJECTION, - EVAS_3D_STATE_NODE_TRANSFORM = 1, + EVAS_3D_STATE_NODE_TRANSFORM_POSITION = 1, + EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION, + EVAS_3D_STATE_NODE_TRANSFORM_SCALE, EVAS_3D_STATE_NODE_MESH_GEOMETRY, EVAS_3D_STATE_NODE_MESH_MATERIAL, EVAS_3D_STATE_NODE_MESH_FRAME, @@ -507,7 +509,9 @@ typedef enum _Evas_3D_State EVAS_3D_STATE_NODE_MESH_MATERIAL_ID, EVAS_3D_STATE_NODE_LIGHT, EVAS_3D_STATE_NODE_CAMERA, - EVAS_3D_STATE_NODE_PARENT, + EVAS_3D_STATE_NODE_PARENT_POSITION, + EVAS_3D_STATE_NODE_PARENT_ORIENTATION, + EVAS_3D_STATE_NODE_PARENT_SCALE, EVAS_3D_STATE_NODE_MEMBER, } Evas_3D_State; diff --git a/src/lib/evas/canvas/evas_3d_node.c b/src/lib/evas/canvas/evas_3d_node.c index ed47791..a5355ed 100644 --- a/src/lib/evas/canvas/evas_3d_node.c +++ b/src/lib/evas/canvas/evas_3d_node.c @@ -59,6 +59,10 @@ _evas_3d_node_evas_3d_object_change_notify(Eo *obj, Evas_3D_Node_Data *pd, Evas_ { Eina_List *l; Evas_3D_Node *n; + Eina_Bool orientation; + Eina_Bool position; + Eina_Bool scale; + Eina_Bool parent_change; /* Notify all scenes using this node that it has changed. */ if (pd->scenes_root) @@ -67,17 +71,39 @@ _evas_3d_node_evas_3d_object_change_notify(Eo *obj, Evas_3D_Node_Data *pd, Evas_ if (pd->scenes_camera) eina_hash_foreach(pd->scenes_camera, _node_scene_camera_change_notify, obj); + parent_change = (state == EVAS_3D_STATE_NODE_PARENT_ORIENTATION) + || (state == EVAS_3D_STATE_NODE_PARENT_POSITION) + || (state == EVAS_3D_STATE_NODE_PARENT_SCALE); + /* Notify parent that a member has changed. */ - if (pd->parent) + if (pd->parent && !parent_change) { eo_do(pd->parent, evas_3d_object_change(EVAS_3D_STATE_NODE_MEMBER, obj)); } + orientation = (state == EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION) + || (state == EVAS_3D_STATE_NODE_PARENT_ORIENTATION); + position = (state == EVAS_3D_STATE_NODE_TRANSFORM_POSITION) + || (state == EVAS_3D_STATE_NODE_PARENT_POSITION); + scale = (state == EVAS_3D_STATE_NODE_TRANSFORM_SCALE) + || (state == EVAS_3D_STATE_NODE_PARENT_SCALE); + /* Notify members that the parent has changed. */ - EINA_LIST_FOREACH(pd->members, l, n) - { - eo_do(n, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT, obj)); - } + if (scale) + EINA_LIST_FOREACH(pd->members, l, n) + { + eo_do(n, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_SCALE, obj)); + } + if (orientation) + EINA_LIST_FOREACH(pd->members, l, n) + { + eo_do(n, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_ORIENTATION, obj)); + } + if (position) + EINA_LIST_FOREACH(pd->members, l, n) + { + eo_do(n, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_POSITION, obj)); + } } static Eina_Bool @@ -87,8 +113,12 @@ _node_transform_update(Evas_3D_Node *node, void *data EINA_UNUSED) Eina_Bool transform_dirty = EINA_FALSE, parent_dirty = EINA_FALSE; eo_do(node, - transform_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM), - parent_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT)); + transform_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION), + transform_dirty|= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_POSITION), + transform_dirty|= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_SCALE), + parent_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_ORIENTATION), + parent_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_POSITION), + parent_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_SCALE)); if (transform_dirty || parent_dirty) { @@ -204,7 +234,6 @@ _node_aabb_update(Evas_3D_Node *node, void *data EINA_UNUSED) Eina_Bool transform_dirty = EINA_FALSE, mesh_geom_dirty = EINA_FALSE; Eina_Bool mesh_frame_dirty = EINA_FALSE, member_dirty = EINA_FALSE; Eina_Bool frame_found = EINA_FALSE, is_change_orientation = EINA_FALSE; - Eina_Bool parent_dirty = EINA_FALSE; const Eina_List *m, *l; Evas_3D_Mesh *mesh; int frame, count, size, i, j; @@ -215,17 +244,20 @@ _node_aabb_update(Evas_3D_Node *node, void *data EINA_UNUSED) Evas_Box3 box3; eo_do(node, - transform_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM), + transform_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_POSITION), + transform_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION), + transform_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_TRANSFORM_SCALE), + transform_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_ORIENTATION), + transform_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_POSITION), + transform_dirty |= evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT_SCALE), mesh_geom_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_MESH_GEOMETRY), mesh_frame_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_MESH_FRAME), - parent_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT), member_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_MEMBER)); if (transform_dirty || mesh_geom_dirty || mesh_frame_dirty || - member_dirty || - parent_dirty) + member_dirty) { if (pd->type == EVAS_3D_NODE_TYPE_MESH) { @@ -854,8 +886,10 @@ _evas_3d_node_member_add(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Node *member) pdmember->parent = obj; /* Mark changed. */ - eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT, NULL)); eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_MEMBER, NULL)); + eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_ORIENTATION, NULL)); + eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_POSITION, NULL)); + eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_SCALE, NULL)); } EOLIAN static void @@ -874,7 +908,9 @@ _evas_3d_node_member_del(Eo *obj, Evas_3D_Node_Data *pd, Evas_3D_Node *member) /* Mark modified object as changed. */ eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_MEMBER, NULL)); - eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT, NULL)); + eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_ORIENTATION, NULL)); + eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_POSITION, NULL)); + eo_do(member, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT_SCALE, NULL)); /* Decrease reference count. */ eo_unref(member); @@ -899,7 +935,7 @@ _evas_3d_node_position_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real x, Evas_Rea pd->position.y = y; pd->position.z = z; - eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_POSITION, NULL)); } EOLIAN static void @@ -910,7 +946,7 @@ _evas_3d_node_orientation_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real x, Evas_ pd->orientation.z = z; pd->orientation.w = w; - eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION, NULL)); } EOLIAN static void @@ -929,7 +965,7 @@ _evas_3d_node_orientation_angle_axis_set(Eo *obj, Evas_3D_Node_Data *pd, pd->orientation.y = s * axis.y; pd->orientation.z = s * axis.z; - eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION, NULL)); } EOLIAN static void @@ -939,7 +975,7 @@ _evas_3d_node_scale_set(Eo *obj, Evas_3D_Node_Data *pd, Evas_Real x, Evas_Real y pd->scale.y = y; pd->scale.z = z; - eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_SCALE, NULL)); } EOLIAN static void @@ -1028,21 +1064,21 @@ EOLIAN static void _evas_3d_node_position_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit) { pd->position_inherit = inherit; - eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_POSITION, NULL)); } EOLIAN static void _evas_3d_node_orientation_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit) { pd->orientation_inherit = inherit; - eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION, NULL)); } EOLIAN static void _evas_3d_node_scale_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit) { pd->scale_inherit = inherit; - eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_SCALE, NULL)); } EOLIAN static Eina_Bool @@ -1170,7 +1206,7 @@ _evas_3d_node_look_at_set(Eo *obj, Evas_3D_Node_Data *pd, pd->orientation.y = (y.z + z.y) * s; } - eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM, NULL)); + eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_TRANSFORM_ORIENTATION, NULL)); } EOLIAN static void -- 2.7.4