diff --git a/legacy/ephysics/src/lib/EPhysics.h b/legacy/ephysics/src/lib/EPhysics.h index babe3b5ed4..fd3577ec42 100644 --- a/legacy/ephysics/src/lib/EPhysics.h +++ b/legacy/ephysics/src/lib/EPhysics.h @@ -1394,6 +1394,9 @@ EAPI EPhysics_Body *ephysics_body_soft_box_add(EPhysics_World *world); * To change it's size @ref ephysics_body_geometry_set() should be used, * so it can be deformed on x and y axises. * + * The center of mass of this body can be get with + * @ref ephysics_body_center_mass_get(). + * * @param world The world this body will belongs to. * @param shape The custom shape to be used. * @return a new body or @c NULL, on errors. @@ -2568,6 +2571,33 @@ EAPI void ephysics_body_forces_get(const EPhysics_Body *body, double *x, double */ EAPI void ephysics_body_forces_clear(EPhysics_Body *body); +/** + * @brief + * Get the center of mass of physics body. + * + * It returns a value from 0 to 1 representing where is the center of the mass + * considering the height and width of the body. + * + * If a body of width = 30 and height = 20 has the center of mass at + * center of mass x component = 20 and y component = 10, it will return + * @p x = 0.666 and @p y = 0.5. + * + * For primitive shapes, like box and circle, the center of mass + * is (0.5, 0.5). + * + * This function can be useful when updating evas objects for bodies + * with custom shapes. + * + * @param body The physics body. + * @param x The axis x component of center of mass. + * @param y The axis y component of center of mass. + * + * @see ephysics_body_shape_add(). + * + * @ingroup EPhysics_Body + */ +EAPI void ephysics_body_center_mass_get(const EPhysics_Body *body, double *x, double *y); + /** * @} */ diff --git a/legacy/ephysics/src/lib/ephysics_body.cpp b/legacy/ephysics/src/lib/ephysics_body.cpp index 123192791b..008b309c26 100644 --- a/legacy/ephysics/src/lib/ephysics_body.cpp +++ b/legacy/ephysics/src/lib/ephysics_body.cpp @@ -1834,6 +1834,19 @@ ephysics_body_forces_clear(EPhysics_Body *body) body->force.torque = 0; } +EAPI void +ephysics_body_center_mass_get(const EPhysics_Body *body, double *x, double *y) +{ + if (!body) + { + ERR("Can't get center of mass from a null body."); + return; + } + + if (x) *x = body->cm.x; + if (y) *y = body->cm.y; +} + #ifdef __cplusplus } #endif