forked from enlightenment/efl
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>
This commit is contained in:
parent
2e3b9ea589
commit
d45d7d3f22
|
@ -499,7 +499,9 @@ typedef enum _Evas_3D_State
|
||||||
EVAS_3D_STATE_LIGHT_ATTENUATION,
|
EVAS_3D_STATE_LIGHT_ATTENUATION,
|
||||||
EVAS_3D_STATE_LIGHT_PROJECTION,
|
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_GEOMETRY,
|
||||||
EVAS_3D_STATE_NODE_MESH_MATERIAL,
|
EVAS_3D_STATE_NODE_MESH_MATERIAL,
|
||||||
EVAS_3D_STATE_NODE_MESH_FRAME,
|
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_MESH_MATERIAL_ID,
|
||||||
EVAS_3D_STATE_NODE_LIGHT,
|
EVAS_3D_STATE_NODE_LIGHT,
|
||||||
EVAS_3D_STATE_NODE_CAMERA,
|
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_NODE_MEMBER,
|
||||||
} Evas_3D_State;
|
} Evas_3D_State;
|
||||||
|
|
||||||
|
|
|
@ -59,6 +59,10 @@ _evas_3d_node_evas_3d_object_change_notify(Eo *obj, Evas_3D_Node_Data *pd, Evas_
|
||||||
{
|
{
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
Evas_3D_Node *n;
|
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. */
|
/* Notify all scenes using this node that it has changed. */
|
||||||
if (pd->scenes_root)
|
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)
|
if (pd->scenes_camera)
|
||||||
eina_hash_foreach(pd->scenes_camera, _node_scene_camera_change_notify, obj);
|
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. */
|
/* 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));
|
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. */
|
/* Notify members that the parent has changed. */
|
||||||
EINA_LIST_FOREACH(pd->members, l, n)
|
if (scale)
|
||||||
{
|
EINA_LIST_FOREACH(pd->members, l, n)
|
||||||
eo_do(n, evas_3d_object_change(EVAS_3D_STATE_NODE_PARENT, obj));
|
{
|
||||||
}
|
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
|
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;
|
Eina_Bool transform_dirty = EINA_FALSE, parent_dirty = EINA_FALSE;
|
||||||
|
|
||||||
eo_do(node,
|
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_ORIENTATION),
|
||||||
parent_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_PARENT));
|
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)
|
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 transform_dirty = EINA_FALSE, mesh_geom_dirty = EINA_FALSE;
|
||||||
Eina_Bool mesh_frame_dirty = EINA_FALSE, member_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 frame_found = EINA_FALSE, is_change_orientation = EINA_FALSE;
|
||||||
Eina_Bool parent_dirty = EINA_FALSE;
|
|
||||||
const Eina_List *m, *l;
|
const Eina_List *m, *l;
|
||||||
Evas_3D_Mesh *mesh;
|
Evas_3D_Mesh *mesh;
|
||||||
int frame, count, size, i, j;
|
int frame, count, size, i, j;
|
||||||
|
@ -215,17 +244,20 @@ _node_aabb_update(Evas_3D_Node *node, void *data EINA_UNUSED)
|
||||||
Evas_Box3 box3;
|
Evas_Box3 box3;
|
||||||
|
|
||||||
eo_do(node,
|
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_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),
|
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));
|
member_dirty = evas_3d_object_dirty_get(EVAS_3D_STATE_NODE_MEMBER));
|
||||||
|
|
||||||
if (transform_dirty ||
|
if (transform_dirty ||
|
||||||
mesh_geom_dirty ||
|
mesh_geom_dirty ||
|
||||||
mesh_frame_dirty ||
|
mesh_frame_dirty ||
|
||||||
member_dirty ||
|
member_dirty)
|
||||||
parent_dirty)
|
|
||||||
{
|
{
|
||||||
if (pd->type == EVAS_3D_NODE_TYPE_MESH)
|
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;
|
pdmember->parent = obj;
|
||||||
|
|
||||||
/* Mark changed. */
|
/* 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(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
|
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. */
|
/* Mark modified object as changed. */
|
||||||
eo_do(obj, evas_3d_object_change(EVAS_3D_STATE_NODE_MEMBER, 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, 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. */
|
/* Decrease reference count. */
|
||||||
eo_unref(member);
|
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.y = y;
|
||||||
pd->position.z = z;
|
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
|
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.z = z;
|
||||||
pd->orientation.w = w;
|
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
|
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.y = s * axis.y;
|
||||||
pd->orientation.z = s * axis.z;
|
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
|
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.y = y;
|
||||||
pd->scale.z = z;
|
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
|
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)
|
_evas_3d_node_position_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit)
|
||||||
{
|
{
|
||||||
pd->position_inherit = 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
|
EOLIAN static void
|
||||||
_evas_3d_node_orientation_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit)
|
_evas_3d_node_orientation_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit)
|
||||||
{
|
{
|
||||||
pd->orientation_inherit = 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
|
EOLIAN static void
|
||||||
_evas_3d_node_scale_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit)
|
_evas_3d_node_scale_inherit_set(Eo *obj, Evas_3D_Node_Data *pd, Eina_Bool inherit)
|
||||||
{
|
{
|
||||||
pd->scale_inherit = 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
|
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;
|
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
|
EOLIAN static void
|
||||||
|
|
Loading…
Reference in New Issue