/* * 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