1
0
mirror of https://github.com/lvgl/lvgl.git synced 2025-01-28 07:03:00 +08:00
lvgl/libs/nema_gfx/include/nema_matrix4x4.h
Liam 30193c1035
feat(draw): add NemaGFX rendering backend (#7002)
Co-authored-by: Ioannis Markopoulos <Ioannis_Markopoulos@amat.com>
2024-10-13 08:13:56 +02:00

233 lines
8.4 KiB
C

/* TSI 2023.xmo */
/*******************************************************************************
* Copyright (c) 2023 Think Silicon Single Member PC
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this header file and/or associated documentation files to use, copy,
* modify, merge, publish, distribute, sublicense, and/or sell copies of the
* Materials, and to permit persons to whom the Materials are furnished to do
* so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Materials.
*
* MODIFICATIONS TO THIS FILE MAY MEAN IT NO LONGER ACCURATELY REFLECTS
* NEMAGFX API. THE UNMODIFIED, NORMATIVE VERSIONS OF THINK-SILICON NEMAGFX
* SPECIFICATIONS AND HEADER INFORMATION ARE LOCATED AT:
* https://think-silicon.com/products/software/nemagfx-api
*
* The software is provided 'as is', without warranty of any kind, express or
* implied, including but not limited to the warranties of merchantability,
* fitness for a particular purpose and noninfringement. In no event shall
* Think Silicon Single Member PC be liable for any claim, damages or other
* liability, whether in an action of contract, tort or otherwise, arising
* from, out of or in connection with the software or the use or other dealings
* in the software.
******************************************************************************/
#ifndef NEMA_MATRIX4X4_H__
#define NEMA_MATRIX4X4_H__
#ifdef __cplusplus
extern "C" {
#endif
typedef float nema_matrix4x4_t[4][4];
/** \brief Load a 4x4 Identity Matrix
*
* \param m Matrix to be loaded
*
*/
void nema_mat4x4_load_identity(nema_matrix4x4_t m);
/** \brief Multiply two 4x4 matrices
*
* \param m Result Matrix
* \param m_l Left operand
* \param m_r Right operand
*
*/
void nema_mat4x4_mul(nema_matrix4x4_t m,
nema_matrix4x4_t m_l,
nema_matrix4x4_t m_r);
void nema_mat4x4_copy(nema_matrix4x4_t m_l,
nema_matrix4x4_t m_r);
/** \brief Multiply a 4x1 vector with a 4x4 matrix
*
* \param m Matrix to be multiplied
* \param x Vector first element
* \param y Vector second element
* \param z Vector third element
* \param w Vector forth element
*
*/
void nema_mat4x4_mul_vec(nema_matrix4x4_t m, float *x, float *y, float *z, float *w);
// ------------------------------------------------------------------------------------
// Object Transformation - ModelView Matrix
// Object Coordinates to Eye Coordinates
// ------------------------------------------------------------------------------------
/** \brief Apply translate transformation
*
* \param m Matrix to apply transformation
* \param tx X translation factor
* \param ty Y translation factor
* \param tz Z translation factor
*
*/
void nema_mat4x4_translate(nema_matrix4x4_t m, float tx, float ty, float tz);
/** \brief Apply scale transformation
*
* \param m Matrix to apply transformation
* \param sx X scaling factor
* \param sy Y scaling factor
* \param sz Z scaling factor
*
*/
void nema_mat4x4_scale(nema_matrix4x4_t m, float sx, float sy, float sz);
/** \brief Apply rotate transformation around X axis
*
* \param m Matrix to apply transformation
* \param angle_degrees Angle to rotate in degrees
*
*/
void nema_mat4x4_rotate_X (nema_matrix4x4_t m, float angle_degrees);
/** \brief Apply rotate transformation around Y axis
*
* \param m Matrix to apply transformation
* \param angle_degrees Angle to rotate in degrees
*
*/
void nema_mat4x4_rotate_Y (nema_matrix4x4_t m, float angle_degrees);
/** \brief Apply rotate transformation around Z axis
*
* \param m Matrix to apply transformation
* \param angle_degrees Angle to rotate in degrees
*
*/
void nema_mat4x4_rotate_Z (nema_matrix4x4_t m, float angle_degrees);
// ------------------------------------------------------------------------------------
// Scene Transformation/Frustum - Projection Matrix
// Eye Coordinates to Clip Coordinates
// ------------------------------------------------------------------------------------
/** \brief Set up a perspective projection matrix
*
* \param m A 4x4 Matrix
* \param fovy_degrees Field of View in degrees
* \param aspect Aspect ratio that determines the field of view in the x direction.
* \param nearVal Distance from the viewer to the near clipping plane (always positive)
* \param farVal Distance from the viewer to the far clipping plane (always positive)
*
*/
void nema_mat4x4_load_perspective(nema_matrix4x4_t m, float fovy_degrees, float aspect,
float nearVal, float farVal);
/** \brief Set up a Right Hand perspective projection matrix
*
* \param m A 4x4 Matrix
* \param fovy_degrees Field of View in degrees
* \param aspect Aspect ratio that determines the field of view in the x direction.
* \param nearVal Distance from the viewer to the near clipping plane (always positive)
* \param farVal Distance from the viewer to the far clipping plane (always positive)
*
*/
void nema_mat4x4_load_perspective_rh(nema_matrix4x4_t m, float fovy_degrees, float aspect,
float nearVal, float farVal);
/** \brief Set up an orthographic projection matrix
*
* \param m A 4x4 Matrix
* \param left Left vertical clipping plane
* \param right Right vertical clipping plane
* \param bottom bottom horizontal clipping plane
* \param top Top horizontal clipping plane
* \param nearVal Distance from the viewer to the near clipping plane (always positive)
* \param farVal Distance from the viewer to the far clipping plane (always positive)
*
*/
void nema_mat4x4_load_ortho(nema_matrix4x4_t m,
float left, float right,
float bottom, float top,
float nearVal, float farVal);
/** \brief Set up a 2D orthographic projection matrix
*
* \param m A 4x4 Matrix
* \param left Left vertical clipping plane
* \param right Right vertical clipping plane
* \param bottom bottom horizontal clipping plane
* \param top Top horizontal clipping plane
*
*/
void nema_mat4x4_load_ortho_2d(nema_matrix4x4_t m,
float left, float right,
float bottom, float top);
/** \brief Set up a Right Hand view matrix.
*
* \param m A 4x4 Matrix
* \param eye_x Eye position x.
* \param eye_y Eye position y.
* \param eye_z Eye position z.
* \param center_x Center x to look at
* \param center_y Center y to look at
* \param center_z Center z to look at
* \param up_x Up vector x. (Usually 0)
* \param up_y Up vector y. (Usually 1)
* \param up_z Up vector z. (Usually 0)
*
*/
void nema_mat4x4_look_at_rh(nema_matrix4x4_t m,
float eye_x, float eye_y, float eye_z,
float center_x, float center_y, float center_z,
float up_x, float up_y, float up_z);
// ------------------------------------------------------------------------------------
// Clip Coordinates to Window Coordinates
// ------------------------------------------------------------------------------------
/** \brief Convenience Function to calculate window coordinates from object coordinates
*
* \param mvp Model, View and Projection Matrix
* \param x_orig Window top left X coordinate
* \param y_orig Window top left Y coordinate
* \param width Window width
* \param height Window height
* \param nearVal Distance from the viewer to the near clipping plane (always positive)
* \param farVal Distance from the viewer to the far clipping plane (always positive)
* \param x X object coordinate
* \param y Y object coordinate
* \param z Z object coordinate
* \param w W object coordinate
* \return 1 if vertex is outside frustum (should be clipped)
*
*/
int nema_mat4x4_obj_to_win_coords(nema_matrix4x4_t mvp,
float x_orig, float y_orig,
int width, int height,
float nearVal, float farVal,
float *x,
float *y,
float *z,
float *w);
#ifdef __cplusplus
}
#endif
#endif