2007-11-30 Emmanuele Bassi <ebassi@openedhand.com>

* clutter/clutter-timeline.h:
	* clutter/clutter-timeline.c
	(timeline_timeout_func),
	(clutter_timeline_get_delta): Add a function for retrieving
	the number of frames and the time (in milliseconds) elapsed
	since the last timeline ::new-frame signal. This can be useful
	for implementing a physics engine or just for knowing how if
	and how many frames have been skipped.
This commit is contained in:
Emmanuele Bassi 2007-11-30 13:20:15 +00:00
parent f04a0a4645
commit 9628df5ca9
5 changed files with 112 additions and 7 deletions

View File

@ -1,3 +1,14 @@
2007-11-30 Emmanuele Bassi <ebassi@openedhand.com>
* clutter/clutter-timeline.h:
* clutter/clutter-timeline.c
(timeline_timeout_func),
(clutter_timeline_get_delta): Add a function for retrieving
the number of frames and the time (in milliseconds) elapsed
since the last timeline ::new-frame signal. This can be useful
for implementing a physics engine or just for knowing how if
and how many frames have been skipped.
2007-11-30 Emmanuele Bassi <ebassi@openedhand.com>
* clutter/clutter-actor.c (parse_units),

View File

@ -70,6 +70,8 @@ struct _ClutterTimelinePrivate
guint delay;
guint duration;
gint skipped_frames;
gulong last_frame_msecs;
gulong start_frame_secs;
@ -505,19 +507,27 @@ timeline_timeout_func (gpointer data)
/ (1000 / priv->fps);
if (n_frames <= 0)
{
n_frames = 1;
priv->skipped_frames = 0;
}
else if (n_frames > 1)
{
CLUTTER_TIMESTAMP (SCHEDULER,
"Timeline [%p], skipping %d frames\n",
timeline,
n_frames);
priv->skipped_frames = n_frames - 1;
}
else
priv->skipped_frames = 0;
}
else
{
/* First frame, set up timings.*/
priv->start_frame_secs = timeval.tv_sec;
priv->skipped_frames = 0;
msecs = timeval.tv_usec / 1000;
n_frames = 1;
@ -1206,3 +1216,58 @@ clutter_timeline_set_direction (ClutterTimeline *timeline,
g_object_notify (G_OBJECT (timeline), "direction");
}
}
/**
* clutter_timeline_get_delta:
* @timeline: a #ClutterTimeline
* @msecs: return location for the milliseconds elapsed since the last
* frame, or %NULL
*
* Retrieves the number of frames and the amount of time elapsed since
* the last ClutterTimeline::new-frame signal.
*
* This function is only useful inside handlers for the ::new-frame
* signal, and its behaviour is undefined if the timeline is not
* playing.
*
* Return value: the amount of frames elapsed since the last one
*
* Since: 0.6
*/
guint
clutter_timeline_get_delta (ClutterTimeline *timeline,
guint *msecs)
{
ClutterTimelinePrivate *priv;
g_return_val_if_fail (CLUTTER_IS_TIMELINE (timeline), 0);
if (!clutter_timeline_is_playing (timeline))
{
if (msecs)
*msecs = 0;
return 0;
}
priv = timeline->priv;
if (msecs)
{
GTimeVal timeval;
g_get_current_time (&timeval);
if (priv->last_frame_msecs)
{
*msecs = ((timeval.tv_sec - priv->start_frame_secs) * 1000)
+ (timeval.tv_usec / 1000);
}
else
{
*msecs = timeval.tv_usec / 1000;
}
}
return priv->skipped_frames + 1;
}

View File

@ -138,6 +138,8 @@ gboolean clutter_timeline_is_playing (ClutterTimeline *timeli
void clutter_timeline_set_delay (ClutterTimeline *timeline,
guint msecs);
guint clutter_timeline_get_delay (ClutterTimeline *timeline);
guint clutter_timeline_get_delta (ClutterTimeline *timeline,
guint *msecs);
G_END_DECLS

View File

@ -1,3 +1,7 @@
2007-11-30 Emmanuele Bassi <ebassi@openedhand.com>
* clutter-sections.txt: Update with the newly added API.
2007-11-28 Tomas Frydrych <tf@openedhand.com>
* clutter-sections.txt: added new CLUTTER_UNITS_FROM_* macros.

View File

@ -320,9 +320,7 @@ clutter_actor_set_y
clutter_actor_get_y
clutter_actor_move_by
clutter_actor_set_rotation
clutter_actor_set_rotationx
clutter_actor_get_rotation
clutter_actor_get_rotationx
clutter_actor_set_opacity
clutter_actor_get_opacity
clutter_actor_set_name
@ -348,9 +346,7 @@ clutter_actor_lower_bottom
<SUBSECTION>
clutter_actor_set_depth
clutter_actor_get_depth
clutter_actor_set_scalex
clutter_actor_set_scale
clutter_actor_get_scalex
clutter_actor_get_scale
clutter_actor_get_abs_size
clutter_actor_apply_transform_to_point
@ -362,14 +358,34 @@ clutter_actor_get_vertices
<SUBSECTION>
clutter_actor_set_anchor_point
clutter_actor_get_anchor_point
clutter_actor_set_anchor_pointu
clutter_actor_get_anchor_pointu
clutter_actor_set_anchor_point_from_gravity
<SUBSECTION>
clutter_actor_set_reactive
clutter_actor_get_reactive
<SUBSECTION>
clutter_actor_set_depthu
clutter_actor_get_depthu
clutter_actor_set_heightu
clutter_actor_get_heightu
clutter_actor_set_widthu
clutter_actor_get_widthu
clutter_actor_set_xu
clutter_actor_get_xu
clutter_actor_set_yu
clutter_actor_get_yu
clutter_actor_set_positionu
clutter_actor_set_sizeu
clutter_actor_set_anchor_pointu
clutter_actor_get_anchor_pointu
<SUBSECTION>
clutter_actor_set_scalex
clutter_actor_get_scalex
clutter_actor_set_rotationx
clutter_actor_get_rotationx
<SUBSECTION Standard>
CLUTTER_TYPE_GEOMETRY
CLUTTER_TYPE_ACTOR_BOX
@ -445,6 +461,8 @@ clutter_stage_snapshot
clutter_stage_event
clutter_stage_set_key_focus
clutter_stage_get_key_focus
clutter_stage_get_resolution
clutter_stage_get_resolutionx
<SUBSECTION>
ClutterPerspective
@ -516,6 +534,7 @@ clutter_timeline_rewind
clutter_timeline_skip
clutter_timeline_advance
clutter_timeline_get_current_frame
clutter_timeline_get_delta
clutter_timeline_get_progress
clutter_timeline_get_progressx
clutter_timeline_is_playing
@ -1126,12 +1145,16 @@ ClutterModelSortFunc
ClutterModelForeachFunc
clutter_model_new
clutter_model_newv
clutter_model_set_names
clutter_model_set_types
clutter_model_append
clutter_model_prepend
clutter_model_insert
clutter_model_insert_value
clutter_model_remove
clutter_model_get_column_name
clutter_model_get_column_type
clutter_model_get_n_columns
clutter_model_get_n_rows
clutter_model_get_first_iter
clutter_model_get_last_iter