summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmytro Dadyka <d.dadyka@dmail.com>2015-02-05 15:32:11 +0100
committerCedric BAIL <cedric@osg.samsung.com>2015-02-09 22:03:26 +0100
commitd45d7d3f224e00f3f4bf56c0f1e06910aa9c2d61 (patch)
tree6ae57fb68287cbbe2fea0da1d612191084bce47e
parent2e3b9ea589afdcba13d62e04fbc552b1e6c5f12e (diff)
downloadefl-d45d7d3f224e00f3f4bf56c0f1e06910aa9c2d61.tar.gz
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 <cedric@osg.samsung.com>
-rw-r--r--src/lib/evas/Evas_Eo.h8
-rw-r--r--src/lib/evas/canvas/evas_3d_node.c80
2 files changed, 64 insertions, 24 deletions
diff --git a/src/lib/evas/Evas_Eo.h b/src/lib/evas/Evas_Eo.h
index 088f15fb6b..39c568ba4a 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 ed47791ad5..a5355ed4ec 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