From 59cc6c6f2fd9f9c991a9d310c2dfc8576304d55c Mon Sep 17 00:00:00 2001 From: Bruno Dilly Date: Wed, 10 Oct 2012 19:17:49 +0000 Subject: [PATCH] ephysics: support forces (and torques) on 3 axes SVN revision: 77782 --- legacy/ephysics/src/bin/ephysics_sandbox.c | 14 +++-- legacy/ephysics/src/bin/test_forces.c | 7 ++- .../ephysics/src/bin/test_rotating_forever.c | 6 +- legacy/ephysics/src/bin/test_shapes.c | 2 +- legacy/ephysics/src/lib/EPhysics.h | 48 ++++++++++++--- legacy/ephysics/src/lib/ephysics_body.cpp | 59 ++++++++++++++----- legacy/ephysics/src/lib/ephysics_private.h | 5 +- 7 files changed, 105 insertions(+), 36 deletions(-) diff --git a/legacy/ephysics/src/bin/ephysics_sandbox.c b/legacy/ephysics/src/bin/ephysics_sandbox.c index 232b2cf976..edea23d1a1 100644 --- a/legacy/ephysics/src/bin/ephysics_sandbox.c +++ b/legacy/ephysics/src/bin/ephysics_sandbox.c @@ -249,7 +249,7 @@ static void _body_torque_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) { EPhysics_Body *body = data; - ephysics_body_torque_apply(body, elm_spinner_value_get(obj)); + ephysics_body_torque_apply(body, 0, 0, elm_spinner_value_get(obj)); } static void @@ -334,7 +334,8 @@ _body_force_x_x_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) rel_x = elm_spinner_value_get(evas_object_data_get(obj, "relx")); rel_y = elm_spinner_value_get(evas_object_data_get(obj, "rely")); - ephysics_body_force_apply(body, elm_spinner_value_get(obj), y, rel_x, rel_y); + ephysics_body_force_apply(body, elm_spinner_value_get(obj), y, 0, + rel_x, rel_y, 0); } static void @@ -351,7 +352,8 @@ _body_force_x_rel_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) y = elm_spinner_value_get(evas_object_data_get(aux, "y")); rel_y = elm_spinner_value_get(evas_object_data_get(aux, "rely")); - ephysics_body_force_apply(body, x, y, elm_spinner_value_get(obj), rel_y); + ephysics_body_force_apply(body, x, y, 0, + elm_spinner_value_get(obj), rel_y, 0); } static void @@ -368,7 +370,8 @@ _body_force_y_y_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) rel_x = elm_spinner_value_get(evas_object_data_get(aux, "relx")); rel_y = elm_spinner_value_get(evas_object_data_get(aux, "rely")); - ephysics_body_force_apply(body, x, elm_spinner_value_get(obj), rel_x, rel_y); + ephysics_body_force_apply(body, x, elm_spinner_value_get(obj), 0, + rel_x, rel_y, 0); } static void @@ -385,7 +388,8 @@ _body_force_y_rel_cb(void *data, Evas_Object *obj, void *event_info __UNUSED__) y = elm_spinner_value_get(evas_object_data_get(aux, "y")); rel_x = elm_spinner_value_get(evas_object_data_get(aux, "relx")); - ephysics_body_force_apply(body, x, y, rel_x, elm_spinner_value_get(obj)); + ephysics_body_force_apply(body, x, y, 0, + rel_x, elm_spinner_value_get(obj), 0); } static void diff --git a/legacy/ephysics/src/bin/test_forces.c b/legacy/ephysics/src/bin/test_forces.c index 85ac312f89..d5628c1a82 100644 --- a/legacy/ephysics/src/bin/test_forces.c +++ b/legacy/ephysics/src/bin/test_forces.c @@ -10,7 +10,8 @@ _update_object_cb(void *data __UNUSED__, EPhysics_Body *body, void *event_info _ double x, y, torque, vx, vy, va; ephysics_body_evas_object_update(body); - ephysics_body_forces_get(body, &x, &y, &torque); + ephysics_body_forces_get(body, &x, &y, NULL); + ephysics_body_torques_get(body, NULL, NULL, &torque); DBG("Body %p, fx: %lf, fy: %lf, torque: %lf", body, x, y, torque); ephysics_body_linear_velocity_get(body, &vx, &vy, NULL); @@ -38,7 +39,7 @@ _world_populate(Test_Data *test_data) _update_object_cb, NULL); ephysics_body_restitution_set(box_body1, 0.7); ephysics_body_friction_set(box_body1, 0); - ephysics_body_force_apply(box_body1, 60, 0, 0, 10); + ephysics_body_force_apply(box_body1, 60, 0, 0, 0, 10, 0); test_data->bodies = eina_list_append(test_data->bodies, box_body1); box2 = elm_image_add(test_data->win); @@ -55,7 +56,7 @@ _world_populate(Test_Data *test_data) _update_object_cb, NULL); ephysics_body_restitution_set(box_body2, 0.7); ephysics_body_friction_set(box_body2, 0); - ephysics_body_central_force_apply(box_body2, 60, 0); + ephysics_body_central_force_apply(box_body2, 60, 0, 0); test_data->bodies = eina_list_append(test_data->bodies, box_body2); test_data->data = box_body2; } diff --git a/legacy/ephysics/src/bin/test_rotating_forever.c b/legacy/ephysics/src/bin/test_rotating_forever.c index d3674e730c..7741036201 100644 --- a/legacy/ephysics/src/bin/test_rotating_forever.c +++ b/legacy/ephysics/src/bin/test_rotating_forever.c @@ -22,7 +22,7 @@ _increase_torque_cb(void *data) EPhysics_Body *body = data; Evas_Object *obj; - ephysics_body_torque_apply(body, 2); + ephysics_body_torque_apply(body, 0, 0, 2); obj = ephysics_body_evas_object_get(body); evas_object_data_set(obj, "increase_timer", NULL); @@ -70,7 +70,7 @@ _update_object_cb(void *data __UNUSED__, EPhysics_Body *body, void *event_info _ ephysics_body_rotation_get(body, NULL, NULL, &rot); ephysics_body_angular_velocity_get(body, NULL, NULL, &vrot); - ephysics_body_forces_get(body, NULL, NULL, &torque); + ephysics_body_torques_get(body, NULL, NULL, &torque); ephysics_body_evas_object_update(body); @@ -154,7 +154,7 @@ _world_populate(Test_Data *test_data) EPHYSICS_CALLBACK_BODY_UPDATE, _update_object_cb, NULL); - ephysics_body_torque_apply(body, 2); + ephysics_body_torque_apply(body, 0, 0, 2); ephysics_body_event_callback_add(body, EPHYSICS_CALLBACK_BODY_DEL, _del_torque_cb, cube); diff --git a/legacy/ephysics/src/bin/test_shapes.c b/legacy/ephysics/src/bin/test_shapes.c index 8780ee463f..1a55840b04 100644 --- a/legacy/ephysics/src/bin/test_shapes.c +++ b/legacy/ephysics/src/bin/test_shapes.c @@ -51,7 +51,7 @@ _world_populate(Test_Data *test_data) ephysics_body_evas_object_set(hexagon_body, hexagon, EINA_TRUE); ephysics_body_restitution_set(hexagon_body, 1); test_data->bodies = eina_list_append(test_data->bodies, hexagon_body); - ephysics_body_torque_apply(hexagon_body, -3); + ephysics_body_torque_apply(hexagon_body, 0, 0, -3); ephysics_shape_del(pentagon_shape); ephysics_shape_del(hexagon_shape); diff --git a/legacy/ephysics/src/lib/EPhysics.h b/legacy/ephysics/src/lib/EPhysics.h index e99fdf28e1..d49492d61d 100644 --- a/legacy/ephysics/src/lib/EPhysics.h +++ b/legacy/ephysics/src/lib/EPhysics.h @@ -2895,14 +2895,16 @@ EAPI void *ephysics_body_data_get(const EPhysics_Body *body); * @param body The physics body which over the force will be applied. * @param x The axis x component of force. * @param y The axis y component of force. + * @param z The axis z component of force. * * @see ephysics_body_torque_apply(). * @see ephysics_body_force_apply(). * @see ephysics_body_forces_get(). + * @see ephysics_body_torques_get(). * * @ingroup EPhysics_Body */ -EAPI void ephysics_body_central_force_apply(EPhysics_Body *body, double x, double y); +EAPI void ephysics_body_central_force_apply(EPhysics_Body *body, double x, double y, double z); /** * @brief @@ -2913,17 +2915,24 @@ EAPI void ephysics_body_central_force_apply(EPhysics_Body *body, double x, doubl * And the body will rotate around Z axis considering this angular velocity. * * @param body The physics body that will receive the torque. - * @param torque Torque to change angular acceleration of the body around Z + * @param torque_x Torque to change angular acceleration of the body around X + * axis (rotate on y - z plane). + * Negative values will accelerate it on counter clockwise rotation. + * @param torque_y Torque to change angular acceleration of the body around Y + * axis (rotate on x - z plane). + * Negative values will accelerate it on counter clockwise rotation. + * @param torque_z Torque to change angular acceleration of the body around Z * axis (rotate on x - y plane). * Negative values will accelerate it on counter clockwise rotation. * * @see ephysics_body_central_force_apply(). * @see ephysics_body_force_apply(). * @see ephysics_body_forces_get(). + * @see ephysics_body_torques_get(). * * @ingroup EPhysics_Body */ -EAPI void ephysics_body_torque_apply(EPhysics_Body *body, double torque); +EAPI void ephysics_body_torque_apply(EPhysics_Body *body, double torque_x, double torque_y, double torque_z); /** * @brief @@ -2938,15 +2947,17 @@ EAPI void ephysics_body_torque_apply(EPhysics_Body *body, double torque); * @ref ephysics_body_torque_apply(), or can be used to lead to both * behaviors with @ref ephysics_body_force_apply(). * - * It will result in a central force with force (@p x, @p y) and a + * It will result in a central force with force (@p x, @p y, @p z) and a * torque that will be calculated as a cross product on force * and relative position. * * @param body The physics body that will receive the impulse. * @param x The axis x component of force. * @param y The axis y component of force. + * @param z The axis z component of force. * @param pos_x The axis x component of the relative position to apply force. * @param pos_y The axis y component of the relative position to apply force. + * @param pos_z The axis z component of the relative position to apply force. * * @note Force is measured in kg * p / s / s and position in p (pixels, or * Evas coordinates). @@ -2954,10 +2965,11 @@ EAPI void ephysics_body_torque_apply(EPhysics_Body *body, double torque); * @see ephysics_body_central_force_apply(). * @see ephysics_body_torque_apply(). * @see ephysics_body_forces_get(). + * @see ephysics_body_torques_get(). * * @ingroup EPhysics_Body */ -EAPI void ephysics_body_force_apply(EPhysics_Body *body, double x, double y, Evas_Coord pos_x, Evas_Coord pos_y); +EAPI void ephysics_body_force_apply(EPhysics_Body *body, double x, double y, double z, Evas_Coord pos_x, Evas_Coord pos_y, Evas_Coord pos_z); /** * @brief @@ -2969,17 +2981,38 @@ EAPI void ephysics_body_force_apply(EPhysics_Body *body, double x, double y, Eva * @param body The physics body. * @param x The axis x component of total force. * @param y The axis y component of total force. - * @param torque The torque. + * @param z The axis z component of total force. * * @see ephysics_body_force_apply() for more details. * @see ephysics_body_central_force_apply(). * @see ephysics_body_torque_apply(). + * @see ephysics_body_torques_get(). * @see ephysics_body_forces_clear(). * @see ephysics_world_gravity_set(). * * @ingroup EPhysics_Body */ -EAPI void ephysics_body_forces_get(const EPhysics_Body *body, double *x, double *y, double *torque); +EAPI void ephysics_body_forces_get(const EPhysics_Body *body, double *x, double *y, double *z); + +/** + * @brief + * Get physics body torques. + * + * Get all the torques applied over a body. + * Damping is not considered. + * + * @param body The physics body. + * @param x The torque on x axis. + * @param y The torque on y axis. + * @param z The torque on z axis. + * + * @see ephysics_body_torque_apply() for more details. + * @see ephysics_body_force_apply(). + * @see ephysics_body_forces_clear(). + * + * @ingroup EPhysics_Body + */ +EAPI void ephysics_body_torques_get(const EPhysics_Body *body, double *x, double *y, double *z); /** * @brief @@ -2999,6 +3032,7 @@ EAPI void ephysics_body_forces_get(const EPhysics_Body *body, double *x, double * @see ephysics_body_torque_apply(). * @see ephysics_body_force_apply(). * @see ephysics_body_forces_get(). + * @see ephysics_body_torques_get(). * * @ingroup EPhysics_Body */ diff --git a/legacy/ephysics/src/lib/ephysics_body.cpp b/legacy/ephysics/src/lib/ephysics_body.cpp index 8779a6dabb..87a5200a1e 100644 --- a/legacy/ephysics/src/lib/ephysics_body.cpp +++ b/legacy/ephysics/src/lib/ephysics_body.cpp @@ -467,7 +467,10 @@ _ephysics_body_forces_update(EPhysics_Body *body) { body->force.x = body->rigid_body->getTotalForce().getX(); body->force.y = body->rigid_body->getTotalForce().getY(); - body->force.torque = body->rigid_body->getTotalTorque().getZ(); + body->force.z = body->rigid_body->getTotalForce().getZ(); + body->force.torque_x = body->rigid_body->getTotalTorque().getX(); + body->force.torque_y = body->rigid_body->getTotalTorque().getY(); + body->force.torque_z = body->rigid_body->getTotalTorque().getZ(); body->rigid_body->clearForces(); } @@ -1074,14 +1077,19 @@ ephysics_body_forces_apply(EPhysics_Body *body) { double rate; - if (!((body->force.x) || (body->force.y) || (body->force.torque))) + if (!((body->force.x) || (body->force.y) || (body->force.z) || + (body->force.torque_x) || (body->force.torque_y) || + (body->force.torque_z))) return; rate = ephysics_world_rate_get(body->world); ephysics_body_activate(body, EINA_TRUE); body->rigid_body->applyCentralForce(btVector3(body->force.x / rate, - body->force.y / rate, 0)); - body->rigid_body->applyTorque(btVector3(0, 0, body->force.torque)); + body->force.y / rate, + body->force.z / rate)); + body->rigid_body->applyTorque(btVector3(body->force.torque_x, + body->force.torque_y, + body->force.torque_z)); } void @@ -2607,7 +2615,7 @@ ephysics_body_data_get(const EPhysics_Body *body) } EAPI void -ephysics_body_central_force_apply(EPhysics_Body *body, double x, double y) +ephysics_body_central_force_apply(EPhysics_Body *body, double x, double y, double z) { double rate; @@ -2620,13 +2628,14 @@ ephysics_body_central_force_apply(EPhysics_Body *body, double x, double y) ephysics_world_lock_take(body->world); rate = ephysics_world_rate_get(body->world); ephysics_body_forces_apply(body); - body->rigid_body->applyCentralForce(btVector3(x / rate, - y / rate, 0)); + body->rigid_body->applyCentralForce(btVector3(x / rate, - y / rate, + z / rate)); _ephysics_body_forces_update(body); ephysics_world_lock_release(body->world); } EAPI void -ephysics_body_force_apply(EPhysics_Body *body, double x, double y, Evas_Coord pos_x, Evas_Coord pos_y) +ephysics_body_force_apply(EPhysics_Body *body, double x, double y, double z, Evas_Coord pos_x, Evas_Coord pos_y, Evas_Coord pos_z) { double rate; @@ -2639,15 +2648,16 @@ ephysics_body_force_apply(EPhysics_Body *body, double x, double y, Evas_Coord po rate = ephysics_world_rate_get(body->world); ephysics_world_lock_take(body->world); ephysics_body_forces_apply(body); - body->rigid_body->applyForce(btVector3(x / rate, - y / rate, 0), + body->rigid_body->applyForce(btVector3(x / rate, - y / rate, z / rate), btVector3((double) pos_x / rate, - (double) pos_y / rate, 0)); + (double) pos_y / rate, + (double) pos_z / rate)); _ephysics_body_forces_update(body); ephysics_world_lock_release(body->world); } EAPI void -ephysics_body_torque_apply(EPhysics_Body *body, double torque) +ephysics_body_torque_apply(EPhysics_Body *body, double torque_x, double torque_y, double torque_z) { if (!body) { @@ -2657,15 +2667,15 @@ ephysics_body_torque_apply(EPhysics_Body *body, double torque) ephysics_world_lock_take(body->world); ephysics_body_forces_apply(body); - body->rigid_body->applyTorque(btVector3(0, 0, -torque)); + body->rigid_body->applyTorque(btVector3(-torque_x, -torque_y, -torque_z)); _ephysics_body_forces_update(body); ephysics_world_lock_release(body->world); } EAPI void -ephysics_body_forces_get(const EPhysics_Body *body, double *x, double *y, double *torque) +ephysics_body_forces_get(const EPhysics_Body *body, double *x, double *y, double *z) { - double rate, gx, gy; + double rate, gx, gy, gz; if (!body) { @@ -2674,11 +2684,25 @@ ephysics_body_forces_get(const EPhysics_Body *body, double *x, double *y, double } rate = ephysics_world_rate_get(body->world); - ephysics_world_gravity_get(body->world, &gx, &gy, NULL); + ephysics_world_gravity_get(body->world, &gx, &gy, &gz); if (x) *x = body->force.x * rate + gx; if (y) *y = -body->force.y * rate + gy; - if (torque) *torque = -body->force.torque; + if (z) *z = body->force.z * rate + gz; +} + +EAPI void +ephysics_body_torques_get(const EPhysics_Body *body, double *x, double *y, double *z) +{ + if (!body) + { + ERR("Can't get torques from a null body."); + return; + } + + if (x) *x = -body->force.torque_x; + if (y) *y = -body->force.torque_y; + if (z) *z = -body->force.torque_z; } EAPI void @@ -2692,7 +2716,10 @@ ephysics_body_forces_clear(EPhysics_Body *body) body->force.x = 0; body->force.y = 0; - body->force.torque = 0; + body->force.z = 0; + body->force.torque_x = 0; + body->force.torque_y = 0; + body->force.torque_z = 0; } EAPI void diff --git a/legacy/ephysics/src/lib/ephysics_private.h b/legacy/ephysics/src/lib/ephysics_private.h index 1bdf50cd22..5d624fb16b 100644 --- a/legacy/ephysics/src/lib/ephysics_private.h +++ b/legacy/ephysics/src/lib/ephysics_private.h @@ -93,7 +93,10 @@ struct _EPhysics_Body { struct { double x; double y; - double torque; + double z; + double torque_x; + double torque_y; + double torque_z; } force; struct { double x;