EPhysics: add camera move event

SVN revision: 75228
This commit is contained in:
Bruno Dilly 2012-08-13 22:24:28 +00:00
parent 419c817815
commit 1de398ce60
6 changed files with 69 additions and 46 deletions

View File

@ -24,12 +24,32 @@ _update_floor(Evas_Object *floor_obj, Evas_Coord delta)
evas_object_move(floor_obj, fx, y);
}
static void
_camera_moved_cb(void *data, EPhysics_World *world __UNUSED__, void *event_info)
{
EPhysics_Camera *camera = event_info;
Camera_Data *camera_data = data;
Evas_Object *floor_obj;
int x;
DBG("Camera moved");
ephysics_camera_position_get(camera, &x, NULL);
floor_obj = evas_object_data_get(camera_data->base.layout, "floor");
_update_floor(floor_obj, camera_data->old_x - x);
floor_obj = evas_object_data_get(camera_data->base.layout, "floor2");
_update_floor(floor_obj, camera_data->old_x - x);
camera_data->old_x = x;
}
static Eina_Bool
_camera_move_cb(void *data)
{
Camera_Data *camera_data = data;
EPhysics_Camera *camera;
Evas_Object *floor_obj;
int x, y, w;
ephysics_world_render_geometry_get(camera_data->base.world,
@ -47,14 +67,6 @@ _camera_move_cb(void *data)
x += 2;
ephysics_camera_position_set(camera, x, y);
floor_obj = evas_object_data_get(camera_data->base.layout, "floor");
_update_floor(floor_obj, camera_data->old_x - x);
floor_obj = evas_object_data_get(camera_data->base.layout, "floor2");
_update_floor(floor_obj, camera_data->old_x - x);
camera_data->old_x = x;
return EINA_TRUE;
}
@ -208,6 +220,9 @@ test_camera(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *event_info
world = ephysics_world_new();
ephysics_world_render_geometry_set(world, 50, 40, WIDTH - 100, FLOOR_Y - 40);
ephysics_world_event_callback_add(world,
EPHYSICS_CALLBACK_WORLD_CAMERA_MOVED,
_camera_moved_cb, camera_data);
camera_data->base.world = world;
boundary = ephysics_body_box_add(camera_data->base.world);

View File

@ -30,15 +30,15 @@ _update_floor(Evas_Object *layout, const char *name, int delta_x, int cy, Eina_B
}
static void
_update_object_cb(void *data, EPhysics_Body *body, void *event_info __UNUSED__)
_camera_moved_cb(void *data, EPhysics_World *world __UNUSED__, void *event_info)
{
EPhysics_Camera *camera = event_info;
Track_Data *track_data = data;
EPhysics_Camera *camera;
int cx, cy, delta_x = 0;
Eina_Bool hor, ver;
ephysics_body_evas_object_update(body);
camera = ephysics_world_camera_get(track_data->base.world);
DBG("Camera moved");
ephysics_camera_tracked_body_get(camera, NULL, &hor, &ver);
ephysics_camera_position_get(camera, &cx, &cy);
@ -128,9 +128,6 @@ _world_populate(Track_Data *track_data)
body = ephysics_body_circle_add(track_data->base.world);
ephysics_body_evas_object_set(body, sphere, EINA_TRUE);
ephysics_body_event_callback_add(body,
EPHYSICS_CALLBACK_BODY_UPDATE,
_update_object_cb, track_data);
ephysics_body_restitution_set(body, 0.95);
ephysics_body_friction_set(body, 1);
ephysics_body_damping_set(body, 0.1, 0);
@ -235,6 +232,9 @@ test_camera_track(void *data __UNUSED__, Evas_Object *obj __UNUSED__, void *even
world = ephysics_world_new();
ephysics_world_render_geometry_set(world, 50, 40, WIDTH - 100, FLOOR_Y - 40);
track_data->base.world = world;
ephysics_world_event_callback_add(world,
EPHYSICS_CALLBACK_WORLD_CAMERA_MOVED,
_camera_moved_cb, track_data);
boundary = ephysics_body_box_add(track_data->base.world);
ephysics_body_mass_set(boundary, 0);

View File

@ -500,6 +500,7 @@ typedef enum _EPhysics_Callback_World_Type
{
EPHYSICS_CALLBACK_WORLD_DEL, /**< World being deleted (called before free) */
EPHYSICS_CALLBACK_WORLD_STOPPED, /**< no objects are moving any more */
EPHYSICS_CALLBACK_WORLD_CAMERA_MOVED, /**< camera position changed */
EPHYSICS_CALLBACK_WORLD_LAST, /**< kept as sentinel, not really an event */
} EPhysics_Callback_World_Type;
@ -876,10 +877,18 @@ EAPI EPhysics_Camera *ephysics_world_camera_get(const EPhysics_World *world);
* The registered callback will receives the world and extra user data that
* can be passed.
*
* Regarding EPHYSICS_CALLBACK_WORLD_DEL:
* What follows is a list of details about each callback type:
*
* Registered callbacks will be called before world is freed.
* No event_info is passed.
* - #EPHYSICS_CALLBACK_WORLD_DEL: Called just before a world is freed.
* No event_info is passed to the callback.
*
* - #EPHYSICS_CALLBACK_WORLD_STOPPED: Called when all the bodies
* are stopped. No event_info is passed to the callback.
*
* - #EPHYSICS_CALLBACK_WORLD_CAMERA_MOVED: Called if camera position changed
* on physics simulation tick. Camera is passed as event_info to the callback.
* Useful to move backgrounds, since objects would be already updated
* considering camera's position.
*
* @param world The physics world.
* @param type Type of callback to be listened by @p func.

View File

@ -21,9 +21,20 @@ struct _EPhysics_Camera {
};
static void
_ephysics_camera_target_move_cb(void *data, EPhysics_Body *body, void *event_info __UNUSED__)
_ephysics_camera_target_del_cb(void *data, EPhysics_Body *body, void *event_info)
{
EPhysics_Camera *camera = (EPhysics_Camera *) data;
camera->target = NULL;
camera->track_horizontal = EINA_FALSE;
camera->track_vertical = EINA_FALSE;
INF("Camera isn't tracking body %p anymore.", body);
}
void
ephysics_camera_target_moved(EPhysics_Camera *camera, EPhysics_Body *body)
{
int x, y, w, h, ww, wh, new_x, new_y;
ephysics_body_geometry_get(body, &x, &y, &w, &h);
@ -49,19 +60,7 @@ _ephysics_camera_target_move_cb(void *data, EPhysics_Body *body, void *event_inf
}
}
WRN("Camera position set to (%i, %i).", camera->x, camera->y);
}
static void
_ephysics_camera_target_del_cb(void *data, EPhysics_Body *body, void *event_info)
{
EPhysics_Camera *camera = (EPhysics_Camera *) data;
camera->target = NULL;
camera->track_horizontal = EINA_FALSE;
camera->track_vertical = EINA_FALSE;
INF("Camera isn't tracking body %p anymore.", body);
INF("Camera position set to (%i, %i).", camera->x, camera->y);
}
void
@ -120,9 +119,6 @@ ephysics_camera_position_set(EPhysics_Camera *camera, Evas_Coord x, Evas_Coord y
{
INF("Camera isn't tracking body %p anymore.", camera->target);
ephysics_body_event_callback_del(camera->target,
EPHYSICS_CALLBACK_BODY_UPDATE,
_ephysics_camera_target_move_cb);
ephysics_body_event_callback_del(camera->target,
EPHYSICS_CALLBACK_BODY_DEL,
_ephysics_camera_target_del_cb);
@ -172,9 +168,6 @@ ephysics_camera_body_track(EPhysics_Camera *camera, EPhysics_Body *body, Eina_Bo
if (camera->target)
{
ephysics_body_event_callback_del(camera->target,
EPHYSICS_CALLBACK_BODY_UPDATE,
_ephysics_camera_target_move_cb);
ephysics_body_event_callback_del(camera->target,
EPHYSICS_CALLBACK_BODY_DEL,
_ephysics_camera_target_del_cb);
@ -188,8 +181,6 @@ ephysics_camera_body_track(EPhysics_Camera *camera, EPhysics_Body *body, Eina_Bo
return;
}
ephysics_body_event_callback_add(body, EPHYSICS_CALLBACK_BODY_UPDATE,
_ephysics_camera_target_move_cb, camera);
ephysics_body_event_callback_add(body, EPHYSICS_CALLBACK_BODY_DEL,
_ephysics_camera_target_del_cb, camera);

View File

@ -102,6 +102,7 @@ EPhysics_Camera *ephysics_camera_add(EPhysics_World *world);
void ephysics_camera_del(EPhysics_Camera *camera);
void ephysics_camera_moved_set(EPhysics_Camera *camera, Eina_Bool moved);
Eina_Bool ephysics_camera_moved_get(const EPhysics_Camera *camera);
void ephysics_camera_target_moved(EPhysics_Camera *camera, EPhysics_Body *body);
const Eina_Inlist *ephysics_shape_points_get(const EPhysics_Shape *shape);

View File

@ -134,17 +134,16 @@ _ephysics_world_tick_cb(btDynamicsWorld *dynamics_world, btScalar timeStep)
world_active = EINA_FALSE;
camera_moved = ephysics_camera_moved_get(world->camera);
if (camera_moved)
ephysics_camera_moved_set(world->camera, EINA_FALSE);
ephysics_camera_tracked_body_get(world->camera, &body, &tx, &ty);
if ((body) && (tx || ty))
{
rigid_body = ephysics_body_rigid_body_get(body);
if (rigid_body->isActive())
camera_moved = EINA_TRUE;
if ((rigid_body) && (rigid_body->isActive()))
ephysics_camera_target_moved(world->camera, body);
}
camera_moved = ephysics_camera_moved_get(world->camera);
objects = dynamics_world->getCollisionObjectArray();
for (int i = 0; i < objects.size(); i++)
{
@ -167,6 +166,14 @@ _ephysics_world_tick_cb(btDynamicsWorld *dynamics_world, btScalar timeStep)
}
}
if (camera_moved)
{
_ephysics_world_event_callback_call(
world, EPHYSICS_CALLBACK_WORLD_CAMERA_MOVED, world->camera);
ephysics_camera_moved_set(world->camera, EINA_FALSE);
}
if (world->active == world_active) return;
world->active = world_active;
if (world_active) return;