[clutter] shader-effect: Allow instantiating ShaderEffect



commit 53483896a822b2814c1fbe06b5d08e26d67f0301
Author: Emmanuele Bassi <ebassi linux intel com>
Date:   Wed May 25 15:37:45 2011 +0100

    shader-effect: Allow instantiating ShaderEffect
    
    ClutterShaderEffect doesn't require to be sub-classed in order to be
    useful. It is possible to just create an instance, set the source and
    the uniforms, and attach it to an actor. This should effectively replace
    ClutterShader for good.

 clutter/clutter-shader-effect.c |   41 ++++++++++++++++++++++++++++++++------
 clutter/clutter-shader-effect.h |   30 +++++++++++++++-------------
 2 files changed, 50 insertions(+), 21 deletions(-)
---
diff --git a/clutter/clutter-shader-effect.c b/clutter/clutter-shader-effect.c
index f7b8ed0..ccb8082 100644
--- a/clutter/clutter-shader-effect.c
+++ b/clutter/clutter-shader-effect.c
@@ -27,11 +27,11 @@
  * @short_description: Base class for shader effects
  * @See_Also: #ClutterEffect, #ClutterOffscreenEffect
  *
- * #ClutterShaderEffect is an abstract class that implements all the
- * plumbing for creating #ClutterEffect<!-- -->s using GLSL shaders.
+ * #ClutterShaderEffect is a class that implements all the plumbing for
+ * creating #ClutterEffect<!-- -->s using GLSL shaders.
  *
- * #ClutterShaderEffect creates an offscreen buffer and then applies the GLSL
- * shader (after checking whether the compilation and linking were
+ * #ClutterShaderEffect creates an offscreen buffer and then applies the
+ * GLSL shader (after checking whether the compilation and linking were
  * successfull) to the buffer before painting it on screen.
  *
  * <refsect2 id="ClutterShaderEffect-implementing">
@@ -150,9 +150,9 @@ enum
 
 static GParamSpec *obj_props[PROP_LAST];
 
-G_DEFINE_ABSTRACT_TYPE (ClutterShaderEffect,
-                        clutter_shader_effect,
-                        CLUTTER_TYPE_OFFSCREEN_EFFECT);
+G_DEFINE_TYPE (ClutterShaderEffect,
+               clutter_shader_effect,
+               CLUTTER_TYPE_OFFSCREEN_EFFECT);
 
 static inline void
 clutter_shader_effect_clear (ClutterShaderEffect *self,
@@ -438,6 +438,30 @@ clutter_shader_effect_init (ClutterShaderEffect *effect)
 }
 
 /**
+ * clutter_shader_effect_new:
+ * @shader_type: the type of the shader, either %CLUTTER_FRAGMENT_SHADER,
+ *   or %CLUTTER_VERTEX_SHADER
+ *
+ * Creates a new #ClutterShaderEffect, to be applied to an actor using
+ * clutter_actor_add_effect().
+ *
+ * The effect will be empty until clutter_shader_effect_set_shader_source()
+ * is called.
+ *
+ * Return value: (transfer full): the newly created #ClutterShaderEffect.
+ *   Use g_object_unref() when done.
+ *
+ * Since: 1.8
+ */
+ClutterEffect *
+clutter_shader_effect_new (ClutterShaderType shader_type)
+{
+  return g_object_new (CLUTTER_TYPE_SHADER_EFFECT,
+                       "shader-type", shader_type,
+                       NULL);
+}
+
+/**
  * clutter_shader_effect_get_shader:
  * @effect: a #ClutterShaderEffect
  *
@@ -547,6 +571,9 @@ clutter_shader_effect_add_uniform (ClutterShaderEffect *effect,
       uniform->location =
         cogl_program_get_uniform_location (priv->program, uniform->name);
     }
+
+  if (priv->actor != NULL && !CLUTTER_ACTOR_IN_PAINT (priv->actor))
+    clutter_actor_queue_redraw (priv->actor);
 }
 
 /**
diff --git a/clutter/clutter-shader-effect.h b/clutter/clutter-shader-effect.h
index 1617eca..56c1be6 100644
--- a/clutter/clutter-shader-effect.h
+++ b/clutter/clutter-shader-effect.h
@@ -84,20 +84,22 @@ struct _ClutterShaderEffectClass
 
 GType clutter_shader_effect_get_type (void) G_GNUC_CONST;
 
-gboolean   clutter_shader_effect_set_shader_source (ClutterShaderEffect *effect,
-                                                    const gchar         *source);
-
-void       clutter_shader_effect_set_uniform       (ClutterShaderEffect *effect,
-                                                    const gchar         *name,
-                                                    GType                gtype,
-                                                    gsize                n_values,
-                                                    ...);
-void       clutter_shader_effect_set_uniform_value (ClutterShaderEffect *effect,
-                                                    const gchar         *name,
-                                                    const GValue        *value);
-
-CoglHandle clutter_shader_effect_get_shader        (ClutterShaderEffect *effect);
-CoglHandle clutter_shader_effect_get_program       (ClutterShaderEffect *effect);
+ClutterEffect * clutter_shader_effect_new               (ClutterShaderType    shader_type);
+
+gboolean        clutter_shader_effect_set_shader_source (ClutterShaderEffect *effect,
+                                                         const gchar         *source);
+
+void            clutter_shader_effect_set_uniform       (ClutterShaderEffect *effect,
+                                                         const gchar         *name,
+                                                         GType                gtype,
+                                                         gsize                n_values,
+                                                         ...);
+void            clutter_shader_effect_set_uniform_value (ClutterShaderEffect *effect,
+                                                         const gchar         *name,
+                                                         const GValue        *value);
+
+CoglHandle      clutter_shader_effect_get_shader        (ClutterShaderEffect *effect);
+CoglHandle      clutter_shader_effect_get_program       (ClutterShaderEffect *effect);
 
 G_END_DECLS
 



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