Hi,
I am trying to use glCopyTexImage2D to update a clutter actor texture.
The attached file (90 lines) is my sample case. I am drawing a clutter
rectangle and a clutter actor texture.
The clutter actor texture is updated for each "paint" signal, using
glCopyTexImage2D.
The expected result would be to have only one rectangle drawn. But my
problem is that I got a mirror effect and the copied rectangle is not really
black.
I think it's just a matter of GL_READ_BUFFER (bottom up / top down). Well
It's a little bit hard to explain.
Moreover I am not sure to do a safe thing, so any remark would be
appreciated.
Sincerely
Julien
#include <GL/glew.h>
#include <GL/gl.h>
#include <clutter/clutter.h>
#define W 320
#define H 240
GLuint texture = 0;
void
on_actor_paint (ClutterActor *stage, gpointer data)
{
glBindTexture (GL_TEXTURE_2D, texture);
glReadBuffer (GL_BACK);
glCopyTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, 0, 0, W, H, 0);
}
void
setup_actor (ClutterActor * stage)
{
//------ texture cogl
glEnable (GL_TEXTURE_2D);
glGenTextures (1, &texture);
glBindTexture (GL_TEXTURE_2D, texture);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
glTexImage2D (GL_TEXTURE_2D, 0, GL_RGBA, W, H, 0, GL_RGBA,
GL_UNSIGNED_BYTE, NULL);
CoglHandle cogl_texture = cogl_texture_new_from_foreign (texture,
GL_TEXTURE_2D, W, H, 0, 0, COGL_PIXEL_FORMAT_RGBA_8888);
//------ texture actor
ClutterActor* texture_actor = clutter_texture_new ();
clutter_texture_set_cogl_texture (CLUTTER_TEXTURE (texture_actor),
cogl_texture);
clutter_container_add_actor (CLUTTER_CONTAINER (stage), texture_actor);
clutter_actor_set_size (texture_actor, W, H);
clutter_actor_set_position (texture_actor, 0, 0);
clutter_actor_show (texture_actor);
//------ timeline
ClutterTimeline *timeline = clutter_timeline_new (120, 50);
clutter_timeline_set_loop (timeline, TRUE);
clutter_timeline_start (timeline);
//------ effect template
ClutterEffectTemplate *effect_template = clutter_effect_template_new
(timeline, CLUTTER_ALPHA_SINE_INC);
//------ rectangle actor
ClutterColor rect_color = { 0, 0, 0, 0xdd };
ClutterActor* actorRect = clutter_rectangle_new_with_color
(&rect_color);
clutter_container_add_actor (CLUTTER_CONTAINER (stage), actorRect);
clutter_actor_set_size (actorRect, 50, 50);
clutter_actor_set_position (actorRect, 10, 10);
clutter_effect_rotate (effect_template, actorRect,
CLUTTER_Z_AXIS, 180.0,
25, 25, 0,
CLUTTER_ROTATE_CW,
NULL, NULL);
clutter_actor_show (actorRect);
g_object_unref (effect_template);
g_object_unref (timeline);
}
int
main (int argc, char *argv[])
{
clutter_init (&argc, &argv);
GLenum err = glewInit ();
if (err != GLEW_OK)
g_debug ("failed to init GLEW: %s", glewGetErrorString (err));
ClutterActor *stage = clutter_stage_get_default ();
clutter_actor_set_size (stage, W, H);
setup_actor (stage);
g_signal_connect (stage, "paint", G_CALLBACK (on_actor_paint), NULL);
clutter_actor_show_all (stage);
clutter_main ();
return 0;
}