forked from enlightenment/efl
ephysics: support forces (and torques) on 3 axes
SVN revision: 77782
This commit is contained in:
parent
bdd5ba2115
commit
59cc6c6f2f
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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
|
||||
*/
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in New Issue