1044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/* 2044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Copyright (C) 2011 The Android Open Source Project 3044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 4044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * you may not use this file except in compliance with the License. 6044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * You may obtain a copy of the License at 7044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 8044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 9044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 10044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Unless required by applicable law or agreed to in writing, software 11044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * See the License for the specific language governing permissions and 14044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * limitations under the License. 15044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 16044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 17044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** @file rs_matrix.rsh 18044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \brief Matrix routines 19044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 20044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 21044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 22044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 23044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams#ifndef __RS_MATRIX_RSH__ 24044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams#define __RS_MATRIX_RSH__ 25044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 26044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 27044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Set one element of a matrix. 28044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 29044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m The matrix to be set 30044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param row 31044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param col 32044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param v 33044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 34044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @return void 35044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 36044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME void __attribute__((overloadable)) 37044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v); 38044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 39044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 40044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 41044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME void __attribute__((overloadable)) 42044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v); 43044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 44044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 45044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 46044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME void __attribute__((overloadable)) 47044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v); 48044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 49044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 50044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Get one element of a matrix. 51044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 52044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m The matrix to read from 53044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param row 54044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param col 55044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 56044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @return float 57044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 58044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float __attribute__((overloadable)) 59044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col); 60044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 61044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 62044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 63044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float __attribute__((overloadable)) 64044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col); 65044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 66044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 67044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 68044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float __attribute__((overloadable)) 69044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col); 70044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 71044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 72044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Set the elements of a matrix to the identity matrix. 73044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 74044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 75044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 76044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix4x4 *m); 77044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 78044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 79044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 80044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix3x3 *m); 81044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 82044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 83044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 84044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix2x2 *m); 85044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 86044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 87044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Set the elements of a matrix from an array of floats. 88044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 89044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 90044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 91044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const float *v); 92044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 93044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 94044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 95044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const float *v); 96044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 97044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 98044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 99044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const float *v); 100044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 101044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 102044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 103044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v); 104044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 105044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 106044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 107044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v); 108044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 109044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 110044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Set the elements of a matrix from another matrix. 111044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 112044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 113044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 114044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v); 115044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 116044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 117044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 118044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v); 119044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 120044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 121044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 122044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v); 123044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 124044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 125044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Load a rotation matrix. 126044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 127044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 128044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param rot 129044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param x 130044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param y 131044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param z 132044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 133044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 134044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z); 135044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 136044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 137044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Load a scale matrix. 138044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 139044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 140044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param x 141044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param y 142044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param z 143044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 144044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 145044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z); 146044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 147044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 148044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Load a translation matrix. 149044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 150044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 151044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param x 152044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param y 153044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param z 154044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 155044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 156044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z); 157044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 158044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 159044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Multiply two matrix (lhs, rhs) and place the result in m. 160044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 161044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 162044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param lhs 163044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param rhs 164044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 165044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 166044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs); 167044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 168044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 169044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 170044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 171044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs); 172044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 173044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 174044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 175044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 176044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs); 177044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 178044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 179044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Multiply the matrix m by rhs and place the result back into m. 180044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 181044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m (lhs) 182044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param rhs 183044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 184044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 185044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs); 186044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 187044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 188044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 189044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 190044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs); 191044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 192044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 193044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 194044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 195044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs); 196044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 197044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 198044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Multiple matrix m with a rotation matrix 199044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 200044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 201044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param rot 202044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param x 203044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param y 204044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param z 205044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 206044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 207044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z); 208044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 209044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 210044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Multiple matrix m with a scale matrix 211044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 212044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 213044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param x 214044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param y 215044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param z 216044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 217044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 218044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixScale(rs_matrix4x4 *m, float x, float y, float z); 219044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 220044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 221044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Multiple matrix m with a translation matrix 222044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 223044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 224044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param x 225044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param y 226044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param z 227044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 228044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 229044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z); 230044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 231044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 232044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Load an Ortho projection matrix constructed from the 6 planes 233044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 234044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 235044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param left 236044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param right 237044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param bottom 238044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param top 239044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param near 240044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param far 241044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 242044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 243044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far); 244044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 245044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 246044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Load an Frustum projection matrix constructed from the 6 planes 247044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 248044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 249044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param left 250044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param right 251044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param bottom 252044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param top 253044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param near 254044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param far 255044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 256044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 257044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far); 258044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 259044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 260044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Load an perspective projection matrix constructed from the 6 planes 261044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 262044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 263044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param fovy Field of view, in degrees along the Y axis. 264044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param aspect Ratio of x / y. 265044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param near 266044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param far 267044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 268044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) 269044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far); 270044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 271044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams#if !defined(RS_VERSION) || (RS_VERSION < 14) 272044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 273044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Multiply a vector by a matrix and return the result vector. 274044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * API version 10-13 275044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 276044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float4 __attribute__((overloadable)) 277044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(rs_matrix4x4 *m, float4 in); 278044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 279044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 280044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 281044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 282044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float4 __attribute__((overloadable)) 283044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(rs_matrix4x4 *m, float3 in); 284044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 285044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 286044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 287044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 288044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float4 __attribute__((overloadable)) 289044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(rs_matrix4x4 *m, float2 in); 290044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 291044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 292044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 293044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 294044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float3 __attribute__((overloadable)) 295044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(rs_matrix3x3 *m, float3 in); 296044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 297044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 298044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 299044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 300044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float3 __attribute__((overloadable)) 301044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(rs_matrix3x3 *m, float2 in); 302044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 303044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 304044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 305044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 306044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float2 __attribute__((overloadable)) 307044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(rs_matrix2x2 *m, float2 in); 308044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams#else 309044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 310044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Multiply a vector by a matrix and return the result vector. 3114325387cee36fe373b1a792fb2e65ef00535bbddAlex Sakhartchouk * API version 14+ 312044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 313044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float4 __attribute__((overloadable)) 314044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float4 in); 315044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 316044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 317044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 318044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 319044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float4 __attribute__((overloadable)) 320044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float3 in); 321044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 322044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 323044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 324044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 325044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float4 __attribute__((overloadable)) 326044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(const rs_matrix4x4 *m, float2 in); 327044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 328044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 329044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 330044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 331044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float3 __attribute__((overloadable)) 332044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(const rs_matrix3x3 *m, float3 in); 333044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 334044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 335044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 336044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 337044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float3 __attribute__((overloadable)) 338044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(const rs_matrix3x3 *m, float2 in); 339044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 340044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 341044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 342044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 343044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams_RS_RUNTIME float2 __attribute__((overloadable)) 344044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason SamsrsMatrixMultiply(const rs_matrix2x2 *m, float2 in); 345044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams#endif 346044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 347044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 348044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 349044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Returns true if the matrix was successfully inversed 350044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 351044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 352044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 353044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m); 354044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 355044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 356044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Returns true if the matrix was successfully inversed and transposed. 357044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 358044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 359044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 360044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m); 361044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 362044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 363044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * Transpose the matrix m. 364044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * 365044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * @param m 366044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 367044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m); 368044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 369044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 370044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 371044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m); 372044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams/** 373044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams * \overload 374044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams */ 375044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Samsextern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m); 376044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 377044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams 378044e2ee36ffe6520570a7f0207d75a8fce8b8e91Jason Sams#endif 379