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.
This commit is contained in:
Emmanuele Bassi 2011-05-25 15:37:45 +01:00
parent 9ed5f2842a
commit 53483896a8
2 changed files with 48 additions and 19 deletions

View File

@ -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,
@ -437,6 +437,30 @@ clutter_shader_effect_init (ClutterShaderEffect *effect)
ClutterShaderEffectPrivate);
}
/**
* 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);
}
/**

View File

@ -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);
ClutterEffect * clutter_shader_effect_new (ClutterShaderType shader_type);
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);
gboolean clutter_shader_effect_set_shader_source (ClutterShaderEffect *effect,
const gchar *source);
CoglHandle clutter_shader_effect_get_shader (ClutterShaderEffect *effect);
CoglHandle clutter_shader_effect_get_program (ClutterShaderEffect *effect);
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