[clutter/wip/master-next: 20/23] actor: Add scaling factor in the Z axis



commit 8d44c550c68b70b65c6bbb4c6fc3c27691000f17
Author: Emmanuele Bassi <ebassi gnome org>
Date:   Mon Jul 9 10:59:13 2012 +0100

    actor: Add scaling factor in the Z axis
    
    Having a scaling factor on the Z axis helps with projects that use fully
    3D elements, like Mash.
    
    https://bugzilla.gnome.org/show_bug.cgi?id=677853

 clutter/clutter-actor-private.h |    1 +
 clutter/clutter-actor.c         |   88 +++++++++++++++++++++++++++++++++++++-
 clutter/clutter-actor.h         |    5 ++
 clutter/clutter.symbols         |    2 +
 4 files changed, 93 insertions(+), 3 deletions(-)
---
diff --git a/clutter/clutter-actor-private.h b/clutter/clutter-actor-private.h
index c13840a..b911011 100644
--- a/clutter/clutter-actor-private.h
+++ b/clutter/clutter-actor-private.h
@@ -194,6 +194,7 @@ struct _ClutterTransformInfo
   /* scaling */
   gdouble scale_x;
   gdouble scale_y;
+  gdouble scale_z;
   AnchorCoord scale_center;
 
   /* anchor point */
diff --git a/clutter/clutter-actor.c b/clutter/clutter-actor.c
index 3078713..1fc1241 100644
--- a/clutter/clutter-actor.c
+++ b/clutter/clutter-actor.c
@@ -875,6 +875,7 @@ enum
 
   PROP_SCALE_X,
   PROP_SCALE_Y,
+  PROP_SCALE_Z,
   PROP_SCALE_CENTER_X, /* XXX:2.0 remove */
   PROP_SCALE_CENTER_Y, /* XXX:2.0 remove */
   PROP_SCALE_GRAVITY, /* XXX:2.0 remove */
@@ -3000,7 +3001,7 @@ clutter_actor_real_apply_transform (ClutterActor *self,
                                         cogl_matrix_scale (transform,
                                                            info->scale_x,
                                                            info->scale_y,
-                                                           1.0));
+                                                           info->scale_z));
         }
 
       if (info->rz_angle)
@@ -4111,7 +4112,7 @@ static const ClutterTransformInfo default_transform_info = {
   0.0, { 0, },                  /* rotation-y */
   0.0, { 0, },                  /* rotation-z */
 
-  1.0, 1.0, { 0, },             /* scale */
+  1.0, 1.0, 1.0, { 0, },        /* scale */
 
   { 0, },                       /* anchor */
 
@@ -4578,8 +4579,12 @@ clutter_actor_set_scale_factor_internal (ClutterActor *self,
 
   if (pspec == obj_props[PROP_SCALE_X])
     info->scale_x = factor;
-  else
+  else if (pspec == obj_props[PROP_SCALE_Y])
     info->scale_y = factor;
+  else if (pspec == obj_props[PROP_SCALE_Z])
+    info->scale_z = factor;
+  else
+    g_assert_not_reached ();
 
   self->priv->transform_valid = FALSE;
   clutter_actor_queue_redraw (self);
@@ -4610,6 +4615,8 @@ clutter_actor_set_scale_factor (ClutterActor      *self,
       break;
 
     case CLUTTER_Z_AXIS:
+      pspec = obj_props[PROP_SCALE_Z];
+      scale_p = &info->scale_z;
       break;
     }
 
@@ -4910,6 +4917,11 @@ clutter_actor_set_property (GObject      *object,
                                       g_value_get_double (value));
       break;
 
+    case PROP_SCALE_Z:
+      clutter_actor_set_scale_factor (actor, CLUTTER_Z_AXIS,
+                                      g_value_get_double (value));
+      break;
+
     case PROP_SCALE_CENTER_X:
       clutter_actor_set_scale_center (actor, CLUTTER_X_AXIS,
                                       g_value_get_float (value));
@@ -5340,6 +5352,15 @@ clutter_actor_get_property (GObject    *object,
       }
       break;
 
+    case PROP_SCALE_Z:
+      {
+        const ClutterTransformInfo *info;
+
+        info = _clutter_actor_get_transform_info_or_defaults (actor);
+        g_value_set_double (value, info->scale_z);
+      }
+      break;
+
     case PROP_SCALE_CENTER_X:
       {
         gfloat center;
@@ -6654,6 +6675,25 @@ clutter_actor_class_init (ClutterActorClass *klass)
                          CLUTTER_PARAM_ANIMATABLE);
 
   /**
+   * ClutterActor:scale-z:
+   *
+   * The scale factor of the actor along the Z axis.
+   *
+   * The #ClutterActor:scale-y property is animatable.
+   *
+   * Since: 1.12
+   */
+  obj_props[PROP_SCALE_Z] =
+    g_param_spec_double ("scale-z",
+                         P_("Scale Z"),
+                         P_("Scale factor on the Z axis"),
+                         0.0, G_MAXDOUBLE,
+                         1.0,
+                         G_PARAM_READWRITE |
+                         G_PARAM_STATIC_STRINGS |
+                         CLUTTER_PARAM_ANIMATABLE);
+
+  /**
    * ClutterActor:scale-center-x:
    *
    * The horizontal center point for scaling
@@ -10900,6 +10940,28 @@ clutter_actor_set_scale (ClutterActor *self,
 }
 
 /**
+ * clutter_actor_set_scale_z:
+ * @self: a #ClutterActor
+ * @scale_z: the scaling factor along the Z axis
+ *
+ * Scales an actor on the Z axis by the given @scale_z factor.
+ *
+ * The scale transformation is relative the the #ClutterActor:pivot-point.
+ *
+ * The #ClutterActor:scale-z property is animatable.
+ *
+ * Since: 1.12
+ */
+void
+clutter_actor_set_scale_z (ClutterActor *self,
+                           gdouble       scale_z)
+{
+  g_return_if_fail (CLUTTER_IS_ACTOR (self));
+
+  clutter_actor_set_scale_factor (self, CLUTTER_Z_AXIS, scale_z);
+}
+
+/**
  * clutter_actor_set_scale_full:
  * @self: A #ClutterActor
  * @scale_x: double factor to scale actor by horizontally.
@@ -11008,6 +11070,25 @@ clutter_actor_get_scale (ClutterActor *self,
 }
 
 /**
+ * clutter_actor_get_scale_z:
+ * @self: A #ClutterActor
+ *
+ * Retrieves the scaling factor along the Z axis, as set using
+ * clutter_actor_set_scale_z().
+ *
+ * Return value: the scaling factor along the Z axis
+ *
+ * Since: 1.12
+ */
+gdouble
+clutter_actor_get_scale_z (ClutterActor *self)
+{
+  g_return_val_if_fail (CLUTTER_IS_ACTOR (self), 1.0);
+
+  return _clutter_actor_get_transform_info_or_defaults (self)->scale_z;
+}
+
+/**
  * clutter_actor_get_scale_center:
  * @self: A #ClutterActor
  * @center_x: (out) (allow-none): Location to store the X position
@@ -14456,6 +14537,7 @@ clutter_actor_set_animatable_property (ClutterActor *actor,
 
     case PROP_SCALE_X:
     case PROP_SCALE_Y:
+    case PROP_SCALE_Z:
       clutter_actor_set_scale_factor_internal (actor,
                                                g_value_get_double (value),
                                                pspec);
diff --git a/clutter/clutter-actor.h b/clutter/clutter-actor.h
index 2c47631..561d7f7 100644
--- a/clutter/clutter-actor.h
+++ b/clutter/clutter-actor.h
@@ -652,6 +652,11 @@ void                            clutter_actor_get_scale
                                                                                  gdouble                    *scale_x,
                                                                                  gdouble                    *scale_y);
 CLUTTER_AVAILABLE_IN_1_12
+void                            clutter_actor_set_scale_z                       (ClutterActor               *self,
+                                                                                 gdouble                     scale_z);
+CLUTTER_AVAILABLE_IN_1_12
+gdouble                         clutter_actor_get_scale_z                       (ClutterActor               *self);
+CLUTTER_AVAILABLE_IN_1_12
 void                            clutter_actor_set_translation                   (ClutterActor               *self,
                                                                                  gfloat                      translate_x,
                                                                                  gfloat                      translate_y,
diff --git a/clutter/clutter.symbols b/clutter/clutter.symbols
index f47a2ee..fc4f68c 100644
--- a/clutter/clutter.symbols
+++ b/clutter/clutter.symbols
@@ -144,6 +144,7 @@ clutter_actor_get_rotation
 clutter_actor_get_scale
 clutter_actor_get_scale_center
 clutter_actor_get_scale_gravity
+clutter_actor_get_scale_z
 clutter_actor_get_shader
 clutter_actor_get_size
 clutter_actor_get_stage
@@ -266,6 +267,7 @@ clutter_actor_set_rotation
 clutter_actor_set_scale
 clutter_actor_set_scale_full
 clutter_actor_set_scale_with_gravity
+clutter_actor_set_scale_z
 clutter_actor_set_shader
 clutter_actor_set_shader_param
 clutter_actor_set_shader_param_float



[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]