From d13114520acef63f9293ff313b8a549bc81be30c Mon Sep 17 00:00:00 2001 From: Tony Crisci Date: Sun, 21 Jan 2018 15:53:29 -0500 Subject: move matrix model code to matrix.h --- render/matrix.c | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 46 insertions(+) (limited to 'render/matrix.c') diff --git a/render/matrix.c b/render/matrix.c index 54dba4cc..a64a8f9b 100644 --- a/render/matrix.c +++ b/render/matrix.c @@ -1,6 +1,8 @@ #include #include #include +#include +#include #include /* Obtains the index for the given row/column */ @@ -158,3 +160,47 @@ void wlr_matrix_texture(float mat[static 16], int32_t width, int32_t height, mat[10] = 1.0f; mat[15] = 1.0f; } + +void wlr_matrix_box_model(float (*mat)[16], struct wlr_box *box, + enum wl_output_transform transform, float rotation) { + int x = box->x; + int y = box->y; + int width = box->width; + int height = box->height; + + float translate_center[16]; + wlr_matrix_translate(&translate_center, + (int)x + width / 2, (int)y + height / 2, 0); + + float rotate[16]; + wlr_matrix_rotate(&rotate, rotation); + + float translate_origin[16]; + wlr_matrix_translate(&translate_origin, -width / 2, + -height / 2, 0); + + float scale[16]; + wlr_matrix_scale(&scale, width, height, 1); + + wlr_matrix_mul(&translate_center, &rotate, mat); + wlr_matrix_mul(mat, &translate_origin, mat); + wlr_matrix_mul(mat, &scale, mat); + + if (transform != WL_OUTPUT_TRANSFORM_NORMAL) { + float surface_translate_center[16]; + wlr_matrix_translate(&surface_translate_center, 0.5, 0.5, 0); + + float surface_transform[16]; + wlr_matrix_transform(surface_transform, + wlr_output_transform_invert(transform)); + + float surface_translate_origin[16]; + wlr_matrix_translate(&surface_translate_origin, -0.5, -0.5, 0); + + wlr_matrix_mul(mat, &surface_translate_center, + mat); + wlr_matrix_mul(mat, &surface_transform, mat); + wlr_matrix_mul(mat, &surface_translate_origin, + mat); + } +} -- cgit v1.2.3