<?xml version="1.0"?>
<!DOCTYPE opt SYSTEM "opt.dtd">
<opt>

  <defaults>
    <title  color="#f5f5f5ff" font="Cookie 54" />
    <bullet color="#f5f5f5ff" font="Cooper Lt BT 30" /> 
    <transition style="flip" />  
    <background src="bg.png" />
  </defaults>

  <slide>
    <background src="frontpage.png" />
    <transition style="cube" />  
  </slide>

  <slide>
    <title>What is Clutter?</title>
   <bullet>A toolkit/scenegraph/canvas library rendering via OpenGL/OpenGL ES.</bullet>
   <bullet>Depends on GObject, GLib, GDKPixbuf and Pango.</bullet>
   <bullet>For creation of fast, animated, visually bespoke and impressive graphical interfaces.</bullet>

   <bullet>Raw but flexible API</bullet>
   <bullet>Not a general OpenGL interface - `2D with 3D effects'</bullet>
   <bullet>Written in C, LGPL Licensed, 0.3.1 recently released.</bullet>
   <bullet>Influences: Macromedia Director, Java 3D, processing, GTK+.</bullet>

  </slide> 


   <slide>
    <title>Why Clutter?</title>
   <bullet>Bling without pain of OpenGL API and Maths knowledge.</bullet>
   <bullet>Simple OO GTK+ like API with window and event abstractions.</bullet>
   <bullet>3D desktop hardware commodity, 3D Embedded hardware getting more and more popular.</bullet>
   <bullet>Experimentation!</bullet>
 
   </slide>

   <slide>
     <title>Where to use Clutter?</title>
    <bullet>Media boxes (obviously) - i.e Microsoft Media Center, Apple's Front Row.</bullet>
    <bullet>Desktop aplication effects (e.g Coverflow in iTunes, slideshow in picture viewer).</bullet>
    <bullet>Embedded: Zune, iPhone, other fixed size UIs.</bullet>
    <bullet>Not Quake, not spreadsheets.</bullet>
   </slide>

   <slide>
    <title>General concepts</title>
   <bullet>Visual elements are know as 'Actors' (Widgets).</bullet>
   <bullet>Actors are added to the Stage (Window).</bullet>
   <bullet>Actors have parents and can have children.</bullet>
   <bullet>Actors are manipulated directly, via events and animations.</bullet>
   </slide>

   <slide>
    <title>Actors</title>
  <bullet> All can be tranformed in various ways:
   - Positioned in 3D space (via pixels or ClutterUnits),
   - Rotated around 3 Axis,
   - Sized
   - Scaled,
   - Have opacity set,
   - Clipped.</bullet>
 <bullet>Transforms also apply to children.</bullet>
 <bullet>Position relative to parent.</bullet>
    <transition style="fade" />  
    </slide>
   <slide>
    <title>Simple Actor Example.</title>
    <bullet font="mono 16" symbol="none">#include &lt;clutter/clutter.h&gt;

int
main (int argc, char *argv[])
{
  ClutterActor    *stage, *actor;
  GdkPixbuf       *pixbuf;

  clutter_init (&amp;argc, &amp;argv);

  stage = clutter_stage_get_default ();

  pixbuf = gdk_pixbuf_new_from_file ("superoh.png", NULL);

  actor  = clutter_texture_new_from_pixbuf (pixbuf);

  clutter_container_add_actor (CLUTTER_CONTAINER (stage), actor);
  
  clutter_actor_set_position (actor, 100, 100);
  clutter_actor_rotate_z (actor, 180.0, 
			  clutter_actor_get_width (actor)/2,
			  clutter_actor_get_height (actor)/2);

  clutter_actor_show_all (stage);

  clutter_main();

  return 0;
}
</bullet>
    <transition style="fade" />  
   </slide>
   <slide>
    <title>Simple Actor Example II.</title>
    <bullet font="mono 16" symbol="none"> 
  pixbuf = gdk_pixbuf_new_from_file ("redhand.png", NULL);

  group = clutter_group_new ();

  actor1  = clutter_texture_new_from_pixbuf (pixbuf);
  actor2  = clutter_texture_new_from_pixbuf (pixbuf);

  clutter_container_add (CLUTTER_CONTAINER (group), actor1 ,actor2, NULL);
  
  clutter_actor_set_position (actor1, 0, 0);
  clutter_actor_set_position (actor2, 200, 0);

  clutter_container_add_actor (CLUTTER_CONTAINER (stage), group);
  clutter_actor_set_position (group, 100, 100);

  clutter_actor_rotate_z (group, 45.0, 
			  clutter_actor_get_width (group)/2,
			  clutter_actor_get_height (group)/2);

  clutter_actor_show_all (group);
  clutter_actor_show_all (stage);

  clutter_main();
</bullet>
    </slide>
   <slide>
    <title>Included Actors</title>

  <bullet>ClutterTexture, ClutterAnimationTexture, ClutterCloneTexture</bullet>
  <bullet>ClutterRectangle</bullet>
  <bullet>ClutterLabel</bullet>
  <bullet>ClutterEntry</bullet>
  <bullet>ClutterContainer, ClutterStage, ClutterGroup, ClutterVBox, ClutterHBox</bullet>
  <bullet>ClutterCairo, ClutterGstVideo (Via Add ons)</bullet>
  <bullet>Easy to subclass and make your own.</bullet>
    </slide>

   <slide>
    <title>Events</title>
   <bullet>Simple processed input events (keyboard, mouse)</bullet>
   <bullet>All signals from stage</bullet>
   <bullet>clutter_stage_actor_at_pos()</bullet>
   <bullet>Reasoning: performance, focus model.</bullet> 
   <bullet>Plans to improve RSN</bullet>
    </slide>

   <slide>
    <title>ClutterTimelines</title>
 <bullet>Basis of animations.</bullet>
 <bullet>Specify number of frames and frames per second.</bullet>
 <bullet>Callback on a new frame.</bullet>
 <bullet>Skips 'dropped' frames.</bullet>
 <bullet>Delay, Stop, start, pause, loop, etc.</bullet>
    <transition style="fade" />  
    </slide>

   <slide>
    <title>Timeline Example</title>
    <bullet font="mono 16" symbol="none">
void
on_new_frame (ClutterTimeline *timeline, 
	      gint             frame_num, 
	      gpointer         data)
{
  ClutterActor *actor = CLUTTER_ACTOR(data);

  clutter_actor_rotate_z (actor, (gdouble)frame_num, 
			  clutter_actor_get_width (actor)/2,
			  clutter_actor_get_height (actor)/2);
}

int
main (int argc, char *argv[])
{
  ClutterTimeline *timeline;
  ...

  timeline = clutter_timeline_new (360, 60);    /* num frames, fps */
  g_object_set(timeline, "loop", TRUE, NULL);   /* have it loop */

  /* fire a callback for frame change */
  g_signal_connect (timeline, "new-frame", G_CALLBACK (on_new_frame), actor);

  clutter_timeline_start (timeline);

  ...
}</bullet>
   </slide>
   <slide>
    <title>ClutterAlphas</title>
   <bullet>A *function* of time - not pixel alpha!.</bullet> 
   <bullet>Takes a timeline as parameter and a function.</bullet>
   <bullet>Produces a value between 0 and CLUTTER_ALPHA_MAX.</bullet>
   <img src="alpha-func.png" />
   <bullet>Various prebuilt functions included: ramps, sinewaves, smoothstep, exponential etc.</bullet>
   </slide>

   <slide>
    <title>ClutterBehaviours</title>
  <bullet>Manipulates actors properties in various ways driven by Alphas.</bullet>
  <bullet>Makes complex animations easy.</bullet>
  <bullet>Opacity. Rotation. Depth. Paths. BSplines Paths. Ellipse Paths.</bullet>
  <bullet>Mix. Stack. Easy to roll your own.</bullet>
    <transition style="fade" />  
   </slide>

   <slide>
    <title>Behaviour example</title>
    <bullet font="mono 16" symbol="none">
  timeline = clutter_timeline_new (100, 26); /* num frames, fps */

  /* Set an alpha func to power behaviour */
  alpha = clutter_alpha_new_full (timeline,
                                  CLUTTER_ALPHA_SINE,
                                  NULL, NULL);

  behave = clutter_behaviour_ellipse_new (alpha, 
					  200,   /* center x */
					  200,   /* center y */
					  400,   /* width */
					  300,   /* height */
					  0.0,   /* angle begin */
					  360.0, /* angle end */
					  0.0    /* tilt */ );

   clutter_behaviour_apply (behave, actor);

   /* start the timeline and thus the animations */
   clutter_timeline_start (timeline);
    </bullet>
   </slide>

   <slide>
    <title>ClutterEffects</title>
    <bullet>'One shot' effects</bullet>
    <bullet>Utility wrapper around timelines+alphas+behaviours</bullet>
    <bullet>More limited, but easy</bullet>
    <bullet font="mono 16" symbol="none">	
ClutterEffectTemplate *template

effect_template 
  = clutter_effect_template_new (clutter_timeline_new (60, 60), 
				 CLUTTER_ALPHA_RAMP_INC);

clutter_effect_scale (effect_template,
		      actor,
		      1.0,
		      4.0,
		      CLUTTER_GRAVITY_CENTER,
		      on_completion_callback,
		      on_completion_callback_data);
    </bullet>
   </slide>


   <slide>
    <title>Other</title>
     <bullet>ClutterMedia
 - Interface providing media playback (clutter-gst implements)</bullet>

    </slide>
   <slide>
    <title>Add Ons</title>
    <bullet>ClutterCairo - A Cairo Canvas Actor.</bullet>
    <bullet>ClutterGst - ClutterMedia implementation for audio / video playback.</bullet>
    <bullet>ClutterGTK - Simple GTK Clutter canvas widget.</bullet>
   </slide>

   <slide>
    <title>ClutterCairo</title>
    <bullet>A Cairo Canvas Actor, 2 API calls;</bullet>
    <bullet font="mono 16" symbol="none">
    actor  = clutter_cairo_new (width, height);
    cr     = clutter_cairo_create (CLUTTER_CAIRO(actor));

    ... cairo rendering calls ...

    cairo_destroy (cr);
    </bullet>
    <bullet>Not accelerated (yet)</bullet>

  </slide>

   <slide>
    <title>ClutterGst</title>
    <bullet>Video Texture Actor - simple video file playback.</bullet>
    <bullet>Clutter Texture Sink - for custom pipelines.</bullet>
    <bullet>Simple audio playback also.</bullet>
  </slide>

   <slide>
    <title>ClutterGTK</title>
    <bullet>GTK Clutter Canvas widget</bullet>
    <bullet>Allows Clutter to be embedded into GTK apps.</bullet>
    <transition style="zoom" />  
  </slide>
   <slide>
	<title>Demos</title>
        <bullet>https://svn.o-hand.com/repos/clutter/trunk/toys</bullet>
   </slide>
   <slide>
    <title>Internals</title>
    <bullet>All fixed point math (fixed and float API entry points).</bullet>
    <bullet>ClutterUnits.</bullet>
    <bullet>Timeline Pool.</bullet>
    <bullet>Custom Pango renderer - efficient text rendering
 (based on Marc Lehmann's Pango GL renderer).</bullet>

    </slide>
   <slide>
    <title>Backends</title>
   <bullet>Clutter Backend essentially abstracted into 2 parts:
  - Windowing system interface (GLX, EGL, SDL),
  - Graphics rendering interface (OpenGL / OpenGL ES 1.1).</bullet>
   <bullet>'Cogl' layer abstracts over regular GL and GL ES.</bullet>
   <bullet>Features allows easy runtime detection of missing features 
 (eg YUV textures, texture reads).</bullet>
   </slide>
   <slide>
    <title>Bindings</title>
    <bullet>Perl, Python, Mono.</bullet>
    <bullet font="mono 16" symbol="none">
 stage = clutter.stage_get_default()
 stage.set_size(800,600)

 rect = clutter.Rectangle()
 rect.set_position (100, 100)
 rect.set_size(10, 10)

 stage.add(rect)

 stage.show_all()
 clutter.main()</bullet>
    <bullet>Plea for help in maintaining.</bullet>
   </slide>

   <slide>
    <title>Future plans</title>

   <bullet>Interface definition files.</bullet>
   <bullet>More ClutterUnits.</bullet>
   <bullet>Multipoint events.</bullet>
   <bullet>Shaders.</bullet>
   <bullet>GTK Offscreen.</bullet>
   <bullet>Glitz / GtkGlExt backend.</bullet>
   <bullet>ClutterModel.</bullet>
   <bullet>Endless ideas see TODO in clutter tarball</bullet>
    </slide>
   <slide>
    <title>Thanks for listening</title>
    <bullet>Q&amp;A</bullet>	
    <bullet>More info; http://clutter-project.org</bullet>	
   </slide>

</opt>
