void _clutter_util_fully_transform_vertices (const CoglMatrix *modelview, const CoglMatrix *projection, const float *viewport, const ClutterVertex *vertices_in, ClutterVertex *vertices_out, int n_vertices) { CoglMatrix modelview_projection; ClutterVertex4 *vertices_tmp; int i; vertices_tmp = g_alloca (sizeof (ClutterVertex4) * n_vertices); if (n_vertices >= 4) { /* XXX: we should find a way to cache this per actor */ cogl_matrix_multiply (&modelview_projection, projection, modelview); cogl_matrix_project_points (&modelview_projection, 3, sizeof (ClutterVertex), vertices_in, sizeof (ClutterVertex4), vertices_tmp, n_vertices); } else { cogl_matrix_transform_points (modelview, 3, sizeof (ClutterVertex), vertices_in, sizeof (ClutterVertex4), vertices_tmp, n_vertices); cogl_matrix_project_points (projection, 3, sizeof (ClutterVertex4), vertices_tmp, sizeof (ClutterVertex4), vertices_tmp, n_vertices); } for (i = 0; i < n_vertices; i++) { ClutterVertex4 vertex_tmp = vertices_tmp[i]; ClutterVertex *vertex_out = &vertices_out[i]; /* Finally translate from OpenGL coords to window coords */ vertex_out->x = MTX_GL_SCALE_X (vertex_tmp.x, vertex_tmp.w, viewport[2], viewport[0]); vertex_out->y = MTX_GL_SCALE_Y (vertex_tmp.y, vertex_tmp.w, viewport[3], viewport[1]); } }
void update_control_point_positions (RigSelectionTool *tool, RutCamera *paint_camera) /* 2d ui camera */ { RutCamera *camera = tool->camera_component; GList *l; for (l = tool->selected_entities; l; l = l->next) { EntityState *entity_state = l->data; CoglMatrix transform; const CoglMatrix *projection; float screen_space[4], x, y; const float *viewport; GList *l2; get_modelview_matrix (tool->camera, entity_state->entity, &transform); projection = rut_camera_get_projection (camera); viewport = rut_camera_get_viewport (camera); for (l2 = entity_state->control_points; l2; l2 = l2->next) { ControlPoint *point = l2->data; point->position[0] = point->x; point->position[1] = point->y; point->position[2] = point->z; cogl_matrix_transform_points (&transform, 3, /* num components for input */ sizeof (float) * 3, /* input stride */ point->position, sizeof (float) * 3, /* output stride */ point->position, 1 /* n_points */); /* update the input region, need project the transformed point and do * the viewport transform */ screen_space[0] = point->position[0]; screen_space[1] = point->position[1]; screen_space[2] = point->position[2]; cogl_matrix_project_points (projection, 3, /* num components for input */ sizeof (float) * 3, /* input stride */ screen_space, sizeof (float) * 4, /* output stride */ screen_space, 1 /* n_points */); /* perspective divide */ screen_space[0] /= screen_space[3]; screen_space[1] /= screen_space[3]; /* apply viewport transform */ x = VIEWPORT_TRANSFORM_X (screen_space[0], viewport[0], viewport[2]); y = VIEWPORT_TRANSFORM_Y (screen_space[1], viewport[1], viewport[3]); point->screen_pos[0] = x; point->screen_pos[1] = y; map_window_coords_to_overlay_coord (paint_camera, tool->tool_overlay, &x, &y); rut_transform_init_identity (point->transform); rut_transform_translate (point->transform, x, y, 0); rut_input_region_set_circle (point->input_region, x, y, 10); } } }