mirror of
https://github.com/brl/mutter.git
synced 2024-11-28 19:10:43 -05:00
cogl/matrix: Look-at using graphene matrices
https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1439
This commit is contained in:
parent
2b7a73e0c3
commit
0dbd6d3a80
@ -1946,54 +1946,22 @@ cogl_matrix_look_at (CoglMatrix *matrix,
|
|||||||
float world_up_y,
|
float world_up_y,
|
||||||
float world_up_z)
|
float world_up_z)
|
||||||
{
|
{
|
||||||
CoglMatrix tmp;
|
graphene_matrix_t m;
|
||||||
graphene_vec3_t forward;
|
graphene_vec3_t eye;
|
||||||
graphene_vec3_t side;
|
graphene_vec3_t center;
|
||||||
graphene_vec3_t up;
|
graphene_vec3_t up;
|
||||||
|
CoglMatrix look_at;
|
||||||
|
|
||||||
/* Get a unit viewing direction vector */
|
graphene_vec3_init (&eye, eye_position_x, eye_position_y, eye_position_z);
|
||||||
graphene_vec3_init (&forward,
|
graphene_vec3_init (¢er, object_x, object_y, object_z);
|
||||||
object_x - eye_position_x,
|
|
||||||
object_y - eye_position_y,
|
|
||||||
object_z - eye_position_z);
|
|
||||||
graphene_vec3_normalize (&forward, &forward);
|
|
||||||
|
|
||||||
graphene_vec3_init (&up, world_up_x, world_up_y, world_up_z);
|
graphene_vec3_init (&up, world_up_x, world_up_y, world_up_z);
|
||||||
|
|
||||||
/* Take the sideways direction as being perpendicular to the viewing
|
graphene_matrix_init_look_at (&m, &eye, ¢er, &up);
|
||||||
* direction and the word up vector. */
|
|
||||||
graphene_vec3_cross (&forward, &up, &side);
|
|
||||||
graphene_vec3_normalize (&side, &side);
|
|
||||||
|
|
||||||
/* Now we have unit sideways and forward-direction vectors calculate
|
graphene_matrix_to_cogl_matrix (&m, &look_at);
|
||||||
* a new mutually perpendicular up vector. */
|
look_at.flags = MAT_FLAG_GENERAL_3D | MAT_DIRTY_TYPE | MAT_DIRTY_INVERSE;
|
||||||
graphene_vec3_cross (&side, &forward, &up);
|
|
||||||
|
|
||||||
tmp.xx = graphene_vec3_get_x (&side);
|
cogl_matrix_multiply (matrix, matrix, &look_at);
|
||||||
tmp.yx = graphene_vec3_get_y (&side);
|
|
||||||
tmp.zx = graphene_vec3_get_z (&side);
|
|
||||||
tmp.wx = 0;
|
|
||||||
|
|
||||||
tmp.xy = graphene_vec3_get_x (&up);
|
|
||||||
tmp.yy = graphene_vec3_get_y (&up);
|
|
||||||
tmp.zy = graphene_vec3_get_z (&up);
|
|
||||||
tmp.wy = 0;
|
|
||||||
|
|
||||||
tmp.xz = -graphene_vec3_get_x (&forward);
|
|
||||||
tmp.yz = -graphene_vec3_get_y (&forward);
|
|
||||||
tmp.zz = -graphene_vec3_get_z (&forward);
|
|
||||||
tmp.wz = 0;
|
|
||||||
|
|
||||||
tmp.xw = 0;
|
|
||||||
tmp.yw = 0;
|
|
||||||
tmp.zw = 0;
|
|
||||||
tmp.ww = 1;
|
|
||||||
|
|
||||||
tmp.flags = (MAT_FLAG_GENERAL_3D | MAT_DIRTY_TYPE | MAT_DIRTY_INVERSE);
|
|
||||||
|
|
||||||
cogl_matrix_translate (&tmp, -eye_position_x, -eye_position_y, -eye_position_z);
|
|
||||||
|
|
||||||
cogl_matrix_multiply (matrix, matrix, &tmp);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
|
Loading…
Reference in New Issue
Block a user