From 0bdec6725538665680ba77a84b21a745c7462380 Mon Sep 17 00:00:00 2001 From: Bruno Dilly Date: Thu, 4 Oct 2012 22:39:42 +0000 Subject: [PATCH] ephysics: support body material Using material_set it will be easier to set density, friction and restitution to a body, simulating properties of the selected material. SVN revision: 77462 --- legacy/ephysics/src/lib/EPhysics.h | 62 +++++++++++++++++ legacy/ephysics/src/lib/Makefile.am | 2 +- legacy/ephysics/src/lib/ephysics_body.cpp | 69 +++++++++++++++++-- .../src/lib/ephysics_body_materials.h | 37 ++++++++++ legacy/ephysics/src/lib/ephysics_private.h | 1 + 5 files changed, 166 insertions(+), 5 deletions(-) create mode 100644 legacy/ephysics/src/lib/ephysics_body_materials.h diff --git a/legacy/ephysics/src/lib/EPhysics.h b/legacy/ephysics/src/lib/EPhysics.h index afd6dc9c56..d102e2b3b4 100644 --- a/legacy/ephysics/src/lib/EPhysics.h +++ b/legacy/ephysics/src/lib/EPhysics.h @@ -1465,6 +1465,28 @@ typedef enum _EPhysics_Callback_Body_Type EPHYSICS_CALLBACK_BODY_LAST, /**< kept as sentinel, not really an event */ } EPhysics_Callback_Body_Type; /**< The types of events triggering a callback */ +/** + * @enum _EPhysics_Body_Material + * @typedef EPhysics_Body_Material + * + * EPhysics bodies materials. Each material has specific properties to be + * applied on the body, as density, friction and restitution. + * + * @see ephysics_body_material_set() for details. + * + * @ingroup EPhysics_Body + */ +typedef enum _EPhysics_Body_Material +{ + EPHYSICS_BODY_MATERIAL_CUSTOM, /**< Custom properties set by the user */ + EPHYSICS_BODY_MATERIAL_CONCRETE, /**< Density:2300,Fric:0.65,Rest:0.75 */ + EPHYSICS_BODY_MATERIAL_IRON, /**< Density:7400,Fric:0.8,Rest:0.85 */ + EPHYSICS_BODY_MATERIAL_PLASTIC, /**< Density:1300,Fric:0.35,Rest:0.6 */ + EPHYSICS_BODY_MATERIAL_POLYSTYRENE, /**< Density:80,Fric:0.5,Rest:0.5*/ + EPHYSICS_BODY_MATERIAL_RUBBER, /**< Density:920,Fric:0.75,Rest:0.3*/ + EPHYSICS_BODY_MATERIAL_WOOD, /**< Density:680,Fric:0.4,Rest:0.7*/ + EPHYSICS_BODY_MATERIAL_LAST, /**< kept as sentinel, not really a material */ +} EPhysics_Body_Material; /**< The types of materials to be set on a body */ /** * @typedef EPhysics_Body_Event_Cb @@ -2892,6 +2914,46 @@ EAPI void ephysics_body_density_set(EPhysics_Body *body, double density); */ EAPI double ephysics_body_density_get(const EPhysics_Body *body); +/** + * @brief + * Set body's material. + * + * This function makes properties setting easy. When a material is set to + * a body, it will update its friction, restitution and density, + * recalculating its mass. + * + * EPhysics support some materials defined by @ref EPhysics_Body_Material. + * + * So, for example, if @ref EPHYSICS_BODY_MATERIAL_WOOD is set, it will + * set body's density to @ref EPHYSICS_BODY_DENSITY_WOOD, restitution + * to @ref EPHSYICS_BODY_RESTITUTION_WOOD and friction to + * @ref EPHYSICS_BODY_FRICTION_WOOD. + * + * If any of these values are later explicitely set, the material will + * be set back to @ref EPHYSICS_BODY_MATERIAL_CUSTOM, the default. + * + * @param body The body to has its material set. + * @param material The @p material to be used by the body. + * + * @see ephysics_body_material_get(). + * + * @ingroup EPhysics_Body + */ +EAPI void ephysics_body_material_set(EPhysics_Body *body, EPhysics_Body_Material material); + +/** + * @brief + * Get body's material. + * + * @param body The physics body. + * @return the @p material used by the body. + * + * @see ephysics_body_body_set() for more details. + * + * @ingroup EPhysics_Body + */ +EAPI EPhysics_Body_Material ephysics_body_material_get(const EPhysics_Body *body); + /** * @} */ diff --git a/legacy/ephysics/src/lib/Makefile.am b/legacy/ephysics/src/lib/Makefile.am index 5e040b3951..c91e5fb786 100644 --- a/legacy/ephysics/src/lib/Makefile.am +++ b/legacy/ephysics/src/lib/Makefile.am @@ -26,4 +26,4 @@ libephysics_la_SOURCES = $(base_sources) libephysics_la_LIBADD = @EPHYSICS_LIBS@ @EVIL_LIBS@ -lm libephysics_la_LDFLAGS = -no-undefined @lt_enable_auto_import@ -version-info @version_info@ @release_info@ -EXTRA_DIST = ephysics_private.h ephysics_trimesh.h +EXTRA_DIST = ephysics_private.h ephysics_trimesh.h ephysics_body_materials.h diff --git a/legacy/ephysics/src/lib/ephysics_body.cpp b/legacy/ephysics/src/lib/ephysics_body.cpp index c03a8db705..30df114c34 100644 --- a/legacy/ephysics/src/lib/ephysics_body.cpp +++ b/legacy/ephysics/src/lib/ephysics_body.cpp @@ -10,6 +10,7 @@ #include "ephysics_private.h" #include "ephysics_trimesh.h" +#include "ephysics_body_materials.h" #ifdef __cplusplus extern "C" { @@ -1418,6 +1419,7 @@ ephysics_body_mass_set(EPhysics_Body *body, double mass) } ephysics_world_lock_take(body->world); + body->material = EPHYSICS_BODY_MATERIAL_CUSTOM; body->density = 0; _ephysics_body_mass_set(body, mass); ephysics_world_lock_release(body->world); @@ -1673,6 +1675,13 @@ ephysics_body_event_callback_del_full(EPhysics_Body *body, EPhysics_Callback_Bod return cb_data; } +static void +_ephysics_body_restitution_set(EPhysics_Body *body, double restitution) +{ + body->rigid_body->setRestitution(btScalar(restitution)); + DBG("Body %p restitution set to %lf", body, restitution); +} + EAPI void ephysics_body_restitution_set(EPhysics_Body *body, double restitution) { @@ -1683,8 +1692,8 @@ ephysics_body_restitution_set(EPhysics_Body *body, double restitution) } ephysics_world_lock_take(body->world); - body->rigid_body->setRestitution(btScalar(restitution)); - DBG("Body %p restitution set to %lf", body, restitution); + body->material = EPHYSICS_BODY_MATERIAL_CUSTOM; + _ephysics_body_restitution_set(body, restitution); ephysics_world_lock_release(body->world); } @@ -1700,6 +1709,13 @@ ephysics_body_restitution_get(const EPhysics_Body *body) return body->rigid_body->getRestitution(); } +static void +_ephysics_body_friction_set(EPhysics_Body *body, double friction) +{ + body->rigid_body->setFriction(btScalar(friction)); + DBG("Body %p friction set to %lf", body, friction); +} + EAPI void ephysics_body_friction_set(EPhysics_Body *body, double friction) { @@ -1710,8 +1726,8 @@ ephysics_body_friction_set(EPhysics_Body *body, double friction) } ephysics_world_lock_take(body->world); - body->rigid_body->setFriction(btScalar(friction)); - DBG("Body %p friction set to %lf", body, friction); + body->material = EPHYSICS_BODY_MATERIAL_CUSTOM; + _ephysics_body_friction_set(body, friction); ephysics_world_lock_release(body->world); } @@ -2032,6 +2048,7 @@ ephysics_body_density_set(EPhysics_Body *body, double density) return; } + body->material = EPHYSICS_BODY_MATERIAL_CUSTOM; body->density = density; ephysics_world_lock_take(body->world); _ephysics_body_mass_set(body, 0); @@ -2050,6 +2067,50 @@ ephysics_body_density_get(const EPhysics_Body *body) return body->density; } +EAPI void +ephysics_body_material_set(EPhysics_Body *body, EPhysics_Body_Material material) +{ + if (!body) + { + ERR("Can't set body's material."); + return; + } + + if (material >= EPHYSICS_BODY_MATERIAL_LAST) + { + ERR("Invalid material."); + return; + } + + if (material != ephysics_material_props[material].material) + { + ERR("Material properties weren't found."); + return; + } + + ephysics_world_lock_take(body->world); + body->density = ephysics_material_props[material].density; + _ephysics_body_mass_set(body, 0); + _ephysics_body_friction_set(body, + ephysics_material_props[material].friction); + _ephysics_body_restitution_set( + body, ephysics_material_props[material].restitution); + body->material = material; + ephysics_world_lock_release(body->world); +} + +EAPI EPhysics_Body_Material +ephysics_body_material_get(const EPhysics_Body *body) +{ + if (!body) + { + ERR("Can't get body's material."); + return EPHYSICS_BODY_MATERIAL_LAST; + } + + return body->material; +} + #ifdef __cplusplus } #endif diff --git a/legacy/ephysics/src/lib/ephysics_body_materials.h b/legacy/ephysics/src/lib/ephysics_body_materials.h new file mode 100644 index 0000000000..993a0b116b --- /dev/null +++ b/legacy/ephysics/src/lib/ephysics_body_materials.h @@ -0,0 +1,37 @@ +#ifndef _EPHYSICS_BODY_MATERIALS_H +#define _EPHYSICS_BODY_MATERIALS_H + +#ifdef __cplusplus +extern "C" { +#endif + +typedef struct _EPhysics_Body_Material_Props EPhysics_Body_Material_Props; +struct _EPhysics_Body_Material_Props { + EPhysics_Body_Material material; + int density; + double friction; + double restitution; +}; + +const EPhysics_Body_Material_Props ephysics_material_props [] = { + {EPHYSICS_BODY_MATERIAL_CUSTOM, 1.0, 0.0, 0.0}, + {EPHYSICS_BODY_MATERIAL_CONCRETE, EPHYSICS_BODY_DENSITY_CONCRETE, + EPHYSICS_BODY_FRICTION_CONCRETE, EPHYSICS_BODY_RESTITUTION_CONCRETE}, + {EPHYSICS_BODY_MATERIAL_IRON, EPHYSICS_BODY_DENSITY_IRON, + EPHYSICS_BODY_FRICTION_IRON, EPHYSICS_BODY_RESTITUTION_IRON}, + {EPHYSICS_BODY_MATERIAL_PLASTIC, EPHYSICS_BODY_DENSITY_PLASTIC, + EPHYSICS_BODY_FRICTION_PLASTIC, EPHYSICS_BODY_RESTITUTION_PLASTIC}, + {EPHYSICS_BODY_MATERIAL_POLYSTYRENE, EPHYSICS_BODY_DENSITY_POLYSTYRENE, + EPHYSICS_BODY_FRICTION_POLYSTYRENE, + EPHYSICS_BODY_RESTITUTION_POLYSTYRENE}, + {EPHYSICS_BODY_MATERIAL_RUBBER, EPHYSICS_BODY_DENSITY_RUBBER, + EPHYSICS_BODY_FRICTION_RUBBER, EPHYSICS_BODY_RESTITUTION_RUBBER}, + {EPHYSICS_BODY_MATERIAL_WOOD, EPHYSICS_BODY_DENSITY_WOOD, + EPHYSICS_BODY_FRICTION_WOOD, EPHYSICS_BODY_RESTITUTION_WOOD} +}; + +#ifdef __cplusplus +} +#endif + +#endif diff --git a/legacy/ephysics/src/lib/ephysics_private.h b/legacy/ephysics/src/lib/ephysics_private.h index 78eff5bec4..358c720a93 100644 --- a/legacy/ephysics/src/lib/ephysics_private.h +++ b/legacy/ephysics/src/lib/ephysics_private.h @@ -79,6 +79,7 @@ struct _EPhysics_Body { Eina_Inlist *callbacks; Eina_List *collision_groups; Eina_List *to_delete; + EPhysics_Body_Material material; double mass; double density; struct {