static RutTraverseVisitFlags entitygraph_pre_paint_cb (RutObject *object, int depth, void *user_data) { RigPaintContext *paint_ctx = user_data; RutPaintContext *rut_paint_ctx = user_data; RutCamera *camera = rut_paint_ctx->camera; CoglFramebuffer *fb = rut_camera_get_framebuffer (camera); if (rut_object_is (object, RUT_INTERFACE_ID_TRANSFORMABLE)) { const CoglMatrix *matrix = rut_transformable_get_matrix (object); cogl_framebuffer_push_matrix (fb); cogl_framebuffer_transform (fb, matrix); } if (rut_object_get_type (object) == &rut_entity_type) { RutEntity *entity = RUT_ENTITY (object); RutObject *geometry; CoglMatrix matrix; if (!rut_entity_get_visible (entity) || (paint_ctx->pass == RIG_PASS_SHADOW && !rut_entity_get_cast_shadow (entity))) return RUT_TRAVERSE_VISIT_CONTINUE; geometry = rut_entity_get_component (object, RUT_COMPONENT_TYPE_GEOMETRY); if (!geometry) { if (!paint_ctx->engine->play_mode && object == paint_ctx->engine->light) draw_entity_camera_frustum (paint_ctx->engine, object, fb); return RUT_TRAVERSE_VISIT_CONTINUE; } cogl_framebuffer_get_modelview_matrix (fb, &matrix); rig_journal_log (paint_ctx->engine->journal, paint_ctx, entity, &matrix); return RUT_TRAVERSE_VISIT_CONTINUE; } return RUT_TRAVERSE_VISIT_CONTINUE; }
void rut_graphable_apply_transform (RutObject *graphable, CoglMatrix *transform_matrix) { int depth = 0; RutObject **transform_nodes; RutObject *node = graphable; int i; do { RutGraphableProps *graphable_priv = rut_object_get_properties (node, RUT_INTERFACE_ID_GRAPHABLE); depth++; node = graphable_priv->parent; } while (node); transform_nodes = g_alloca (sizeof (RutObject *) * depth); node = graphable; i = 0; do { RutGraphableProps *graphable_priv; if (rut_object_is (node, RUT_INTERFACE_ID_TRANSFORMABLE)) transform_nodes[i++] = node; graphable_priv = rut_object_get_properties (node, RUT_INTERFACE_ID_GRAPHABLE); node = graphable_priv->parent; } while (node); for (i--; i >= 0; i--) { const CoglMatrix *matrix = rut_transformable_get_matrix (transform_nodes[i]); cogl_matrix_multiply (transform_matrix, transform_matrix, matrix); } }