From acc28cf60c482bf56bb298630a9d1b75f350d31b Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Tue, 31 Aug 2010 17:42:37 +0100 Subject: [PATCH 1/6] cookbook: Added example for animation reuse recipe Added an example showing how to reuse a ClutterAnimator instance to animate multiple actors at different times using an animatable rig, combined with reparenting. --- doc/cookbook/examples/Makefile.am | 2 + doc/cookbook/examples/animations-reuse.c | 117 ++++++++++++++++++ doc/cookbook/examples/animations-reuse.json | 124 ++++++++++++++++++++ 3 files changed, 243 insertions(+) create mode 100644 doc/cookbook/examples/animations-reuse.c create mode 100644 doc/cookbook/examples/animations-reuse.json diff --git a/doc/cookbook/examples/Makefile.am b/doc/cookbook/examples/Makefile.am index 6039c690b..e1bcd81b9 100644 --- a/doc/cookbook/examples/Makefile.am +++ b/doc/cookbook/examples/Makefile.am @@ -4,6 +4,7 @@ NULL = noinst_PROGRAMS = \ animations-complex \ + animations-reuse \ animations-rotating \ text-shadow \ textures-reflection \ @@ -45,6 +46,7 @@ AM_CFLAGS = \ AM_LDFLAGS = $(CLUTTER_LIBS) -export-dynamic animations_complex_SOURCES = animations-complex.c +animations_reuse_SOURCES = animations-reuse.c animations_rotating_SOURCES = animations-rotating.c text_shadow_SOURCES = text-shadow.c textures_reflection_SOURCES = textures-reflection.c diff --git a/doc/cookbook/examples/animations-reuse.c b/doc/cookbook/examples/animations-reuse.c new file mode 100644 index 000000000..2a7ffbecd --- /dev/null +++ b/doc/cookbook/examples/animations-reuse.c @@ -0,0 +1,117 @@ +#include +#include + +gboolean +foo_button_pressed_cb (ClutterActor *actor, + ClutterEvent *event, + gpointer user_data) +{ + ClutterScript *script = CLUTTER_SCRIPT (user_data); + + ClutterAnimator *bounce; + ClutterActor *rig; + ClutterTimeline *bounce_timeline; + + clutter_script_get_objects (script, + "bounce_timeline", &bounce_timeline, + "rig", &rig, + "bounce", &bounce, + NULL); + + /* don't allow animation to be reused until it is complete */ + if (clutter_timeline_is_playing (bounce_timeline)) + return TRUE; + + clutter_actor_set_position (rig, 0, 0); + + clutter_actor_set_scale (rig, 1.0, 1.0); + + clutter_actor_reparent (actor, rig); + + clutter_animator_start (bounce); + + return TRUE; +} + +/* set the actor's position to the rig's position + * but parented to the background; + * remove the click handler so the rectangle can't be animated again + */ +static void +_move_to_background_cb (ClutterActor *actor, + gpointer user_data) +{ + ClutterActor *background = CLUTTER_ACTOR (user_data); + + gfloat x, y; + clutter_actor_get_position (clutter_actor_get_parent (actor), &x, &y); + + gdouble scale_x, scale_y; + clutter_actor_get_scale (clutter_actor_get_parent (actor), &scale_x, &scale_y); + + clutter_actor_reparent (actor, background); + + clutter_actor_set_position (actor, x, y); + clutter_actor_set_scale (actor, scale_x, scale_y); + + g_signal_handlers_disconnect_matched (actor, + G_SIGNAL_MATCH_FUNC, + 0, + 0, + NULL, + foo_button_pressed_cb, + NULL); +} + +void +foo_rig_animation_complete_cb (ClutterTimeline *timeline, + gpointer user_data) +{ + ClutterScript *script = CLUTTER_SCRIPT (user_data); + + ClutterContainer *rig; + ClutterActor *background; + + clutter_script_get_objects (script, + "rig", &rig, + "background", &background, + NULL); + + clutter_container_foreach (rig, + CLUTTER_CALLBACK (_move_to_background_cb), + background); +} + +int +main (int argc, char *argv[]) +{ + clutter_init (&argc, &argv); + + gchar *filename = "animations-reuse.json"; + GError *error = NULL; + + ClutterScript *script = clutter_script_new (); + clutter_script_load_from_file (script, filename, &error); + + if (error != NULL) + { + g_critical ("Error loading ClutterScript file %s\n%s", filename, error->message); + g_error_free (error); + exit (EXIT_FAILURE); + } + + clutter_script_connect_signals (script, script); + + ClutterActor *stage; + clutter_script_get_objects (script, + "stage", &stage, + NULL); + + clutter_actor_show (stage); + + clutter_main (); + + g_object_unref (script); + + return EXIT_SUCCESS; +} diff --git a/doc/cookbook/examples/animations-reuse.json b/doc/cookbook/examples/animations-reuse.json new file mode 100644 index 000000000..c300cd9e9 --- /dev/null +++ b/doc/cookbook/examples/animations-reuse.json @@ -0,0 +1,124 @@ +[ + { + "type" : "ClutterStage", + "id" : "stage", + "width" : 550, + "height" : 400, + "color" : "#333355ff", + + "signals" : [ + { "name" : "destroy", "handler" : "clutter_main_quit" } + ], + + "children" : [ + + { + "type" : "ClutterRectangle", + "id" : "rect1", + "color" : "red", + "width" : 50, + "height" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + }, + + { + "type" : "ClutterRectangle", + "id" : "rect2", + "color" : "blue", + "width" : 50, + "height" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + }, + + { + "type" : "ClutterRectangle", + "id" : "rect3", + "color" : "green", + "width" : 50, + "height" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + }, + + { + "type" : "ClutterGroup", + "id" : "background" + }, + + { + "type" : "ClutterGroup", + "id" : "rig" + } + + ] + }, + + { + "type" : "ClutterAnimator", + "id" : "bounce", + "timeline" : { + "type" : "ClutterTimeline", + "id" : "bounce_timeline", + "duration" : 3000, + + "signals" : [ + { "name" : "completed", "handler" : "foo_rig_animation_complete_cb" } + ] + }, + + "properties" : [ + { + "object" : "rig", + "name" : "x", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutCubic", 100.0 ], + [ 0.6, "easeOutCubic", 150.0 ], + [ 0.8, "linear", 350.0 ], + [ 1.0, "linear", 500.0 ] + ] + }, + { + "object" : "rig", + "name" : "y", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutCubic", 200.0 ], + [ 0.6, "easeOutBounce", 200.0 ], + [ 0.8, "linear", 200.0 ], + [ 1.0, "linear", 0.0 ] + ] + }, + { + "object" : "rig", + "name" : "scale-x", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutElastic", 2.0 ], + [ 0.6, "easeOutBounce", 4.0 ], + [ 0.8, "linear", 4.0 ], + [ 1.0, "linear", 1.0 ] + ] + }, + { + "object" : "rig", + "name" : "scale-y", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutElastic", 2.0 ], + [ 0.6, "easeOutBounce", 4.0 ], + [ 0.8, "linear", 4.0 ], + [ 1.0, "linear", 1.0 ] + ] + } + ] + } +] From d4190cbf8ce8c667110744976c8cdd52ff3ede81 Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Wed, 1 Sep 2010 10:21:23 +0100 Subject: [PATCH 2/6] cookbook: Refactored reusable animation example Extracted the animation into its own JSON definition, then create a new script and get the animation each time a rectangle is clicked. Removes the need to reparent onto the background and copy property values to the rectangle after the animation, and generally much cleaner. --- .../examples/animations-reuse-animation.json | 63 +++++++++ .../examples/animations-reuse-ui.json | 53 ++++++++ doc/cookbook/examples/animations-reuse.c | 108 ++++++--------- doc/cookbook/examples/animations-reuse.json | 124 ------------------ 4 files changed, 158 insertions(+), 190 deletions(-) create mode 100644 doc/cookbook/examples/animations-reuse-animation.json create mode 100644 doc/cookbook/examples/animations-reuse-ui.json delete mode 100644 doc/cookbook/examples/animations-reuse.json diff --git a/doc/cookbook/examples/animations-reuse-animation.json b/doc/cookbook/examples/animations-reuse-animation.json new file mode 100644 index 000000000..cad247500 --- /dev/null +++ b/doc/cookbook/examples/animations-reuse-animation.json @@ -0,0 +1,63 @@ +[ + { + "type" : "ClutterGroup", + "id" : "rig" + }, + + { + "type" : "ClutterAnimator", + "id" : "bounce", + "timeline" : { + "type" : "ClutterTimeline", + "id" : "bounce_timeline", + "duration" : 2500 + }, + + "properties" : [ + { + "object" : "rig", + "name" : "x", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutCubic", 100.0 ], + [ 0.6, "easeOutCubic", 150.0 ], + [ 0.8, "linear", 350.0 ], + [ 1.0, "linear", 500.0 ] + ] + }, + { + "object" : "rig", + "name" : "y", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutCubic", 200.0 ], + [ 0.6, "easeOutBounce", 200.0 ], + [ 0.8, "linear", 200.0 ], + [ 1.0, "linear", 0.0 ] + ] + }, + { + "object" : "rig", + "name" : "scale-x", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutElastic", 2.0 ], + [ 0.6, "easeOutBounce", 4.0 ], + [ 0.8, "linear", 4.0 ], + [ 1.0, "linear", 1.0 ] + ] + }, + { + "object" : "rig", + "name" : "scale-y", + "ease-in" : true, + "keys" : [ + [ 0.2, "easeOutElastic", 2.0 ], + [ 0.6, "easeOutBounce", 4.0 ], + [ 0.8, "linear", 4.0 ], + [ 1.0, "linear", 1.0 ] + ] + } + ] + } +] diff --git a/doc/cookbook/examples/animations-reuse-ui.json b/doc/cookbook/examples/animations-reuse-ui.json new file mode 100644 index 000000000..0b9e24087 --- /dev/null +++ b/doc/cookbook/examples/animations-reuse-ui.json @@ -0,0 +1,53 @@ +[ + { + "type" : "ClutterStage", + "id" : "stage", + "width" : 550, + "height" : 400, + "color" : "#333355ff", + + "signals" : [ + { "name" : "destroy", "handler" : "clutter_main_quit" } + ], + + "children" : [ + + { + "type" : "ClutterRectangle", + "id" : "rect1", + "color" : "red", + "width" : 50, + "height" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + }, + + { + "type" : "ClutterRectangle", + "id" : "rect2", + "color" : "blue", + "width" : 50, + "height" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + }, + + { + "type" : "ClutterRectangle", + "id" : "rect3", + "color" : "green", + "width" : 50, + "height" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + } + + ] + } +] diff --git a/doc/cookbook/examples/animations-reuse.c b/doc/cookbook/examples/animations-reuse.c index 2a7ffbecd..78d0082a9 100644 --- a/doc/cookbook/examples/animations-reuse.c +++ b/doc/cookbook/examples/animations-reuse.c @@ -1,12 +1,38 @@ #include #include +#define UI_FILE "animations-reuse-ui.json" +#define ANIMATION_FILE "animations-reuse-animation.json" + +static gboolean +_load_script (ClutterScript *script, + gchar *filename) +{ + GError *error = NULL; + + clutter_script_load_from_file (script, filename, &error); + + if (error != NULL) + { + g_critical ("Error loading ClutterScript file %s\n%s", filename, error->message); + g_error_free (error); + exit (EXIT_FAILURE); + } + + return TRUE; +} + gboolean foo_button_pressed_cb (ClutterActor *actor, ClutterEvent *event, gpointer user_data) { - ClutterScript *script = CLUTTER_SCRIPT (user_data); + ClutterScript *ui = CLUTTER_SCRIPT (user_data); + ClutterStage *stage = CLUTTER_STAGE (clutter_script_get_object (ui, "stage")); + + ClutterScript *script = clutter_script_new (); + + _load_script (script, ANIMATION_FILE); ClutterAnimator *bounce; ClutterActor *rig; @@ -18,13 +44,22 @@ foo_button_pressed_cb (ClutterActor *actor, "bounce", &bounce, NULL); - /* don't allow animation to be reused until it is complete */ - if (clutter_timeline_is_playing (bounce_timeline)) - return TRUE; + /* remove the button press handler */ + g_signal_handlers_disconnect_matched (actor, + G_SIGNAL_MATCH_FUNC, + 0, + 0, + NULL, + foo_button_pressed_cb, + NULL); - clutter_actor_set_position (rig, 0, 0); + /* add a handler to clean up when the animation completes */ + g_signal_connect_swapped (bounce_timeline, + "completed", + G_CALLBACK (g_object_unref), + script); - clutter_actor_set_scale (rig, 1.0, 1.0); + clutter_container_add_actor (CLUTTER_CONTAINER (stage), rig); clutter_actor_reparent (actor, rig); @@ -33,72 +68,13 @@ foo_button_pressed_cb (ClutterActor *actor, return TRUE; } -/* set the actor's position to the rig's position - * but parented to the background; - * remove the click handler so the rectangle can't be animated again - */ -static void -_move_to_background_cb (ClutterActor *actor, - gpointer user_data) -{ - ClutterActor *background = CLUTTER_ACTOR (user_data); - - gfloat x, y; - clutter_actor_get_position (clutter_actor_get_parent (actor), &x, &y); - - gdouble scale_x, scale_y; - clutter_actor_get_scale (clutter_actor_get_parent (actor), &scale_x, &scale_y); - - clutter_actor_reparent (actor, background); - - clutter_actor_set_position (actor, x, y); - clutter_actor_set_scale (actor, scale_x, scale_y); - - g_signal_handlers_disconnect_matched (actor, - G_SIGNAL_MATCH_FUNC, - 0, - 0, - NULL, - foo_button_pressed_cb, - NULL); -} - -void -foo_rig_animation_complete_cb (ClutterTimeline *timeline, - gpointer user_data) -{ - ClutterScript *script = CLUTTER_SCRIPT (user_data); - - ClutterContainer *rig; - ClutterActor *background; - - clutter_script_get_objects (script, - "rig", &rig, - "background", &background, - NULL); - - clutter_container_foreach (rig, - CLUTTER_CALLBACK (_move_to_background_cb), - background); -} - int main (int argc, char *argv[]) { clutter_init (&argc, &argv); - gchar *filename = "animations-reuse.json"; - GError *error = NULL; - ClutterScript *script = clutter_script_new (); - clutter_script_load_from_file (script, filename, &error); - - if (error != NULL) - { - g_critical ("Error loading ClutterScript file %s\n%s", filename, error->message); - g_error_free (error); - exit (EXIT_FAILURE); - } + _load_script (script, UI_FILE); clutter_script_connect_signals (script, script); diff --git a/doc/cookbook/examples/animations-reuse.json b/doc/cookbook/examples/animations-reuse.json deleted file mode 100644 index c300cd9e9..000000000 --- a/doc/cookbook/examples/animations-reuse.json +++ /dev/null @@ -1,124 +0,0 @@ -[ - { - "type" : "ClutterStage", - "id" : "stage", - "width" : 550, - "height" : 400, - "color" : "#333355ff", - - "signals" : [ - { "name" : "destroy", "handler" : "clutter_main_quit" } - ], - - "children" : [ - - { - "type" : "ClutterRectangle", - "id" : "rect1", - "color" : "red", - "width" : 50, - "height" : 50, - "reactive" : true, - "signals" : [ - { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } - ] - }, - - { - "type" : "ClutterRectangle", - "id" : "rect2", - "color" : "blue", - "width" : 50, - "height" : 50, - "reactive" : true, - "signals" : [ - { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } - ] - }, - - { - "type" : "ClutterRectangle", - "id" : "rect3", - "color" : "green", - "width" : 50, - "height" : 50, - "reactive" : true, - "signals" : [ - { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } - ] - }, - - { - "type" : "ClutterGroup", - "id" : "background" - }, - - { - "type" : "ClutterGroup", - "id" : "rig" - } - - ] - }, - - { - "type" : "ClutterAnimator", - "id" : "bounce", - "timeline" : { - "type" : "ClutterTimeline", - "id" : "bounce_timeline", - "duration" : 3000, - - "signals" : [ - { "name" : "completed", "handler" : "foo_rig_animation_complete_cb" } - ] - }, - - "properties" : [ - { - "object" : "rig", - "name" : "x", - "ease-in" : true, - "keys" : [ - [ 0.2, "easeOutCubic", 100.0 ], - [ 0.6, "easeOutCubic", 150.0 ], - [ 0.8, "linear", 350.0 ], - [ 1.0, "linear", 500.0 ] - ] - }, - { - "object" : "rig", - "name" : "y", - "ease-in" : true, - "keys" : [ - [ 0.2, "easeOutCubic", 200.0 ], - [ 0.6, "easeOutBounce", 200.0 ], - [ 0.8, "linear", 200.0 ], - [ 1.0, "linear", 0.0 ] - ] - }, - { - "object" : "rig", - "name" : "scale-x", - "ease-in" : true, - "keys" : [ - [ 0.2, "easeOutElastic", 2.0 ], - [ 0.6, "easeOutBounce", 4.0 ], - [ 0.8, "linear", 4.0 ], - [ 1.0, "linear", 1.0 ] - ] - }, - { - "object" : "rig", - "name" : "scale-y", - "ease-in" : true, - "keys" : [ - [ 0.2, "easeOutElastic", 2.0 ], - [ 0.6, "easeOutBounce", 4.0 ], - [ 0.8, "linear", 4.0 ], - [ 1.0, "linear", 1.0 ] - ] - } - ] - } -] From d7a3e35f46593e04cf8cfe5eca18e3b2c06ff35b Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Wed, 1 Sep 2010 11:18:15 +0100 Subject: [PATCH 3/6] cookbook: Cleaned up the "animations reuse" example With some help from pippin, moved variable declarations into more sensible positions within their functions, changed a function name, and found a better way to unref a script once its associated actor has been destroyed. --- .../examples/animations-reuse-animation.json | 1 - doc/cookbook/examples/animations-reuse.c | 32 +++++++++---------- 2 files changed, 15 insertions(+), 18 deletions(-) diff --git a/doc/cookbook/examples/animations-reuse-animation.json b/doc/cookbook/examples/animations-reuse-animation.json index cad247500..7561bd557 100644 --- a/doc/cookbook/examples/animations-reuse-animation.json +++ b/doc/cookbook/examples/animations-reuse-animation.json @@ -9,7 +9,6 @@ "id" : "bounce", "timeline" : { "type" : "ClutterTimeline", - "id" : "bounce_timeline", "duration" : 2500 }, diff --git a/doc/cookbook/examples/animations-reuse.c b/doc/cookbook/examples/animations-reuse.c index 78d0082a9..ee58020bc 100644 --- a/doc/cookbook/examples/animations-reuse.c +++ b/doc/cookbook/examples/animations-reuse.c @@ -5,8 +5,8 @@ #define ANIMATION_FILE "animations-reuse-animation.json" static gboolean -_load_script (ClutterScript *script, - gchar *filename) +load_script_from_file (ClutterScript *script, + gchar *filename) { GError *error = NULL; @@ -30,16 +30,15 @@ foo_button_pressed_cb (ClutterActor *actor, ClutterScript *ui = CLUTTER_SCRIPT (user_data); ClutterStage *stage = CLUTTER_STAGE (clutter_script_get_object (ui, "stage")); - ClutterScript *script = clutter_script_new (); - - _load_script (script, ANIMATION_FILE); - - ClutterAnimator *bounce; + ClutterScript *script; ClutterActor *rig; - ClutterTimeline *bounce_timeline; + ClutterAnimator *bounce; + + script = clutter_script_new (); + + load_script_from_file (script, ANIMATION_FILE); clutter_script_get_objects (script, - "bounce_timeline", &bounce_timeline, "rig", &rig, "bounce", &bounce, NULL); @@ -53,11 +52,8 @@ foo_button_pressed_cb (ClutterActor *actor, foo_button_pressed_cb, NULL); - /* add a handler to clean up when the animation completes */ - g_signal_connect_swapped (bounce_timeline, - "completed", - G_CALLBACK (g_object_unref), - script); + /* add a callback to clean up the script when the rig is destroyed */ + g_object_set_data_full (G_OBJECT (rig), "script", script, g_object_unref); clutter_container_add_actor (CLUTTER_CONTAINER (stage), rig); @@ -71,14 +67,16 @@ foo_button_pressed_cb (ClutterActor *actor, int main (int argc, char *argv[]) { + ClutterScript *script; + ClutterActor *stage; + clutter_init (&argc, &argv); - ClutterScript *script = clutter_script_new (); - _load_script (script, UI_FILE); + script = clutter_script_new (); + load_script_from_file (script, UI_FILE); clutter_script_connect_signals (script, script); - ClutterActor *stage; clutter_script_get_objects (script, "stage", &stage, NULL); From 82ab00930b63d3860f96ac99da9cdc8128de1aee Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Thu, 9 Sep 2010 12:02:02 +0100 Subject: [PATCH 4/6] cookbook: Simplified and clarified example code Modified the "animation reuse" sample code to provide a simpler example to explain in the recipe. Also modified variable names to mirror the names used for the previous "complex animation" example and added some more comments, to further simplify and support the recipe. --- .../examples/animations-reuse-animation.json | 36 ++++-------------- .../examples/animations-reuse-ui.json | 37 ++++++++++++++++--- doc/cookbook/examples/animations-reuse.c | 20 ++++++++-- 3 files changed, 56 insertions(+), 37 deletions(-) diff --git a/doc/cookbook/examples/animations-reuse-animation.json b/doc/cookbook/examples/animations-reuse-animation.json index 7561bd557..5f16e1ee9 100644 --- a/doc/cookbook/examples/animations-reuse-animation.json +++ b/doc/cookbook/examples/animations-reuse-animation.json @@ -6,11 +6,8 @@ { "type" : "ClutterAnimator", - "id" : "bounce", - "timeline" : { - "type" : "ClutterTimeline", - "duration" : 2500 - }, + "id" : "animator", + "duration" : 2000, "properties" : [ { @@ -18,21 +15,8 @@ "name" : "x", "ease-in" : true, "keys" : [ - [ 0.2, "easeOutCubic", 100.0 ], - [ 0.6, "easeOutCubic", 150.0 ], - [ 0.8, "linear", 350.0 ], - [ 1.0, "linear", 500.0 ] - ] - }, - { - "object" : "rig", - "name" : "y", - "ease-in" : true, - "keys" : [ - [ 0.2, "easeOutCubic", 200.0 ], - [ 0.6, "easeOutBounce", 200.0 ], - [ 0.8, "linear", 200.0 ], - [ 1.0, "linear", 0.0 ] + [ 0.0, "linear", 0.0 ], + [ 1.0, "easeOutCubic", 150.0 ] ] }, { @@ -40,10 +24,8 @@ "name" : "scale-x", "ease-in" : true, "keys" : [ - [ 0.2, "easeOutElastic", 2.0 ], - [ 0.6, "easeOutBounce", 4.0 ], - [ 0.8, "linear", 4.0 ], - [ 1.0, "linear", 1.0 ] + [ 0.5, "linear", 1.0 ], + [ 1.0, "easeOutBack", 2.0 ] ] }, { @@ -51,10 +33,8 @@ "name" : "scale-y", "ease-in" : true, "keys" : [ - [ 0.2, "easeOutElastic", 2.0 ], - [ 0.6, "easeOutBounce", 4.0 ], - [ 0.8, "linear", 4.0 ], - [ 1.0, "linear", 1.0 ] + [ 0.5, "linear", 1.0 ], + [ 1.0, "easeOutBack", 2.0 ] ] } ] diff --git a/doc/cookbook/examples/animations-reuse-ui.json b/doc/cookbook/examples/animations-reuse-ui.json index 0b9e24087..99f50c616 100644 --- a/doc/cookbook/examples/animations-reuse-ui.json +++ b/doc/cookbook/examples/animations-reuse-ui.json @@ -2,8 +2,8 @@ { "type" : "ClutterStage", "id" : "stage", - "width" : 550, - "height" : 400, + "width" : 300, + "height" : 200, "color" : "#333355ff", "signals" : [ @@ -11,13 +11,13 @@ ], "children" : [ - { "type" : "ClutterRectangle", "id" : "rect1", - "color" : "red", + "color" : "white", "width" : 50, "height" : 50, + "y" : 50, "reactive" : true, "signals" : [ { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } @@ -30,6 +30,7 @@ "color" : "blue", "width" : 50, "height" : 50, + "y" : 50, "reactive" : true, "signals" : [ { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } @@ -42,12 +43,38 @@ "color" : "green", "width" : 50, "height" : 50, + "y" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + }, + + { + "type" : "ClutterRectangle", + "id" : "rect4", + "color" : "red", + "width" : 50, + "height" : 50, + "y" : 50, + "reactive" : true, + "signals" : [ + { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } + ] + }, + + { + "type" : "ClutterRectangle", + "id" : "rect5", + "color" : "grey", + "width" : 50, + "height" : 50, + "y" : 50, "reactive" : true, "signals" : [ { "name" : "button-press-event", "handler" : "foo_button_pressed_cb" } ] } - ] } ] diff --git a/doc/cookbook/examples/animations-reuse.c b/doc/cookbook/examples/animations-reuse.c index ee58020bc..506435a21 100644 --- a/doc/cookbook/examples/animations-reuse.c +++ b/doc/cookbook/examples/animations-reuse.c @@ -32,18 +32,20 @@ foo_button_pressed_cb (ClutterActor *actor, ClutterScript *script; ClutterActor *rig; - ClutterAnimator *bounce; + ClutterAnimator *animator; + /* load the rig and its animator from a JSON file */ script = clutter_script_new (); + /* use a function defined statically in this source file to load the JSON */ load_script_from_file (script, ANIMATION_FILE); clutter_script_get_objects (script, "rig", &rig, - "bounce", &bounce, + "animator", &animator, NULL); - /* remove the button press handler */ + /* remove the button press handler from the rectangle */ g_signal_handlers_disconnect_matched (actor, G_SIGNAL_MATCH_FUNC, 0, @@ -55,11 +57,21 @@ foo_button_pressed_cb (ClutterActor *actor, /* add a callback to clean up the script when the rig is destroyed */ g_object_set_data_full (G_OBJECT (rig), "script", script, g_object_unref); + /* add the rig to the stage */ clutter_container_add_actor (CLUTTER_CONTAINER (stage), rig); + /* place the rig at the same coordinates on the stage as the rectangle */ + clutter_actor_set_position (rig, + clutter_actor_get_x (actor), + clutter_actor_get_y (actor)); + + /* put the rectangle into the top-left corner of the rig */ clutter_actor_reparent (actor, rig); - clutter_animator_start (bounce); + clutter_actor_set_position (actor, 0, 0); + + /* animate the rig */ + clutter_animator_start (animator); return TRUE; } From 6548bee56ca8401d2e9d31e33bf4fcd5a65b92f5 Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Mon, 13 Sep 2010 10:28:16 +0100 Subject: [PATCH 5/6] cookbook: Added id for section in "rotating an actor" recipe Added an id to a section in the "rotating an actor" recipe, so that it can be referred to from the "reusing an animation" recipe. --- doc/cookbook/animations.xml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/doc/cookbook/animations.xml b/doc/cookbook/animations.xml index 49c9a0832..661b64eaf 100644 --- a/doc/cookbook/animations.xml +++ b/doc/cookbook/animations.xml @@ -844,7 +844,7 @@ clutter_actor_set_z_rotation_from_gravity (actor, -
+
Direction of rotation The apparent direction of an animated rotation depends on From e8e360eaa7207a677738ce15496499ac7196a5b5 Mon Sep 17 00:00:00 2001 From: Elliot Smith Date: Mon, 13 Sep 2010 14:29:37 +0100 Subject: [PATCH 6/6] cookbook: Added a recipe for reusing a complex animation This recipe explains how to "reuse" the same animation definition for different actors, by creating a new instance of a "rig" (empty container) and animation for the rig each time the animation is required. An actor is then re-parented to the rig and animated using it, rather than being animated directly. JSON is used to define the rig + animator, to make creating new instances of them simpler. The recipe also discusses various caveats around using this approach, rather than directly animating an actor. --- doc/cookbook/Makefile.am | 1 + doc/cookbook/animations.xml | 378 +++++++++++++++++++++++ doc/cookbook/videos/animations-reuse.ogv | Bin 0 -> 60837 bytes 3 files changed, 379 insertions(+) create mode 100644 doc/cookbook/videos/animations-reuse.ogv diff --git a/doc/cookbook/Makefile.am b/doc/cookbook/Makefile.am index 9ce15c241..15ce15a23 100644 --- a/doc/cookbook/Makefile.am +++ b/doc/cookbook/Makefile.am @@ -58,6 +58,7 @@ VIDEO_FILES = \ videos/events-mouse-scroll.ogv \ videos/textures-crossfade-two-textures.ogv \ videos/animations-complex.ogv \ + videos/animations-reuse.ogv \ $(NULL) EXTRA_DIST = \ diff --git a/doc/cookbook/animations.xml b/doc/cookbook/animations.xml index 661b64eaf..ba22a3350 100644 --- a/doc/cookbook/animations.xml +++ b/doc/cookbook/animations.xml @@ -1438,4 +1438,382 @@ clutter_actor_set_z_rotation_from_gravity (actor,
+
+ Reusing a complex animation on different actors + +
+ Problem + + You want to apply the same complex animation to several + different actors. + +
+ +
+ Solution + + Instead of animating each actor separately, create a + rig: an empty container with an associated + animation, which will be animated in lieu of + animating the actor directly. Do this as follows: + + + + Initialise the stage and actors, including those + to be animated. + + + Define a ClutterContainer and a + ClutterAnimator animation to animate it. + + + When you need to animate an actor: + + + + Create an instance of the rig and its animator. + + + Reparent the actor to the rig. + + + Run the rig's animation. + + + + + + For this solution, we're using + JSON to define the + animation and the user interface elements. For more + details about this approach, see + the chapter + on ClutterScript. + + Here's an extract of the JSON definition for the stage and + one of five rectangles placed at its left edge (the full definition + is in the + appendix): + + + + + + + + The key point to note is how a signal handler is defined + for the button-press-event, so that the + foo_button_pressed_cb() function will trigger + the animation when a (mouse) button is pressed on each rectangle. + + The second JSON definition includes the rig + (an empty ClutterGroup) and a + ClutterAnimator to animate it. The animation moves the + container across the stage and scales it to twice its original + size. (This is the same + code as in the appendix): + + + + + a code sample should be here... but isn't + + + + + The remaining parts of the application code load + the user interface definition, setting up the stage and rectangles; + and define the callback. The full code is + in the appendix, + but below is the most important part, the callback function: + + + + + + + + The code creates a new rig and associated animation + at the point when the rectangle is clicked. It then positions the + rig at the same coordinates as the rectangle, reparents + the rectangle to the rig, and starts the rig's animation. + + + The signal handler has to be declared non-static and + you must use -export-dynamic as an option to the + compiler, otherwise the function isn't visible to + ClutterScript (as outlined + in this recipe). + + + This is what the animation looks like: + + + + + + + Video of a simple reusable animation + + + +
+ +
+ Discussion + + The above solution reparents an actor to be animated + into a rig (an empty placeholder). The rig is a container + which acts as a temporary parent for the actor we + really want to animate. By animating the rig, + it appears as though the actor inside it is being animated (but + see + these caveats). This means the same animation can be + easily applied to different actors: create an + instance of the rig, reparent an actor to it, then + run the rig's animation. This is simpler than creating + a separate animation for each actor individually, or + reusing a single ClutterAnimator on different + actors (see + this + section). + + Using JSON enhances the animation's reusability (it's even + potentially reusable in another application), makes the code + simpler (an animation can be loaded directly from the script), + and makes refactoring easier (the animation can be modified + without recompiling the application code). However, it also puts + some minor limitations on the animation's reusability; namely, you + can only set absolute property values in a JSON animation + definition. This makes JSON less useful in cases where + you need to animate properties relative to their starting + values: for example, "move 50 pixels along the x axis" or + "rotate by 10 degrees more on the z axis". (This type of animation + is probably less portable anyway.) In such cases, the programmable + API may be a better option: see the ClutterAnimator + documentation for examples. + +
+ One animation vs. many + + In the sample code, a new instance of the rig and its + animation are created for each actor. One side effect of this + is that all of the actors can animate simultaneously with the + "same" animation. If you don't want this behaviour, but still + want to use a rig approach, you could create a single instance + of the rig and its animation. Then, you could reparent each actor + to it in turn. + + To ensure that the rig only animates one actor (or group + of actors) at a time, you could track whether the rig is + currently animating (e.g. by examining the animation's + timeline with clutter_animator_get_timeline()). + Then, if the animation is running, prevent any other actor + from being reparented to the rig. + + Note that you would also need to "reset" the rig each time the + animation completed (move it back to the right start values for + its properties), ready to animate the next actor. +
+ +
+ Caveats about animating a rig instead of an actor + + There are a few issues to be aware of in cases + where you animate a rig with contained actors, rather than + animating the actor directly: + + + + Animating a rig doesn't always + produce the same visual effect as animating an actor directly. + For example, compare the following cases: + + + + You rotate an actor by 180 degrees in the + y axis, then by 90 degrees in the + z axis. The actor appears to rotate in + a clockwise direction. + + + You rotate the parent container of an actor + by 180 degrees in the y axis; then rotate + the actor by 90 degrees in the z axis. + The actor appears to rotate in an + anti-clockwise direction. By + rotating the container, the "back" of the + actor faces the view point, so the actor's movement + appears reversed. See + this + recipe for more details. + + + + There may be other situations where you get similar + discrepancies. + + + + Animating a rig doesn't change an actor's properties, + but animating the actor does. + + When you animate a container rather than the actor + directly, the reported properties of the actor may not + reflect its visual appearance. For example, if you apply + a scale animation to a container, the final scale of + actors inside it (as returned by + clutter_actor_get_scale()) will not + reflect the scaling applied to their container; whereas + directly animating the actors would cause their scale + properties to change. + + + + Reparenting an actor to a rig can cause the actor + to "jump" to the rig's position, unless you align the + actor to the rig first. + + Note that in the sample code, the position of the actor + (x, y coordinates) is copied to + the rig before the reparenting happens. The actor is then + reparented to the rig, and positioned in the rig's + top-left corner. So the actor appears to be in the same + position, but is now actually inside a rig at the actor's old + position. + + Why bother to do this? Because the rig has a default + position of 0,0 (top-left of its + container, the stage). If you reparent the actor to the rig, + without first copying the actor's position to the rig, the + actor appears to "jump" to the rig's position. + + +
+ +
+ +
+ Full example + + + The three separate code examples in this section + constitute a single application which implements the above + solution. + + + + <type>ClutterScript</type> JSON defining several + rectangles with signal handlers + + + a code sample should be here... but isn't + + + + + + <type>ClutterScript</type> JSON describing a "rig" + and a <type>ClutterAnimator</type> animation + + + a code sample should be here... but isn't + + + + + + Loading <type>ClutterScript</type> from JSON files + in response to events in a user interface + + + a code sample should be here... but isn't + + + + +
+ +
+ diff --git a/doc/cookbook/videos/animations-reuse.ogv b/doc/cookbook/videos/animations-reuse.ogv new file mode 100644 index 0000000000000000000000000000000000000000..07b0c4e40a0480f3f076878f956b2aad8176d52d GIT binary patch literal 60837 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 literal 0 HcmV?d00001