push_framebuffer


Description:


public void push_framebuffer (Framebuffer buffer)

Redirects all subsequent drawing to the specified framebuffer.

Note:

The latest drawing apis take explicit Framebuffer arguments so this stack of framebuffers shouldn't be used anymore.

This can either be an offscreen buffer created with cogl_offscreen_new_to_texture () or in the future it may be an onscreen framebuffer too.

You should understand that a framebuffer owns the following state: <itemizedlist> <listitem><simpara>The projection matrix</simpara></listitem> <listitem><simpara>The modelview matrix stack</simpara></listitem> < listitem><simpara>The viewport</simpara></listitem> <listitem><simpara>The clip stack</simpara> </listitem> </itemizedlist> So these items will automatically be saved and restored when you push and pop between different framebuffers.

Also remember a newly allocated framebuffer will have an identity matrix for the projection and modelview matrices which gives you a coordinate space like OpenGL with (-1, -1) corresponding to the top left of the viewport, (1, 1) corresponding to the bottom right and +z coming out towards the viewer.

If you want to set up a coordinate space like Clutter does with (0, 0) corresponding to the top left and (framebuffer_width, framebuffer_height) corresponding to the bottom right you can do so like this:

static void
setup_viewport (unsigned int width,
unsigned int height,
float fovy,
float aspect,
float z_near,
float z_far)
{
float z_camera;
CoglMatrix projection_matrix;
CoglMatrix mv_matrix;

cogl_set_viewport (0, 0, width, height);
cogl_perspective (fovy, aspect, z_near, z_far);

cogl_get_projection_matrix (&amp;projection_matrix);
z_camera = 0.5 * projection_matrix.xx;

cogl_matrix_init_identity (&amp;mv_matrix);
cogl_matrix_translate (&amp;mv_matrix, -0.5f, -0.5f, -z_camera);
cogl_matrix_scale (&amp;mv_matrix, 1.0f / width, -1.0f / height, 1.0f / width);
cogl_matrix_translate (&amp;mv_matrix, 0.0f, -1.0 * height, 0.0f);
cogl_set_modelview_matrix (&amp;mv_matrix);
}

static void
my_init_framebuffer (ClutterStage *stage,
CoglFramebuffer *framebuffer,
unsigned int framebuffer_width,
unsigned int framebuffer_height)
{
ClutterPerspective perspective;

clutter_stage_get_perspective (stage, &perspective);

cogl_push_framebuffer (framebuffer);
setup_viewport (framebuffer_width,
framebuffer_height,
perspective.fovy,
perspective.aspect,
perspective.z_near,
perspective.z_far);
}

The previous framebuffer can be restored by calling pop_framebuffer

Parameters:

buffer

A Framebuffer object, either onscreen or offscreen.


Namespace: Cogl
Package: cogl-1.0