* tests/test-shader.c: Fixed to use sampler2D instead of
authorNeil Roberts <neil@openedhand.com>
Fri, 6 Jun 2008 15:00:12 +0000 (15:00 +0000)
committerNeil Roberts <neil@openedhand.com>
Fri, 6 Jun 2008 15:00:12 +0000 (15:00 +0000)
sampler2DRect now that GL_TEXTURE_RECTANGLE support is disabled in
revision 2834. The ClutterTexture actor now has the
'disable-slicing' property set. The distance in texture
coordinates between pixels is passed in as a uniform so that the
box-blur shader can still work.

ChangeLog
tests/test-shader.c

index 7a001e5..74bff6a 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,12 @@
+2008-06-06  Neil Roberts  <neil@o-hand.com>
+
+       * tests/test-shader.c: Fixed to use sampler2D instead of
+       sampler2DRect now that GL_TEXTURE_RECTANGLE support is disabled in
+       revision 2834. The ClutterTexture actor now has the
+       'disable-slicing' property set. The distance in texture
+       coordinates between pixels is passed in as a uniform so that the
+       box-blur shader can still work.
+
 2008-06-06  Emmanuele Bassi  <ebassi@openedhand.com>
 
        Bug #952 - Fix test-textures in trunk
index ceb6d0e..758c459 100644 (file)
@@ -22,12 +22,13 @@ typedef struct
  */
 
 /* FRAGMENT_SHADER_BEGIN: generate boilerplate with a local vec4 color already
- * initialized, from a sampler2DRect in a variable tex.
+ * initialized, from a sampler2D in a variable tex.
  */
-#define FRAGMENT_SHADER_BEGIN                  \
-     "uniform sampler2DRect tex;"  \
-      "void main (){"              \
-      "  vec4 color = texture2DRect (tex, vec2(gl_TexCoord[0].st));"
+#define FRAGMENT_SHADER_BEGIN                                  \
+  "uniform sampler2D tex;"                                     \
+  "uniform float x_step, y_step;"                              \
+  "void main (){"                                              \
+  "  vec4 color = texture2D (tex, vec2(gl_TexCoord[0].st));"
 
 /* FRAGMENT_SHADER_END: apply the changed color to the output buffer correctly
  * blended with the gl specified color (makes the opacity of actors work
@@ -57,29 +58,31 @@ static ShaderSource shaders[]=
      "for (u=-radius;u<radius;u++)"
      "  for (v=-radius;v<radius;v++)"
      "    {"
-     "      color += texture2DRect(tex, "
-     "          vec2(gl_TexCoord[0].s + u * 2.0, gl_TexCoord[0].t +v * 2.0));"
+     "      color += texture2D(tex, "
+     "          vec2(gl_TexCoord[0].s + u * 2.0 * x_step, "
+     "               gl_TexCoord[0].t + v * 2.0 * y_step));"
      "      count ++;"
      "    }"
      "color = color / float(count);"
      FRAGMENT_SHADER_END
 #else
-     "vec4 get_rgba_rel(sampler2DRect tex, float dx, float dy)"
+     "vec4 get_rgba_rel(sampler2D tex, float dx, float dy)"
      "{"
-     "  return texture2DRect (tex, gl_TexCoord[0].st + vec2(dx,dy) * 2.0);"
+     "  return texture2D (tex, gl_TexCoord[0].st "
+     "                         + vec2(dx, dy) * 2.0);"
      "}"
 
      FRAGMENT_SHADER_BEGIN
      "  float count = 1.0;"
-     "  color += get_rgba_rel (tex, -1.0, -1.0); count++;"
-     "  color += get_rgba_rel (tex, -1.0,  0.0); count++;"
-     "  color += get_rgba_rel (tex, -1.0,  1.0); count++;"
-     "  color += get_rgba_rel (tex,  0.0, -1.0); count++;"
-     "  color += get_rgba_rel (tex,  0.0,  0.0); count++;"
-     "  color += get_rgba_rel (tex,  0.0,  1.0); count++;"
-     "  color += get_rgba_rel (tex,  1.0, -1.0); count++;"
-     "  color += get_rgba_rel (tex,  1.0,  0.0); count++;"
-     "  color += get_rgba_rel (tex,  1.0,  1.0); count++;"
+     "  color += get_rgba_rel (tex, -x_step, -y_step); count++;"
+     "  color += get_rgba_rel (tex, -x_step,  0.0);    count++;"
+     "  color += get_rgba_rel (tex, -x_step,  y_step); count++;"
+     "  color += get_rgba_rel (tex,  0.0,    -y_step); count++;"
+     "  color += get_rgba_rel (tex,  0.0,     0.0);    count++;"
+     "  color += get_rgba_rel (tex,  0.0,     y_step); count++;"
+     "  color += get_rgba_rel (tex,  x_step, -y_step); count++;"
+     "  color += get_rgba_rel (tex,  x_step,  0.0);    count++;"
+     "  color += get_rgba_rel (tex,  x_step,  y_step); count++;"
      "  color = color / count;"
      FRAGMENT_SHADER_END
 #endif
@@ -112,7 +115,7 @@ static ShaderSource shaders[]=
 
     {"combined-mirror",
      FRAGMENT_SHADER_BEGIN 
-     "  vec4 colorB = texture2DRect (tex, vec2(gl_TexCoord[0].ts));"
+     "  vec4 colorB = texture2D (tex, vec2(gl_TexCoord[0].ts));"
      "  float avg = (color.r + color.g + color.b) / 3.0;"
      "  color.r = avg;"
      "  color.g = avg;"
@@ -132,6 +135,8 @@ button_release_cb (ClutterActor    *actor,
                    gpointer         data)
 {
   gint new_no;
+  int  tex_width;
+  int  tex_height;
 
   if (event->button.button == 1)
     {
@@ -179,6 +184,19 @@ button_release_cb (ClutterActor    *actor,
           clutter_actor_set_shader_param (actor, "radius", 3.0);
           clutter_actor_set_shader_param (actor, "brightness", 0.4);
           clutter_actor_set_shader_param (actor, "contrast", -1.9);
+
+         if (CLUTTER_IS_TEXTURE (actor))
+           {
+             tex_width = clutter_actor_get_width (actor);
+             tex_width = clutter_util_next_p2 (tex_width);
+             tex_height = clutter_actor_get_height (actor);
+             tex_height = clutter_util_next_p2 (tex_height);
+
+             clutter_actor_set_shader_param (actor, "x_step",
+                                             1.0f / tex_width);
+             clutter_actor_set_shader_param (actor, "y_step",
+                                             1.0f / tex_height);
+           }
         }
     }
   return FALSE;
@@ -229,9 +247,14 @@ main (gint   argc,
   g_object_set (timeline, "loop", TRUE, NULL);   /* have it loop */
 
 #ifndef TEST_GROUP
+  actor = g_object_new (CLUTTER_TYPE_TEXTURE,
+                       "filename", "redhand.png",
+                       "disable-slicing", TRUE,
+                       NULL);
   actor = clutter_texture_new_from_file ("redhand.png", &error);
   if (!actor)
     g_error("pixbuf load failed: %s", error ? error->message : "Unknown");
+
 #else
   actor = clutter_group_new ();
     {