mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 01:20:42 -05:00
clutter/stage: Setup 2D view internally
Move and simplify cogl_matrix_view_2d_in_perspective() to inside ClutterStage, since it's the only consumer of this API, and remove it from Cogl. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1439
This commit is contained in:
parent
db23ee5829
commit
5db1f67d44
@ -2755,6 +2755,40 @@ calculate_z_translation (float z_near)
|
||||
+ z_near;
|
||||
}
|
||||
|
||||
static void
|
||||
view_2d_in_perspective (graphene_matrix_t *matrix,
|
||||
float fov_y,
|
||||
float aspect,
|
||||
float z_near,
|
||||
float z_2d,
|
||||
float width_2d,
|
||||
float height_2d)
|
||||
{
|
||||
float top = z_near * tan (fov_y * G_PI / 360.0);
|
||||
float left = -top * aspect;
|
||||
float right = top * aspect;
|
||||
float bottom = -top;
|
||||
|
||||
float left_2d_plane = left / z_near * z_2d;
|
||||
float right_2d_plane = right / z_near * z_2d;
|
||||
float bottom_2d_plane = bottom / z_near * z_2d;
|
||||
float top_2d_plane = top / z_near * z_2d;
|
||||
|
||||
float width_2d_start = right_2d_plane - left_2d_plane;
|
||||
float height_2d_start = top_2d_plane - bottom_2d_plane;
|
||||
|
||||
/* Factors to scale from framebuffer geometry to frustum
|
||||
* cross-section geometry. */
|
||||
float width_scale = width_2d_start / width_2d;
|
||||
float height_scale = height_2d_start / height_2d;
|
||||
|
||||
graphene_matrix_init_scale (matrix, width_scale, -height_scale, width_scale);
|
||||
graphene_matrix_translate (matrix,
|
||||
&GRAPHENE_POINT3D_INIT (left_2d_plane,
|
||||
top_2d_plane,
|
||||
-z_2d));
|
||||
}
|
||||
|
||||
static void
|
||||
clutter_stage_update_view_perspective (ClutterStage *stage)
|
||||
{
|
||||
@ -2779,14 +2813,13 @@ clutter_stage_update_view_perspective (ClutterStage *stage)
|
||||
|
||||
clutter_stage_set_perspective (stage, &perspective);
|
||||
|
||||
cogl_matrix_init_identity (&priv->view);
|
||||
cogl_matrix_view_2d_in_perspective (&priv->view,
|
||||
perspective.fovy,
|
||||
perspective.aspect,
|
||||
perspective.z_near,
|
||||
z_2d,
|
||||
priv->viewport[2],
|
||||
priv->viewport[3]);
|
||||
view_2d_in_perspective (&priv->view,
|
||||
perspective.fovy,
|
||||
perspective.aspect,
|
||||
perspective.z_near,
|
||||
z_2d,
|
||||
priv->viewport[2],
|
||||
priv->viewport[3]);
|
||||
|
||||
clutter_actor_invalidate_transform (CLUTTER_ACTOR (stage));
|
||||
}
|
||||
|
@ -246,63 +246,6 @@ cogl_matrix_init_from_euler (graphene_matrix_t *matrix,
|
||||
graphene_matrix_rotate_euler (matrix, euler);
|
||||
}
|
||||
|
||||
void
|
||||
cogl_matrix_view_2d_in_frustum (graphene_matrix_t *matrix,
|
||||
float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float z_near,
|
||||
float z_2d,
|
||||
float width_2d,
|
||||
float height_2d)
|
||||
{
|
||||
float left_2d_plane = left / z_near * z_2d;
|
||||
float right_2d_plane = right / z_near * z_2d;
|
||||
float bottom_2d_plane = bottom / z_near * z_2d;
|
||||
float top_2d_plane = top / z_near * z_2d;
|
||||
|
||||
float width_2d_start = right_2d_plane - left_2d_plane;
|
||||
float height_2d_start = top_2d_plane - bottom_2d_plane;
|
||||
|
||||
/* Factors to scale from framebuffer geometry to frustum
|
||||
* cross-section geometry. */
|
||||
float width_scale = width_2d_start / width_2d;
|
||||
float height_scale = height_2d_start / height_2d;
|
||||
|
||||
cogl_matrix_translate (matrix,
|
||||
left_2d_plane, top_2d_plane, -z_2d);
|
||||
|
||||
cogl_matrix_scale (matrix, width_scale, -height_scale, width_scale);
|
||||
}
|
||||
|
||||
/* Assuming a symmetric perspective matrix is being used for your
|
||||
* projective transform this convenience function lets you compose a
|
||||
* view transform such that geometry on the z=0 plane will map to
|
||||
* screen coordinates with a top left origin of (0,0) and with the
|
||||
* given width and height.
|
||||
*/
|
||||
void
|
||||
cogl_matrix_view_2d_in_perspective (graphene_matrix_t *matrix,
|
||||
float fov_y,
|
||||
float aspect,
|
||||
float z_near,
|
||||
float z_2d,
|
||||
float width_2d,
|
||||
float height_2d)
|
||||
{
|
||||
float top = z_near * tan (fov_y * G_PI / 360.0);
|
||||
cogl_matrix_view_2d_in_frustum (matrix,
|
||||
-top * aspect,
|
||||
top * aspect,
|
||||
-top,
|
||||
top,
|
||||
z_near,
|
||||
z_2d,
|
||||
width_2d,
|
||||
height_2d);
|
||||
}
|
||||
|
||||
gboolean
|
||||
cogl_matrix_equal (const void *v1, const void *v2)
|
||||
{
|
||||
|
@ -308,84 +308,6 @@ cogl_matrix_orthographic (graphene_matrix_t *matrix,
|
||||
float near,
|
||||
float far);
|
||||
|
||||
/**
|
||||
* cogl_matrix_view_2d_in_frustum:
|
||||
* @matrix: A 4x4 transformation matrix
|
||||
* @left: coord of left vertical clipping plane
|
||||
* @right: coord of right vertical clipping plane
|
||||
* @bottom: coord of bottom horizontal clipping plane
|
||||
* @top: coord of top horizontal clipping plane
|
||||
* @z_near: The distance to the near clip plane. Never pass 0 and always pass
|
||||
* a positive number.
|
||||
* @z_2d: The distance to the 2D plane. (Should always be positive and
|
||||
* be between @z_near and the z_far value that was passed to
|
||||
* cogl_matrix_frustum())
|
||||
* @width_2d: The width of the 2D coordinate system
|
||||
* @height_2d: The height of the 2D coordinate system
|
||||
*
|
||||
* Multiplies @matrix by a view transform that maps the 2D coordinates
|
||||
* (0,0) top left and (@width_2d,@height_2d) bottom right the full viewport
|
||||
* size. Geometry at a depth of 0 will now lie on this 2D plane.
|
||||
*
|
||||
* Note: this doesn't multiply the matrix by any projection matrix,
|
||||
* but it assumes you have a perspective projection as defined by
|
||||
* passing the corresponding arguments to cogl_matrix_frustum().
|
||||
|
||||
* Toolkits such as Clutter that mix 2D and 3D drawing can use this to
|
||||
* create a 2D coordinate system within a 3D perspective projected
|
||||
* view frustum.
|
||||
*
|
||||
* Since: 1.8
|
||||
* Stability: unstable
|
||||
*/
|
||||
COGL_EXPORT void
|
||||
cogl_matrix_view_2d_in_frustum (graphene_matrix_t *matrix,
|
||||
float left,
|
||||
float right,
|
||||
float bottom,
|
||||
float top,
|
||||
float z_near,
|
||||
float z_2d,
|
||||
float width_2d,
|
||||
float height_2d);
|
||||
|
||||
/**
|
||||
* cogl_matrix_view_2d_in_perspective:
|
||||
* @fov_y: A field of view angle for the Y axis
|
||||
* @aspect: The ratio of width to height determining the field of view angle
|
||||
* for the x axis.
|
||||
* @z_near: The distance to the near clip plane. Never pass 0 and always pass
|
||||
* a positive number.
|
||||
* @z_2d: The distance to the 2D plane. (Should always be positive and
|
||||
* be between @z_near and the z_far value that was passed to
|
||||
* cogl_matrix_frustum())
|
||||
* @width_2d: The width of the 2D coordinate system
|
||||
* @height_2d: The height of the 2D coordinate system
|
||||
*
|
||||
* Multiplies @matrix by a view transform that maps the 2D coordinates
|
||||
* (0,0) top left and (@width_2d,@height_2d) bottom right the full viewport
|
||||
* size. Geometry at a depth of 0 will now lie on this 2D plane.
|
||||
*
|
||||
* Note: this doesn't multiply the matrix by any projection matrix,
|
||||
* but it assumes you have a perspective projection as defined by
|
||||
* passing the corresponding arguments to cogl_matrix_perspective().
|
||||
*
|
||||
* Toolkits such as Clutter that mix 2D and 3D drawing can use this to
|
||||
* create a 2D coordinate system within a 3D perspective projected
|
||||
* view frustum.
|
||||
*
|
||||
* Since: 1.8
|
||||
* Stability: unstable
|
||||
*/
|
||||
COGL_EXPORT void
|
||||
cogl_matrix_view_2d_in_perspective (graphene_matrix_t *matrix,
|
||||
float fov_y,
|
||||
float aspect,
|
||||
float z_near,
|
||||
float z_2d,
|
||||
float width_2d,
|
||||
float height_2d);
|
||||
|
||||
/**
|
||||
* cogl_matrix_init_from_array:
|
||||
* @matrix: A 4x4 transformation matrix
|
||||
|
Loading…
Reference in New Issue
Block a user