379 lines
8.5 KiB
Plaintext
379 lines
8.5 KiB
Plaintext
|
/*
|
||
|
* Copyright (C) 2011 The Android Open Source Project
|
||
|
*
|
||
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
||
|
* you may not use this file except in compliance with the License.
|
||
|
* You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
||
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
|
* See the License for the specific language governing permissions and
|
||
|
* limitations under the License.
|
||
|
*/
|
||
|
|
||
|
/** @file rs_matrix.rsh
|
||
|
* \brief Matrix routines
|
||
|
*
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
#ifndef __RS_MATRIX_RSH__
|
||
|
#define __RS_MATRIX_RSH__
|
||
|
|
||
|
/**
|
||
|
* Set one element of a matrix.
|
||
|
*
|
||
|
* @param m The matrix to be set
|
||
|
* @param row
|
||
|
* @param col
|
||
|
* @param v
|
||
|
*
|
||
|
* @return void
|
||
|
*/
|
||
|
_RS_RUNTIME void __attribute__((overloadable))
|
||
|
rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME void __attribute__((overloadable))
|
||
|
rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME void __attribute__((overloadable))
|
||
|
rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v);
|
||
|
|
||
|
/**
|
||
|
* Get one element of a matrix.
|
||
|
*
|
||
|
* @param m The matrix to read from
|
||
|
* @param row
|
||
|
* @param col
|
||
|
*
|
||
|
* @return float
|
||
|
*/
|
||
|
_RS_RUNTIME float __attribute__((overloadable))
|
||
|
rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float __attribute__((overloadable))
|
||
|
rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float __attribute__((overloadable))
|
||
|
rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col);
|
||
|
|
||
|
/**
|
||
|
* Set the elements of a matrix to the identity matrix.
|
||
|
*
|
||
|
* @param m
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix4x4 *m);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix3x3 *m);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix2x2 *m);
|
||
|
|
||
|
/**
|
||
|
* Set the elements of a matrix from an array of floats.
|
||
|
*
|
||
|
* @param m
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const float *v);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const float *v);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const float *v);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v);
|
||
|
|
||
|
/**
|
||
|
* Set the elements of a matrix from another matrix.
|
||
|
*
|
||
|
* @param m
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v);
|
||
|
|
||
|
/**
|
||
|
* Load a rotation matrix.
|
||
|
*
|
||
|
* @param m
|
||
|
* @param rot
|
||
|
* @param x
|
||
|
* @param y
|
||
|
* @param z
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
|
||
|
|
||
|
/**
|
||
|
* Load a scale matrix.
|
||
|
*
|
||
|
* @param m
|
||
|
* @param x
|
||
|
* @param y
|
||
|
* @param z
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z);
|
||
|
|
||
|
/**
|
||
|
* Load a translation matrix.
|
||
|
*
|
||
|
* @param m
|
||
|
* @param x
|
||
|
* @param y
|
||
|
* @param z
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z);
|
||
|
|
||
|
/**
|
||
|
* Multiply two matrix (lhs, rhs) and place the result in m.
|
||
|
*
|
||
|
* @param m
|
||
|
* @param lhs
|
||
|
* @param rhs
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs);
|
||
|
|
||
|
/**
|
||
|
* Multiply the matrix m by rhs and place the result back into m.
|
||
|
*
|
||
|
* @param m (lhs)
|
||
|
* @param rhs
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs);
|
||
|
|
||
|
/**
|
||
|
* Multiple matrix m with a rotation matrix
|
||
|
*
|
||
|
* @param m
|
||
|
* @param rot
|
||
|
* @param x
|
||
|
* @param y
|
||
|
* @param z
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
|
||
|
|
||
|
/**
|
||
|
* Multiple matrix m with a scale matrix
|
||
|
*
|
||
|
* @param m
|
||
|
* @param x
|
||
|
* @param y
|
||
|
* @param z
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixScale(rs_matrix4x4 *m, float x, float y, float z);
|
||
|
|
||
|
/**
|
||
|
* Multiple matrix m with a translation matrix
|
||
|
*
|
||
|
* @param m
|
||
|
* @param x
|
||
|
* @param y
|
||
|
* @param z
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z);
|
||
|
|
||
|
/**
|
||
|
* Load an Ortho projection matrix constructed from the 6 planes
|
||
|
*
|
||
|
* @param m
|
||
|
* @param left
|
||
|
* @param right
|
||
|
* @param bottom
|
||
|
* @param top
|
||
|
* @param near
|
||
|
* @param far
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
|
||
|
|
||
|
/**
|
||
|
* Load an Frustum projection matrix constructed from the 6 planes
|
||
|
*
|
||
|
* @param m
|
||
|
* @param left
|
||
|
* @param right
|
||
|
* @param bottom
|
||
|
* @param top
|
||
|
* @param near
|
||
|
* @param far
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
|
||
|
|
||
|
/**
|
||
|
* Load an perspective projection matrix constructed from the 6 planes
|
||
|
*
|
||
|
* @param m
|
||
|
* @param fovy Field of view, in degrees along the Y axis.
|
||
|
* @param aspect Ratio of x / y.
|
||
|
* @param near
|
||
|
* @param far
|
||
|
*/
|
||
|
extern void __attribute__((overloadable))
|
||
|
rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
|
||
|
|
||
|
#if !defined(RS_VERSION) || (RS_VERSION < 14)
|
||
|
/**
|
||
|
* Multiply a vector by a matrix and return the result vector.
|
||
|
* API version 10-13
|
||
|
*/
|
||
|
_RS_RUNTIME float4 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(rs_matrix4x4 *m, float4 in);
|
||
|
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float4 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(rs_matrix4x4 *m, float3 in);
|
||
|
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float4 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(rs_matrix4x4 *m, float2 in);
|
||
|
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float3 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(rs_matrix3x3 *m, float3 in);
|
||
|
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float3 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(rs_matrix3x3 *m, float2 in);
|
||
|
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float2 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(rs_matrix2x2 *m, float2 in);
|
||
|
#else
|
||
|
/**
|
||
|
* Multiply a vector by a matrix and return the result vector.
|
||
|
* API version 14+
|
||
|
*/
|
||
|
_RS_RUNTIME float4 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(const rs_matrix4x4 *m, float4 in);
|
||
|
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float4 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(const rs_matrix4x4 *m, float3 in);
|
||
|
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float4 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(const rs_matrix4x4 *m, float2 in);
|
||
|
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float3 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(const rs_matrix3x3 *m, float3 in);
|
||
|
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float3 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(const rs_matrix3x3 *m, float2 in);
|
||
|
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
_RS_RUNTIME float2 __attribute__((overloadable))
|
||
|
rsMatrixMultiply(const rs_matrix2x2 *m, float2 in);
|
||
|
#endif
|
||
|
|
||
|
|
||
|
/**
|
||
|
* Returns true if the matrix was successfully inversed
|
||
|
*
|
||
|
* @param m
|
||
|
*/
|
||
|
extern bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m);
|
||
|
|
||
|
/**
|
||
|
* Returns true if the matrix was successfully inversed and transposed.
|
||
|
*
|
||
|
* @param m
|
||
|
*/
|
||
|
extern bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m);
|
||
|
|
||
|
/**
|
||
|
* Transpose the matrix m.
|
||
|
*
|
||
|
* @param m
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m);
|
||
|
/**
|
||
|
* \overload
|
||
|
*/
|
||
|
extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m);
|
||
|
|
||
|
|
||
|
#endif
|