push_framebuffer
Description:
Redirects all subsequent drawing to the specified framebuffer.
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. |