EPhysics: fix collision detection point
Also improve docs and test. SVN revision: 74504
This commit is contained in:
parent
a05e66c88b
commit
24c2279813
|
@ -25,11 +25,12 @@ _collision_cb(void *data, EPhysics_Body *body __UNUSED__, void *event_info)
|
||||||
if (contact_body != collision_data->sphere2) return;
|
if (contact_body != collision_data->sphere2) return;
|
||||||
|
|
||||||
ephysics_body_collision_position_get(collision, &x, &y);
|
ephysics_body_collision_position_get(collision, &x, &y);
|
||||||
INF("Collision Detected");
|
|
||||||
|
|
||||||
evas_object_move(collision_data->impact, x, y);
|
evas_object_move(collision_data->impact, x - 10, y - 40);
|
||||||
elm_object_signal_emit(collision_data->impact, "impact,show",
|
elm_object_signal_emit(collision_data->impact, "impact,show",
|
||||||
"ephysics_test");
|
"ephysics_test");
|
||||||
|
|
||||||
|
INF("Collision Detected at (%i, %i)", x, y);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
|
|
|
@ -1467,9 +1467,11 @@ EAPI void ephysics_body_damping_get(const EPhysics_Body *body, double *linear_da
|
||||||
* If not added to any group the body will collide against any other body.
|
* If not added to any group the body will collide against any other body.
|
||||||
* Otherwise this body will collide only against those in the same groups.
|
* Otherwise this body will collide only against those in the same groups.
|
||||||
*
|
*
|
||||||
|
* If @p body was already part of @p group, nothing will happen.
|
||||||
|
*
|
||||||
* @param body The body to be added to @p group.
|
* @param body The body to be added to @p group.
|
||||||
* @param group The group the @p body will belong to.
|
* @param group The group the @p body will belong to.
|
||||||
* @return EINA_TRUE on success, EINA_FALSE otherwise.
|
* @return @c EINA_TRUE if body is added to group, or @c EINA_FALSE on error.
|
||||||
*
|
*
|
||||||
* @see ephysics_body_collision_group_del()
|
* @see ephysics_body_collision_group_del()
|
||||||
* @see ephysics_body_collision_group_list_get()
|
* @see ephysics_body_collision_group_list_get()
|
||||||
|
@ -1484,9 +1486,12 @@ EAPI Eina_Bool ephysics_body_collision_group_add(EPhysics_Body *body, const char
|
||||||
* This @p body will not belong to @p group any more and the collisions filter
|
* This @p body will not belong to @p group any more and the collisions filter
|
||||||
* must take that on account.
|
* must take that on account.
|
||||||
*
|
*
|
||||||
|
* If @p body wasn't part of @p group before, nothing will happen.
|
||||||
|
*
|
||||||
* @param body The body to be removed from @p group.
|
* @param body The body to be removed from @p group.
|
||||||
* @param group The group @p body must be removed from.
|
* @param group The group @p body must be removed from.
|
||||||
* @return EINA_TRUE on success, EINA_FALSE otherwise.
|
* @return @c EINA_TRUE if body is removed from group, or @c EINA_FALSE on
|
||||||
|
* error.
|
||||||
*
|
*
|
||||||
* @see ephysics_body_collision_group_add()
|
* @see ephysics_body_collision_group_add()
|
||||||
* @ingroup EPhysics_Body
|
* @ingroup EPhysics_Body
|
||||||
|
|
|
@ -75,8 +75,6 @@ ephysics_body_filter_collision(EPhysics_Body *body0, EPhysics_Body *body1)
|
||||||
EAPI Eina_Bool
|
EAPI Eina_Bool
|
||||||
ephysics_body_collision_group_add(EPhysics_Body *body, const char *group)
|
ephysics_body_collision_group_add(EPhysics_Body *body, const char *group)
|
||||||
{
|
{
|
||||||
Eina_List *l;
|
|
||||||
void *grp;
|
|
||||||
Eina_Stringshare *group_str;
|
Eina_Stringshare *group_str;
|
||||||
|
|
||||||
if (!body)
|
if (!body)
|
||||||
|
@ -86,13 +84,11 @@ ephysics_body_collision_group_add(EPhysics_Body *body, const char *group)
|
||||||
}
|
}
|
||||||
|
|
||||||
group_str = eina_stringshare_add(group);
|
group_str = eina_stringshare_add(group);
|
||||||
EINA_LIST_FOREACH(body->collision_groups, l, grp)
|
if (eina_list_data_find(body->collision_groups, group_str))
|
||||||
{
|
{
|
||||||
if (grp == group_str)
|
INF("Body already added to group: %s", group);
|
||||||
{
|
eina_stringshare_del(group_str);
|
||||||
eina_stringshare_del(group_str);
|
return EINA_TRUE;
|
||||||
return EINA_TRUE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
body->collision_groups = eina_list_append(body->collision_groups, group_str);
|
body->collision_groups = eina_list_append(body->collision_groups, group_str);
|
||||||
|
@ -111,6 +107,13 @@ ephysics_body_collision_group_del(EPhysics_Body *body, const char *group)
|
||||||
}
|
}
|
||||||
|
|
||||||
group_str = eina_stringshare_add(group);
|
group_str = eina_stringshare_add(group);
|
||||||
|
if (!eina_list_data_find(body->collision_groups, group_str))
|
||||||
|
{
|
||||||
|
INF("Body isn't part of group: %s", group);
|
||||||
|
eina_stringshare_del(group_str);
|
||||||
|
return EINA_TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
body->collision_groups = eina_list_remove(body->collision_groups, group_str);
|
body->collision_groups = eina_list_remove(body->collision_groups, group_str);
|
||||||
eina_stringshare_del(group_str);
|
eina_stringshare_del(group_str);
|
||||||
eina_stringshare_del(group_str);
|
eina_stringshare_del(group_str);
|
||||||
|
@ -331,17 +334,17 @@ ephysics_body_evas_object_update_select(EPhysics_Body *body)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
ephysics_body_collision_set(EPhysics_Body_Collision *collision, EPhysics_Body *contact_body, btVector3 position)
|
_ephysics_body_collision_set(EPhysics_Body_Collision *collision, EPhysics_Body *contact_body, btVector3 position)
|
||||||
{
|
{
|
||||||
double rate;
|
double rate;
|
||||||
int height;
|
int wy, wh;
|
||||||
EPhysics_World *world = contact_body->world;
|
EPhysics_World *world = contact_body->world;
|
||||||
|
|
||||||
ephysics_world_render_geometry_get(world, NULL, NULL, NULL, &height);
|
ephysics_world_render_geometry_get(world, NULL, &wy, NULL, &wh);
|
||||||
rate = ephysics_world_rate_get(world);
|
rate = ephysics_world_rate_get(world);
|
||||||
collision->contact_body = contact_body;
|
collision->contact_body = contact_body;
|
||||||
collision->x = position.getX() * rate;
|
collision->x = position.getX() * rate;
|
||||||
collision->y = height - (position.getY() * rate);
|
collision->y = wh + wy - (position.getY() * rate);
|
||||||
}
|
}
|
||||||
|
|
||||||
EAPI void
|
EAPI void
|
||||||
|
@ -373,7 +376,6 @@ void
|
||||||
ephysics_body_contact_processed(EPhysics_Body *body, EPhysics_Body *contact_body, btVector3 position)
|
ephysics_body_contact_processed(EPhysics_Body *body, EPhysics_Body *contact_body, btVector3 position)
|
||||||
{
|
{
|
||||||
EPhysics_Body_Callback *cb;
|
EPhysics_Body_Callback *cb;
|
||||||
EPhysics_Body_Collision *collision;
|
|
||||||
|
|
||||||
if ((!body) || (!contact_body))
|
if ((!body) || (!contact_body))
|
||||||
return;
|
return;
|
||||||
|
@ -382,14 +384,18 @@ ephysics_body_contact_processed(EPhysics_Body *body, EPhysics_Body *contact_body
|
||||||
{
|
{
|
||||||
if (cb->type == EPHYSICS_CALLBACK_BODY_COLLISION)
|
if (cb->type == EPHYSICS_CALLBACK_BODY_COLLISION)
|
||||||
{
|
{
|
||||||
collision = (EPhysics_Body_Collision*)malloc(
|
EPhysics_Body_Collision *collision;
|
||||||
sizeof(EPhysics_Body_Collision));
|
|
||||||
|
collision = (EPhysics_Body_Collision *)malloc(
|
||||||
|
sizeof(EPhysics_Body_Collision));
|
||||||
|
|
||||||
if (!collision)
|
if (!collision)
|
||||||
{
|
{
|
||||||
ERR("Can't allocate collision data structure.");
|
ERR("Can't allocate collision data structure.");
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
ephysics_body_collision_set(collision, contact_body, position);
|
|
||||||
|
_ephysics_body_collision_set(collision, contact_body, position);
|
||||||
cb->func(cb->data, body, collision);
|
cb->func(cb->data, body, collision);
|
||||||
free(collision);
|
free(collision);
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue