mirror of
https://github.com/brl/mutter.git
synced 2024-11-25 09:30:45 -05:00
Don't access CoglMatrix struct fields
Instead, use the new cogl_matrix_get_value() API. https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1439
This commit is contained in:
parent
8e125fbab6
commit
55b05e5631
@ -673,6 +673,7 @@ _cogl_util_get_eye_planes_for_screen_poly (float *polygon,
|
|||||||
Vector4 *poly;
|
Vector4 *poly;
|
||||||
graphene_vec3_t b;
|
graphene_vec3_t b;
|
||||||
graphene_vec3_t c;
|
graphene_vec3_t c;
|
||||||
|
float wz, ww;
|
||||||
int count;
|
int count;
|
||||||
|
|
||||||
tmp_poly = g_alloca (sizeof (Vector4) * n_vertices * 2);
|
tmp_poly = g_alloca (sizeof (Vector4) * n_vertices * 2);
|
||||||
@ -693,7 +694,9 @@ _cogl_util_get_eye_planes_for_screen_poly (float *polygon,
|
|||||||
* frustum; coordinates range from [-Wc,Wc] left to right on the
|
* frustum; coordinates range from [-Wc,Wc] left to right on the
|
||||||
* x-axis and [Wc,-Wc] top to bottom on the y-axis.
|
* x-axis and [Wc,-Wc] top to bottom on the y-axis.
|
||||||
*/
|
*/
|
||||||
Wc = DEPTH * projection->wz + projection->ww;
|
wz = cogl_matrix_get_value (projection, 3, 2);
|
||||||
|
ww = cogl_matrix_get_value (projection, 3, 3);
|
||||||
|
Wc = DEPTH * wz + ww;
|
||||||
|
|
||||||
#define CLIP_X(X) ((((float)X - viewport[0]) * (2.0 / viewport[2])) - 1) * Wc
|
#define CLIP_X(X) ((((float)X - viewport[0]) * (2.0 / viewport[2])) - 1) * Wc
|
||||||
#define CLIP_Y(Y) ((((float)Y - viewport[1]) * (2.0 / viewport[3])) - 1) * -Wc
|
#define CLIP_Y(Y) ((((float)Y - viewport[1]) * (2.0 / viewport[3])) - 1) * -Wc
|
||||||
@ -706,7 +709,7 @@ _cogl_util_get_eye_planes_for_screen_poly (float *polygon,
|
|||||||
tmp_poly[i].w = Wc;
|
tmp_poly[i].w = Wc;
|
||||||
}
|
}
|
||||||
|
|
||||||
Wc = DEPTH * 2 * projection->wz + projection->ww;
|
Wc = DEPTH * 2 * wz + ww;
|
||||||
|
|
||||||
/* FIXME: technically we don't need to project all of the points
|
/* FIXME: technically we don't need to project all of the points
|
||||||
* twice, it would be enough project every other point since
|
* twice, it would be enough project every other point since
|
||||||
|
@ -249,6 +249,9 @@ get_paint_level (ClutterPaintContext *paint_context,
|
|||||||
{
|
{
|
||||||
CoglFramebuffer *framebuffer;
|
CoglFramebuffer *framebuffer;
|
||||||
CoglMatrix projection, modelview, pm;
|
CoglMatrix projection, modelview, pm;
|
||||||
|
float xx, xy, xw;
|
||||||
|
float yx, yy, yw;
|
||||||
|
float wx, wy, ww;
|
||||||
float v[4];
|
float v[4];
|
||||||
double viewport_width, viewport_height;
|
double viewport_width, viewport_height;
|
||||||
double u0, v0;
|
double u0, v0;
|
||||||
@ -280,6 +283,16 @@ get_paint_level (ClutterPaintContext *paint_context,
|
|||||||
|
|
||||||
cogl_matrix_multiply (&pm, &projection, &modelview);
|
cogl_matrix_multiply (&pm, &projection, &modelview);
|
||||||
|
|
||||||
|
xx = cogl_matrix_get_value (&pm, 0, 0);
|
||||||
|
xy = cogl_matrix_get_value (&pm, 0, 1);
|
||||||
|
xw = cogl_matrix_get_value (&pm, 0, 3);
|
||||||
|
yx = cogl_matrix_get_value (&pm, 1, 0);
|
||||||
|
yy = cogl_matrix_get_value (&pm, 1, 1);
|
||||||
|
yw = cogl_matrix_get_value (&pm, 1, 3);
|
||||||
|
wx = cogl_matrix_get_value (&pm, 3, 0);
|
||||||
|
wy = cogl_matrix_get_value (&pm, 3, 1);
|
||||||
|
ww = cogl_matrix_get_value (&pm, 3, 3);
|
||||||
|
|
||||||
cogl_framebuffer_get_viewport4fv (framebuffer, v);
|
cogl_framebuffer_get_viewport4fv (framebuffer, v);
|
||||||
viewport_width = v[2];
|
viewport_width = v[2];
|
||||||
viewport_height = v[3];
|
viewport_height = v[3];
|
||||||
@ -287,9 +300,9 @@ get_paint_level (ClutterPaintContext *paint_context,
|
|||||||
u0 = width / 2.;
|
u0 = width / 2.;
|
||||||
v0 = height / 2.;
|
v0 = height / 2.;
|
||||||
|
|
||||||
xc = pm.xx * u0 + pm.xy * v0 + pm.xw;
|
xc = xx * u0 + xy * v0 + xw;
|
||||||
yc = pm.yx * u0 + pm.yy * v0 + pm.yw;
|
yc = yx * u0 + yy * v0 + yw;
|
||||||
wc = pm.wx * u0 + pm.wy * v0 + pm.ww;
|
wc = wx * u0 + wy * v0 + ww;
|
||||||
|
|
||||||
/* We'll simplify the equations below for a bit of micro-optimization.
|
/* We'll simplify the equations below for a bit of micro-optimization.
|
||||||
* The commented out code is the unsimplified version.
|
* The commented out code is the unsimplified version.
|
||||||
@ -302,10 +315,10 @@ get_paint_level (ClutterPaintContext *paint_context,
|
|||||||
// with respect to u, v, using
|
// with respect to u, v, using
|
||||||
// d(a/b)/dx = da/dx * (1/b) - a * db/dx / (b^2)
|
// d(a/b)/dx = da/dx * (1/b) - a * db/dx / (b^2)
|
||||||
|
|
||||||
dxdu = 0.5 * viewport_width * (pm.xx - pm.wx * (xc/wc)) / wc;
|
dxdu = 0.5 * viewport_width * (xx - wx * (xc/wc)) / wc;
|
||||||
dxdv = 0.5 * viewport_width * (pm.xy - pm.wy * (xc/wc)) / wc;
|
dxdv = 0.5 * viewport_width * (xy - wy * (xc/wc)) / wc;
|
||||||
dydu = 0.5 * viewport_height * (pm.yx - pm.wx * (yc/wc)) / wc;
|
dydu = 0.5 * viewport_height * (yx - wx * (yc/wc)) / wc;
|
||||||
dydv = 0.5 * viewport_height * (pm.yy - pm.wy * (yc/wc)) / wc;
|
dydv = 0.5 * viewport_height * (yy - wy * (yc/wc)) / wc;
|
||||||
|
|
||||||
// Compute the inverse partials as the matrix inverse
|
// Compute the inverse partials as the matrix inverse
|
||||||
det = dxdu * dydv - dxdv * dydu;
|
det = dxdu * dydv - dxdv * dydu;
|
||||||
@ -324,10 +337,10 @@ get_paint_level (ClutterPaintContext *paint_context,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
/* dxdu * wc, etc */
|
/* dxdu * wc, etc */
|
||||||
dxdu_ = 0.5 * viewport_width * (pm.xx - pm.wx * (xc/wc));
|
dxdu_ = 0.5 * viewport_width * (xx - wx * (xc/wc));
|
||||||
dxdv_ = 0.5 * viewport_width * (pm.xy - pm.wy * (xc/wc));
|
dxdv_ = 0.5 * viewport_width * (xy - wy * (xc/wc));
|
||||||
dydu_ = 0.5 * viewport_height * (pm.yx - pm.wx * (yc/wc));
|
dydu_ = 0.5 * viewport_height * (yx - wx * (yc/wc));
|
||||||
dydv_ = 0.5 * viewport_height * (pm.yy - pm.wy * (yc/wc));
|
dydv_ = 0.5 * viewport_height * (yy - wy * (yc/wc));
|
||||||
|
|
||||||
/* det * wc^2 */
|
/* det * wc^2 */
|
||||||
det_ = dxdu_ * dydv_ - dxdv_ * dydu_;
|
det_ = dxdu_ * dydv_ - dxdv_ * dydu_;
|
||||||
@ -340,7 +353,7 @@ get_paint_level (ClutterPaintContext *paint_context,
|
|||||||
lambda = 0.5 * M_LOG2E * log (rho_sq * wc * wc / det_sq) + LOD_BIAS;
|
lambda = 0.5 * M_LOG2E * log (rho_sq * wc * wc / det_sq) + LOD_BIAS;
|
||||||
|
|
||||||
#if 0
|
#if 0
|
||||||
g_print ("%g %g %g\n", 0.5 * viewport_width * pm.xx / pm.ww, 0.5 * viewport_height * pm.yy / pm.ww, lambda);
|
g_print ("%g %g %g\n", 0.5 * viewport_width * xx / ww, 0.5 * viewport_height * yy / ww, lambda);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
if (lambda <= 0.)
|
if (lambda <= 0.)
|
||||||
|
@ -232,7 +232,7 @@ setup_viewport (CoglFramebuffer *framebuffer,
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
cogl_framebuffer_get_projection_matrix (framebuffer, &projection_matrix);
|
cogl_framebuffer_get_projection_matrix (framebuffer, &projection_matrix);
|
||||||
z_camera = 0.5 * projection_matrix.xx;
|
z_camera = 0.5 * cogl_matrix_get_value (&projection_matrix, 0, 0);
|
||||||
|
|
||||||
cogl_matrix_init_identity (&mv_matrix);
|
cogl_matrix_init_identity (&mv_matrix);
|
||||||
cogl_matrix_translate (&mv_matrix, -0.5f, -0.5f, -z_camera);
|
cogl_matrix_translate (&mv_matrix, -0.5f, -0.5f, -z_camera);
|
||||||
|
Loading…
Reference in New Issue
Block a user