diff --git a/legacy/ephysics/src/bin/test_camera.c b/legacy/ephysics/src/bin/test_camera.c index bc0d0bc1bb..9378a1ad76 100644 --- a/legacy/ephysics/src/bin/test_camera.c +++ b/legacy/ephysics/src/bin/test_camera.c @@ -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); diff --git a/legacy/ephysics/src/bin/test_camera_track.c b/legacy/ephysics/src/bin/test_camera_track.c index c1ceee2d36..9dc43ac85c 100644 --- a/legacy/ephysics/src/bin/test_camera_track.c +++ b/legacy/ephysics/src/bin/test_camera_track.c @@ -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); diff --git a/legacy/ephysics/src/lib/EPhysics.h b/legacy/ephysics/src/lib/EPhysics.h index 722255fd30..d4fe26d1cb 100644 --- a/legacy/ephysics/src/lib/EPhysics.h +++ b/legacy/ephysics/src/lib/EPhysics.h @@ -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. diff --git a/legacy/ephysics/src/lib/ephysics_camera.cpp b/legacy/ephysics/src/lib/ephysics_camera.cpp index fbbd11a23a..120688603d 100644 --- a/legacy/ephysics/src/lib/ephysics_camera.cpp +++ b/legacy/ephysics/src/lib/ephysics_camera.cpp @@ -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); diff --git a/legacy/ephysics/src/lib/ephysics_private.h b/legacy/ephysics/src/lib/ephysics_private.h index 88353ff82f..b878533740 100644 --- a/legacy/ephysics/src/lib/ephysics_private.h +++ b/legacy/ephysics/src/lib/ephysics_private.h @@ -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); diff --git a/legacy/ephysics/src/lib/ephysics_world.cpp b/legacy/ephysics/src/lib/ephysics_world.cpp index 7a230a920e..e58c0e6348 100644 --- a/legacy/ephysics/src/lib/ephysics_world.cpp +++ b/legacy/ephysics/src/lib/ephysics_world.cpp @@ -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;