edje: parts with bodies aren't move at each recalc

Otherwise at each recalc they will be moved to initial position
again.



SVN revision: 80275
This commit is contained in:
Bruno Dilly 2012-12-05 19:29:33 +00:00
parent f9293909d9
commit 3038f33e82
4 changed files with 107 additions and 62 deletions

View File

@ -6,7 +6,6 @@ collections {
group {
name: "example_group";
min: 100 100;
parts {
part {

View File

@ -2433,6 +2433,88 @@ _edje_real_part_state_get(Edje *ed, Edje_Real_Part *ep, int flags, int id, int *
return result;
}
#ifdef HAVE_EPHYSICS
static Eina_Bool
_edje_physics_world_geometry_check(EPhysics_World *world)
{
Evas_Coord w, h, d;
ephysics_world_render_geometry_get(world, NULL, NULL, NULL, &w, &h, &d);
return (w && h && d);
}
static void
_edje_physics_body_props_update(Edje_Real_Part *ep, Edje_Calc_Params *pf)
{
/* Boundaries geometry and mass shouldn't be changed */
if (ep->part->physics_body < EDJE_PART_PHYSICS_BODY_BOUNDARY_TOP)
{
Evas_Coord z;
ephysics_body_geometry_get(ep->body, NULL, NULL, &z, NULL, NULL, NULL);
ephysics_body_move(ep->body, ep->edje->x + pf->x, ep->edje->y + pf->y,
z);
ephysics_body_mass_set(ep->body, pf->physics.mass);
}
ephysics_body_restitution_set(ep->body, pf->physics.restitution);
ephysics_body_friction_set(ep->body, pf->physics.friction);
}
static void
_edje_physics_body_add(Edje_Real_Part *rp, EPhysics_World *world)
{
Eina_Bool resize = EINA_TRUE;
switch (rp->part->physics_body)
{
case EDJE_PART_PHYSICS_BODY_RIGID_BOX:
rp->body = ephysics_body_box_add(world);
break;
case EDJE_PART_PHYSICS_BODY_RIGID_CIRCLE:
rp->body = ephysics_body_circle_add(world);
break;
case EDJE_PART_PHYSICS_BODY_SOFT_BOX:
rp->body = ephysics_body_soft_box_add(world);
break;
case EDJE_PART_PHYSICS_BODY_SOFT_CIRCLE:
rp->body = ephysics_body_soft_circle_add(world);
break;
case EDJE_PART_PHYSICS_BODY_CLOTH:
rp->body = ephysics_body_cloth_add(world, 0, 0);
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_TOP:
rp->body = ephysics_body_top_boundary_add(world);
resize = EINA_FALSE;
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_BOTTOM:
rp->body = ephysics_body_bottom_boundary_add(world);
resize = EINA_FALSE;
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_RIGHT:
rp->body = ephysics_body_right_boundary_add(world);
resize = EINA_FALSE;
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_LEFT:
rp->body = ephysics_body_left_boundary_add(world);
resize = EINA_FALSE;
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_FRONT:
rp->body = ephysics_body_front_boundary_add(world);
resize = EINA_FALSE;
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_BACK:
rp->body = ephysics_body_back_boundary_add(world);
resize = EINA_FALSE;
break;
default:
ERR("Invalid body: %i", rp->part->physics_body);
return;
}
ephysics_body_evas_object_set(rp->body, rp->object, resize);
}
#endif
void
_edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *state)
{
@ -2991,8 +3073,14 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
if (!pf->visible)
{
evas_object_hide(ep->object);
#ifdef HAVE_EPHYSICS
/* body attributes should be updated for invisible objects */
}
else
#else
break;
}
#endif
evas_object_show(ep->object);
/* move and resize are needed for all previous object => no break here. */
case EDJE_PART_TYPE_SWALLOW:
@ -3000,17 +3088,20 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
case EDJE_PART_TYPE_EXTERNAL:
/* visibility and color have no meaning on SWALLOW and GROUP part. */
#ifdef HAVE_EPHYSICS
if (ep->body)
if ((ep->part->physics_body) && (!ep->body))
{
Evas_Coord z;
ephysics_body_geometry_get(ep->body, NULL, NULL, &z,
NULL, NULL, NULL);
ephysics_body_move(ep->body,
ed->x + pf->x, ed->y + pf->y, z);
ephysics_body_mass_set(ep->body, pf->physics.mass);
ephysics_body_restitution_set(ep->body,
pf->physics.restitution);
ephysics_body_friction_set(ep->body, pf->physics.friction);
if (_edje_physics_world_geometry_check(ep->edje->world))
{
_edje_physics_body_add(ep, ep->edje->world);
_edje_physics_body_props_update(ep, pf);
}
}
else if (ep->body)
{
if (((ep->prev_description) &&
(chosen_desc != ep->prev_description)) ||
(pf != p1))
_edje_physics_body_props_update(ep, pf);
}
else
#endif
@ -3197,6 +3288,11 @@ _edje_part_recalc(Edje *ed, Edje_Real_Part *ep, int flags, Edje_Calc_Params *sta
ep->calculated |= flags;
ep->calculating = FLAG_NONE;
#ifdef HAVE_EPHYSICS
ep->prev_description = chosen_desc;
#endif
#ifdef EDJE_CALC_CACHE
if (ep->calculated == FLAG_XY)
{

View File

@ -341,53 +341,6 @@ _edje_programs_patterns_init(Edje *ed)
ssp->sources_patterns = edje_match_programs_source_init(all, j);
}
#ifdef HAVE_EPHYSICS
static void
_edje_physics_body_add(Edje_Real_Part *rp, EPhysics_World *world)
{
switch (rp->part->physics_body)
{
case EDJE_PART_PHYSICS_BODY_RIGID_BOX:
rp->body = ephysics_body_box_add(world);
break;
case EDJE_PART_PHYSICS_BODY_RIGID_CIRCLE:
rp->body = ephysics_body_circle_add(world);
break;
case EDJE_PART_PHYSICS_BODY_SOFT_BOX:
rp->body = ephysics_body_soft_box_add(world);
break;
case EDJE_PART_PHYSICS_BODY_SOFT_CIRCLE:
rp->body = ephysics_body_soft_circle_add(world);
break;
case EDJE_PART_PHYSICS_BODY_CLOTH:
rp->body = ephysics_body_cloth_add(world, 0, 0);
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_TOP:
rp->body = ephysics_body_top_boundary_add(world);
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_BOTTOM:
rp->body = ephysics_body_bottom_boundary_add(world);
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_RIGHT:
rp->body = ephysics_body_right_boundary_add(world);
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_LEFT:
rp->body = ephysics_body_left_boundary_add(world);
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_FRONT:
rp->body = ephysics_body_front_boundary_add(world);
break;
case EDJE_PART_PHYSICS_BODY_BOUNDARY_BACK:
rp->body = ephysics_body_back_boundary_add(world);
break;
default:
ERR("Invalid body: %i", rp->part->physics_body);
return;
}
ephysics_body_evas_object_set(rp->body, rp->object, EINA_TRUE);
}
#endif
int
_edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *group, const char *parent, Eina_List *group_path, Eina_Array *nested)
{
@ -728,10 +681,6 @@ _edje_object_file_set_internal(Evas_Object *obj, const char *file, const char *g
if (rp->part->clip_to_id < 0)
evas_object_clip_set(rp->object, ed->base->clipper);
}
#ifdef HAVE_EPHYSICS
if (ep->physics_body)
_edje_physics_body_add(rp, ed->world);
#endif
}
if (n > 0)
{

View File

@ -1412,6 +1412,7 @@ struct _Edje_Real_Part
Edje_Real_Part *clip_to; // 4
Edje_Running_Program *program; // 4
#ifdef HAVE_EPHYSICS
Edje_Part_Description_Common *prev_description; // 4
EPhysics_Body *body; // 4
#endif
union {