clutter/paint-nodes: Expose and cleanup ClutterTransformNode

It will also be used by ClutterActor to apply it's own transform
to the paint node tree, and thus preserve it's rendering area.

https://gitlab.gnome.org/GNOME/mutter/merge_requests/872
This commit is contained in:
Georges Basile Stavracas Neto 2019-10-17 18:16:01 +02:00
parent 1d8807a171
commit cf791c09f0
2 changed files with 48 additions and 24 deletions

View File

@ -183,35 +183,31 @@ clutter_root_node_new (CoglFramebuffer *framebuffer,
} }
/* /*
* Transform node * ClutterTransformNode
*
* A private PaintNode, that changes the modelview of its child
* nodes.
*/ */
#define clutter_transform_node_get_type _clutter_transform_node_get_type struct _ClutterTransformNode
{
typedef struct _ClutterTransformNode {
ClutterPaintNode parent_instance; ClutterPaintNode parent_instance;
CoglMatrix modelview; CoglMatrix transform;
} ClutterTransformNode; };
typedef struct _ClutterPaintNodeClass ClutterTransformNodeClass; struct _ClutterTransformNodeClass
{
ClutterPaintNodeClass parent_class;
};
G_DEFINE_TYPE (ClutterTransformNode, clutter_transform_node, CLUTTER_TYPE_PAINT_NODE) G_DEFINE_TYPE (ClutterTransformNode, clutter_transform_node, CLUTTER_TYPE_PAINT_NODE)
static gboolean static gboolean
clutter_transform_node_pre_draw (ClutterPaintNode *node) clutter_transform_node_pre_draw (ClutterPaintNode *node)
{ {
ClutterTransformNode *tnode = (ClutterTransformNode *) node; ClutterTransformNode *transform_node = (ClutterTransformNode *) node;
CoglMatrix matrix; CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
cogl_push_matrix (); cogl_framebuffer_push_matrix (fb);
cogl_framebuffer_transform (fb, &transform_node->transform);
cogl_get_modelview_matrix (&matrix);
cogl_matrix_multiply (&matrix, &matrix, &tnode->modelview);
cogl_set_modelview_matrix (&matrix);
return TRUE; return TRUE;
} }
@ -219,7 +215,9 @@ clutter_transform_node_pre_draw (ClutterPaintNode *node)
static void static void
clutter_transform_node_post_draw (ClutterPaintNode *node) clutter_transform_node_post_draw (ClutterPaintNode *node)
{ {
cogl_pop_matrix (); CoglFramebuffer *fb = cogl_get_draw_framebuffer ();
cogl_framebuffer_pop_matrix (fb);
} }
static void static void
@ -235,18 +233,24 @@ clutter_transform_node_class_init (ClutterTransformNodeClass *klass)
static void static void
clutter_transform_node_init (ClutterTransformNode *self) clutter_transform_node_init (ClutterTransformNode *self)
{ {
cogl_matrix_init_identity (&self->modelview); cogl_matrix_init_identity (&self->transform);
} }
/*
* clutter_transform_node_new:
* @transform: (nullable): the transform matrix to apply
*
* Return value: (transfer full): the newly created #ClutterTransformNode.
* Use clutter_paint_node_unref() when done.
*/
ClutterPaintNode * ClutterPaintNode *
_clutter_transform_node_new (const CoglMatrix *modelview) clutter_transform_node_new (const CoglMatrix *transform)
{ {
ClutterTransformNode *res; ClutterTransformNode *res;
res = _clutter_paint_node_create (_clutter_transform_node_get_type ()); res = _clutter_paint_node_create (CLUTTER_TYPE_TRANSFORM_NODE);
if (transform)
if (modelview != NULL) res->transform = *transform;
res->modelview = *modelview;
return (ClutterPaintNode *) res; return (ClutterPaintNode *) res;
} }

View File

@ -190,6 +190,26 @@ ClutterPaintNode * clutter_layer_node_new (const CoglMatrix
guint8 opacity); guint8 opacity);
#define CLUTTER_TYPE_TRANSFORM_NODE (clutter_transform_node_get_type ())
#define CLUTTER_TRANSFORM_NODE(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), CLUTTER_TYPE_TRANSFORM_NODE, ClutterTransformNode))
#define CLUTTER_IS_TRANSFORM_NODE(obj) (G_TYPE_CHECK_INSTANCE_TYPE ((obj), CLUTTER_TYPE_TRANSFORM_NODE))
/*
* ClutterTransformNode:
*
* The #ClutterLayerNode structure is an opaque
* type whose members cannot be directly accessed.
*
* Since: 1.10
*/
typedef struct _ClutterTransformNode ClutterTransformNode;
typedef struct _ClutterPaintNodeClass ClutterTransformNodeClass;
CLUTTER_EXPORT
GType clutter_transform_node_get_type (void) G_GNUC_CONST;
CLUTTER_EXPORT
ClutterPaintNode * clutter_transform_node_new (const CoglMatrix *projection);
G_END_DECLS G_END_DECLS