EPhysics: add soft body triangle impulse API

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



SVN revision: 79594
This commit is contained in:
Leandro Dorileo 2012-11-23 21:43:49 +00:00 committed by Bruno Dilly
parent 5d49f5912a
commit cf2d140f8c
2 changed files with 62 additions and 0 deletions

View File

@ -2368,6 +2368,33 @@ EAPI void ephysics_body_soft_body_dragging_unset(EPhysics_Body *body);
*/
EAPI int ephysics_body_soft_body_triangle_index_get(EPhysics_Body *body, Evas_Coord x, Evas_Coord y);
/**
* @brief
* Apply an impulse on a given soft body triangle.
*
* The impulse is equal to the change of momentum of the body.
* Impulse is the product of the force over the time this force is applied. In
* ephysics case, it would be the time of a tick, so it behaves just summing
* current linear velocity to impulse per mass(per triangle mass).
*
* When a impulse is applied over a body, it will have its velocity changed. This
* impulse will be applied on body's specified triangle @p idx, so it won't
* imply in rotating the body.
*
* @note Impulse is measured in kg * p / s.
*
* @param body The body to apply impulse to.
* @param idx The soft body triangle index.
* @param x The axis @p x component of impulse.
* @param y The axis @p y component of impulse
* @param z The axis @p z component of impulse
*
* @see ephysics_body_soft_body_triangle_index_get().
*
* @ingroup EPhysics_Body
*/
EAPI void ephysics_body_soft_body_triangle_impulse_apply(EPhysics_Body * body, int idx, double x, double y, double z);
/**
* @brief
* Set the soft body number of position iterations.

View File

@ -2078,6 +2078,41 @@ ephysics_body_soft_body_triangle_move(EPhysics_Body *body, int idx, Evas_Coord x
ephysics_world_lock_release(body->world);
}
EAPI void
ephysics_body_soft_body_triangle_impulse_apply(EPhysics_Body * body, int idx, double x, double y, double z)
{
btSoftBody::Face face;
btSoftBody::Node *node;
double rate;
btVector3 impulse;
if (body->type == EPHYSICS_BODY_TYPE_RIGID)
{
ERR("Can't apply impulse, operation not permited to rigid bodies.");
return;
}
if (idx < 0 || idx >= body->soft_body->m_faces.size())
{
ERR("Could not apply impulse, provided body triangle index ranges from"
" 0 to %d", body->soft_body->m_faces.size());
return;
}
rate = ephysics_world_rate_get(body->world);
impulse = btVector3(x / rate, y / rate, z / rate);
ephysics_world_lock_take(body->world);
face = body->soft_body->m_faces[idx];
node = face.m_n[0];
node->m_f += impulse * node->m_im;
ephysics_world_lock_release(body->world);
DBG("Impulse applied to soft body node(%d): %lf, %lf, %lf", idx, impulse.x(),
impulse.y(), impulse.z());
}
EAPI int
ephysics_body_soft_body_triangle_index_get(EPhysics_Body *body, Evas_Coord x, Evas_Coord y)
{