void _clutter_actor_shader_post_paint (ClutterActor *actor) { ShaderData *shader_data; ClutterShader *shader; shader_data = g_object_get_data (G_OBJECT (actor), "-clutter-actor-shader-data"); if (G_LIKELY (shader_data == NULL)) return; shader = shader_data->shader; if (shader != NULL) { ClutterActor *head; clutter_shader_set_is_enabled (shader, FALSE); /* remove the actor from the shaders stack; if there is another * actor inside it, then call pre-paint again to set its shader * but this time with the second argument being TRUE, indicating * that we are re-applying an existing shader and thus should it * not be prepended to the stack */ head = _clutter_context_pop_shader_stack (actor); if (head != NULL) _clutter_actor_shader_pre_paint (head, TRUE); } }
static void clutter_shader_set_property (GObject *object, guint prop_id, const GValue *value, GParamSpec *pspec) { ClutterShader *shader = CLUTTER_SHADER(object); switch (prop_id) { case PROP_VERTEX_SOURCE: clutter_shader_set_vertex_source (shader, g_value_get_string (value), -1); break; case PROP_FRAGMENT_SOURCE: clutter_shader_set_fragment_source (shader, g_value_get_string (value), -1); break; case PROP_ENABLED: clutter_shader_set_is_enabled (shader, g_value_get_boolean (value)); break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID (object, prop_id, pspec); break; } }
void _clutter_actor_shader_pre_paint (ClutterActor *actor, gboolean repeat) { ShaderData *shader_data; ClutterShader *shader; shader_data = g_object_get_data (G_OBJECT (actor), "-clutter-actor-shader-data"); if (shader_data == NULL) return; shader = shader_data->shader; if (shader != NULL) { clutter_shader_set_is_enabled (shader, TRUE); g_hash_table_foreach (shader_data->value_hash, set_each_param, shader); if (!repeat) _clutter_context_push_shader_stack (actor); } }