diff --git a/doc/reference/clutter/Makefile.am b/doc/reference/clutter/Makefile.am index bce244add..431b2ff87 100644 --- a/doc/reference/clutter/Makefile.am +++ b/doc/reference/clutter/Makefile.am @@ -139,7 +139,6 @@ SVG_IMAGES = \ # e.g. content_files=running.sgml building.sgml changes-2.0.sgml content_files = \ glossary.xml \ - clutter-animation-tutorial.xml \ clutter-overview.xml \ building-clutter.xml \ running-clutter.xml \ @@ -152,7 +151,6 @@ content_files = \ # e.g. expand_content_files=running.sgml expand_content_files = \ glossary.xml \ - clutter-animation-tutorial.xml \ clutter-overview.xml \ building-clutter.xml \ running-clutter.xml \ diff --git a/doc/reference/clutter/clutter-animation-tutorial.xml b/doc/reference/clutter/clutter-animation-tutorial.xml deleted file mode 100644 index e9f1bf8ec..000000000 --- a/doc/reference/clutter/clutter-animation-tutorial.xml +++ /dev/null @@ -1,466 +0,0 @@ - - - - Matthew - Allum - -
- mallum@openedhand.com -
-
-
- - - Emmanuele - Bassi - -
- ebassi@linux.intel.com -
-
-
-
- - Creating Animations with Clutter - - With Clutter using hardware accelration for graphics rendering, - complex and fast animations are possible. This chapter describes basic - techniques and the utilities Clutter provides in aiding animation - creation. - -
- Basic Animations - - The most basic way to create animations with Clutter is via the use - of clutter_threads_add_timeout(). This enables a callback function to be - called at a defined interval. The callback function can then modify actors - visual properties as to produce an animation. - - - Simple timeout example - Implement a rotating actor using 360 "frames" - -struct RotationClosure { - ClutterActor *actor; - - gdouble final_angle; - gdouble current_angle; -}; - -static gboolean -rotate_actor (gpointer data) -{ - struct RotationClosure *clos = data; - - clutter_actor_set_rotation (clos->actor, clos->current_angle, 0, 0, 0); - - /* add one degree */ - clos->current_angle += 1.0 - - /* if we reached the target angle, stop */ - if (clos->current_angle == clos->final_angle) - return G_SOURCE_REMOVE; - - return G_SOURCE_CONTINUE; -} - -static void -rotate_actor_cleanup (gpointer data) -{ - struct RotationClosure *clos = data; - - g_object_unref (clos->actor); - g_free (clos); -} - -... - struct RotationClosure *clos = NULL; - - clos = g_new (struct RotationClosure, 1); - clos->actor = g_object_ref (an_actor); - clos->final_angle = 360.0; - clos->current_angle = 0; - - clutter_threads_add_timeout_full (G_PRIORITY_DEFAULT, - 1000 / 360, /* 360 updates in one second */ - rotate_actor, - clos, - rotate_actor_cleanup); - - - - - Priorities - %G_PRIORITY_DEFAULT should always be used as the timeouts priority - (in case of clutter_threads_add_timeout_full()) as not to intefere with - Clutter's scheduling of repaints and input event handling. - -
- -
- Timelines - - Using clutter_threads_add_timeout() to control an animation is - complicated and does not work in concert with the rest of the operations - Clutter must perform for each redraw cycle. - - For this reason, Clutter provides #ClutterTimeline, a class that - allows scheduling animations with a definite duration. Timelines are - advanced during the redraw cycle so that animations are ready to be - performed at the right time. This also means that animations will not - affect the event processing; it also means that if the animation is too - complex it will be called with a longer delay, thus not blocking the - whole UI. - - A Timeline is created with: - - -ClutterTimeline *timeline = clutter_timeline_new (duration_in_milliseconds); - - - The duration of the timeline then be modifed via the - #ClutterTimeline:duration property or by using - clutter_timeline_set_duration(). - - A timeline is started via clutter_timeline_start() and its - playback further manipulated by the clutter_timeline_pause(), - clutter_timeline_stop(), clutter_timeline_rewind() and - clutter_timeline_skip() functions. - - By attaching a handler to the timeline's - #ClutterTimeline::new-frame signal a timeline can then be used to - drive an animation by altering an actor's visual properties. The - callback looks like: - - -void -on_new_frame (ClutterTimeline *timeline, - gint elapsed_msecs, - gpointer user_data) -{ -} - - - The elapsed_msecs parameter is set to the amount - of time elapsed since the beginning of the timeline, and its value is - always between 0 and the #ClutterTimeline:duration value. - - The function clutter_timeline_get_progress() can also be used to - get a normalised value of the timeline's current position between 0 and - 1. - - Timelines can also be played in reverse by setting the direction - using clutter_timeline_set_direction(), and can also have a one-time - delay set before they begin playing by using the function - clutter_timeline_set_delay(). - - Timelines can also control a pyshical simulation; the - clutter_timeline_get_delta() function allows retrieving the number of - milliseconds elapsed since the previous callback to ensure the physics - engine to be able to take the actual time elapsed between iterations - into account. - - - Using a Timeline to drive an animation - Rewrite the example above with a #ClutterTimeline instead of - using clutter_threads_add_timeout() - -#include <clutter/clutter.h> - -static void -on_new_frame (ClutterTimeline *timeline, - gint elapsed_msecs, - ClutterActor *actor) -{ - gdouble angle = 360 * clutter_timeline_get_progress (timeline); - - clutter_actor_set_rotation (actor, CLUTTER_Z_AXIS, - angle, - clutter_actor_get_width (actor) / 2, - clutter_actor_get_height (actor) / 2, - 0); -} - - ... - - ClutterTimeline *timeline; - - /* one second */ - timeline = clutter_timeline_new (1000); - - /* looping indefinitely */ - clutter_timeline_set_repeat_count (timeline, -1); - - /* get a notification each time a new frame should be drawn */ - g_signal_connect (timeline, "new-frame", G_CALLBACK (on_new_frame), actor); - - /* start the timeline once control returns to the main loop */ - clutter_timeline_start (timeline); - - -
- - - -
- Implicit Animations - - Using behaviours for simple animations of a single actor may - be too complicated, in terms of memory management and bookkeeping - of the object instances. For this reason, Clutter also provides a - simple animation API for implicit animations using properties of - an actor: clutter_actor_animate(). - - The clutter_actor_animate() family of functions will create - and use an implicit #ClutterAnimation instance, which will then - handle the animation of one or more #ClutterActor properties between - a range of values. - - - Using clutter_actor_animate() - The following example demonstrates how to use the - clutter_actor_animate() method to tween an actor between the current - position and a new set of coordinates. The animation takes 200 - milliseconds to complete and uses a linear progression. - - clutter_actor_animate (actor, CLUTTER_LINEAR, 200, - "x", 200.0f, - "y", 200.0f, - NULL); - - - - The clutter_actor_animate() method returns a #ClutterAnimation - instance that can be used to start, stop and modify the animation - while it's running. The #ClutterAnimation::completed signal will - be emitted when the animation has been completed. - - When the animation is complete it will be automatically - unreferenced, and disposed if nothing else is holding a reference - on it. - - - Animating inside an event handler - The following example demonstrates how to animate an actor - inside the signal handler for a button press event. If the user - presses the button on a new position while the animation is running, - the animation will be restarted with the new final values - updated. - - static gboolean - on_button_press (ClutterActor *actor, - ClutterEvent *event, - gpointer user_data) - { - gfloat event_x, event_y; - - clutter_event_get_coords (event, &event_x, &event_y); - clutter_actor_animate (actor, CLUTTER_EASE_SINE_OUT, 500, - "x", event_x, - "y", event_y, - NULL); - return TRUE; - } - - - - Calling clutter_actor_animate() multiple times on an - actor which is being animated will cause the animation to be updated - with the new values. - - If you need to chain up multiple animations created using - clutter_actor_animate() you should connect to the - #ClutterAnimation::completed signal using g_signal_connect_after() - to have the guarantee that the current #ClutterAnimation has been - detached from the actor. The documentation for clutter_actor_animate() - has further examples. - -
- -
- Conclusion - Clutter provides a number of utility classes to aid animations - and complex animations can be produced by combining the various features - provided. - - Of course animations can becreated outside of the Clutter animation - framework, as the framework is not expected to cover every kind of - possible animation scenario. - - The animation functionality in Clutter is primarily suited to - building animations with a set or finite running time - i.e transitions - between states. For animations involving variable input (such as - touchscreen handling) physical simulations may be more suited. -
- -
diff --git a/doc/reference/clutter/clutter-docs.xml.in b/doc/reference/clutter/clutter-docs.xml.in index 6869f73ce..8d03ef29a 100644 --- a/doc/reference/clutter/clutter-docs.xml.in +++ b/doc/reference/clutter/clutter-docs.xml.in @@ -222,17 +222,6 @@ - - Additional Documentation - - - This section contains additional useful documentation for - developing with Clutter. - - - - - Migrating from previous version of Clutter