From 44aeda07ae66f5007e4334b70b68b9755c457683 Mon Sep 17 00:00:00 2001 From: Bruno Dilly Date: Thu, 16 Aug 2012 21:35:04 +0000 Subject: [PATCH] EPhysics: implement body recalc SVN revision: 75332 --- legacy/ephysics/src/lib/ephysics_body.cpp | 56 +++++++++++++++++----- legacy/ephysics/src/lib/ephysics_private.h | 1 + 2 files changed, 44 insertions(+), 13 deletions(-) diff --git a/legacy/ephysics/src/lib/ephysics_body.cpp b/legacy/ephysics/src/lib/ephysics_body.cpp index 6fc1379f35..7677d5584e 100644 --- a/legacy/ephysics/src/lib/ephysics_body.cpp +++ b/legacy/ephysics/src/lib/ephysics_body.cpp @@ -26,6 +26,19 @@ struct _EPhysics_Body_Collision { Evas_Coord y; }; +static inline void +_ephysics_body_sleeping_threshold_set(EPhysics_Body *body, double linear_threshold, double angular_threshold, double rate) +{ + body->rigid_body->setSleepingThresholds(linear_threshold / rate, + angular_threshold / RAD_TO_DEG); +} + +static inline void +_ephysics_body_linear_velocity_set(EPhysics_Body *body, double x, double y, double rate) +{ + body->rigid_body->setLinearVelocity(btVector3(x / rate, y / rate, 0)); +} + static void _ephysics_body_event_callback_del(EPhysics_Body *body, EPhysics_Body_Callback *cb) { @@ -256,13 +269,12 @@ _ephysics_body_evas_obj_del_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj } static void -_ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h) +_ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, double rate) { - double rate, mx, my, sx, sy; + double mx, my, sx, sy; btTransform trans; int wy, height; - rate = ephysics_world_rate_get(body->world); ephysics_world_render_geometry_get(body->world, NULL, &wy, NULL, &height); height += wy; @@ -285,6 +297,8 @@ _ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Eva body->w = w; body->h = h; + body->rigid_body->activate(1); + DBG("Body %p position changed to %lf, %lf.", body, mx, my); DBG("Body %p scale changed to %lf, %lf.", body, sx, sy); } @@ -301,7 +315,8 @@ _ephysics_body_evas_obj_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *o DBG("Resizing body %p to w=%i, h=%i", body, w, h); ephysics_body_geometry_get(body, &x, &y, NULL, NULL); - _ephysics_body_geometry_set(body, x, y, w, h); + _ephysics_body_geometry_set(body, x, y, w, h, + ephysics_world_rate_get(body->world)); } static void @@ -404,6 +419,21 @@ _ephysics_body_outside_render_area_check(EPhysics_Body *body) } } +void +ephysics_body_recalc(EPhysics_Body *body, double rate) +{ + Evas_Coord x, y, w, h; + double vx, vy, lt, at; + + ephysics_body_geometry_get(body, &x, &y, &w, &h); + ephysics_body_linear_velocity_get(body, &vx, &vy); + ephysics_body_sleeping_threshold_get(body, <, &at); + + _ephysics_body_geometry_set(body, x, y, w, h, rate); + _ephysics_body_linear_velocity_set(body, vx, vy, rate); + _ephysics_body_sleeping_threshold_set(body, lt, at, rate); +} + void ephysics_body_evas_object_update_select(EPhysics_Body *body) { @@ -707,7 +737,8 @@ ephysics_body_evas_object_set(EPhysics_Body *body, Evas_Object *evas_obj, Eina_B evas_object_event_callback_add(evas_obj, EVAS_CALLBACK_RESIZE, _ephysics_body_evas_obj_resize_cb, body); evas_object_geometry_get(body->evas_obj, &obj_x, &obj_y, &obj_w, &obj_h); - _ephysics_body_geometry_set(body, obj_x, obj_y, obj_w, obj_h); + _ephysics_body_geometry_set(body, obj_x, obj_y, obj_w, obj_h, + ephysics_world_rate_get(body->world)); } EAPI Evas_Object * @@ -761,7 +792,8 @@ ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas return; } - _ephysics_body_geometry_set(body, x, y, w, h); + _ephysics_body_geometry_set(body, x, y, w, h, + ephysics_world_rate_get(body->world)); } EAPI void @@ -833,8 +865,8 @@ ephysics_body_linear_velocity_set(EPhysics_Body *body, double x, double y) return; } - rate = ephysics_world_rate_get(body->world); - body->rigid_body->setLinearVelocity(btVector3(x / rate, y / rate, 0)); + _ephysics_body_linear_velocity_set(body, x, y, + ephysics_world_rate_get(body->world)); DBG("Linear velocity of body %p set to %lf, %lf", body, x, y); } @@ -882,17 +914,15 @@ ephysics_body_angular_velocity_get(const EPhysics_Body *body) EAPI void ephysics_body_sleeping_threshold_set(EPhysics_Body *body, double linear_threshold, double angular_threshold) { - double rate; - if (!body) { ERR("Can't set sleeping thresholds, body is null."); return; } - rate = ephysics_world_rate_get(body->world); - body->rigid_body->setSleepingThresholds(linear_threshold / rate, - angular_threshold / RAD_TO_DEG); + _ephysics_body_sleeping_threshold_set(body, linear_threshold, + angular_threshold, + ephysics_world_rate_get(body->world)); } EAPI void diff --git a/legacy/ephysics/src/lib/ephysics_private.h b/legacy/ephysics/src/lib/ephysics_private.h index 4c0b10ab5f..b8c3527f82 100644 --- a/legacy/ephysics/src/lib/ephysics_private.h +++ b/legacy/ephysics/src/lib/ephysics_private.h @@ -99,6 +99,7 @@ void ephysics_orphan_body_del(EPhysics_Body *body); void ephysics_body_contact_processed(EPhysics_Body *body, EPhysics_Body *contact_body, btVector3 position); btRigidBody *ephysics_body_rigid_body_get(const EPhysics_Body *body); void ephysics_body_active_set(EPhysics_Body *body, Eina_Bool active); +void ephysics_body_recalc(EPhysics_Body *body, double rate); EPhysics_Camera *ephysics_camera_add(EPhysics_World *world); void ephysics_camera_del(EPhysics_Camera *camera);