[re-directing to the correct mailing list]
hi;
On Fri, 2010-07-16 at 11:34 +0800, Jianchun Zhou wrote:
> In Clutter 0.5, I had ever got a class named ClutterReflectTexture,
> and now I want use this reflect function in Clutter 1.0
>
> I wonder if there is a similar one or not?
that code was never in Clutter: it was in one of the toys.
nowadays, two years and a half after that code was written, we have
better ways of accomplishing the same result - even in languages that
are not C. :-)
first of all, ClutterCloneTexture has been replaced by ClutterClone,
which can clone all actors, not just textures.
then you don't need to drop into GL to paint: Cogl, the Clutter OpenGL
abstraction library, can do that for you, and more efficiently.
the whole paint() virtual function implementation can be replaced with
something like this:
static void
clutter_texture_reflection_paint (ClutterActor *actor)
{
ClutterClone *super = CLUTTER_CLONE (actor);
ClutterTextureReflectionPrivate *priv;
ClutterActor *source;
ClutterActorBox *box;
CoglHandle material;
gfloat width, height, r_height;
gfloat rty;
CoglColor color_1, color_2;
CoglTextureVertex vertices[4];
priv = CLUTTER_TEXTURE_REFLECTION (actor)->priv;
/* if we don't have a source actor, don't paint */
source = clutter_clone_get_source (super);
if (source == NULL)
return;
/* if the source texture does not have any content, don't paint */
material = clutter_texture_get_cogl_material (CLUTTER_TEXTURE (source));
if (material == NULL)
return;
/* get the size of the reflection */
clutter_actor_get_allocation_box (actor, &box);
clutter_actor_box_get_size (&box, &width, &height);
/* get the composite opacity of the actor */
opacity = clutter_actor_get_paint_opacity (actor);
/* clamp the size of the reflection */
r_height = priv->reflection_height;
if (r_height < 0 || r_height > height)
r_height = height;
/* figure out the texel for the reflection */
rty = r_height / height;
/* figure out the two colors for the reflection: the first is
* full color and the second is the same, but at 0 opacity
*/
cogl_color_set_from_4f (&color_1, 1.0, 1.0, 1.0, opacity / 255.);
cogl_color_premultiply (&color_1);
cogl_color_set_from_4f (&color_2, 1.0, 1.0, 1.0, 0.0);
cogl_color_premultiply (&color_2);
/* now describe the four vertices of the quad; since it has
* to be a reflection, we need to invert it as well
*/
vertices[0].x = 0; vertices[0].y = 0; vertices[0].z = 0;
vertices[0].tx = 0.0; vertices[0].ty = 1.0;
vertices[0].color = color_1;
vertices[1].x = width; vertices[1].y = 0; vertices[1].z = 0;
vertices[1].tx = 1.0; vertices[1].ty = 1.0;
vertices[1].color = color_1;
vertices[2].x = width; vertices[2].y = r_height; vertices[2].z = 0;
vertices[2].tz = 1.0; vertices[2].ty = 1.0 - rty;
vertices[2].color = color_2;
vertices[3].x = 0; vertices[3].y = r_height; vertices[3].z = 0;
vertices[3].tx = 0.0; vertices[3].ty = 1.0 - rty;
vertices[3].color = color_2;
/* paint the same texture but with a different geometry */
cogl_set_source (material);
cogl_polygon (vertices, 4, TRUE);
}
[the code above is untested and uncompiled, but translated from the
python example available in Git[0] so it should just work]
ciao,
Emmanuele.
[0]
http://git.clutter-project.org/bindings/pyclutter/plain/examples/reflection.py
--
Emmanuele Bassi, Open Source Software Engineer
Intel Open Source Technology Center
_______________________________________________
clutter-app-devel-list mailing list
[email protected]
http://lists.clutter-project.org/listinfo/clutter-app-devel-list