[mutter/wip/gcampax/background: 64/68] MetaBackground: draw twice with different constants instead of blending with Cogl
- From: Giovanni Campagna <gcampagna src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [mutter/wip/gcampax/background: 64/68] MetaBackground: draw twice with different constants instead of blending with Cogl
- Date: Wed, 13 Feb 2013 21:32:52 +0000 (UTC)
commit 7332eb3db2051ba334b015688498174be112ea23
Author: Giovanni Campagna <gcampagna src gnome org>
Date: Sun Feb 3 19:35:02 2013 +0100
MetaBackground: draw twice with different constants instead of blending with Cogl
This is in preparation for having a more complex drawing sequence, which
would require custom attributes to implement with a single pass.
src/compositor/meta-background-actor.c | 128 +++++++++++++++-----------------
1 files changed, 60 insertions(+), 68 deletions(-)
---
diff --git a/src/compositor/meta-background-actor.c b/src/compositor/meta-background-actor.c
index c35b2d5..057aa12 100644
--- a/src/compositor/meta-background-actor.c
+++ b/src/compositor/meta-background-actor.c
@@ -69,8 +69,6 @@ struct _MetaBackgroundActorPrivate
MetaBackground *background;
GSettings *settings;
- CoglPipeline *single_pipeline;
- CoglPipeline *crossfade_pipeline;
CoglPipeline *pipeline;
CoglMaterialWrapMode wrap_mode;
@@ -182,25 +180,8 @@ update_actor_pipeline (MetaBackgroundActor *self,
{
MetaBackgroundActorPrivate *priv = self->priv;
- if (crossfade)
- {
- priv->pipeline = priv->crossfade_pipeline;
- priv->is_crossfading = TRUE;
-
- cogl_pipeline_set_layer_texture (priv->pipeline, 0, priv->background->old_texture);
- cogl_pipeline_set_layer_wrap_mode (priv->pipeline, 0, priv->wrap_mode);
-
- cogl_pipeline_set_layer_texture (priv->pipeline, 1, priv->background->texture);
- cogl_pipeline_set_layer_wrap_mode (priv->pipeline, 1, priv->wrap_mode);
- }
- else
- {
- priv->pipeline = priv->single_pipeline;
- priv->is_crossfading = FALSE;
-
- cogl_pipeline_set_layer_texture (priv->pipeline, 0, priv->background->texture);
- cogl_pipeline_set_layer_wrap_mode (priv->pipeline, 0, priv->wrap_mode);
- }
+ priv->is_crossfading = crossfade;
+ cogl_pipeline_set_layer_wrap_mode (priv->pipeline, 0, priv->wrap_mode);
clutter_actor_queue_redraw (CLUTTER_ACTOR (self));
}
@@ -325,8 +306,7 @@ meta_background_actor_dispose (GObject *object)
priv->background = NULL;
}
- g_clear_pointer (&priv->single_pipeline, cogl_object_unref);
- g_clear_pointer (&priv->crossfade_pipeline, cogl_object_unref);
+ g_clear_pointer (&priv->pipeline, cogl_object_unref);
g_clear_object (&priv->settings);
G_OBJECT_CLASS (meta_background_actor_parent_class)->dispose (object);
@@ -370,39 +350,14 @@ meta_background_actor_get_preferred_height (ClutterActor *actor,
}
static void
-meta_background_actor_paint (ClutterActor *actor)
+paint_background (MetaBackgroundActor *self)
{
- MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
MetaBackgroundActorPrivate *priv = self->priv;
- guint8 opacity = clutter_actor_get_paint_opacity (actor);
- guint8 color_component;
- int width, height;
- CoglColor crossfade_color;
+ float width, height;
+ ClutterActorBox alloc;
- meta_background_ensure_rendered (priv->background);
-
- meta_screen_get_size (priv->screen, &width, &height);
-
- color_component = (int)(0.5 + opacity * priv->dim_factor);
-
- cogl_pipeline_set_color4ub (priv->pipeline,
- color_component,
- color_component,
- color_component,
- opacity);
-
- if (priv->is_crossfading)
- {
- cogl_color_init_from_4f (&crossfade_color,
- priv->crossfade_progress,
- priv->crossfade_progress,
- priv->crossfade_progress,
- priv->crossfade_progress);
- cogl_pipeline_set_layer_combine_constant (priv->pipeline,
- 1, &crossfade_color);
- }
-
- cogl_set_source (priv->pipeline);
+ clutter_actor_get_allocation_box (CLUTTER_ACTOR (self), &alloc);
+ clutter_actor_box_get_size (&alloc, &width, &height);
if (priv->visible_region)
{
@@ -432,6 +387,53 @@ meta_background_actor_paint (ClutterActor *actor)
}
}
+static void
+meta_background_actor_paint (ClutterActor *actor)
+{
+ MetaBackgroundActor *self = META_BACKGROUND_ACTOR (actor);
+ MetaBackgroundActorPrivate *priv = self->priv;
+ guint8 opacity = clutter_actor_get_paint_opacity (actor);
+ float crossfade_progress;
+ float first_color_factor, first_alpha_factor,
+ second_color_factor, second_alpha_factor;
+
+ meta_background_ensure_rendered (priv->background);
+
+ if (priv->is_crossfading)
+ crossfade_progress = priv->crossfade_progress;
+ else
+ crossfade_progress = 1.0;
+
+ first_color_factor = (opacity / 256.f) * priv->dim_factor * crossfade_progress;
+ first_alpha_factor = (opacity / 256.f) * crossfade_progress;
+ second_color_factor = (opacity / 256.f) * priv->dim_factor * (1 - crossfade_progress);
+ second_alpha_factor = (opacity / 256.f) * (1 - crossfade_progress);
+
+ cogl_set_source (priv->pipeline);
+
+ if (priv->is_crossfading)
+ {
+ cogl_pipeline_set_color4f (priv->pipeline,
+ second_color_factor,
+ second_color_factor,
+ second_color_factor,
+ second_alpha_factor);
+ cogl_pipeline_set_layer_texture (priv->pipeline, 0, priv->background->old_texture);
+
+ paint_background (self);
+ }
+
+
+ cogl_pipeline_set_color4f (priv->pipeline,
+ first_color_factor,
+ first_color_factor,
+ first_color_factor,
+ first_alpha_factor);
+ cogl_pipeline_set_layer_texture (priv->pipeline, 0, priv->background->texture);
+
+ paint_background (self);
+}
+
static gboolean
meta_background_actor_get_paint_volume (ClutterActor *actor,
ClutterPaintVolume *volume)
@@ -659,9 +661,7 @@ meta_background_actor_constructed (GObject *object)
priv->background = meta_background_get (priv->screen, priv->settings);
priv->background->actors = g_slist_prepend (priv->background->actors, self);
- priv->single_pipeline = meta_create_texture_material (priv->background->texture);
- priv->crossfade_pipeline = meta_create_crossfade_material (priv->background->old_texture,
- priv->background->texture);
+ priv->pipeline = meta_create_texture_material (priv->background->texture);
if (priv->background->texture != COGL_INVALID_HANDLE)
update_actor_pipeline (self, FALSE);
@@ -855,15 +855,11 @@ meta_background_actor_add_glsl_snippet (MetaBackgroundActor *actor,
if (hook == META_SNIPPET_HOOK_VERTEX ||
hook == META_SNIPPET_HOOK_FRAGMENT)
{
- cogl_pipeline_add_snippet (priv->single_pipeline, snippet);
- cogl_pipeline_add_snippet (priv->crossfade_pipeline, snippet);
+ cogl_pipeline_add_snippet (priv->pipeline, snippet);
}
else
{
- /* In case of crossfading, apply the snippet only to the new texture.
- We can't apply it to both because declarations would be doubled. */
- cogl_pipeline_add_layer_snippet (priv->single_pipeline, 0, snippet);
- cogl_pipeline_add_layer_snippet (priv->crossfade_pipeline, 1, snippet);
+ cogl_pipeline_add_layer_snippet (priv->pipeline, 0, snippet);
}
cogl_object_unref (snippet);
@@ -898,12 +894,8 @@ meta_background_actor_set_uniform_float (MetaBackgroundActor *actor,
priv = actor->priv;
- cogl_pipeline_set_uniform_float (priv->single_pipeline,
- cogl_pipeline_get_uniform_location (priv->single_pipeline,
- uniform_name),
- n_components, count, uniform);
- cogl_pipeline_set_uniform_float (priv->crossfade_pipeline,
- cogl_pipeline_get_uniform_location (priv->crossfade_pipeline,
+ cogl_pipeline_set_uniform_float (priv->pipeline,
+ cogl_pipeline_get_uniform_location (priv->pipeline,
uniform_name),
n_components, count, uniform);
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]