[clutter/wip/master-next: 5/8] Add ClutterActor.transform
- From: Emmanuele Bassi <ebassi src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [clutter/wip/master-next: 5/8] Add ClutterActor.transform
- Date: Tue, 24 Jul 2012 13:18:29 +0000 (UTC)
commit d9854be8090949a4340ec4fd104f1b3a7fe56962
Author: Emmanuele Bassi <ebassi gnome org>
Date: Fri Jul 20 16:56:43 2012 -0400
Add ClutterActor.transform
The :transform property controls the modelview matrix of an actor; it
can be used to set a custom modelview matrix on the actor, as opposed
to the decomposed transformations (rotation, scaling, translation)
provided by the ClutterActor class.
clutter/clutter-actor-private.h | 3 +
clutter/clutter-actor.c | 174 ++++++++++++++++++++++++++++++++----
clutter/clutter-actor.h | 10 ++-
clutter/clutter.symbols | 2 +
clutter/deprecated/clutter-actor.h | 3 +
5 files changed, 172 insertions(+), 20 deletions(-)
---
diff --git a/clutter/clutter-actor-private.h b/clutter/clutter-actor-private.h
index 9920fa3..f5832b2 100644
--- a/clutter/clutter-actor-private.h
+++ b/clutter/clutter-actor-private.h
@@ -209,6 +209,9 @@ struct _ClutterTransformInfo
/* transformation center */
ClutterPoint pivot;
gfloat pivot_z;
+
+ CoglMatrix transform;
+ guint transform_set : 1;
};
const ClutterTransformInfo * _clutter_actor_get_transform_info_or_defaults (ClutterActor *self);
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index 172847f..e31b6bb 100644
--- a/clutter/clutter-actor.c
+++ b/clutter/clutter-actor.c
@@ -899,6 +899,9 @@ enum
PROP_TRANSLATION_Y,
PROP_TRANSLATION_Z,
+ PROP_TRANSFORM,
+ PROP_TRANSFORM_SET,
+
PROP_SHOW_ON_SET_PARENT, /*XXX:2.0 remove */
PROP_TEXT_DIRECTION,
@@ -2947,8 +2950,8 @@ clutter_actor_get_abs_allocation_vertices (ClutterActor *self,
}
static void
-clutter_actor_real_apply_transform (ClutterActor *self,
- CoglMatrix *matrix)
+clutter_actor_real_apply_transform (ClutterActor *self,
+ ClutterMatrix *matrix)
{
ClutterActorPrivate *priv = self->priv;
@@ -2979,6 +2982,17 @@ clutter_actor_real_apply_transform (ClutterActor *self,
cogl_matrix_init_identity (transform);
+ /* if we have an overriding transformation, we use that, and get out */
+ if (info->transform_set)
+ {
+ cogl_matrix_translate (transform,
+ priv->allocation.x1 + pivot_x,
+ priv->allocation.y1 + pivot_y,
+ info->pivot_z);
+ cogl_matrix_multiply (transform, transform, &info->transform);
+ goto out;
+ }
+
/* basic translation: :allocation's origin and :z-position; instead
* of decomposing the pivot and translation info separate operations,
* we just compose everything into a single translation
@@ -3049,6 +3063,7 @@ clutter_actor_real_apply_transform (ClutterActor *self,
if (pivot_x != 0.f || pivot_y != 0.f || info->pivot_z != 0.f)
cogl_matrix_translate (transform, -pivot_x, -pivot_y, -info->pivot_z);
+out:
priv->transform_valid = TRUE;
}
@@ -3058,8 +3073,8 @@ clutter_actor_real_apply_transform (ClutterActor *self,
/* Applies the transforms associated with this actor to the given
* matrix. */
void
-_clutter_actor_apply_modelview_transform (ClutterActor *self,
- CoglMatrix *matrix)
+_clutter_actor_apply_modelview_transform (ClutterActor *self,
+ ClutterMatrix *matrix)
{
CLUTTER_ACTOR_GET_CLASS (self)->apply_transform (self, matrix);
}
@@ -3069,7 +3084,7 @@ _clutter_actor_apply_modelview_transform (ClutterActor *self,
* @self: The actor whose coordinate space you want to transform from.
* @ancestor: The ancestor actor whose coordinate space you want to transform too
* or %NULL if you want to transform all the way to eye coordinates.
- * @matrix: A #CoglMatrix to apply the transformation too.
+ * @matrix: A #ClutterMatrix to apply the transformation too.
*
* This multiplies a transform with @matrix that will transform coordinates
* from the coordinate space of @self into the coordinate space of @ancestor.
@@ -4123,7 +4138,9 @@ static const ClutterTransformInfo default_transform_info = {
0.f, /* z-position */
CLUTTER_POINT_INIT_ZERO, /* pivot */
- 0.f /* pivot-z */
+ 0.f, /* pivot-z */
+
+ { 0.0, }, FALSE, /* transform */
};
/*< private >
@@ -4977,22 +4994,26 @@ clutter_actor_set_property (GObject *object,
}
break;
- case PROP_ANCHOR_X:
+ case PROP_ANCHOR_X: /* XXX:2.0 - remove */
clutter_actor_set_anchor_coord (actor, CLUTTER_X_AXIS,
g_value_get_float (value));
break;
- case PROP_ANCHOR_Y:
+ case PROP_ANCHOR_Y: /* XXX:2.0 - remove */
clutter_actor_set_anchor_coord (actor, CLUTTER_Y_AXIS,
g_value_get_float (value));
break;
- case PROP_ANCHOR_GRAVITY:
+ case PROP_ANCHOR_GRAVITY: /* XXX:2.0 - remove */
clutter_actor_set_anchor_point_from_gravity (actor,
g_value_get_enum (value));
break;
- case PROP_SHOW_ON_SET_PARENT:
+ case PROP_TRANSFORM:
+ clutter_actor_set_transform (actor, g_value_get_boxed (value));
+ break;
+
+ case PROP_SHOW_ON_SET_PARENT: /* XXX:2.0 - remove */
priv->show_on_set_parent = g_value_get_boolean (value);
break;
@@ -5464,11 +5485,29 @@ clutter_actor_get_property (GObject *object,
}
break;
- case PROP_ANCHOR_GRAVITY:
+ case PROP_ANCHOR_GRAVITY: /* XXX:2.0 - remove */
g_value_set_enum (value, clutter_actor_get_anchor_point_gravity (actor));
break;
- case PROP_SHOW_ON_SET_PARENT:
+ case PROP_TRANSFORM:
+ {
+ ClutterMatrix m;
+
+ clutter_actor_get_transform (actor, &m);
+ g_value_set_boxed (value, &m);
+ }
+ break;
+
+ case PROP_TRANSFORM_SET:
+ {
+ const ClutterTransformInfo *info;
+
+ info = _clutter_actor_get_transform_info_or_defaults (actor);
+ g_value_set_boolean (value, info->transform_set);
+ }
+ break;
+
+ case PROP_SHOW_ON_SET_PARENT: /* XXX:2.0 - remove */
g_value_set_boolean (value, priv->show_on_set_parent);
break;
@@ -7004,6 +7043,48 @@ clutter_actor_class_init (ClutterActorClass *klass)
CLUTTER_PARAM_ANIMATABLE);
/**
+ * ClutterActor:transform:
+ *
+ * Overrides the transformations of a #ClutterActor with a custom
+ * matrix.
+ *
+ * The matrix specified by the #ClutterActor:transform property is
+ * applied to the actor and its children relative to the actor's
+ * #ClutterActor:allocation and #ClutterActor:pivot-point.
+ *
+ * Application code should rarely need to use this function directly.
+ *
+ * Setting this property with a #ClutterMatrix will set the
+ * #ClutterActor:transform-set property to %TRUE as a side effect;
+ * setting this property with %NULL will set the
+ * #ClutterActor:transform-set property to %FALSE.
+ *
+ * Since: 1.12
+ */
+ obj_props[PROP_TRANSFORM] =
+ g_param_spec_boxed ("transform",
+ P_("Transform"),
+ P_("Transformation matrix"),
+ CLUTTER_TYPE_MATRIX,
+ G_PARAM_READWRITE |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
+ * ClutterActor:transform-set:
+ *
+ * Whether the #ClutterActor:transform property is set.
+ *
+ * Since: 1.12
+ */
+ obj_props[PROP_TRANSFORM_SET] =
+ g_param_spec_boolean ("transform-set",
+ P_("Transform Set"),
+ P_("Whether the transform property is set"),
+ FALSE,
+ G_PARAM_READABLE |
+ G_PARAM_STATIC_STRINGS);
+
+ /**
* ClutterActor:show-on-set-parent:
*
* If %TRUE, the actor is automatically shown when parented.
@@ -15588,22 +15669,81 @@ clutter_actor_unset_flags (ClutterActor *self,
/**
* clutter_actor_get_transformation_matrix:
* @self: a #ClutterActor
- * @matrix: (out caller-allocates): the return location for a #CoglMatrix
+ * @matrix: (out caller-allocates): the return location for a #ClutterMatrix
*
* Retrieves the transformations applied to @self relative to its
* parent.
*
* Since: 1.0
+ *
+ * Deprecated: 1.12: Use clutter_actor_get_transform() instead
+ */
+void
+clutter_actor_get_transformation_matrix (ClutterActor *self,
+ ClutterMatrix *matrix)
+{
+ clutter_actor_get_transform (self, matrix);
+}
+
+/**
+ * clutter_actor_set_transform:
+ * @self: a #ClutterActor
+ * @transform: (allow-none): a #ClutterMatrix, or %NULL to
+ * unset a custom transformation
+ *
+ * Overrides the transformations of a #ClutterActor with a custom
+ * matrix, which will be applied relative to the origin of the
+ * actor's allocation and to the actor's pivot point.
+ *
+ * Since: 1.12
*/
void
-clutter_actor_get_transformation_matrix (ClutterActor *self,
- CoglMatrix *matrix)
+clutter_actor_set_transform (ClutterActor *self,
+ const ClutterMatrix *transform)
{
+ ClutterTransformInfo *info;
+ GObject *obj;
+
g_return_if_fail (CLUTTER_IS_ACTOR (self));
- cogl_matrix_init_identity (matrix);
+ obj = G_OBJECT (self);
- _clutter_actor_apply_modelview_transform (self, matrix);
+ info = _clutter_actor_get_transform_info (self);
+
+ if (transform != NULL)
+ {
+ info->transform = *transform;
+ info->transform_set = TRUE;
+ }
+ else
+ info->transform_set = FALSE;
+
+ self->priv->transform_valid = FALSE;
+
+ clutter_actor_queue_redraw (self);
+
+ g_object_notify_by_pspec (obj, obj_props[PROP_TRANSFORM]);
+ g_object_notify_by_pspec (obj, obj_props[PROP_TRANSFORM_SET]);
+}
+
+/**
+ * clutter_actor_get_transform:
+ * @self: a #ClutterActor
+ * @transform: (out caller-allocates): a #ClutterMatrix
+ *
+ * Retrieves the current transformation matrix of a #ClutterActor.
+ *
+ * Since: 1.12
+ */
+void
+clutter_actor_get_transform (ClutterActor *self,
+ ClutterMatrix *transform)
+{
+ g_return_if_fail (CLUTTER_IS_ACTOR (self));
+ g_return_if_fail (transform != NULL);
+
+ cogl_matrix_init_identity (transform);
+ _clutter_actor_apply_modelview_transform (self, transform);
}
void
diff --git a/clutter/clutter-actor.h b/clutter/clutter-actor.h
index 561d7f7..1edb465 100644
--- a/clutter/clutter-actor.h
+++ b/clutter/clutter-actor.h
@@ -225,7 +225,7 @@ struct _ClutterActorClass
/* transformations */
void (* apply_transform) (ClutterActor *actor,
- CoglMatrix *matrix);
+ ClutterMatrix *matrix);
/* event signals */
gboolean (* event) (ClutterActor *actor,
@@ -666,6 +666,12 @@ void clutter_actor_get_translation
gfloat *translate_x,
gfloat *translate_y,
gfloat *translate_z);
+CLUTTER_AVAILABLE_IN_1_12
+void clutter_actor_set_transform (ClutterActor *self,
+ const ClutterMatrix *transform);
+CLUTTER_AVAILABLE_IN_1_12
+void clutter_actor_get_transform (ClutterActor *self,
+ ClutterMatrix *transform);
void clutter_actor_get_transformed_position (ClutterActor *self,
gfloat *x,
gfloat *y);
@@ -686,8 +692,6 @@ void clutter_actor_apply_relative_transform_to_point
ClutterActor *ancestor,
const ClutterVertex *point,
ClutterVertex *vertex);
-void clutter_actor_get_transformation_matrix (ClutterActor *self,
- CoglMatrix *matrix);
/* Implicit animations */
CLUTTER_AVAILABLE_IN_1_10
diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols
index c6a773e..0f4a5cd 100644
--- a/clutter/clutter.symbols
+++ b/clutter/clutter.symbols
@@ -149,6 +149,7 @@ clutter_actor_get_shader
clutter_actor_get_size
clutter_actor_get_stage
clutter_actor_get_text_direction
+clutter_actor_get_transform
clutter_actor_get_transformation_matrix
clutter_actor_get_transformed_paint_volume
clutter_actor_get_transformed_position
@@ -274,6 +275,7 @@ clutter_actor_set_shader_param_float
clutter_actor_set_shader_param_int
clutter_actor_set_size
clutter_actor_set_text_direction
+clutter_actor_set_transform
clutter_actor_set_translation
clutter_actor_set_width
clutter_actor_set_x_align
diff --git a/clutter/deprecated/clutter-actor.h b/clutter/deprecated/clutter-actor.h
index fe49732..eafb5eb 100644
--- a/clutter/deprecated/clutter-actor.h
+++ b/clutter/deprecated/clutter-actor.h
@@ -148,6 +148,9 @@ void clutter_actor_set_anchor_point_from_gravity (ClutterActor
CLUTTER_DEPRECATED_IN_1_12
void clutter_actor_move_anchor_point_from_gravity (ClutterActor *self,
ClutterGravity gravity);
+CLUTTER_DEPRECATED_IN_1_12
+void clutter_actor_get_transformation_matrix (ClutterActor *self,
+ ClutterMatrix *matrix);
G_END_DECLS
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]