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 Offscreen.to_texture or in the future it may be an onscreen framebuffer too.

You should understand that a framebuffer owns the following state:

  • The projection matrix
  • The modelview matrix stack
  • The viewport
  • The clip stack

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 (&projection_matrix);
z_camera = 0.5 * projection_matrix.xx;

cogl_matrix_init_identity (&mv_matrix);
cogl_matrix_translate (&mv_matrix, -0.5f, -0.5f, -z_camera);
cogl_matrix_scale (&mv_matrix, 1.0f / width, -1.0f / height, 1.0f / width);
cogl_matrix_translate (&mv_matrix, 0.0f, -1.0 * height, 0.0f);
cogl_set_modelview_matrix (&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