EPhysics: soft body members stacking

Using evas stacking for soft body slices members.


Patch by: Leandro Dorileo <dorileo@profusion.mobi>



SVN revision: 77677
This commit is contained in:
Leandro Dorileo 2012-10-09 20:00:03 +00:00 committed by Bruno Dilly
parent 6f9e9a67f7
commit 179efa1d66
1 changed files with 37 additions and 4 deletions

View File

@ -36,6 +36,7 @@ typedef struct _EPhysics_Body_Soft_Body_Slice
{
int index;
Evas_Object *evas_obj;
int stacking;
} EPhysics_Body_Soft_Body_Slice;
static const Evas_Smart_Cb_Description _smart_callbacks[] =
@ -62,6 +63,23 @@ EVAS_SMART_SUBCLASS_NEW(SMART_CLASS_NAME,
Evas_Smart_Class, evas_object_smart_clipped_class_get,
_smart_callbacks);
static int
_ephysics_body_soft_body_slice_stacking_sort_cb(const void *d1, const void *d2)
{
const EPhysics_Body_Soft_Body_Slice *slice1, *slice2;
slice1 = (const EPhysics_Body_Soft_Body_Slice *)d1;
slice2 = (const EPhysics_Body_Soft_Body_Slice *)d2;
if (!slice1) return 1;
if (!slice2) return -1;
if (slice1->stacking < slice2->stacking) return -1;
if (slice2->stacking > slice2->stacking) return 1;
return 0;
}
static void
_ephysics_body_soft_body_slices_apply(Evas_Object *obj)
{
@ -75,7 +93,7 @@ _ephysics_body_soft_body_slices_apply(Evas_Object *obj)
EPhysics_Body_Soft_Body_Slice *slice;
EPhysics_Body_Soft_Body_Smart_Data *smart_data;
EPhysics_Body *body;
short z_factor;
Evas_Object *prev_obj = NULL;
EPHYSICS_BODY_SOFT_BODY_SMART_DATA_GET(obj, smart_data);
body = smart_data->body;
@ -103,10 +121,8 @@ _ephysics_body_soft_body_slices_apply(Evas_Object *obj)
z1 = p1.z() * rate;
z2 = p2.z() * rate;
z_factor = p0.z() + p1.z() + p2.z();
z_factor = (z_factor < 0) ? -z_factor : z_factor;
slice->stacking = p0.z() + p1.z() + p2.z();
evas_object_layer_set(slice->evas_obj, z_factor);
evas_object_map_enable_set(slice->evas_obj, EINA_FALSE);
map = (Evas_Map *)evas_object_map_get((const Evas_Object *)
slice->evas_obj);
@ -122,6 +138,22 @@ _ephysics_body_soft_body_slices_apply(Evas_Object *obj)
evas_object_map_enable_set(slice->evas_obj, EINA_TRUE);
evas_object_show(slice->evas_obj);
}
smart_data->slices = eina_list_sort(smart_data->slices,
eina_list_count(smart_data->slices),
_ephysics_body_soft_body_slice_stacking_sort_cb);
EINA_LIST_FOREACH(smart_data->slices, l, data)
{
slice = (EPhysics_Body_Soft_Body_Slice *)data;
if (!prev_obj)
evas_object_lower(slice->evas_obj);
else
evas_object_stack_above(slice->evas_obj, prev_obj);
prev_obj = slice->evas_obj;
}
}
static EPhysics_Body_Soft_Body_Slice *
@ -209,6 +241,7 @@ _ephysics_body_soft_body_slices_init(EPhysics_Body *body, Evas_Object *obj)
evas_map_free(map);
smart_data->slices = eina_list_append(smart_data->slices, slice);
evas_object_smart_member_add(slice->evas_obj, obj);
}
return EINA_TRUE;