[clutter] test-constrains: Use a ShaderEffect



commit 941d8d23fa3ebb54f5c27c5f8cfa883903dbb24e
Author: Emmanuele Bassi <ebassi linux intel com>
Date:   Wed May 25 15:38:56 2011 +0100

    test-constrains: Use a ShaderEffect
    
    Demonstrate how to use a ShaderEffect instance.

 tests/interactive/test-constraints.c |   42 +++++++++++++++++++++++++++++++--
 1 files changed, 39 insertions(+), 3 deletions(-)
---
diff --git a/tests/interactive/test-constraints.c b/tests/interactive/test-constraints.c
index 4474784..b5eb8ec 100644
--- a/tests/interactive/test-constraints.c
+++ b/tests/interactive/test-constraints.c
@@ -2,6 +2,8 @@
 #include <gmodule.h>
 #include <clutter/clutter.h>
 
+#define RECT_SIZE       128
+
 #define H_PADDING       32
 #define V_PADDING       32
 
@@ -21,6 +23,24 @@ static const gchar *colors[N_RECTS] = {
   "#ef2929", "#cc0000", "#a40000"
 };
 
+static const gchar *desaturare_glsl_shader =
+"uniform sampler2D tex;\n"
+"uniform float factor;\n"
+"\n"
+"vec3 desaturate (const vec3 color, const float desaturation)\n"
+"{\n"
+"  const vec3 gray_conv = vec3 (0.299, 0.587, 0.114);\n"
+"  vec3 gray = vec3 (dot (gray_conv, color));\n"
+"  return vec3 (mix (color.rgb, gray, desaturation));\n"
+"}\n"
+"\n"
+"void main ()\n"
+"{\n"
+"  vec4 color = cogl_color_in * texture2D (tex, vec2 (cogl_tex_coord_in[0].xy));\n"
+"  color.rgb = desaturate (color.rgb, factor);\n"
+"  cogl_color_out = color;\n"
+"}\n";
+
 static gboolean      is_expanded = FALSE;
 
 static gboolean
@@ -61,7 +81,7 @@ on_button_release (ClutterActor *actor,
                              "@constraints.x-bind.offset", west_offset,
                              NULL);
       clutter_actor_animate (rects[Center], CLUTTER_LINEAR, 500,
-                             "opacity", 128,
+                             "@effects.desaturate.enabled", TRUE,
                              NULL);
       clutter_actor_animate (rects[East], CLUTTER_EASE_OUT_CUBIC, 500,
                              "opacity", 255,
@@ -88,7 +108,7 @@ on_button_release (ClutterActor *actor,
       gint i;
 
       clutter_actor_animate (rects[Center], CLUTTER_LINEAR, 500,
-                             "opacity", 255,
+                             "@effects.desaturate.enabled", FALSE,
                              NULL);
 
       for (i = NorthWest; i < N_RECTS; i++)
@@ -114,6 +134,7 @@ test_constraints_main (int argc, char *argv[])
 {
   ClutterActor *stage, *rect;
   ClutterConstraint *constraint;
+  ClutterEffect *effect;
   ClutterColor rect_color;
   gint i;
 
@@ -133,7 +154,7 @@ test_constraints_main (int argc, char *argv[])
                     G_CALLBACK (on_button_release),
                     NULL);
   clutter_rectangle_set_color (CLUTTER_RECTANGLE (rect), &rect_color);
-  clutter_actor_set_size (rect, 128, 128);
+  clutter_actor_set_size (rect, RECT_SIZE, RECT_SIZE);
   clutter_actor_set_reactive (rect, TRUE);
   clutter_container_add_actor (CLUTTER_CONTAINER (stage), rect);
 
@@ -143,6 +164,21 @@ test_constraints_main (int argc, char *argv[])
   constraint = clutter_align_constraint_new (stage, CLUTTER_ALIGN_Y_AXIS, 0.5);
   clutter_actor_add_constraint_with_name (rect, "y-align", constraint);
 
+  /* this is the equivalent of the DesaturateEffect; we cannot animate
+   * the factor because the animation API only understands GObject
+   * properties; so we use the ActorMeta:enabled property to toggle
+   * the shader
+   */
+  effect = clutter_shader_effect_new (CLUTTER_FRAGMENT_SHADER);
+  clutter_shader_effect_set_shader_source (CLUTTER_SHADER_EFFECT (effect),
+                                           desaturare_glsl_shader);
+  clutter_shader_effect_set_uniform (CLUTTER_SHADER_EFFECT (effect),
+                                     "tex", G_TYPE_INT, 1, 0);
+  clutter_shader_effect_set_uniform (CLUTTER_SHADER_EFFECT (effect),
+                                     "factor", G_TYPE_FLOAT, 1, 0.85);
+  clutter_actor_meta_set_enabled (CLUTTER_ACTOR_META (effect), FALSE);
+  clutter_actor_add_effect_with_name (rect, "desaturate", effect);
+
   rects[Center] = rect;
 
   for (i = 0; i < N_RECTS; i++)



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