forked from enlightenment/efl
GLayer: Updated test to work with new momentum values
Signed-off-by: Aharon Hillel <a.hillel@partner.samsung.com> SVN revision: 66430
This commit is contained in:
parent
a5bd4cb04f
commit
e217f07e86
|
@ -6,15 +6,22 @@
|
||||||
|
|
||||||
/* We zoom out to this value so we'll be able to use map and have a nice
|
/* We zoom out to this value so we'll be able to use map and have a nice
|
||||||
* resolution when zooming in. */
|
* resolution when zooming in. */
|
||||||
#define BASE_ZOOM 0.5
|
#define BASE_ZOOM 0.8
|
||||||
/* The amount of zoom to do when "lifting" objects. */
|
/* The amount of zoom to do when "lifting" objects. */
|
||||||
#define LIFT_FACTOR 1.3
|
#define LIFT_FACTOR 1.3
|
||||||
/* The base size of the shadow image. */
|
/* The base size of the shadow image. */
|
||||||
#define SHADOW_W 118
|
#define SHADOW_W 118
|
||||||
#define SHADOW_H 118
|
#define SHADOW_H 118
|
||||||
#define RAD2DEG(x) ((x) * 57.295779513)
|
//#define RAD2DEG(x) ((x) * 57.295779513)
|
||||||
|
|
||||||
static double zoom_momentum_animation_duration = 0.4;
|
#define MOMENTUM_FRICTION 2000
|
||||||
|
#define ROTATE_MOMENTUM_FRICTION 30
|
||||||
|
#define ZOOM_MOMENTUM_FRICTION 8
|
||||||
|
#define TIMER_TICK 0.1
|
||||||
|
|
||||||
|
#define ROTATE_MOMENTUM_FRICTION 30
|
||||||
|
#define ZOOM_MOMENTUM_FRICTION 8
|
||||||
|
#define TIMER_TICK 0.1
|
||||||
|
|
||||||
struct _Photo_Object {
|
struct _Photo_Object {
|
||||||
Evas_Object *ic, *shadow;
|
Evas_Object *ic, *shadow;
|
||||||
|
@ -24,7 +31,9 @@ struct _Photo_Object {
|
||||||
/* 3 transit object to implement momentum animation */
|
/* 3 transit object to implement momentum animation */
|
||||||
Elm_Transit *momentum;
|
Elm_Transit *momentum;
|
||||||
Elm_Transit *zoom_momentum;
|
Elm_Transit *zoom_momentum;
|
||||||
Elm_Transit *rot_momentum;
|
Ecore_Timer *rot_timer;
|
||||||
|
double rot_tot_time;
|
||||||
|
double rot_progress;
|
||||||
/* bx, by - current wanted coordinates of the photo object.
|
/* bx, by - current wanted coordinates of the photo object.
|
||||||
* bw, bh - original size of the "ic" object.
|
* bw, bh - original size of the "ic" object.
|
||||||
* dx, dy - Used to indicate the distance between the center point
|
* dx, dy - Used to indicate the distance between the center point
|
||||||
|
@ -37,7 +46,7 @@ struct _Photo_Object {
|
||||||
* per gesture, we have to keep the current rotate/zoom factor and the
|
* per gesture, we have to keep the current rotate/zoom factor and the
|
||||||
* one that was before we started the gesture. */
|
* one that was before we started the gesture. */
|
||||||
int base_rotate, rotate; /* base - initial angle */
|
int base_rotate, rotate; /* base - initial angle */
|
||||||
double r_momentum;
|
double rot_momentum;
|
||||||
double base_zoom, zoom, zoom_dx; /* zoom_dx used for zoom-momentum */
|
double base_zoom, zoom, zoom_dx; /* zoom_dx used for zoom-momentum */
|
||||||
double shadow_zoom;
|
double shadow_zoom;
|
||||||
};
|
};
|
||||||
|
@ -127,7 +136,6 @@ zoom_momentum_animation_operation(void *_po, Elm_Transit *transit __UNUSED__,
|
||||||
{
|
{
|
||||||
Photo_Object *po = (Photo_Object *) _po;
|
Photo_Object *po = (Photo_Object *) _po;
|
||||||
po->zoom += po->zoom_dx;
|
po->zoom += po->zoom_dx;
|
||||||
printf("%s po->zoom=<%f>\n",__func__, po->zoom);
|
|
||||||
apply_changes(po);
|
apply_changes(po);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -139,28 +147,42 @@ zoom_momentum_animation_end(void *_po, Elm_Transit *transit __UNUSED__)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Rotate momentum animation */
|
/* Rotate momentum animation */
|
||||||
static void
|
static Eina_Bool
|
||||||
rotate_momentum_animation_operation(void *_po, Elm_Transit *transit __UNUSED__,
|
rotate_momentum_animation_operation(void *_po)
|
||||||
double progress)
|
|
||||||
{
|
{
|
||||||
printf("%s progress=<%f>\n", __func__, progress);
|
Eina_Bool rc = ECORE_CALLBACK_RENEW;
|
||||||
|
int deg_friction = ROTATE_MOMENTUM_FRICTION;
|
||||||
Photo_Object *po = (Photo_Object *) _po;
|
Photo_Object *po = (Photo_Object *) _po;
|
||||||
po->rotate = po->base_rotate + RAD2DEG(po->r_momentum * progress);
|
po->rot_progress += TIMER_TICK;
|
||||||
|
if (po->rot_progress > po->rot_tot_time)
|
||||||
|
{
|
||||||
|
po->rot_timer = NULL;
|
||||||
|
po->rot_progress = po->rot_tot_time;
|
||||||
|
rc = ECORE_CALLBACK_CANCEL;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (po->rot_momentum > 0)
|
||||||
|
deg_friction *= -1;
|
||||||
|
|
||||||
|
/* Current = rot0 + (rotv0 * t) + (a * t^2 / 2) */
|
||||||
|
po->rotate = po->base_rotate -
|
||||||
|
((po->rot_momentum * po->rot_progress) +
|
||||||
|
(deg_friction * (po->rot_progress * po->rot_progress) / 2));
|
||||||
|
po->rotate = (po->rotate % 360);
|
||||||
if (po->rotate < 0)
|
if (po->rotate < 0)
|
||||||
po->rotate = (po->rotate % 360) + 360;
|
po->rotate += 360;
|
||||||
printf("current-angle=<%d> base-angle=<%d> momentum-angle=<%d>\n",
|
printf("%d = %d - (%f + %f)\n", po->rotate, po->base_rotate,
|
||||||
po->rotate, po->base_rotate,
|
(po->rot_momentum * po->rot_progress),
|
||||||
(int) RAD2DEG(po->r_momentum * progress));
|
(deg_friction * (po->rot_progress * po->rot_progress) / 2));
|
||||||
|
|
||||||
|
if (rc == ECORE_CALLBACK_CANCEL)
|
||||||
|
{
|
||||||
|
po->base_rotate = po->rotate;
|
||||||
|
printf("%s po->rotate=<%d>\n", __func__, po->rotate);
|
||||||
|
}
|
||||||
|
|
||||||
apply_changes(po);
|
apply_changes(po);
|
||||||
}
|
return rc;
|
||||||
|
|
||||||
static void
|
|
||||||
rotate_momentum_animation_end(void *_po, Elm_Transit *transit __UNUSED__)
|
|
||||||
{
|
|
||||||
Photo_Object *po = (Photo_Object *) _po;
|
|
||||||
|
|
||||||
po->rot_momentum = NULL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Momentum animation */
|
/* Momentum animation */
|
||||||
|
@ -211,14 +233,15 @@ rotate_start(void *_po, void *event_info)
|
||||||
{
|
{
|
||||||
Photo_Object *po = (Photo_Object *) _po;
|
Photo_Object *po = (Photo_Object *) _po;
|
||||||
Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
|
Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
|
||||||
printf("rotate start <%d,%d> base=<%f> <%f>\n", p->x, p->y,
|
printf("rotate start <%d,%d> po->rotate=<%d> base=<%f> p->angle=<%f>\n", p->x, p->y, po->rotate,
|
||||||
RAD2DEG(p->base_angle), RAD2DEG(p->angle));
|
p->base_angle, p->angle);
|
||||||
|
|
||||||
/* If there's an active animator, stop it */
|
/* If there's an active animator, stop it */
|
||||||
if (po->rot_momentum)
|
if (po->rot_timer)
|
||||||
{
|
{
|
||||||
elm_transit_del(po->rot_momentum);
|
po->base_rotate = po->rotate;
|
||||||
po->rot_momentum = NULL;
|
ecore_timer_del(po->rot_timer);
|
||||||
|
po->rot_timer = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
return EVAS_EVENT_FLAG_NONE;
|
return EVAS_EVENT_FLAG_NONE;
|
||||||
|
@ -230,8 +253,9 @@ rotate_move(void *_po, void *event_info)
|
||||||
Photo_Object *po = (Photo_Object *) _po;
|
Photo_Object *po = (Photo_Object *) _po;
|
||||||
Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
|
Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
|
||||||
printf("rotate move <%d,%d> base=<%f> <%f> m=<%f>\n", p->x, p->y,
|
printf("rotate move <%d,%d> base=<%f> <%f> m=<%f>\n", p->x, p->y,
|
||||||
RAD2DEG(p->base_angle), RAD2DEG(p->angle), p->momentum);
|
p->base_angle, p->angle, p->momentum);
|
||||||
po->rotate = po->base_rotate + (int) RAD2DEG(p->base_angle - p->angle);
|
po->rotate = po->base_rotate + (int) (p->angle - p->base_angle);
|
||||||
|
|
||||||
if (po->rotate < 0)
|
if (po->rotate < 0)
|
||||||
po->rotate += 360;
|
po->rotate += 360;
|
||||||
apply_changes(po);
|
apply_changes(po);
|
||||||
|
@ -244,23 +268,19 @@ rotate_end(void *_po, void *event_info)
|
||||||
Photo_Object *po = (Photo_Object *) _po;
|
Photo_Object *po = (Photo_Object *) _po;
|
||||||
Elm_Gesture_Rotate_Info *r_info = (Elm_Gesture_Rotate_Info *) event_info;
|
Elm_Gesture_Rotate_Info *r_info = (Elm_Gesture_Rotate_Info *) event_info;
|
||||||
printf("rotate end <%d,%d> base=<%f> <%f> m=<%f>\n", r_info->x, r_info->y,
|
printf("rotate end <%d,%d> base=<%f> <%f> m=<%f>\n", r_info->x, r_info->y,
|
||||||
RAD2DEG(r_info->base_angle), RAD2DEG(r_info->angle), r_info->momentum);
|
r_info->base_angle, r_info->angle, r_info->momentum);
|
||||||
po->base_rotate += (int) RAD2DEG(r_info->base_angle - r_info->angle);
|
|
||||||
if (po->rotate < 0)
|
if (po->rotate < 0)
|
||||||
po->rotate += 360;
|
po->rotate += 360;
|
||||||
|
|
||||||
|
po->base_rotate = po->rotate;
|
||||||
|
|
||||||
/* Apply the rotate-momentum */
|
/* Apply the rotate-momentum */
|
||||||
double tot_time = fabs(r_info->momentum) / 8;
|
po->rot_tot_time = fabs(r_info->momentum) / ROTATE_MOMENTUM_FRICTION;
|
||||||
po->r_momentum = r_info->momentum * tot_time - (8 * tot_time * tot_time) / 2;
|
po->rot_momentum = r_info->momentum;
|
||||||
if (po->r_momentum)
|
po->rot_progress = 0.0;
|
||||||
|
if (po->rot_momentum)
|
||||||
{
|
{
|
||||||
po->rot_momentum = elm_transit_add();
|
po->rot_timer = ecore_timer_add(TIMER_TICK, rotate_momentum_animation_operation, po);
|
||||||
printf("TOM %f\n", tot_time);
|
|
||||||
elm_transit_duration_set(po->rot_momentum, tot_time);
|
|
||||||
elm_transit_effect_add(po->rot_momentum,
|
|
||||||
rotate_momentum_animation_operation, po,
|
|
||||||
rotate_momentum_animation_end);
|
|
||||||
elm_transit_go(po->rot_momentum);
|
|
||||||
}
|
}
|
||||||
return EVAS_EVENT_FLAG_NONE;
|
return EVAS_EVENT_FLAG_NONE;
|
||||||
}
|
}
|
||||||
|
@ -271,8 +291,8 @@ rotate_abort(void *_po, void *event_info)
|
||||||
Photo_Object *po = (Photo_Object *) _po;
|
Photo_Object *po = (Photo_Object *) _po;
|
||||||
Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
|
Elm_Gesture_Rotate_Info *p = (Elm_Gesture_Rotate_Info *) event_info;
|
||||||
printf("rotate abort <%d,%d> base=<%f> <%f>\n", p->x, p->y,
|
printf("rotate abort <%d,%d> base=<%f> <%f>\n", p->x, p->y,
|
||||||
RAD2DEG(p->base_angle), RAD2DEG(p->angle));
|
p->base_angle, p->angle);
|
||||||
po->base_rotate += (int) RAD2DEG(p->base_angle - p->angle);
|
po->base_rotate = po->rotate;
|
||||||
if (po->rotate < 0)
|
if (po->rotate < 0)
|
||||||
po->rotate += 360;
|
po->rotate += 360;
|
||||||
|
|
||||||
|
@ -301,7 +321,7 @@ zoom_move(void *_po, void *event_info)
|
||||||
{
|
{
|
||||||
Photo_Object *po = (Photo_Object *) _po;
|
Photo_Object *po = (Photo_Object *) _po;
|
||||||
Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
|
Elm_Gesture_Zoom_Info *p = (Elm_Gesture_Zoom_Info *) event_info;
|
||||||
printf("zoom move <%d,%d> <%f>\n", p->x, p->y, p->zoom);
|
printf("zoom move <%d,%d> <%f> momentum=<%f>\n", p->x, p->y, p->zoom, p->momentum);
|
||||||
po->zoom = po->base_zoom * p->zoom;
|
po->zoom = po->base_zoom * p->zoom;
|
||||||
apply_changes(po);
|
apply_changes(po);
|
||||||
return EVAS_EVENT_FLAG_NONE;
|
return EVAS_EVENT_FLAG_NONE;
|
||||||
|
@ -316,18 +336,20 @@ zoom_end(void *_po, void *event_info)
|
||||||
p->zoom, p->momentum);
|
p->zoom, p->momentum);
|
||||||
|
|
||||||
/* Apply the zoom-momentum or zoom out animator */
|
/* Apply the zoom-momentum or zoom out animator */
|
||||||
po->zoom_dx = p->momentum / (zoom_momentum_animation_duration * 1000);
|
double tot_time = fabs(p->momentum) / ZOOM_MOMENTUM_FRICTION;
|
||||||
|
po->zoom_dx = (p->momentum * tot_time + (ZOOM_MOMENTUM_FRICTION * tot_time * tot_time) / 2) - po->base_zoom;
|
||||||
if (po->zoom_dx)
|
if (po->zoom_dx)
|
||||||
{
|
{
|
||||||
po->zoom_momentum = elm_transit_add();
|
po->zoom_momentum = elm_transit_add();
|
||||||
elm_transit_duration_set(po->zoom_momentum,
|
elm_transit_duration_set(po->zoom_momentum,
|
||||||
zoom_momentum_animation_duration);
|
tot_time);
|
||||||
elm_transit_effect_add(po->zoom_momentum,
|
elm_transit_effect_add(po->zoom_momentum,
|
||||||
zoom_momentum_animation_operation, po,
|
zoom_momentum_animation_operation, po,
|
||||||
zoom_momentum_animation_end);
|
zoom_momentum_animation_end);
|
||||||
elm_transit_go(po->zoom_momentum);
|
elm_transit_go(po->zoom_momentum);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
po->base_zoom = po->zoom;
|
||||||
return EVAS_EVENT_FLAG_NONE;
|
return EVAS_EVENT_FLAG_NONE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -336,7 +358,7 @@ momentum_start(void *_po, void *event_info)
|
||||||
{
|
{
|
||||||
Photo_Object *po = (Photo_Object *) _po;
|
Photo_Object *po = (Photo_Object *) _po;
|
||||||
Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
|
Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
|
||||||
printf("momentum_start <%d,%d>\n", p->x2, p->y2);
|
printf("momentum_start po->rotate=<%d> <%d,%d>\n", po->rotate, p->x2, p->y2);
|
||||||
|
|
||||||
/* If there's an active animator, stop it */
|
/* If there's an active animator, stop it */
|
||||||
if (po->momentum)
|
if (po->momentum)
|
||||||
|
@ -371,14 +393,17 @@ momentum_end(void *_po, void *event_info)
|
||||||
{
|
{
|
||||||
Photo_Object *po = (Photo_Object *) _po;
|
Photo_Object *po = (Photo_Object *) _po;
|
||||||
Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
|
Elm_Gesture_Momentum_Info *p = (Elm_Gesture_Momentum_Info *) event_info;
|
||||||
printf("momentum end <%d,%d> <%d,%d>\n", p->x2, p->y2, p->mx, p->my);
|
printf("momentum end po->rotate=<%d> <%d,%d> <%d,%d>\n", po->rotate, p->x2, p->y2, p->mx, p->my);
|
||||||
pic_obj_keep_inframe(po);
|
pic_obj_keep_inframe(po);
|
||||||
apply_changes(po);
|
apply_changes(po);
|
||||||
po->m_dx = p->mx / 200;
|
po->m_dx = p->mx / 200;
|
||||||
po->m_dy = p->my / 200;
|
po->m_dy = p->my / 200;
|
||||||
|
|
||||||
po->momentum = elm_transit_add();
|
po->momentum = elm_transit_add();
|
||||||
elm_transit_duration_set(po->momentum, 0.5);
|
double tot_time = sqrt((p->mx * p->mx) + (p->my * p->my))
|
||||||
|
/ MOMENTUM_FRICTION;
|
||||||
|
printf("%s tot_time=<%f>\n", __func__, tot_time);
|
||||||
|
elm_transit_duration_set(po->momentum, tot_time);
|
||||||
elm_transit_effect_add(po->momentum, momentum_animation_operation, po,
|
elm_transit_effect_add(po->momentum, momentum_animation_operation, po,
|
||||||
momentum_animation_end);
|
momentum_animation_end);
|
||||||
elm_transit_go(po->momentum);
|
elm_transit_go(po->momentum);
|
||||||
|
@ -463,6 +488,7 @@ photo_object_add(Evas_Object *parent, Evas_Object *ic, const char *icon,
|
||||||
elm_gesture_layer_attach(po->gl, po->hit);
|
elm_gesture_layer_attach(po->gl, po->hit);
|
||||||
|
|
||||||
/* FIXME: Add a po->rotate start so we take the first angle!!!! */
|
/* FIXME: Add a po->rotate start so we take the first angle!!!! */
|
||||||
|
/*
|
||||||
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM,
|
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM,
|
||||||
ELM_GESTURE_STATE_START, momentum_start, po);
|
ELM_GESTURE_STATE_START, momentum_start, po);
|
||||||
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM,
|
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM,
|
||||||
|
@ -471,7 +497,7 @@ photo_object_add(Evas_Object *parent, Evas_Object *ic, const char *icon,
|
||||||
ELM_GESTURE_STATE_END, momentum_end, po);
|
ELM_GESTURE_STATE_END, momentum_end, po);
|
||||||
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM,
|
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_MOMENTUM,
|
||||||
ELM_GESTURE_STATE_ABORT, momentum_abort, po);
|
ELM_GESTURE_STATE_ABORT, momentum_abort, po);
|
||||||
|
*/
|
||||||
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM,
|
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM,
|
||||||
ELM_GESTURE_STATE_START, zoom_start, po);
|
ELM_GESTURE_STATE_START, zoom_start, po);
|
||||||
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM,
|
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM,
|
||||||
|
@ -480,7 +506,7 @@ photo_object_add(Evas_Object *parent, Evas_Object *ic, const char *icon,
|
||||||
ELM_GESTURE_STATE_END, zoom_end, po);
|
ELM_GESTURE_STATE_END, zoom_end, po);
|
||||||
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM,
|
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ZOOM,
|
||||||
ELM_GESTURE_STATE_ABORT, zoom_end, po);
|
ELM_GESTURE_STATE_ABORT, zoom_end, po);
|
||||||
|
/*
|
||||||
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE,
|
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE,
|
||||||
ELM_GESTURE_STATE_START, rotate_start, po);
|
ELM_GESTURE_STATE_START, rotate_start, po);
|
||||||
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE,
|
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE,
|
||||||
|
@ -489,7 +515,7 @@ photo_object_add(Evas_Object *parent, Evas_Object *ic, const char *icon,
|
||||||
ELM_GESTURE_STATE_END, rotate_end, po);
|
ELM_GESTURE_STATE_END, rotate_end, po);
|
||||||
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE,
|
elm_gesture_layer_cb_set(po->gl, ELM_GESTURE_ROTATE,
|
||||||
ELM_GESTURE_STATE_ABORT, rotate_abort, po);
|
ELM_GESTURE_STATE_ABORT, rotate_abort, po);
|
||||||
|
*/
|
||||||
po->rotate = po->base_rotate = angle;
|
po->rotate = po->base_rotate = angle;
|
||||||
po->shadow_zoom = 1.3;
|
po->shadow_zoom = 1.3;
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue