From d3097a3db1cfe3b363403b35ddcc06b3cf4e9e12 Mon Sep 17 00:00:00 2001 From: Leandro Dorileo Date: Thu, 25 Oct 2012 21:53:51 +0000 Subject: [PATCH] EPhysics: implement central impulse apply for cloth bodies Patch by: Leandro Dorileo SVN revision: 78480 --- legacy/ephysics/src/lib/ephysics_body.cpp | 24 +++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/legacy/ephysics/src/lib/ephysics_body.cpp b/legacy/ephysics/src/lib/ephysics_body.cpp index 5fa72a5fe0..0bd52ea24f 100644 --- a/legacy/ephysics/src/lib/ephysics_body.cpp +++ b/legacy/ephysics/src/lib/ephysics_body.cpp @@ -2764,10 +2764,24 @@ ephysics_body_world_get(const EPhysics_Body *body) return body->world; } +static void +_ephysics_body_soft_body_central_impulse_apply(EPhysics_Body *body, btVector3 impulse) +{ + btSoftBody::Face *face; + + for (int m = 0; m < body->soft_body->m_faces.size(); m++) + { + face = &body->soft_body->m_faces[m]; + for (int n = 0; n < 3; n++) + face->m_n[n]->m_v += impulse * face->m_n[n]->m_im; + } +} + EAPI void ephysics_body_central_impulse_apply(EPhysics_Body *body, double x, double y, double z) { double rate; + btVector3 impulse; if (!body) { @@ -2779,8 +2793,14 @@ ephysics_body_central_impulse_apply(EPhysics_Body *body, double x, double y, dou ephysics_world_lock_take(body->world); ephysics_body_activate(body, EINA_TRUE); - body->rigid_body->applyCentralImpulse(btVector3(x / rate, - y / rate, - z / rate)); + + impulse = btVector3(x / rate, - y / rate, z / rate); + + if (body->type == EPHYSICS_BODY_TYPE_CLOTH) + _ephysics_body_soft_body_central_impulse_apply(body, impulse); + else + body->rigid_body->applyCentralImpulse(impulse); + ephysics_world_lock_release(body->world); }