ephysics: support 3 axes on body geometry related

functions

geometry set / get, move, resize



SVN revision: 77777
This commit is contained in:
Bruno Dilly 2012-10-10 19:17:01 +00:00
parent 32f03f55a4
commit 8b9c28f003
12 changed files with 75 additions and 57 deletions

View File

@ -99,7 +99,7 @@ _update_circle_cb(void *data __UNUSED__, EPhysics_Body *body, void *event_info)
evas_object_color_set(shadow, alpha, alpha, alpha, alpha); evas_object_color_set(shadow, alpha, alpha, alpha, alpha);
if (x > E_THRESHOLD) if (x > E_THRESHOLD)
ephysics_body_move(body, -w - 1, y); ephysics_body_move(body, -w - 1, y, -15);
} }
static void static void
@ -218,7 +218,8 @@ elm_main(int argc __UNUSED__, char **argv __UNUSED__)
ground_body = ephysics_body_box_add(world); ground_body = ephysics_body_box_add(world);
ephysics_body_mass_set(ground_body, EPHYSICS_BODY_MASS_STATIC); ephysics_body_mass_set(ground_body, EPHYSICS_BODY_MASS_STATIC);
ephysics_body_geometry_set(ground_body, -100, FLOOR_Y, WIDTH + 800, 10); ephysics_body_geometry_set(ground_body, -100, FLOOR_Y, -15, WIDTH + 800, 10,
30);
ephysics_body_restitution_set(ground_body, 0.65); ephysics_body_restitution_set(ground_body, 0.65);
ephysics_body_friction_set(ground_body, 0.8); ephysics_body_friction_set(ground_body, 0.8);

View File

@ -22,7 +22,7 @@ _world_populate(Test_Data *test_data)
text_body = ephysics_body_box_add(test_data->world); text_body = ephysics_body_box_add(test_data->world);
ephysics_body_evas_object_set(text_body, text, EINA_FALSE); ephysics_body_evas_object_set(text_body, text, EINA_FALSE);
ephysics_body_geometry_set(text_body, x, y, w * 5 / 6, 46); ephysics_body_geometry_set(text_body, x, y, -15, w * 5 / 6, 46, 30);
ephysics_body_restitution_set(text_body, 0.95); ephysics_body_restitution_set(text_body, 0.95);
ephysics_body_friction_set(text_body, 0.1); ephysics_body_friction_set(text_body, 0.1);
test_data->bodies = eina_list_append(test_data->bodies, text_body); test_data->bodies = eina_list_append(test_data->bodies, text_body);

View File

@ -227,7 +227,7 @@ test_camera(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info
boundary = ephysics_body_box_add(camera_data->base.world); boundary = ephysics_body_box_add(camera_data->base.world);
ephysics_body_mass_set(boundary, 0); ephysics_body_mass_set(boundary, 0);
ephysics_body_geometry_set(boundary, 0, FLOOR_Y, WIDTH * 2, 10); ephysics_body_geometry_set(boundary, 0, FLOOR_Y, -15, WIDTH * 2, 10, 30);
ephysics_body_restitution_set(boundary, 0.65); ephysics_body_restitution_set(boundary, 0.65);
ephysics_body_friction_set(boundary, 4); ephysics_body_friction_set(boundary, 4);

View File

@ -238,7 +238,7 @@ test_camera_track(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *even
boundary = ephysics_body_box_add(track_data->base.world); boundary = ephysics_body_box_add(track_data->base.world);
ephysics_body_mass_set(boundary, 0); ephysics_body_mass_set(boundary, 0);
ephysics_body_geometry_set(boundary, 0, FLOOR_Y, WIDTH * 4, 10); ephysics_body_geometry_set(boundary, 0, FLOOR_Y, -15, WIDTH * 4, 10, 30);
ephysics_body_restitution_set(boundary, 0.65); ephysics_body_restitution_set(boundary, 0.65);
ephysics_body_friction_set(boundary, 4); ephysics_body_friction_set(boundary, 4);

View File

@ -75,7 +75,8 @@ test_collision_filter(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *
ephysics_body_friction_set(boundary, 2); ephysics_body_friction_set(boundary, 2);
boundary = ephysics_body_box_add(test_data->world); boundary = ephysics_body_box_add(test_data->world);
ephysics_body_geometry_set(boundary, 60, FLOOR_Y - 16, WIDTH - 120, 10); ephysics_body_geometry_set(boundary, 60, FLOOR_Y - 16, -15, WIDTH - 120, 10,
30);
ephysics_body_restitution_set(boundary, 0.65); ephysics_body_restitution_set(boundary, 0.65);
ephysics_body_friction_set(boundary, 2); ephysics_body_friction_set(boundary, 2);
ephysics_body_mass_set(boundary, 0); ephysics_body_mass_set(boundary, 0);

View File

@ -30,7 +30,7 @@ _world_populate(Test_Data *test_data)
text_body = ephysics_body_box_add(test_data->world); text_body = ephysics_body_box_add(test_data->world);
ephysics_body_evas_object_set(text_body, text, EINA_FALSE); ephysics_body_evas_object_set(text_body, text, EINA_FALSE);
ephysics_body_geometry_set(text_body, x, y, w * 5 / 6, 40); ephysics_body_geometry_set(text_body, x, y, -15, w * 5 / 6, 40, 30);
ephysics_body_friction_set(text_body, 0.1); ephysics_body_friction_set(text_body, 0.1);
ephysics_body_restitution_set(text_body, 0.95); ephysics_body_restitution_set(text_body, 0.95);
test_data->bodies = eina_list_append(test_data->bodies, text_body); test_data->bodies = eina_list_append(test_data->bodies, text_body);

View File

@ -62,7 +62,7 @@ _mouse_move_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_inf
if (nx < 0 || ny < 0) return; if (nx < 0 || ny < 0) return;
evas_object_geometry_get(obj, &x, &y, &w, &h); evas_object_geometry_get(obj, &x, &y, &w, &h);
ephysics_body_move(dragging->body, nx, ny); ephysics_body_move(dragging->body, nx, ny, -15);
} }
static void static void

View File

@ -62,7 +62,7 @@ _win_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *obj, void *event_inf
evas_object_geometry_get(sphere, &x, &y, NULL, NULL); evas_object_geometry_get(sphere, &x, &y, NULL, NULL);
ephysics_body_move(sphere_body, x * (ratew / old_rate->w), ephysics_body_move(sphere_body, x * (ratew / old_rate->w),
y * (rateh / old_rate->h)); y * (rateh / old_rate->h), -15);
evas_object_resize(sphere, 70 * ratew, 70 * rateh); evas_object_resize(sphere, 70 * ratew, 70 * rateh);
old_rate->w = ratew; old_rate->w = ratew;

View File

@ -1945,9 +1945,8 @@ EAPI Evas_Object *ephysics_body_evas_object_get(const EPhysics_Body *body);
* @brief * @brief
* Set physics body size. * Set physics body size.
* *
* All the physics bodies are and with canonical dimensions. * By default circles have diameter equal to 1 meter * rate, boxes have
* Circles have diameter 1, boxes have dimensions 1 * dimensions 1 meter * rate on all the axes.
* on all the axes.
* *
* There are three direct ways of modifying it's size: * There are three direct ways of modifying it's size:
* @li With @ref ephysics_body_resize(); * @li With @ref ephysics_body_resize();
@ -1960,6 +1959,7 @@ EAPI Evas_Object *ephysics_body_evas_object_get(const EPhysics_Body *body);
* @param body The body to be resized. * @param body The body to be resized.
* @param w The body width, in pixels. * @param w The body width, in pixels.
* @param h The body height, in pixels. * @param h The body height, in pixels.
* @param d The body depth, in pixels.
* *
* @see ephysics_body_geometry_get(). * @see ephysics_body_geometry_get().
* @see ephysics_body_geometry_set(). * @see ephysics_body_geometry_set().
@ -1967,13 +1967,13 @@ EAPI Evas_Object *ephysics_body_evas_object_get(const EPhysics_Body *body);
* *
* @ingroup EPhysics_Body * @ingroup EPhysics_Body
*/ */
EAPI void ephysics_body_resize(EPhysics_Body *body, Evas_Coord w, Evas_Coord h); EAPI void ephysics_body_resize(EPhysics_Body *body, Evas_Coord w, Evas_Coord h, Evas_Coord d);
/** /**
* @brief * @brief
* Set physics body position. * Set physics body position.
* *
* All the physics bodies are created centered on origin (0, 0). * All the physics bodies are created centered on origin (0, 0, 0).
* *
* There are three direct ways of modifying this position: * There are three direct ways of modifying this position:
* @li With @ref ephysics_body_move(); * @li With @ref ephysics_body_move();
@ -1989,6 +1989,7 @@ EAPI void ephysics_body_resize(EPhysics_Body *body, Evas_Coord w, Evas_Coord h);
* @param body The body to be positioned. * @param body The body to be positioned.
* @param x The position on axis x, in pixels. * @param x The position on axis x, in pixels.
* @param y The position on axis y, in pixels. * @param y The position on axis y, in pixels.
* @param z The position on axis z, in pixels.
* *
* @see ephysics_body_geometry_get(). * @see ephysics_body_geometry_get().
* @see ephysics_body_geometry_set(). * @see ephysics_body_geometry_set().
@ -1996,7 +1997,7 @@ EAPI void ephysics_body_resize(EPhysics_Body *body, Evas_Coord w, Evas_Coord h);
* *
* @ingroup EPhysics_Body * @ingroup EPhysics_Body
*/ */
EAPI void ephysics_body_move(EPhysics_Body *body, Evas_Coord x, Evas_Coord y); EAPI void ephysics_body_move(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas_Coord z);
/** /**
* @brief * @brief
@ -2025,8 +2026,10 @@ EAPI void ephysics_body_move(EPhysics_Body *body, Evas_Coord x, Evas_Coord y);
* @param body The body to be modified. * @param body The body to be modified.
* @param x The position on axis x, in pixels. * @param x The position on axis x, in pixels.
* @param y The position on axis y, in pixels. * @param y The position on axis y, in pixels.
* @param z The position on axis z, in pixels.
* @param w The body width, in pixels. * @param w The body width, in pixels.
* @param h The body height, in pixels. * @param h The body height, in pixels.
* @param d The body depth, in pixels.
* *
* @see ephysics_body_geometry_get(). * @see ephysics_body_geometry_get().
* @see ephysics_body_move(). * @see ephysics_body_move().
@ -2034,7 +2037,7 @@ EAPI void ephysics_body_move(EPhysics_Body *body, Evas_Coord x, Evas_Coord y);
* *
* @ingroup EPhysics_Body * @ingroup EPhysics_Body
*/ */
EAPI void ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h); EAPI void ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas_Coord z, Evas_Coord w, Evas_Coord h, Evas_Coord d);
/** /**
* @brief * @brief
@ -2043,8 +2046,10 @@ EAPI void ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coo
* @param body The physics body. * @param body The physics body.
* @param x The position on axis x, in pixels. * @param x The position on axis x, in pixels.
* @param y The position on axis y, in pixels. * @param y The position on axis y, in pixels.
* @param z The position on axis z, in pixels.
* @param w The body width, in pixels. * @param w The body width, in pixels.
* @param h The body height, in pixels. * @param h The body height, in pixels.
* @param d The body depth, in pixels.
* *
* @see ephysics_body_geometry_set() for more details. * @see ephysics_body_geometry_set() for more details.
* @see ephysics_body_move(). * @see ephysics_body_move().
@ -2052,7 +2057,7 @@ EAPI void ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coo
* *
* @ingroup EPhysics_Body * @ingroup EPhysics_Body
*/ */
EAPI void ephysics_body_geometry_get(const EPhysics_Body *body, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h); EAPI void ephysics_body_geometry_get(const EPhysics_Body *body, Evas_Coord *x, Evas_Coord *y, Evas_Coord *z, Evas_Coord *w, Evas_Coord *h, Evas_Coord *d);
/** /**
* @brief * @brief

View File

@ -828,22 +828,23 @@ _ephysics_body_mass_set(EPhysics_Body *body, double mass)
} }
static void static void
_ephysics_body_resize(EPhysics_Body *body, Evas_Coord w, Evas_Coord h) _ephysics_body_resize(EPhysics_Body *body, Evas_Coord w, Evas_Coord h, Evas_Coord d)
{ {
double rate, sx, sy; double rate, sx, sy, sz;
rate = ephysics_world_rate_get(body->world); rate = ephysics_world_rate_get(body->world);
sx = w / rate; sx = w / rate;
sy = h / rate; sy = h / rate;
sz = d / rate;
if (body->soft_body) if (body->soft_body)
{ {
body->soft_body->scale(btVector3(sx, sy, 1)); body->soft_body->scale(btVector3(sx, sy, sz));
_ephysics_body_soft_body_constraints_rebuild(body); _ephysics_body_soft_body_constraints_rebuild(body);
} }
else else
{ {
body->collision_shape->setLocalScaling(btVector3(sx, sy, 1)); body->collision_shape->setLocalScaling(btVector3(sx, sy, sz));
if(!body->rigid_body->isStaticObject()) if(!body->rigid_body->isStaticObject())
_ephysics_body_mass_set(body, ephysics_body_mass_get(body)); _ephysics_body_mass_set(body, ephysics_body_mass_get(body));
@ -851,16 +852,17 @@ _ephysics_body_resize(EPhysics_Body *body, Evas_Coord w, Evas_Coord h)
body->w = w; body->w = w;
body->h = h; body->h = h;
body->d = d;
ephysics_body_activate(body, EINA_TRUE); ephysics_body_activate(body, EINA_TRUE);
DBG("Body %p scale changed to %lf, %lf.", body, sx, sy); DBG("Body %p scale changed to (%lf, %lf, %lf).", body, sx, sy, sz);
} }
static void static void
_ephysics_body_move(EPhysics_Body *body, Evas_Coord x, Evas_Coord y) _ephysics_body_move(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas_Coord z)
{ {
double rate, mx, my; double rate, mx, my, mz;
btTransform trans; btTransform trans;
int wy, height; int wy, height;
btVector3 body_scale; btVector3 body_scale;
@ -871,21 +873,22 @@ _ephysics_body_move(EPhysics_Body *body, Evas_Coord x, Evas_Coord y)
mx = (x + body->w * body->cm.x) / rate; mx = (x + body->w * body->cm.x) / rate;
my = (height - (y + body->h * body->cm.y)) / rate; my = (height - (y + body->h * body->cm.y)) / rate;
mz = z / rate;
trans = _ephysics_body_transform_get(body); trans = _ephysics_body_transform_get(body);
trans.setOrigin(btVector3(mx, my, 0)); trans.setOrigin(btVector3(mx, my, mz));
body->rigid_body->proceedToTransform(trans); body->rigid_body->proceedToTransform(trans);
body->rigid_body->getMotionState()->setWorldTransform(trans); body->rigid_body->getMotionState()->setWorldTransform(trans);
ephysics_body_activate(body, EINA_TRUE); ephysics_body_activate(body, EINA_TRUE);
DBG("Body %p position changed to %lf, %lf.", body, mx, my); DBG("Body %p position changed to (%lf, %lf, %lf).", body, mx, my, mz);
} }
static void static void
_ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas_Coord w, Evas_Coord h, double rate) _ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas_Coord z, Evas_Coord w, Evas_Coord h, Evas_Coord d, double rate)
{ {
double mx, my, sx, sy; double mx, my, mz, sx, sy, sz;
btTransform trans; btTransform trans;
int wy, height; int wy, height;
btVector3 body_scale; btVector3 body_scale;
@ -895,12 +898,14 @@ _ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Eva
mx = (x + w * body->cm.x) / rate; mx = (x + w * body->cm.x) / rate;
my = (height - (y + h * body->cm.y)) / rate; my = (height - (y + h * body->cm.y)) / rate;
mz = z / rate;
sx = w / rate; sx = w / rate;
sy = h / rate; sy = h / rate;
sz = d / rate;
trans = _ephysics_body_transform_get(body); trans = _ephysics_body_transform_get(body);
trans.setOrigin(btVector3(mx, my, trans.getOrigin().z())); trans.setOrigin(btVector3(mx, my, mz));
body_scale = btVector3(sx, sy, 1); body_scale = btVector3(sx, sy, sz);
if (body->type == EPHYSICS_BODY_TYPE_SOFT) if (body->type == EPHYSICS_BODY_TYPE_SOFT)
{ {
@ -929,9 +934,10 @@ _ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Eva
body->w = w; body->w = w;
body->h = h; body->h = h;
body->d = d;
DBG("Body %p position changed to %lf, %lf.", body, mx, my); DBG("Body %p position changed to (%lf, %lf, %lf).", body, mx, my, mz);
DBG("Body %p scale changed to %lf, %lf.", body, sx, sy); DBG("Body %p scale changed to (%lf, %lf, %lf).", body, sx, sy, sz);
} }
static void static void
@ -944,9 +950,9 @@ _ephysics_body_evas_obj_resize_cb(void *data, Evas *e __UNUSED__, Evas_Object *o
if ((w == body->w) && (h == body->h)) if ((w == body->w) && (h == body->h))
return; return;
DBG("Resizing body %p to w=%i, h=%i", body, w, h); DBG("Resizing body %p to w=%i, h=%i, d=%i", body, w, h, body->d);
ephysics_world_lock_take(body->world); ephysics_world_lock_take(body->world);
_ephysics_body_resize(body, w, h); _ephysics_body_resize(body, w, h, body->d);
ephysics_world_lock_release(body->world); ephysics_world_lock_release(body->world);
} }
@ -1044,7 +1050,7 @@ _ephysics_body_outside_render_area_check(EPhysics_Body *body)
int wx, wy, ww, wh, bx, by, bw, bh; int wx, wy, ww, wh, bx, by, bw, bh;
ephysics_world_render_geometry_get(body->world, &wx, &wy, &ww, &wh); ephysics_world_render_geometry_get(body->world, &wx, &wy, &ww, &wh);
ephysics_body_geometry_get(body, &bx, &by, &bw, &bh); ephysics_body_geometry_get(body, &bx, &by, NULL, &bw, &bh, NULL);
// FIXME: check what should be done regarding rotated bodies // FIXME: check what should be done regarding rotated bodies
if (((ephysics_world_bodies_outside_top_autodel_get(body->world)) && if (((ephysics_world_bodies_outside_top_autodel_get(body->world)) &&
@ -1079,14 +1085,14 @@ ephysics_body_forces_apply(EPhysics_Body *body)
void void
ephysics_body_recalc(EPhysics_Body *body, double rate) ephysics_body_recalc(EPhysics_Body *body, double rate)
{ {
Evas_Coord x, y, w, h; Evas_Coord x, y, z, w, h, d;
double vx, vy, lt, at; double vx, vy, lt, at;
ephysics_body_geometry_get(body, &x, &y, &w, &h); ephysics_body_geometry_get(body, &x, &y, &z, &w, &h, &d);
ephysics_body_linear_velocity_get(body, &vx, &vy); ephysics_body_linear_velocity_get(body, &vx, &vy);
ephysics_body_sleeping_threshold_get(body, &lt, &at); ephysics_body_sleeping_threshold_get(body, &lt, &at);
_ephysics_body_geometry_set(body, x, y, w, h, rate); _ephysics_body_geometry_set(body, x, y, z, w, h, d, rate);
_ephysics_body_linear_velocity_set(body, vx, vy, rate); _ephysics_body_linear_velocity_set(body, vx, vy, rate);
_ephysics_body_sleeping_threshold_set(body, lt, at, rate); _ephysics_body_sleeping_threshold_set(body, lt, at, rate);
} }
@ -1729,19 +1735,19 @@ ephysics_body_world_boundaries_resize(EPhysics_World *world)
bottom = ephysics_world_boundary_get(world, EPHYSICS_WORLD_BOUNDARY_BOTTOM); bottom = ephysics_world_boundary_get(world, EPHYSICS_WORLD_BOUNDARY_BOTTOM);
if (bottom) if (bottom)
ephysics_body_geometry_set(bottom, x, y + height, width, 10); ephysics_body_geometry_set(bottom, x, y + height, -5, width, 10, 10);
right = ephysics_world_boundary_get(world, EPHYSICS_WORLD_BOUNDARY_RIGHT); right = ephysics_world_boundary_get(world, EPHYSICS_WORLD_BOUNDARY_RIGHT);
if (right) if (right)
ephysics_body_geometry_set(right, x + width, 0, 10, y + height); ephysics_body_geometry_set(right, x + width, 0, -5, 10, y + height, 10);
left = ephysics_world_boundary_get(world, EPHYSICS_WORLD_BOUNDARY_LEFT); left = ephysics_world_boundary_get(world, EPHYSICS_WORLD_BOUNDARY_LEFT);
if (left) if (left)
ephysics_body_geometry_set(left, x - 10, 0, 10, y + height); ephysics_body_geometry_set(left, x - 10, 0, -5, 10, y + height, 10);
top = ephysics_world_boundary_get(world, EPHYSICS_WORLD_BOUNDARY_TOP); top = ephysics_world_boundary_get(world, EPHYSICS_WORLD_BOUNDARY_TOP);
if (top) if (top)
ephysics_body_geometry_set(top, 0, y - 10, x + width, 10); ephysics_body_geometry_set(top, 0, y - 10, -5, x + width, 10, 10);
} }
static EPhysics_Body * static EPhysics_Body *
@ -1765,7 +1771,7 @@ _ephysics_body_boundary_add(EPhysics_World *world, EPhysics_World_Boundary bound
ephysics_body_mass_set(body, 0); ephysics_body_mass_set(body, 0);
ephysics_world_boundary_set(world, boundary, body); ephysics_world_boundary_set(world, boundary, body);
ephysics_body_geometry_set(body, x, y, w, h); ephysics_body_geometry_set(body, x, y, -5, w, h, 10);
return body; return body;
} }
@ -1847,6 +1853,7 @@ EAPI Evas_Object *
ephysics_body_evas_object_set(EPhysics_Body *body, Evas_Object *evas_obj, Eina_Bool use_obj_pos) ephysics_body_evas_object_set(EPhysics_Body *body, Evas_Object *evas_obj, Eina_Bool use_obj_pos)
{ {
int obj_x, obj_y, obj_w, obj_h; int obj_x, obj_y, obj_w, obj_h;
double rate;
if (!body) if (!body)
{ {
@ -1878,9 +1885,10 @@ ephysics_body_evas_object_set(EPhysics_Body *body, Evas_Object *evas_obj, Eina_B
return evas_obj; return evas_obj;
evas_object_geometry_get(body->evas_obj, &obj_x, &obj_y, &obj_w, &obj_h); evas_object_geometry_get(body->evas_obj, &obj_x, &obj_y, &obj_w, &obj_h);
rate = ephysics_world_rate_get(body->world);
ephysics_world_lock_take(body->world); ephysics_world_lock_take(body->world);
_ephysics_body_geometry_set(body, obj_x, obj_y, obj_w, obj_h, _ephysics_body_geometry_set(body, obj_x, obj_y, - rate / 2,
ephysics_world_rate_get(body->world)); obj_w, obj_h, rate, rate);
if (body->soft_body) if (body->soft_body)
{ {
@ -1946,7 +1954,7 @@ ephysics_body_evas_object_get(const EPhysics_Body *body)
} }
EAPI void EAPI 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 z, Evas_Coord w, Evas_Coord h, Evas_Coord d)
{ {
if (!body) if (!body)
{ {
@ -1954,20 +1962,20 @@ ephysics_body_geometry_set(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas
return; return;
} }
if ((w <= 0) || (h <= 0)) if ((w <= 0) || (h <= 0) || (d <= 0))
{ {
ERR("Width and height must to be a non-null, positive value."); ERR("Width, height and depth must to be a non-null, positive value.");
return; return;
} }
ephysics_world_lock_take(body->world); ephysics_world_lock_take(body->world);
_ephysics_body_geometry_set(body, x, y, w, h, _ephysics_body_geometry_set(body, x, y, z, w, h, d,
ephysics_world_rate_get(body->world)); ephysics_world_rate_get(body->world));
ephysics_world_lock_release(body->world); ephysics_world_lock_release(body->world);
} }
EAPI void EAPI void
ephysics_body_resize(EPhysics_Body *body, Evas_Coord w, Evas_Coord h) ephysics_body_resize(EPhysics_Body *body, Evas_Coord w, Evas_Coord h, Evas_Coord d)
{ {
if (!body) if (!body)
{ {
@ -1975,19 +1983,19 @@ ephysics_body_resize(EPhysics_Body *body, Evas_Coord w, Evas_Coord h)
return; return;
} }
if ((w <= 0) || (h <= 0)) if ((w <= 0) || (h <= 0) || (d <= 0))
{ {
ERR("Width and height must to be a non-null, positive value."); ERR("Width, height and depth must to be a non-null, positive value.");
return; return;
} }
ephysics_world_lock_take(body->world); ephysics_world_lock_take(body->world);
_ephysics_body_resize(body, w, h); _ephysics_body_resize(body, w, h, d);
ephysics_world_lock_release(body->world); ephysics_world_lock_release(body->world);
} }
EAPI void EAPI void
ephysics_body_move(EPhysics_Body *body, Evas_Coord x, Evas_Coord y) ephysics_body_move(EPhysics_Body *body, Evas_Coord x, Evas_Coord y, Evas_Coord z)
{ {
if (!body) if (!body)
{ {
@ -1996,12 +2004,12 @@ ephysics_body_move(EPhysics_Body *body, Evas_Coord x, Evas_Coord y)
} }
ephysics_world_lock_take(body->world); ephysics_world_lock_take(body->world);
_ephysics_body_move(body, x, y); _ephysics_body_move(body, x, y, z);
ephysics_world_lock_release(body->world); ephysics_world_lock_release(body->world);
} }
EAPI void EAPI void
ephysics_body_geometry_get(const EPhysics_Body *body, Evas_Coord *x, Evas_Coord *y, Evas_Coord *w, Evas_Coord *h) ephysics_body_geometry_get(const EPhysics_Body *body, Evas_Coord *x, Evas_Coord *y, Evas_Coord *z, Evas_Coord *w, Evas_Coord *h, Evas_Coord *d)
{ {
btTransform trans; btTransform trans;
btVector3 scale; btVector3 scale;
@ -2024,8 +2032,10 @@ ephysics_body_geometry_get(const EPhysics_Body *body, Evas_Coord *x, Evas_Coord
if (x) *x = round((trans.getOrigin().getX() - scale.x() / 2) * rate); if (x) *x = round((trans.getOrigin().getX() - scale.x() / 2) * rate);
if (y) *y = height - round((trans.getOrigin().getY() + scale.y() / 2) if (y) *y = height - round((trans.getOrigin().getY() + scale.y() / 2)
* rate); * rate);
if (z) *z = round((trans.getOrigin().getZ() - scale.z() / 2) * rate);
if (w) *w = body->w; if (w) *w = body->w;
if (h) *h = body->h; if (h) *h = body->h;
if (d) *d = body->d;
} }
EAPI void EAPI void

View File

@ -36,7 +36,7 @@ ephysics_camera_target_moved(EPhysics_Camera *camera, EPhysics_Body *body)
{ {
int x, y, w, h, ww, wh, new_x, new_y; int x, y, w, h, ww, wh, new_x, new_y;
ephysics_body_geometry_get(body, &x, &y, &w, &h); ephysics_body_geometry_get(body, &x, &y, NULL, &w, &h, NULL);
ephysics_world_render_geometry_get(camera->world, NULL, NULL, &ww, &wh); ephysics_world_render_geometry_get(camera->world, NULL, NULL, &ww, &wh);
if (camera->track_horizontal) if (camera->track_horizontal)

View File

@ -82,6 +82,7 @@ struct _EPhysics_Body {
int walking; int walking;
Evas_Coord w; Evas_Coord w;
Evas_Coord h; Evas_Coord h;
Evas_Coord d;
void *data; void *data;
Eina_Inlist *callbacks; Eina_Inlist *callbacks;
Eina_List *collision_groups; Eina_List *collision_groups;