2008-02-01 Matthew Allum <mallum@openedhand.com>
* clutter/clutter-feature.h: * clutter/clutter-texture.c: * clutter/clutter-texture.h: * clutter/cogl/cogl.h: * clutter/cogl/gl/cogl.c: * clutter/cogl/gles/cogl.c: * tests/Makefile.am: * tests/test.fbo.c: Add initial support for FBO's in Clutter (OpenGL only so far). See new clutter_texture_new_from_actor() Initial implementation, needs work. * clutter/x11/clutter-stage-x11.c: (clutter_stage_x11_set_cursor_visible): Fall back to again not relying on xfixes to hide cursor. *sigh* * clutter/clutter-deprecated.h: Add clutter_group_find_child_by_id
This commit is contained in:
parent
6bb998f25f
commit
8366a906e2
21
ChangeLog
21
ChangeLog
@ -1,3 +1,24 @@
|
|||||||
|
2008-02-01 Matthew Allum <mallum@openedhand.com>
|
||||||
|
|
||||||
|
* clutter/clutter-feature.h:
|
||||||
|
* clutter/clutter-texture.c:
|
||||||
|
* clutter/clutter-texture.h:
|
||||||
|
* clutter/cogl/cogl.h:
|
||||||
|
* clutter/cogl/gl/cogl.c:
|
||||||
|
* clutter/cogl/gles/cogl.c:
|
||||||
|
* tests/Makefile.am:
|
||||||
|
* tests/test.fbo.c:
|
||||||
|
Add initial support for FBO's in Clutter (OpenGL only so far).
|
||||||
|
See new clutter_texture_new_from_actor()
|
||||||
|
Initial implementation, needs work.
|
||||||
|
|
||||||
|
* clutter/x11/clutter-stage-x11.c:
|
||||||
|
(clutter_stage_x11_set_cursor_visible):
|
||||||
|
Fall back to again not relying on xfixes to hide cursor. *sigh*
|
||||||
|
|
||||||
|
* clutter/clutter-deprecated.h:
|
||||||
|
Add clutter_group_find_child_by_id
|
||||||
|
|
||||||
2008-02-01 Øyvind Kolås <pippin@o-hand.com>
|
2008-02-01 Øyvind Kolås <pippin@o-hand.com>
|
||||||
|
|
||||||
* clutter/cogl/gles/cogl.c: (cogl_rectangle_internal): increase size
|
* clutter/cogl/gles/cogl.c: (cogl_rectangle_internal): increase size
|
||||||
|
@ -11,6 +11,8 @@
|
|||||||
* new functionality should giver errors containing _DEPRECATED_BY_.
|
* new functionality should giver errors containing _DEPRECATED_BY_.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define clutter_group_find_child_by_id clutter_group_find_child_by_id_REPLACED_BY_clutter_container_find_child_by_name
|
||||||
|
|
||||||
#define clutter_behaviour_ellipse_set_angle_begin clutter_behaviour_ellipse_set_angle_begin_REPLACED_BY_clutter_behaviour_set_angle_start
|
#define clutter_behaviour_ellipse_set_angle_begin clutter_behaviour_ellipse_set_angle_begin_REPLACED_BY_clutter_behaviour_set_angle_start
|
||||||
#define clutter_behaviour_ellipse_set_angle_beginx clutter_behaviour_ellipse_set_angle_beginx_REPLACED_BY_clutter_behaviour_set_angle_startx
|
#define clutter_behaviour_ellipse_set_angle_beginx clutter_behaviour_ellipse_set_angle_beginx_REPLACED_BY_clutter_behaviour_set_angle_startx
|
||||||
#define clutter_behaviour_ellipse_get_angle_begin clutter_behaviour_ellipse_get_angle_begin_REPLACED_BY_clutter_behaviour_get_angle_start
|
#define clutter_behaviour_ellipse_get_angle_begin clutter_behaviour_ellipse_get_angle_begin_REPLACED_BY_clutter_behaviour_get_angle_start
|
||||||
|
@ -47,6 +47,7 @@ G_BEGIN_DECLS
|
|||||||
* @CLUTTER_FEATURE_STAGE_USER_RESIZE: Set if stage is able to be user resized.
|
* @CLUTTER_FEATURE_STAGE_USER_RESIZE: Set if stage is able to be user resized.
|
||||||
* @CLUTTER_FEATURE_STAGE_CURSOR: Set if stage has a graphical cursor.
|
* @CLUTTER_FEATURE_STAGE_CURSOR: Set if stage has a graphical cursor.
|
||||||
* @CLUTTER_FEATURE_SHADERS_GLSL: Set if the backend supports GLSL shaders.
|
* @CLUTTER_FEATURE_SHADERS_GLSL: Set if the backend supports GLSL shaders.
|
||||||
|
* @CLUTTER_FEATURE_OFFSCREEN: Set if the backend supports offscreen rendering.
|
||||||
*
|
*
|
||||||
* Runtime flags indicating specific features available via Clutter window
|
* Runtime flags indicating specific features available via Clutter window
|
||||||
* sysytem and graphics backend.
|
* sysytem and graphics backend.
|
||||||
@ -62,7 +63,8 @@ typedef enum
|
|||||||
CLUTTER_FEATURE_STAGE_STATIC = (1 << 5),
|
CLUTTER_FEATURE_STAGE_STATIC = (1 << 5),
|
||||||
CLUTTER_FEATURE_STAGE_USER_RESIZE = (1 << 6),
|
CLUTTER_FEATURE_STAGE_USER_RESIZE = (1 << 6),
|
||||||
CLUTTER_FEATURE_STAGE_CURSOR = (1 << 7),
|
CLUTTER_FEATURE_STAGE_CURSOR = (1 << 7),
|
||||||
CLUTTER_FEATURE_SHADERS_GLSL = (1 << 8)
|
CLUTTER_FEATURE_SHADERS_GLSL = (1 << 8),
|
||||||
|
CLUTTER_FEATURE_OFFSCREEN = (1 << 9)
|
||||||
} ClutterFeatureFlags;
|
} ClutterFeatureFlags;
|
||||||
|
|
||||||
gboolean clutter_feature_available (ClutterFeatureFlags feature);
|
gboolean clutter_feature_available (ClutterFeatureFlags feature);
|
||||||
|
@ -96,6 +96,9 @@ struct _ClutterTexturePrivate
|
|||||||
gint n_x_tiles;
|
gint n_x_tiles;
|
||||||
gint n_y_tiles;
|
gint n_y_tiles;
|
||||||
COGLuint *tiles;
|
COGLuint *tiles;
|
||||||
|
|
||||||
|
ClutterActor *fbo_source;
|
||||||
|
COGLuint fbo_handle;
|
||||||
};
|
};
|
||||||
|
|
||||||
enum
|
enum
|
||||||
@ -668,6 +671,9 @@ clutter_texture_realize (ClutterActor *actor)
|
|||||||
texture = CLUTTER_TEXTURE(actor);
|
texture = CLUTTER_TEXTURE(actor);
|
||||||
priv = texture->priv;
|
priv = texture->priv;
|
||||||
|
|
||||||
|
if (priv->fbo_handle)
|
||||||
|
return; /* handle better */
|
||||||
|
|
||||||
CLUTTER_MARK();
|
CLUTTER_MARK();
|
||||||
|
|
||||||
if (priv->local_pixbuf != NULL)
|
if (priv->local_pixbuf != NULL)
|
||||||
@ -751,6 +757,19 @@ clutter_texture_paint (ClutterActor *self)
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (priv->fbo_handle)
|
||||||
|
{
|
||||||
|
cogl_offscreen_redirect_start (priv->fbo_handle,
|
||||||
|
priv->width, priv->height);
|
||||||
|
clutter_actor_paint (priv->fbo_source);
|
||||||
|
cogl_offscreen_redirect_end (priv->fbo_handle,
|
||||||
|
CLUTTER_STAGE_WIDTH(),
|
||||||
|
CLUTTER_STAGE_HEIGHT());
|
||||||
|
|
||||||
|
glBindTexture(CGL_TEXTURE_RECTANGLE_ARB, priv->tiles[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
CLUTTER_NOTE (PAINT,
|
CLUTTER_NOTE (PAINT,
|
||||||
"painting texture '%s'",
|
"painting texture '%s'",
|
||||||
clutter_actor_get_name (self) ? clutter_actor_get_name (self)
|
clutter_actor_get_name (self) ? clutter_actor_get_name (self)
|
||||||
@ -2083,3 +2102,90 @@ clutter_texture_set_area_from_rgb_data (ClutterTexture *texture,
|
|||||||
|
|
||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* clutter_texture_new_from_actor:
|
||||||
|
* @actor: A #ClutterActor
|
||||||
|
*
|
||||||
|
* Creates a new #ClutterTexture object with its source a prexisting
|
||||||
|
* actor (and associated children).
|
||||||
|
*
|
||||||
|
* Note this function is intented as a utility call for uniformly applying
|
||||||
|
* shaders to groups and other potentail visual effects. It requires the
|
||||||
|
* #CLUTTER_FEATURE_TEXTURE_RECTANGLE & #CLUTTER_FEATURE_OFFSCREEN features
|
||||||
|
* are supported by both the current backend and target system
|
||||||
|
*
|
||||||
|
* Return value: A newly created #ClutterTexture object or NULL on fail.
|
||||||
|
**/
|
||||||
|
ClutterActor *
|
||||||
|
clutter_texture_new_from_actor (ClutterActor *actor)
|
||||||
|
{
|
||||||
|
ClutterTexture *texture;
|
||||||
|
ClutterTexturePrivate *priv;
|
||||||
|
guint w, h;
|
||||||
|
|
||||||
|
|
||||||
|
/* TODO (before 0.6 release):
|
||||||
|
*
|
||||||
|
* - Figure out getting source actor size correctly.
|
||||||
|
* - Figure out refing/reparenting source actor.
|
||||||
|
* - Handle source actor resizing.
|
||||||
|
* - Handle failure better.
|
||||||
|
* - Handle cleanup on destruction.
|
||||||
|
* - Beef up test-fbo.
|
||||||
|
* - Have the source actor as a prop?
|
||||||
|
*/
|
||||||
|
|
||||||
|
if (clutter_feature_available (CLUTTER_FEATURE_TEXTURE_RECTANGLE) == FALSE)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
if (clutter_feature_available (CLUTTER_FEATURE_OFFSCREEN) == FALSE)
|
||||||
|
return NULL;
|
||||||
|
|
||||||
|
texture = g_object_new (CLUTTER_TYPE_TEXTURE, NULL);
|
||||||
|
|
||||||
|
priv = texture->priv;
|
||||||
|
|
||||||
|
priv->fbo_source = actor;
|
||||||
|
|
||||||
|
if (!CLUTTER_ACTOR_IS_REALIZED (priv->fbo_source))
|
||||||
|
clutter_actor_realize (priv->fbo_source);
|
||||||
|
|
||||||
|
|
||||||
|
/* FIXME: just ref ? */
|
||||||
|
clutter_actor_set_parent (actor, CLUTTER_ACTOR(texture));
|
||||||
|
|
||||||
|
/* FIXME abs size */
|
||||||
|
/*clutter_actor_get_abs_size (priv->fbo_source, &w, &h);*/
|
||||||
|
clutter_actor_get_size (actor, &w, &h);
|
||||||
|
|
||||||
|
/* FIXME: Check we can actually create a texture this large */
|
||||||
|
priv->width = w;
|
||||||
|
priv->height = h;
|
||||||
|
|
||||||
|
priv->target_type = CGL_TEXTURE_RECTANGLE_ARB;
|
||||||
|
priv->pixel_format = CGL_RGBA;
|
||||||
|
priv->pixel_type = PIXEL_TYPE;
|
||||||
|
priv->is_tiled = 0;
|
||||||
|
|
||||||
|
priv->tiles = g_new (COGLuint, 1);
|
||||||
|
|
||||||
|
/* FIXME: needs a cogl wrapper */
|
||||||
|
glGenTextures (1, priv->tiles);
|
||||||
|
|
||||||
|
cogl_texture_bind (priv->target_type, priv->tiles[0]);
|
||||||
|
|
||||||
|
cogl_texture_image_2d (priv->target_type,
|
||||||
|
CGL_RGBA,
|
||||||
|
w,
|
||||||
|
h,
|
||||||
|
priv->pixel_format,
|
||||||
|
priv->pixel_type,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
priv->fbo_handle = cogl_offscreen_create (priv->tiles[0]);
|
||||||
|
|
||||||
|
clutter_actor_set_size (actor, w, h);
|
||||||
|
|
||||||
|
return CLUTTER_ACTOR(texture);
|
||||||
|
}
|
||||||
|
@ -119,7 +119,7 @@ gboolean clutter_texture_set_from_rgb_data (ClutterTexture *texture,
|
|||||||
gint bpp,
|
gint bpp,
|
||||||
ClutterTextureFlags flags,
|
ClutterTextureFlags flags,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
ClutterActor *clutter_texture_new_from_actor (ClutterActor *actor);
|
||||||
gboolean clutter_texture_set_area_from_rgb_data (ClutterTexture *texture,
|
gboolean clutter_texture_set_area_from_rgb_data (ClutterTexture *texture,
|
||||||
const guchar *data,
|
const guchar *data,
|
||||||
gboolean has_alpha,
|
gboolean has_alpha,
|
||||||
|
@ -264,6 +264,23 @@ void
|
|||||||
cogl_program_uniform_1f (COGLint uniform_no,
|
cogl_program_uniform_1f (COGLint uniform_no,
|
||||||
gfloat value);
|
gfloat value);
|
||||||
|
|
||||||
|
/* Offscreen - FBO support */
|
||||||
|
|
||||||
|
COGLuint
|
||||||
|
cogl_offscreen_create (COGLuint target_texture);
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_offscreen_destroy (COGLuint offscreen_handle);
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_offscreen_redirect_start (COGLuint offscreen_handle,
|
||||||
|
gint width,
|
||||||
|
gint height);
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_offscreen_redirect_end (COGLuint offscreen_handle,
|
||||||
|
gint width,
|
||||||
|
gint height);
|
||||||
|
|
||||||
G_END_DECLS
|
G_END_DECLS
|
||||||
|
|
||||||
|
@ -41,6 +41,21 @@ typedef CoglFuncPtr (*GLXGetProcAddressProc) (const guint8 *procName);
|
|||||||
|
|
||||||
static gulong __enable_flags = 0;
|
static gulong __enable_flags = 0;
|
||||||
|
|
||||||
|
/* FBO Procs */
|
||||||
|
typedef void (*GenFramebuffers) (GLsizei n, GLuint *ids);
|
||||||
|
typedef void (*BindFramebuffer) (GLenum target, GLuint framebuffer);
|
||||||
|
typedef void (*FramebufferTexture2D) (GLenum target, GLenum attachment,
|
||||||
|
GLenum textarget, GLuint texture,
|
||||||
|
GLint level);
|
||||||
|
typedef GLenum (*CheckFramebufferStatus)(GLenum target);
|
||||||
|
typedef void (*DeleteFramebuffers) (GLsizei n, const GLuint *framebuffers);
|
||||||
|
|
||||||
|
static GenFramebuffers _gen_framebuffers = NULL;
|
||||||
|
static BindFramebuffer _bind_framebuffer = NULL;
|
||||||
|
static FramebufferTexture2D _framebuffer_texture_2d = NULL;
|
||||||
|
static CheckFramebufferStatus _check_framebuffer_status = NULL;
|
||||||
|
static DeleteFramebuffers _delete_framebuffers = NULL;
|
||||||
|
|
||||||
#if COGL_DEBUG
|
#if COGL_DEBUG
|
||||||
struct token_string
|
struct token_string
|
||||||
{
|
{
|
||||||
@ -189,7 +204,6 @@ cogl_paint_init (const ClutterColor *color)
|
|||||||
glDepthFunc (GL_LEQUAL);
|
glDepthFunc (GL_LEQUAL);
|
||||||
|
|
||||||
cogl_enable (CGL_ENABLE_BLEND);
|
cogl_enable (CGL_ENABLE_BLEND);
|
||||||
|
|
||||||
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
glTexEnvi (GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -295,6 +309,7 @@ cogl_enable (gulong flags)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if 0
|
||||||
if (flags & CGL_ENABLE_ALPHA_TEST)
|
if (flags & CGL_ENABLE_ALPHA_TEST)
|
||||||
{
|
{
|
||||||
if (!(__enable_flags & CGL_ENABLE_ALPHA_TEST))
|
if (!(__enable_flags & CGL_ENABLE_ALPHA_TEST))
|
||||||
@ -308,6 +323,7 @@ cogl_enable (gulong flags)
|
|||||||
glDisable (GL_ALPHA_TEST);
|
glDisable (GL_ALPHA_TEST);
|
||||||
__enable_flags &= ~CGL_ENABLE_ALPHA_TEST;
|
__enable_flags &= ~CGL_ENABLE_ALPHA_TEST;
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@ -648,6 +664,35 @@ cogl_get_features ()
|
|||||||
flags |= CLUTTER_FEATURE_SHADERS_GLSL;
|
flags |= CLUTTER_FEATURE_SHADERS_GLSL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (cogl_check_extension ("GL_EXT_framebuffer_object", gl_extensions) ||
|
||||||
|
cogl_check_extension ("GL_ARB_framebuffer_object", gl_extensions))
|
||||||
|
{
|
||||||
|
_gen_framebuffers =
|
||||||
|
(GenFramebuffers) cogl_get_proc_address ("glGenFramebuffersEXT");
|
||||||
|
|
||||||
|
_bind_framebuffer =
|
||||||
|
(BindFramebuffer) cogl_get_proc_address ("glBindFramebufferEXT");
|
||||||
|
|
||||||
|
_framebuffer_texture_2d =
|
||||||
|
(FramebufferTexture2D)
|
||||||
|
cogl_get_proc_address ("glFramebufferTexture2DEXT");
|
||||||
|
|
||||||
|
_check_framebuffer_status =
|
||||||
|
(CheckFramebufferStatus)
|
||||||
|
cogl_get_proc_address ("glCheckFramebufferStatusEXT");
|
||||||
|
|
||||||
|
_delete_framebuffers =
|
||||||
|
(DeleteFramebuffers)
|
||||||
|
cogl_get_proc_address ("glDeleteFramebuffersEXT");
|
||||||
|
|
||||||
|
if (_gen_framebuffers
|
||||||
|
&& _bind_framebuffer
|
||||||
|
&& _framebuffer_texture_2d
|
||||||
|
&& _check_framebuffer_status
|
||||||
|
&& _delete_framebuffers)
|
||||||
|
flags |= CLUTTER_FEATURE_OFFSCREEN;
|
||||||
|
}
|
||||||
|
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -774,6 +819,112 @@ cogl_fog_set (const ClutterColor *fog_color,
|
|||||||
glFogf (GL_FOG_END, CLUTTER_FIXED_TO_FLOAT (stop));
|
glFogf (GL_FOG_END, CLUTTER_FIXED_TO_FLOAT (stop));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* FBOs - offscreen */
|
||||||
|
|
||||||
|
COGLuint
|
||||||
|
cogl_offscreen_create (COGLuint target_texture)
|
||||||
|
{
|
||||||
|
#ifdef GL_FRAMEBUFFER_EXT
|
||||||
|
COGLuint handle;
|
||||||
|
GLenum status;
|
||||||
|
|
||||||
|
if (_gen_framebuffers == NULL
|
||||||
|
|| _bind_framebuffer == NULL
|
||||||
|
|| _framebuffer_texture_2d == NULL
|
||||||
|
|| _check_framebuffer_status == NULL)
|
||||||
|
{
|
||||||
|
/* tmp warning - need error reporting */
|
||||||
|
g_warning("Missing GL_FRAMEBUFFER_EXT API\n");
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_gen_framebuffers (1, &handle);
|
||||||
|
_bind_framebuffer (GL_FRAMEBUFFER_EXT, handle);
|
||||||
|
|
||||||
|
_framebuffer_texture_2d (GL_FRAMEBUFFER_EXT,
|
||||||
|
GL_COLOR_ATTACHMENT0_EXT,
|
||||||
|
GL_TEXTURE_RECTANGLE_ARB,
|
||||||
|
target_texture,
|
||||||
|
0);
|
||||||
|
|
||||||
|
status = _check_framebuffer_status (GL_FRAMEBUFFER_EXT);
|
||||||
|
|
||||||
|
if (status != GL_FRAMEBUFFER_COMPLETE_EXT)
|
||||||
|
{
|
||||||
|
_delete_framebuffers (1, &handle);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_bind_framebuffer (GL_FRAMEBUFFER_EXT, 0);
|
||||||
|
|
||||||
|
return handle;
|
||||||
|
#else
|
||||||
|
/* tmp warning - need error reporting */
|
||||||
|
g_warning("No GL_FRAMEBUFFER_EXT\n");
|
||||||
|
return 0;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_offscreen_destroy (COGLuint offscreen_handle)
|
||||||
|
{
|
||||||
|
if (_delete_framebuffers)
|
||||||
|
_delete_framebuffers (1, &offscreen_handle);
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_offscreen_redirect_start (COGLuint offscreen_handle,
|
||||||
|
gint width,
|
||||||
|
gint height)
|
||||||
|
{
|
||||||
|
/* FIXME: silly we need to pass width / height to init viewport */
|
||||||
|
#ifdef GL_FRAMEBUFFER_EXT
|
||||||
|
|
||||||
|
if (_bind_framebuffer == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
_bind_framebuffer (GL_FRAMEBUFFER_EXT, offscreen_handle);
|
||||||
|
|
||||||
|
glViewport (0, 0, width, height);
|
||||||
|
|
||||||
|
glMatrixMode (GL_PROJECTION);
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity ();
|
||||||
|
|
||||||
|
glMatrixMode (GL_MODELVIEW);
|
||||||
|
glPushMatrix();
|
||||||
|
glLoadIdentity ();
|
||||||
|
|
||||||
|
glTranslatef (-1.0f, -1.0f, 0.0f);
|
||||||
|
glScalef (2.0f / (float)width, 2.0f / (float)height, 1.0f);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_offscreen_redirect_end (COGLuint offscreen_handle,
|
||||||
|
gint width,
|
||||||
|
gint height)
|
||||||
|
{
|
||||||
|
/* FIXME: silly we need to pass width / height to reset to */
|
||||||
|
if (_bind_framebuffer == NULL)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef GL_FRAMEBUFFER_EXT
|
||||||
|
glViewport (0, 0, width, height);
|
||||||
|
|
||||||
|
glMatrixMode (GL_PROJECTION);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
glMatrixMode (GL_MODELVIEW);
|
||||||
|
glPopMatrix();
|
||||||
|
|
||||||
|
_bind_framebuffer (GL_FRAMEBUFFER_EXT, 0);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Shader Magic follows */
|
||||||
|
|
||||||
#ifdef __GNUC__
|
#ifdef __GNUC__
|
||||||
|
|
||||||
#define PROC(rettype, retval, procname, args...) \
|
#define PROC(rettype, retval, procname, args...) \
|
||||||
|
@ -645,6 +645,36 @@ cogl_fog_set (const ClutterColor *fog_color,
|
|||||||
glFogx (GL_FOG_END, (GLfixed) z_far);
|
glFogx (GL_FOG_END, (GLfixed) z_far);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Offscreen - TODO: possible support from FBO's */
|
||||||
|
|
||||||
|
COGLuint
|
||||||
|
cogl_offscreen_create (COGLuint target_texture)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_offscreen_destroy (COGLuint offscreen_handle)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_offscreen_redirect_start (COGLuint offscreen_handle,
|
||||||
|
gint width,
|
||||||
|
gint height)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
cogl_offscreen_redirect_end (COGLuint offscreen_handle,
|
||||||
|
gint width,
|
||||||
|
gint height)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* Shaders, no support on regular OpenGL 1.1 */
|
||||||
|
|
||||||
COGLhandle
|
COGLhandle
|
||||||
cogl_create_program (void)
|
cogl_create_program (void)
|
||||||
{
|
{
|
||||||
|
@ -308,7 +308,7 @@ clutter_stage_x11_set_cursor_visible (ClutterStage *stage,
|
|||||||
|
|
||||||
if (show_cursor)
|
if (show_cursor)
|
||||||
{
|
{
|
||||||
#if HAVE_XFIXES
|
#if 0 /* HAVE_XFIXES - seems buggy/unreliable */
|
||||||
XFixesShowCursor (stage_x11->xdpy, stage_x11->xwin);
|
XFixesShowCursor (stage_x11->xdpy, stage_x11->xwin);
|
||||||
#else
|
#else
|
||||||
XUndefineCursor (stage_x11->xdpy, stage_x11->xwin);
|
XUndefineCursor (stage_x11->xdpy, stage_x11->xwin);
|
||||||
@ -316,7 +316,9 @@ clutter_stage_x11_set_cursor_visible (ClutterStage *stage,
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
#if HAVE_XFIXES
|
#if 0 /* HAVE_XFIXES - seems buggy/unreliable, check cursor in firefox
|
||||||
|
* loading page after hiding.
|
||||||
|
*/
|
||||||
XFixesHideCursor (stage_x11->xdpy, stage_x11->xwin);
|
XFixesHideCursor (stage_x11->xdpy, stage_x11->xwin);
|
||||||
#else
|
#else
|
||||||
XColor col;
|
XColor col;
|
||||||
|
@ -3,7 +3,7 @@ noinst_PROGRAMS = test-textures test-events test-offscreen test-scale \
|
|||||||
test-perspective test-rotate test-depth \
|
test-perspective test-rotate test-depth \
|
||||||
test-threads test-timeline test-score test-script \
|
test-threads test-timeline test-score test-script \
|
||||||
test-model test-grab test-effects test-fullscreen \
|
test-model test-grab test-effects test-fullscreen \
|
||||||
test-shader test-unproject test-viewport
|
test-shader test-unproject test-viewport test-fbo
|
||||||
|
|
||||||
INCLUDES = -I$(top_srcdir)/
|
INCLUDES = -I$(top_srcdir)/
|
||||||
LDADD = $(top_builddir)/clutter/libclutter-@CLUTTER_FLAVOUR@-@CLUTTER_MAJORMINOR@.la
|
LDADD = $(top_builddir)/clutter/libclutter-@CLUTTER_FLAVOUR@-@CLUTTER_MAJORMINOR@.la
|
||||||
@ -33,5 +33,6 @@ test_model_SOURCES = test-model.c
|
|||||||
test_effects_SOURCES = test-effects.c
|
test_effects_SOURCES = test-effects.c
|
||||||
test_fullscreen_SOURCES = test-fullscreen.c
|
test_fullscreen_SOURCES = test-fullscreen.c
|
||||||
test_viewport_SOURCES = test-viewport.c
|
test_viewport_SOURCES = test-viewport.c
|
||||||
|
test_fbo_SOURCES = test-fbo.c
|
||||||
|
|
||||||
EXTRA_DIST = redhand.png test-script.json
|
EXTRA_DIST = redhand.png test-script.json
|
||||||
|
100
tests/test-fbo.c
Normal file
100
tests/test-fbo.c
Normal file
@ -0,0 +1,100 @@
|
|||||||
|
/*#define TEST_GROUP */
|
||||||
|
|
||||||
|
#include <clutter/clutter.h>
|
||||||
|
|
||||||
|
#include <errno.h>
|
||||||
|
#include <stdlib.h>
|
||||||
|
#include <glib.h>
|
||||||
|
|
||||||
|
|
||||||
|
gint
|
||||||
|
main (gint argc,
|
||||||
|
gchar *argv[])
|
||||||
|
{
|
||||||
|
ClutterColor color={0x33, 0x44, 0x55, 0xff};
|
||||||
|
ClutterActor *fbo;
|
||||||
|
ClutterActor *actor;
|
||||||
|
ClutterActor *actor2;
|
||||||
|
ClutterActor *group;
|
||||||
|
ClutterShader *shader;
|
||||||
|
ClutterActor *stage;
|
||||||
|
ClutterActor *rectangle;
|
||||||
|
ClutterActor *clone;
|
||||||
|
GdkPixbuf *pixbuf;
|
||||||
|
GError *error = NULL;
|
||||||
|
|
||||||
|
clutter_init (&argc, &argv);
|
||||||
|
|
||||||
|
stage = clutter_stage_get_default ();
|
||||||
|
clutter_stage_set_color (CLUTTER_STAGE (stage), &color);
|
||||||
|
|
||||||
|
pixbuf = gdk_pixbuf_new_from_file ("redhand.png", &error);
|
||||||
|
if (!pixbuf)
|
||||||
|
g_error("pixbuf load failed: %s", error ? error->message : "Unknown");
|
||||||
|
|
||||||
|
/* actor = clutter_texture_new_from_pixbuf (pixbuf);*/
|
||||||
|
|
||||||
|
group = clutter_group_new ();
|
||||||
|
{
|
||||||
|
ClutterColor nothing = {0, 0,0,0};
|
||||||
|
rectangle = clutter_rectangle_new_with_color (¬hing);
|
||||||
|
clutter_actor_set_size (rectangle, 800, 270);
|
||||||
|
}
|
||||||
|
|
||||||
|
actor2 = clutter_texture_new_from_pixbuf (pixbuf);
|
||||||
|
clutter_container_add_actor (CLUTTER_CONTAINER (group), actor2);
|
||||||
|
{
|
||||||
|
ClutterColor yellow = {0xff, 0xff, 0x00, 0xff};
|
||||||
|
actor = clutter_label_new_with_text ("Sans 50px", "Hello hadyness");
|
||||||
|
clutter_label_set_color (CLUTTER_LABEL (actor), &yellow);
|
||||||
|
}
|
||||||
|
|
||||||
|
clutter_container_add_actor (CLUTTER_CONTAINER (group), actor);
|
||||||
|
clutter_container_add_actor (CLUTTER_CONTAINER (group), rectangle);
|
||||||
|
clutter_actor_set_position (actor, 0, 15);
|
||||||
|
|
||||||
|
clutter_actor_show_all (group);
|
||||||
|
|
||||||
|
fbo = clutter_texture_new_from_actor (group);
|
||||||
|
|
||||||
|
clutter_container_add_actor (CLUTTER_CONTAINER (stage), fbo);
|
||||||
|
clutter_actor_set_position (fbo, 20, 120);
|
||||||
|
clutter_actor_set_position (actor2, 130, 20);
|
||||||
|
|
||||||
|
shader = clutter_shader_new ();
|
||||||
|
clutter_shader_set_fragment_source (shader,
|
||||||
|
|
||||||
|
"uniform float radius ;"
|
||||||
|
"uniform sampler2DRect rectTexture;"
|
||||||
|
""
|
||||||
|
"void main()"
|
||||||
|
"{"
|
||||||
|
" vec4 color = texture2DRect(rectTexture, gl_TexCoord[0].st);"
|
||||||
|
" float u;"
|
||||||
|
" float v;"
|
||||||
|
" int count = 1;"
|
||||||
|
" for (u=-radius;u<radius;u++)"
|
||||||
|
" for (v=-radius;v<radius;v++)"
|
||||||
|
" {"
|
||||||
|
" color += texture2DRect(rectTexture, vec2(gl_TexCoord[0].s + u * 2.0, gl_TexCoord[0].t +v * 2.0));"
|
||||||
|
" count ++;"
|
||||||
|
" }"
|
||||||
|
""
|
||||||
|
" gl_FragColor = color / float(count);"
|
||||||
|
|
||||||
|
"}",
|
||||||
|
-1
|
||||||
|
);
|
||||||
|
|
||||||
|
clone = clutter_clone_texture_new (fbo);
|
||||||
|
clutter_container_add_actor (CLUTTER_CONTAINER (stage), clone);
|
||||||
|
clutter_actor_set_position (clone, 40, 300);
|
||||||
|
|
||||||
|
|
||||||
|
if(1)clutter_actor_apply_shader (clone, shader);
|
||||||
|
if(1)clutter_actor_set_shader_param (clone, "radius", 2.0);
|
||||||
|
|
||||||
|
|
||||||
|
clutter_actor_show_all (stage);
|
||||||
|
clutter_main ();
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user