forked from enlightenment/efl
ephysics: use evas_object_image_source API
Remove workaround on soft body slicing SVN revision: 78726
This commit is contained in:
parent
67f36ff048
commit
9f04fdf723
|
@ -149,12 +149,12 @@ if test "x${build_docs_only}" = "xno" ; then
|
||||||
PKG_CHECK_MODULES([EPHYSICS],
|
PKG_CHECK_MODULES([EPHYSICS],
|
||||||
[
|
[
|
||||||
eina >= 1.2.99
|
eina >= 1.2.99
|
||||||
evas >= 1.2.99
|
evas >= 1.7.99
|
||||||
ecore >= 1.2.99
|
ecore >= 1.2.99
|
||||||
bullet >= 2.80
|
bullet >= 2.80
|
||||||
])
|
])
|
||||||
|
|
||||||
requirement_ephysics="bullet >= 2.80 ecore >= 1.2.99 evas >= 1.2.99 eina >= 1.2.99 ${requirement_ephysics}"
|
requirement_ephysics="bullet >= 2.80 ecore >= 1.2.99 evas >= 1.7.99 eina >= 1.2.99 ${requirement_ephysics}"
|
||||||
fi
|
fi
|
||||||
|
|
||||||
### Checks for header files
|
### Checks for header files
|
||||||
|
@ -212,7 +212,7 @@ if test "x${build_tests}" = "xyes" && test "x${build_docs_only}" = "xno" ; then
|
||||||
PKG_CHECK_MODULES([EPHYSICS_TEST],
|
PKG_CHECK_MODULES([EPHYSICS_TEST],
|
||||||
[
|
[
|
||||||
eina >= 1.2.99
|
eina >= 1.2.99
|
||||||
evas >= 1.2.99
|
evas >= 1.7.99
|
||||||
ecore >= 1.2.99
|
ecore >= 1.2.99
|
||||||
elementary >= 1.0.99
|
elementary >= 1.0.99
|
||||||
bullet >= 2.80
|
bullet >= 2.80
|
||||||
|
|
|
@ -101,10 +101,9 @@ _world_populate(Test_Data *test_data)
|
||||||
ephysics_body_soft_body_position_iterations_set(flag_body, 10);
|
ephysics_body_soft_body_position_iterations_set(flag_body, 10);
|
||||||
ephysics_body_mass_set(flag_body, 10);
|
ephysics_body_mass_set(flag_body, 10);
|
||||||
ephysics_body_soft_body_hardness_set(flag_body, 1);
|
ephysics_body_soft_body_hardness_set(flag_body, 1);
|
||||||
evas_obj = ephysics_body_evas_object_set(flag_body, evas_obj, EINA_TRUE);
|
ephysics_body_evas_object_set(flag_body, evas_obj, EINA_TRUE);
|
||||||
ephysics_body_restitution_set(flag_body, 0.5);
|
ephysics_body_restitution_set(flag_body, 0.5);
|
||||||
ephysics_body_friction_set(flag_body, 0.1);
|
ephysics_body_friction_set(flag_body, 0.1);
|
||||||
test_data->evas_objs = eina_list_append(test_data->evas_objs, evas_obj);
|
|
||||||
test_data->bodies = eina_list_append(test_data->bodies, flag_body);
|
test_data->bodies = eina_list_append(test_data->bodies, flag_body);
|
||||||
ephysics_body_cloth_anchor_full_add(flag_body, pole_body,
|
ephysics_body_cloth_anchor_full_add(flag_body, pole_body,
|
||||||
EPHYSICS_BODY_CLOTH_ANCHOR_SIDE_LEFT);
|
EPHYSICS_BODY_CLOTH_ANCHOR_SIDE_LEFT);
|
||||||
|
|
|
@ -28,13 +28,12 @@ _world_populate(Test_Data *test_data)
|
||||||
|
|
||||||
fall_body = ephysics_body_soft_circle_add(test_data->world);
|
fall_body = ephysics_body_soft_circle_add(test_data->world);
|
||||||
ephysics_body_soft_body_hardness_set(fall_body, 10);
|
ephysics_body_soft_body_hardness_set(fall_body, 10);
|
||||||
evas_obj = ephysics_body_evas_object_set(fall_body, evas_obj, EINA_TRUE);
|
ephysics_body_evas_object_set(fall_body, evas_obj, EINA_TRUE);
|
||||||
ephysics_body_restitution_set(fall_body, 0.95);
|
ephysics_body_restitution_set(fall_body, 0.95);
|
||||||
ephysics_body_friction_set(fall_body, 0.1);
|
ephysics_body_friction_set(fall_body, 0.1);
|
||||||
ephysics_body_event_callback_add(fall_body, EPHYSICS_CALLBACK_BODY_UPDATE,
|
ephysics_body_event_callback_add(fall_body, EPHYSICS_CALLBACK_BODY_UPDATE,
|
||||||
update_object_cb, shadow);
|
update_object_cb, shadow);
|
||||||
test_data->bodies = eina_list_append(test_data->bodies, fall_body);
|
test_data->bodies = eina_list_append(test_data->bodies, fall_body);
|
||||||
test_data->evas_objs = eina_list_append(test_data->evas_objs, evas_obj);
|
|
||||||
|
|
||||||
shadow = elm_layout_add(test_data->win);
|
shadow = elm_layout_add(test_data->win);
|
||||||
elm_layout_file_set(
|
elm_layout_file_set(
|
||||||
|
@ -54,13 +53,12 @@ _world_populate(Test_Data *test_data)
|
||||||
|
|
||||||
fall_body = ephysics_body_soft_circle_add(test_data->world);
|
fall_body = ephysics_body_soft_circle_add(test_data->world);
|
||||||
ephysics_body_soft_body_hardness_set(fall_body, 30);
|
ephysics_body_soft_body_hardness_set(fall_body, 30);
|
||||||
evas_obj = ephysics_body_evas_object_set(fall_body, evas_obj, EINA_TRUE);
|
ephysics_body_evas_object_set(fall_body, evas_obj, EINA_TRUE);
|
||||||
ephysics_body_restitution_set(fall_body, 0.95);
|
ephysics_body_restitution_set(fall_body, 0.95);
|
||||||
ephysics_body_friction_set(fall_body, 0.1);
|
ephysics_body_friction_set(fall_body, 0.1);
|
||||||
ephysics_body_event_callback_add(fall_body, EPHYSICS_CALLBACK_BODY_UPDATE,
|
ephysics_body_event_callback_add(fall_body, EPHYSICS_CALLBACK_BODY_UPDATE,
|
||||||
update_object_cb, shadow);
|
update_object_cb, shadow);
|
||||||
test_data->bodies = eina_list_append(test_data->bodies, fall_body);
|
test_data->bodies = eina_list_append(test_data->bodies, fall_body);
|
||||||
test_data->evas_objs = eina_list_append(test_data->evas_objs, evas_obj);
|
|
||||||
|
|
||||||
shadow = elm_layout_add(test_data->win);
|
shadow = elm_layout_add(test_data->win);
|
||||||
elm_layout_file_set(
|
elm_layout_file_set(
|
||||||
|
@ -105,12 +103,11 @@ _world_populate(Test_Data *test_data)
|
||||||
|
|
||||||
fall_body = ephysics_body_soft_box_add(test_data->world);
|
fall_body = ephysics_body_soft_box_add(test_data->world);
|
||||||
ephysics_body_soft_body_hardness_set(fall_body, 10);
|
ephysics_body_soft_body_hardness_set(fall_body, 10);
|
||||||
evas_obj = ephysics_body_evas_object_set(fall_body, evas_obj, EINA_TRUE);
|
ephysics_body_evas_object_set(fall_body, evas_obj, EINA_TRUE);
|
||||||
ephysics_body_event_callback_add(fall_body, EPHYSICS_CALLBACK_BODY_UPDATE,
|
ephysics_body_event_callback_add(fall_body, EPHYSICS_CALLBACK_BODY_UPDATE,
|
||||||
update_object_cb, shadow);
|
update_object_cb, shadow);
|
||||||
ephysics_body_restitution_set(fall_body, 0.5);
|
ephysics_body_restitution_set(fall_body, 0.5);
|
||||||
ephysics_body_friction_set(fall_body, 0.1);
|
ephysics_body_friction_set(fall_body, 0.1);
|
||||||
test_data->evas_objs = eina_list_append(test_data->evas_objs, evas_obj);
|
|
||||||
test_data->bodies = eina_list_append(test_data->bodies, fall_body);
|
test_data->bodies = eina_list_append(test_data->bodies, fall_body);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -2428,16 +2428,10 @@ EAPI EPhysics_World *ephysics_body_world_get(const EPhysics_Body *body);
|
||||||
* updates of associated evas objects, or complement updates, like changing
|
* updates of associated evas objects, or complement updates, like changing
|
||||||
* evas objects properties under certain conditions of position or rotation.
|
* evas objects properties under certain conditions of position or rotation.
|
||||||
*
|
*
|
||||||
* Case @p body is a soft one a new evas_object will be returned, actually
|
|
||||||
* this is an smart object which maps many slices of @p evas_obj to reflect
|
|
||||||
* the soft body deformation.
|
|
||||||
*
|
|
||||||
* @param body The body to associate to an evas object.
|
* @param body The body to associate to an evas object.
|
||||||
* @param evas_obj The evas object that will be associated to this @p body.
|
* @param evas_obj The evas object that will be associated to this @p body.
|
||||||
* @param use_obj_pos If @c EINA_TRUE it will set the physics body position
|
* @param use_obj_pos If @c EINA_TRUE it will set the physics body position
|
||||||
* to match evas object position taking world rate on consideration.
|
* to match evas object position taking world rate on consideration.
|
||||||
* @return NULL on failure, @p evas_obj case @p body is a rigid body or a
|
|
||||||
* new Evas_Object if @p body is a soft body.
|
|
||||||
*
|
*
|
||||||
* @see ephysics_body_box_add().
|
* @see ephysics_body_box_add().
|
||||||
* @see ephysics_body_soft_box_add().
|
* @see ephysics_body_soft_box_add().
|
||||||
|
@ -2448,7 +2442,7 @@ EAPI EPhysics_World *ephysics_body_world_get(const EPhysics_Body *body);
|
||||||
*
|
*
|
||||||
* @ingroup EPhysics_Body
|
* @ingroup EPhysics_Body
|
||||||
*/
|
*/
|
||||||
EAPI Evas_Object *ephysics_body_evas_object_set(EPhysics_Body *body, Evas_Object *evas_obj, Eina_Bool use_obj_pos);
|
EAPI void ephysics_body_evas_object_set(EPhysics_Body *body, Evas_Object *evas_obj, Eina_Bool use_obj_pos);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief
|
* @brief
|
||||||
|
|
|
@ -54,26 +54,18 @@ struct _EPhysics_Body_Soft_Body_Slice
|
||||||
float stacking;
|
float stacking;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct _EPhysics_Body_Soft_Body_Data
|
|
||||||
{
|
|
||||||
Evas_Object *base_obj;
|
|
||||||
EPhysics_Body *body;
|
|
||||||
Eina_List *slices;
|
|
||||||
};
|
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ephysics_body_soft_body_slices_apply(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
|
_ephysics_body_soft_body_slices_apply(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
|
||||||
{
|
{
|
||||||
double rate;
|
double rate;
|
||||||
void *list_data;
|
void *list_data;
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
Evas_Coord wy, wh, y0, y1, y2, x0, x1, x2, z0, z1, z2, bw, bh, w, h;
|
Evas_Coord wy, wh, y0, y1, y2, x0, x1, x2, z0, z1, z2, w, h;
|
||||||
Evas_Map *map;
|
Evas_Map *map;
|
||||||
btVector3 p0, p1, p2;
|
btVector3 p0, p1, p2;
|
||||||
btSoftBody::tFaceArray faces;
|
btSoftBody::tFaceArray faces;
|
||||||
EPhysics_Body_Soft_Body_Slice *slice;
|
EPhysics_Body_Soft_Body_Slice *slice;
|
||||||
EPhysics_Body *body;
|
EPhysics_Body *body;
|
||||||
btVector3 b0, b1;
|
|
||||||
int lr, lg, lb, ar, ag, ab;
|
int lr, lg, lb, ar, ag, ab;
|
||||||
Evas_Coord lx, ly, lz;
|
Evas_Coord lx, ly, lz;
|
||||||
Eina_Bool light = EINA_FALSE;
|
Eina_Bool light = EINA_FALSE;
|
||||||
|
@ -87,7 +79,7 @@ _ephysics_body_soft_body_slices_apply(void *data __UNUSED__, Evas *e __UNUSED__,
|
||||||
|
|
||||||
ephysics_world_render_geometry_get(body->world, NULL, &wy, NULL, NULL, &wh,
|
ephysics_world_render_geometry_get(body->world, NULL, &wy, NULL, NULL, &wh,
|
||||||
NULL);
|
NULL);
|
||||||
evas_object_geometry_get(body->soft_data->base_obj, NULL, NULL, &w, &h);
|
evas_object_geometry_get(body->evas_obj, NULL, NULL, &w, &h);
|
||||||
|
|
||||||
if ((body->light_apply) ||
|
if ((body->light_apply) ||
|
||||||
(ephysics_world_light_all_bodies_get(body->world)))
|
(ephysics_world_light_all_bodies_get(body->world)))
|
||||||
|
@ -104,7 +96,7 @@ _ephysics_body_soft_body_slices_apply(void *data __UNUSED__, Evas *e __UNUSED__,
|
||||||
perspective = EINA_TRUE;
|
perspective = EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
EINA_LIST_FOREACH(body->soft_data->slices, l, list_data)
|
EINA_LIST_FOREACH(body->slices_list, l, list_data)
|
||||||
{
|
{
|
||||||
slice = (EPhysics_Body_Soft_Body_Slice *)list_data;
|
slice = (EPhysics_Body_Soft_Body_Slice *)list_data;
|
||||||
|
|
||||||
|
@ -165,15 +157,6 @@ _ephysics_body_soft_body_slices_apply(void *data __UNUSED__, Evas *e __UNUSED__,
|
||||||
evas_object_map_enable_set(slice->evas_obj, EINA_TRUE);
|
evas_object_map_enable_set(slice->evas_obj, EINA_TRUE);
|
||||||
evas_map_free(map);
|
evas_map_free(map);
|
||||||
}
|
}
|
||||||
|
|
||||||
b0 = body->soft_body->m_bounds[0];
|
|
||||||
b1 = body->soft_body->m_bounds[1];
|
|
||||||
|
|
||||||
bh = (b1.y() - b0.y()) * rate;
|
|
||||||
bw = (b1.x() - b0.x()) * rate;
|
|
||||||
|
|
||||||
body->rebounding = EINA_TRUE;
|
|
||||||
evas_object_resize(obj, bw, bh);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline double
|
static inline double
|
||||||
|
@ -230,49 +213,35 @@ _ephysics_body_soft_body_slices_init(EPhysics_Body *body)
|
||||||
Evas *evas;
|
Evas *evas;
|
||||||
|
|
||||||
evas = evas_object_evas_get(body->evas_obj);
|
evas = evas_object_evas_get(body->evas_obj);
|
||||||
|
evas_object_data_set(body->evas_obj, BODY, body);
|
||||||
|
|
||||||
EINA_LIST_FOREACH(body->soft_data->slices, l, slice_data)
|
EINA_LIST_FOREACH(body->slices_list, l, slice_data)
|
||||||
{
|
{
|
||||||
slice = (EPhysics_Body_Soft_Body_Slice *) slice_data;
|
slice = (EPhysics_Body_Soft_Body_Slice *) slice_data;
|
||||||
slice->evas_obj = evas_object_image_filled_add(evas);
|
slice->evas_obj = evas_object_image_filled_add(evas);
|
||||||
evas_object_image_source_set(slice->evas_obj,
|
|
||||||
body->soft_data->base_obj);
|
|
||||||
evas_object_layer_set(slice->evas_obj,
|
evas_object_layer_set(slice->evas_obj,
|
||||||
evas_object_layer_get(body->soft_data->base_obj));
|
evas_object_layer_get(body->evas_obj));
|
||||||
|
evas_object_image_source_set(slice->evas_obj, body->evas_obj);
|
||||||
|
evas_object_image_source_events_set(slice->evas_obj, EINA_TRUE);
|
||||||
evas_object_resize(slice->evas_obj, 1, 1);
|
evas_object_resize(slice->evas_obj, 1, 1);
|
||||||
evas_object_show(slice->evas_obj);
|
evas_object_show(slice->evas_obj);
|
||||||
evas_object_image_smooth_scale_set(slice->evas_obj, EINA_TRUE);
|
evas_object_image_smooth_scale_set(slice->evas_obj, EINA_TRUE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (slice)
|
if (slice)
|
||||||
evas_object_stack_above(body->evas_obj, slice->evas_obj);
|
evas_object_image_source_visible_set(slice->evas_obj, EINA_FALSE);
|
||||||
|
|
||||||
_ephysics_body_soft_body_slices_apply(NULL, NULL, body->evas_obj, NULL);
|
_ephysics_body_soft_body_slices_apply(NULL, NULL, body->evas_obj, NULL);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
_ephysics_body_soft_body_data_free(EPhysics_Body_Soft_Body_Data *soft_data)
|
_ephysics_body_soft_body_slices_clean(EPhysics_Body *body)
|
||||||
{
|
|
||||||
EPhysics_Body_Soft_Body_Slice *slice;
|
|
||||||
void *ldata;
|
|
||||||
|
|
||||||
EINA_LIST_FREE(soft_data->slices, ldata)
|
|
||||||
{
|
|
||||||
slice = (EPhysics_Body_Soft_Body_Slice *)ldata;
|
|
||||||
evas_object_del(slice->evas_obj);
|
|
||||||
free(slice);
|
|
||||||
}
|
|
||||||
free(soft_data);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_ephysics_body_soft_body_slices_clean(EPhysics_Body_Soft_Body_Data *soft_data)
|
|
||||||
{
|
{
|
||||||
EPhysics_Body_Soft_Body_Slice *slice;
|
EPhysics_Body_Soft_Body_Slice *slice;
|
||||||
void *slice_data;
|
void *slice_data;
|
||||||
Eina_List *l;
|
Eina_List *l;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(soft_data->slices, l, slice_data)
|
EINA_LIST_FOREACH(body->slices_list, l, slice_data)
|
||||||
{
|
{
|
||||||
slice = (EPhysics_Body_Soft_Body_Slice *)slice_data;
|
slice = (EPhysics_Body_Soft_Body_Slice *)slice_data;
|
||||||
evas_object_del(slice->evas_obj);
|
evas_object_del(slice->evas_obj);
|
||||||
|
@ -280,61 +249,6 @@ _ephysics_body_soft_body_slices_clean(EPhysics_Body_Soft_Body_Data *soft_data)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
|
||||||
_ephysics_body_soft_body_evas_del_cb(void *data __UNUSED__, Evas *e __UNUSED__, Evas_Object *obj, void *event_info __UNUSED__)
|
|
||||||
{
|
|
||||||
EPhysics_Body *body;
|
|
||||||
body = (EPhysics_Body *) evas_object_data_del(obj, BODY);
|
|
||||||
_ephysics_body_soft_body_data_free(body->soft_data);
|
|
||||||
body->soft_data = NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
static EPhysics_Body_Soft_Body_Data *
|
|
||||||
_ephysics_body_soft_body_data_new(EPhysics_Body *body)
|
|
||||||
{
|
|
||||||
EPhysics_Body_Soft_Body_Data *soft_data;
|
|
||||||
|
|
||||||
soft_data = (EPhysics_Body_Soft_Body_Data *)calloc(
|
|
||||||
1, sizeof(EPhysics_Body_Soft_Body_Data));
|
|
||||||
|
|
||||||
if (!soft_data)
|
|
||||||
{
|
|
||||||
ERR("Could not allocate soft body data struct.");
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
|
|
||||||
soft_data->body = body;
|
|
||||||
|
|
||||||
return soft_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void
|
|
||||||
_ephysics_body_soft_body_evas_add(EPhysics_Body *body)
|
|
||||||
{
|
|
||||||
Evas_Object *obj;
|
|
||||||
Evas_Coord x, y, w, h;
|
|
||||||
|
|
||||||
body->soft_data->base_obj = body->evas_obj;
|
|
||||||
evas_object_geometry_get(body->evas_obj, &x, &y, &w, &h);
|
|
||||||
|
|
||||||
obj = evas_object_rectangle_add(evas_object_evas_get(body->evas_obj));
|
|
||||||
evas_object_color_set(obj, 0, 0, 0, 0);
|
|
||||||
evas_object_move(obj, x, y);
|
|
||||||
evas_object_resize(obj, w, h);
|
|
||||||
evas_object_data_set(obj, BODY, body);
|
|
||||||
evas_object_show(obj);
|
|
||||||
evas_object_layer_set(obj, evas_object_layer_get(body->evas_obj));
|
|
||||||
|
|
||||||
body->evas_obj = obj;
|
|
||||||
_ephysics_body_soft_body_slices_init(body);
|
|
||||||
evas_object_move(body->soft_data->base_obj, 0, -h);
|
|
||||||
|
|
||||||
evas_object_event_callback_add(obj, EVAS_CALLBACK_MOVE,
|
|
||||||
_ephysics_body_soft_body_slices_apply, NULL);
|
|
||||||
evas_object_event_callback_add(obj, EVAS_CALLBACK_DEL,
|
|
||||||
_ephysics_body_soft_body_evas_del_cb, NULL);
|
|
||||||
}
|
|
||||||
|
|
||||||
static btTransform
|
static btTransform
|
||||||
_ephysics_body_transform_get(const EPhysics_Body *body)
|
_ephysics_body_transform_get(const EPhysics_Body *body)
|
||||||
{
|
{
|
||||||
|
@ -452,9 +366,9 @@ ephysics_body_evas_objects_restack(EPhysics_World *world)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!body->soft_data) continue;
|
if (!body->slices_list) continue;
|
||||||
|
|
||||||
EINA_LIST_FOREACH(body->soft_data->slices, slices, slice_data)
|
EINA_LIST_FOREACH(body->slices_list, slices, slice_data)
|
||||||
{
|
{
|
||||||
previously_added = EINA_FALSE;
|
previously_added = EINA_FALSE;
|
||||||
slice = (EPhysics_Body_Soft_Body_Slice *)slice_data;
|
slice = (EPhysics_Body_Soft_Body_Slice *)slice_data;
|
||||||
|
@ -809,6 +723,7 @@ static void
|
||||||
_ephysics_body_evas_obj_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
|
_ephysics_body_evas_obj_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info __UNUSED__)
|
||||||
{
|
{
|
||||||
EPhysics_Body *body = (EPhysics_Body *) data;
|
EPhysics_Body *body = (EPhysics_Body *) data;
|
||||||
|
_ephysics_body_soft_body_slices_clean(body);
|
||||||
body->evas_obj = NULL;
|
body->evas_obj = NULL;
|
||||||
DBG("Evas object deleted. Updating body: %p", body);
|
DBG("Evas object deleted. Updating body: %p", body);
|
||||||
}
|
}
|
||||||
|
@ -1090,12 +1005,6 @@ _ephysics_body_evas_obj_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *o
|
||||||
EPhysics_Body *body = (EPhysics_Body *) data;
|
EPhysics_Body *body = (EPhysics_Body *) data;
|
||||||
int w, h;
|
int w, h;
|
||||||
|
|
||||||
if (body->rebounding)
|
|
||||||
{
|
|
||||||
body->rebounding = EINA_FALSE;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
|
evas_object_geometry_get(obj, NULL, NULL, &w, &h);
|
||||||
if ((w == body->w) && (h == body->h))
|
if ((w == body->w) && (h == body->h))
|
||||||
return;
|
return;
|
||||||
|
@ -1673,8 +1582,7 @@ _ephysics_body_slices_add(EPhysics_Body *body, double delta, double max)
|
||||||
body->points_deform[i]);
|
body->points_deform[i]);
|
||||||
if (!slice) return EINA_FALSE;
|
if (!slice) return EINA_FALSE;
|
||||||
|
|
||||||
body->soft_data->slices = eina_list_append(body->soft_data->slices,
|
body->slices_list = eina_list_append(body->slices_list, slice);
|
||||||
slice);
|
|
||||||
}
|
}
|
||||||
return EINA_TRUE;
|
return EINA_TRUE;
|
||||||
}
|
}
|
||||||
|
@ -1773,13 +1681,6 @@ ephysics_body_cloth_add(EPhysics_World *world, unsigned short rows, unsigned sho
|
||||||
for (int i = 0; i < body->slices; i++)
|
for (int i = 0; i < body->slices; i++)
|
||||||
body->points_deform[i] = i;
|
body->points_deform[i] = i;
|
||||||
|
|
||||||
body->soft_data = _ephysics_body_soft_body_data_new(body);
|
|
||||||
if (!body->soft_data)
|
|
||||||
{
|
|
||||||
ERR("Couldn't create soft data.");
|
|
||||||
goto no_soft_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_ephysics_body_slices_add(body, -1, 1))
|
if (!_ephysics_body_slices_add(body, -1, 1))
|
||||||
{
|
{
|
||||||
ERR("Couldn't create slices.");
|
ERR("Couldn't create slices.");
|
||||||
|
@ -1795,8 +1696,6 @@ ephysics_body_cloth_add(EPhysics_World *world, unsigned short rows, unsigned sho
|
||||||
return body;
|
return body;
|
||||||
|
|
||||||
no_slices:
|
no_slices:
|
||||||
free(body->soft_data);
|
|
||||||
no_soft_data:
|
|
||||||
free(body->points_deform);
|
free(body->points_deform);
|
||||||
no_deform:
|
no_deform:
|
||||||
free(body);
|
free(body);
|
||||||
|
@ -1987,13 +1886,6 @@ ephysics_body_soft_circle_add(EPhysics_World *world)
|
||||||
for (int i = 0; i < body->slices; i++)
|
for (int i = 0; i < body->slices; i++)
|
||||||
body->points_deform[i] = points[i];
|
body->points_deform[i] = points[i];
|
||||||
|
|
||||||
body->soft_data = _ephysics_body_soft_body_data_new(body);
|
|
||||||
if (!body->soft_data)
|
|
||||||
{
|
|
||||||
ERR("Couldn't create soft data.");
|
|
||||||
goto no_soft_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_ephysics_body_slices_add(body, 0.55, 1.1))
|
if (!_ephysics_body_slices_add(body, 0.55, 1.1))
|
||||||
{
|
{
|
||||||
ERR("Couldn't create slices.");
|
ERR("Couldn't create slices.");
|
||||||
|
@ -2004,8 +1896,6 @@ ephysics_body_soft_circle_add(EPhysics_World *world)
|
||||||
return body;
|
return body;
|
||||||
|
|
||||||
no_slices:
|
no_slices:
|
||||||
free(body->soft_data);
|
|
||||||
no_soft_data:
|
|
||||||
free(body->points_deform);
|
free(body->points_deform);
|
||||||
no_deform:
|
no_deform:
|
||||||
ephysics_world_body_del(world, body);
|
ephysics_world_body_del(world, body);
|
||||||
|
@ -2094,13 +1984,6 @@ ephysics_body_soft_box_add(EPhysics_World *world)
|
||||||
for (int i = 0; i < body->slices; i++)
|
for (int i = 0; i < body->slices; i++)
|
||||||
body->points_deform[i] = points[i];
|
body->points_deform[i] = points[i];
|
||||||
|
|
||||||
body->soft_data = _ephysics_body_soft_body_data_new(body);
|
|
||||||
if (!body->soft_data)
|
|
||||||
{
|
|
||||||
ERR("Couldn't create soft data.");
|
|
||||||
goto no_soft_data;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!_ephysics_body_slices_add(body, 0.55, 1.1))
|
if (!_ephysics_body_slices_add(body, 0.55, 1.1))
|
||||||
{
|
{
|
||||||
ERR("Couldn't create slices.");
|
ERR("Couldn't create slices.");
|
||||||
|
@ -2111,8 +1994,6 @@ ephysics_body_soft_box_add(EPhysics_World *world)
|
||||||
return body;
|
return body;
|
||||||
|
|
||||||
no_slices:
|
no_slices:
|
||||||
free(body->soft_data);
|
|
||||||
no_soft_data:
|
|
||||||
free(body->points_deform);
|
free(body->points_deform);
|
||||||
no_deform:
|
no_deform:
|
||||||
ephysics_world_body_del(world, body);
|
ephysics_world_body_del(world, body);
|
||||||
|
@ -2430,7 +2311,7 @@ ephysics_body_del(EPhysics_Body *body)
|
||||||
ephysics_world_lock_release(world);
|
ephysics_world_lock_release(world);
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI Evas_Object *
|
EAPI void
|
||||||
ephysics_body_evas_object_set(EPhysics_Body *body, Evas_Object *evas_obj, Eina_Bool use_obj_pos)
|
ephysics_body_evas_object_set(EPhysics_Body *body, Evas_Object *evas_obj, Eina_Bool use_obj_pos)
|
||||||
{
|
{
|
||||||
int obj_x, obj_y, obj_w, obj_h;
|
int obj_x, obj_y, obj_w, obj_h;
|
||||||
|
@ -2439,59 +2320,61 @@ ephysics_body_evas_object_set(EPhysics_Body *body, Evas_Object *evas_obj, Eina_B
|
||||||
if (!body)
|
if (!body)
|
||||||
{
|
{
|
||||||
ERR("Can't set evas object to body, the last wasn't provided.");
|
ERR("Can't set evas object to body, the last wasn't provided.");
|
||||||
return NULL;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!evas_obj)
|
if (!evas_obj)
|
||||||
{
|
{
|
||||||
ERR("Can't set evas object to body, the first wasn't provided.");
|
ERR("Can't set evas object to body, the first wasn't provided.");
|
||||||
return NULL;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (body->evas_obj)
|
if (body->evas_obj)
|
||||||
{
|
{
|
||||||
|
evas_object_map_enable_set(body->evas_obj, EINA_FALSE);
|
||||||
evas_object_event_callback_del(body->evas_obj, EVAS_CALLBACK_DEL,
|
evas_object_event_callback_del(body->evas_obj, EVAS_CALLBACK_DEL,
|
||||||
_ephysics_body_evas_obj_del_cb);
|
_ephysics_body_evas_obj_del_cb);
|
||||||
evas_object_event_callback_del(body->evas_obj, EVAS_CALLBACK_RESIZE,
|
evas_object_event_callback_del(body->evas_obj, EVAS_CALLBACK_RESIZE,
|
||||||
_ephysics_body_evas_obj_resize_cb);
|
_ephysics_body_evas_obj_resize_cb);
|
||||||
evas_object_map_enable_set(body->evas_obj, EINA_FALSE);
|
if (body->slices_list)
|
||||||
if (body->soft_data)
|
{
|
||||||
_ephysics_body_soft_body_slices_clean(body->soft_data);
|
_ephysics_body_soft_body_slices_clean(body);
|
||||||
|
evas_object_event_callback_del(
|
||||||
|
body->evas_obj, EVAS_CALLBACK_MOVE,
|
||||||
|
_ephysics_body_soft_body_slices_apply);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
body->evas_obj = evas_obj;
|
body->evas_obj = evas_obj;
|
||||||
evas_object_geometry_get(body->evas_obj, &obj_x, &obj_y, &obj_w, &obj_h);
|
|
||||||
|
|
||||||
if (body->soft_body)
|
|
||||||
{
|
|
||||||
_ephysics_body_soft_body_evas_add(body);
|
|
||||||
evas_obj = body->evas_obj;
|
|
||||||
}
|
|
||||||
|
|
||||||
evas_object_event_callback_add(evas_obj, EVAS_CALLBACK_DEL,
|
evas_object_event_callback_add(evas_obj, EVAS_CALLBACK_DEL,
|
||||||
_ephysics_body_evas_obj_del_cb, body);
|
_ephysics_body_evas_obj_del_cb, body);
|
||||||
|
|
||||||
|
if (body->soft_body)
|
||||||
|
{
|
||||||
|
_ephysics_body_soft_body_slices_init(body);
|
||||||
|
evas_object_event_callback_add(evas_obj, EVAS_CALLBACK_MOVE,
|
||||||
|
_ephysics_body_soft_body_slices_apply,
|
||||||
|
NULL);
|
||||||
|
}
|
||||||
|
|
||||||
if (!use_obj_pos)
|
if (!use_obj_pos)
|
||||||
return evas_obj;
|
return;
|
||||||
|
|
||||||
rate = ephysics_world_rate_get(body->world);
|
rate = ephysics_world_rate_get(body->world);
|
||||||
|
evas_object_geometry_get(body->evas_obj, &obj_x, &obj_y, &obj_w, &obj_h);
|
||||||
|
|
||||||
ephysics_world_lock_take(body->world);
|
ephysics_world_lock_take(body->world);
|
||||||
_ephysics_body_geometry_set(body, obj_x, obj_y, - rate / 2,
|
_ephysics_body_geometry_set(body, obj_x, obj_y, - rate / 2,
|
||||||
obj_w, obj_h, rate, rate);
|
obj_w, obj_h, rate, rate);
|
||||||
|
|
||||||
|
|
||||||
ephysics_world_lock_release(body->world);
|
ephysics_world_lock_release(body->world);
|
||||||
evas_object_event_callback_add(body->evas_obj, EVAS_CALLBACK_RESIZE,
|
evas_object_event_callback_add(body->evas_obj, EVAS_CALLBACK_RESIZE,
|
||||||
_ephysics_body_evas_obj_resize_cb, body);
|
_ephysics_body_evas_obj_resize_cb, body);
|
||||||
|
|
||||||
return evas_obj;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI Evas_Object *
|
EAPI Evas_Object *
|
||||||
ephysics_body_evas_object_unset(EPhysics_Body *body)
|
ephysics_body_evas_object_unset(EPhysics_Body *body)
|
||||||
{
|
{
|
||||||
Evas_Object *obj, *wrapper;
|
Evas_Object *obj;
|
||||||
Evas_Coord x, y;
|
|
||||||
|
|
||||||
if (!body)
|
if (!body)
|
||||||
{
|
{
|
||||||
|
@ -2511,13 +2394,11 @@ ephysics_body_evas_object_unset(EPhysics_Body *body)
|
||||||
evas_object_map_enable_set(obj, EINA_FALSE);
|
evas_object_map_enable_set(obj, EINA_FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (body->type != EPHYSICS_BODY_TYPE_RIGID)
|
if (body->slices_list)
|
||||||
{
|
{
|
||||||
wrapper = obj;
|
_ephysics_body_soft_body_slices_clean(body);
|
||||||
obj = body->soft_data->base_obj;
|
evas_object_event_callback_del(obj, EVAS_CALLBACK_MOVE,
|
||||||
evas_object_del(wrapper);
|
_ephysics_body_soft_body_slices_apply);
|
||||||
ephysics_body_geometry_get(body, &x, &y, NULL, NULL, NULL, NULL);
|
|
||||||
evas_object_move(obj, x, y);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return obj;
|
return obj;
|
||||||
|
|
|
@ -92,6 +92,7 @@ struct _EPhysics_Body {
|
||||||
Eina_Inlist *callbacks;
|
Eina_Inlist *callbacks;
|
||||||
Eina_List *collision_groups;
|
Eina_List *collision_groups;
|
||||||
Eina_List *to_delete;
|
Eina_List *to_delete;
|
||||||
|
Eina_List *slices_list;
|
||||||
EPhysics_Body_Material material;
|
EPhysics_Body_Material material;
|
||||||
double mass;
|
double mass;
|
||||||
double density;
|
double density;
|
||||||
|
@ -125,7 +126,6 @@ struct _EPhysics_Body {
|
||||||
Eina_Bool active:1;
|
Eina_Bool active:1;
|
||||||
Eina_Bool deleted:1;
|
Eina_Bool deleted:1;
|
||||||
Eina_Bool light_apply:1;
|
Eina_Bool light_apply:1;
|
||||||
Eina_Bool rebounding:1;
|
|
||||||
Eina_Bool back_face_culling:1;
|
Eina_Bool back_face_culling:1;
|
||||||
Eina_Bool clockwise:1;
|
Eina_Bool clockwise:1;
|
||||||
};
|
};
|
||||||
|
|
Loading…
Reference in New Issue