Home | History | Annotate | Download | only in include
      1 /*
      2  * Copyright (C) 2011 The Android Open Source Project
      3  *
      4  * Licensed under the Apache License, Version 2.0 (the "License");
      5  * you may not use this file except in compliance with the License.
      6  * You may obtain a copy of the License at
      7  *
      8  *      http://www.apache.org/licenses/LICENSE-2.0
      9  *
     10  * Unless required by applicable law or agreed to in writing, software
     11  * distributed under the License is distributed on an "AS IS" BASIS,
     12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
     13  * See the License for the specific language governing permissions and
     14  * limitations under the License.
     15  */
     16 
     17 /** @file rs_matrix.rsh
     18  *  \brief Matrix routines
     19  *
     20  *
     21  */
     22 
     23 #ifndef __RS_MATRIX_RSH__
     24 #define __RS_MATRIX_RSH__
     25 
     26 /**
     27  * Set one element of a matrix.
     28  *
     29  * @param m The matrix to be set
     30  * @param row
     31  * @param col
     32  * @param v
     33  *
     34  * @return void
     35  */
     36 _RS_RUNTIME void __attribute__((overloadable))
     37 rsMatrixSet(rs_matrix4x4 *m, uint32_t row, uint32_t col, float v);
     38 /**
     39  * \overload
     40  */
     41 _RS_RUNTIME void __attribute__((overloadable))
     42 rsMatrixSet(rs_matrix3x3 *m, uint32_t row, uint32_t col, float v);
     43 /**
     44  * \overload
     45  */
     46 _RS_RUNTIME void __attribute__((overloadable))
     47 rsMatrixSet(rs_matrix2x2 *m, uint32_t row, uint32_t col, float v);
     48 
     49 /**
     50  * Get one element of a matrix.
     51  *
     52  * @param m The matrix to read from
     53  * @param row
     54  * @param col
     55  *
     56  * @return float
     57  */
     58 _RS_RUNTIME float __attribute__((overloadable))
     59 rsMatrixGet(const rs_matrix4x4 *m, uint32_t row, uint32_t col);
     60 /**
     61  * \overload
     62  */
     63 _RS_RUNTIME float __attribute__((overloadable))
     64 rsMatrixGet(const rs_matrix3x3 *m, uint32_t row, uint32_t col);
     65 /**
     66  * \overload
     67  */
     68 _RS_RUNTIME float __attribute__((overloadable))
     69 rsMatrixGet(const rs_matrix2x2 *m, uint32_t row, uint32_t col);
     70 
     71 /**
     72  * Set the elements of a matrix to the identity matrix.
     73  *
     74  * @param m
     75  */
     76 extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix4x4 *m);
     77 /**
     78  * \overload
     79  */
     80 extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix3x3 *m);
     81 /**
     82  * \overload
     83  */
     84 extern void __attribute__((overloadable)) rsMatrixLoadIdentity(rs_matrix2x2 *m);
     85 
     86 /**
     87  * Set the elements of a matrix from an array of floats.
     88  *
     89  * @param m
     90  */
     91 extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const float *v);
     92 /**
     93  * \overload
     94  */
     95 extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const float *v);
     96 /**
     97  * \overload
     98  */
     99 extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const float *v);
    100 /**
    101  * \overload
    102  */
    103 extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix4x4 *v);
    104 /**
    105  * \overload
    106  */
    107 extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix3x3 *v);
    108 
    109 /**
    110  * Set the elements of a matrix from another matrix.
    111  *
    112  * @param m
    113  */
    114 extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix4x4 *m, const rs_matrix2x2 *v);
    115 /**
    116  * \overload
    117  */
    118 extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix3x3 *m, const rs_matrix3x3 *v);
    119 /**
    120  * \overload
    121  */
    122 extern void __attribute__((overloadable)) rsMatrixLoad(rs_matrix2x2 *m, const rs_matrix2x2 *v);
    123 
    124 /**
    125  * Load a rotation matrix.
    126  *
    127  * @param m
    128  * @param rot
    129  * @param x
    130  * @param y
    131  * @param z
    132  */
    133 extern void __attribute__((overloadable))
    134 rsMatrixLoadRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
    135 
    136 /**
    137  * Load a scale matrix.
    138  *
    139  * @param m
    140  * @param x
    141  * @param y
    142  * @param z
    143  */
    144 extern void __attribute__((overloadable))
    145 rsMatrixLoadScale(rs_matrix4x4 *m, float x, float y, float z);
    146 
    147 /**
    148  * Load a translation matrix.
    149  *
    150  * @param m
    151  * @param x
    152  * @param y
    153  * @param z
    154  */
    155 extern void __attribute__((overloadable))
    156 rsMatrixLoadTranslate(rs_matrix4x4 *m, float x, float y, float z);
    157 
    158 /**
    159  * Multiply two matrix (lhs, rhs) and place the result in m.
    160  *
    161  * @param m
    162  * @param lhs
    163  * @param rhs
    164  */
    165 extern void __attribute__((overloadable))
    166 rsMatrixLoadMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *lhs, const rs_matrix4x4 *rhs);
    167 /**
    168  * \overload
    169  */
    170 extern void __attribute__((overloadable))
    171 rsMatrixLoadMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *lhs, const rs_matrix3x3 *rhs);
    172 /**
    173  * \overload
    174  */
    175 extern void __attribute__((overloadable))
    176 rsMatrixLoadMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *lhs, const rs_matrix2x2 *rhs);
    177 
    178 /**
    179  * Multiply the matrix m by rhs and place the result back into m.
    180  *
    181  * @param m (lhs)
    182  * @param rhs
    183  */
    184 extern void __attribute__((overloadable))
    185 rsMatrixMultiply(rs_matrix4x4 *m, const rs_matrix4x4 *rhs);
    186 /**
    187  * \overload
    188  */
    189 extern void __attribute__((overloadable))
    190 rsMatrixMultiply(rs_matrix3x3 *m, const rs_matrix3x3 *rhs);
    191 /**
    192  * \overload
    193  */
    194 extern void __attribute__((overloadable))
    195 rsMatrixMultiply(rs_matrix2x2 *m, const rs_matrix2x2 *rhs);
    196 
    197 /**
    198  * Multiple matrix m with a rotation matrix
    199  *
    200  * @param m
    201  * @param rot
    202  * @param x
    203  * @param y
    204  * @param z
    205  */
    206 extern void __attribute__((overloadable))
    207 rsMatrixRotate(rs_matrix4x4 *m, float rot, float x, float y, float z);
    208 
    209 /**
    210  * Multiple matrix m with a scale matrix
    211  *
    212  * @param m
    213  * @param x
    214  * @param y
    215  * @param z
    216  */
    217 extern void __attribute__((overloadable))
    218 rsMatrixScale(rs_matrix4x4 *m, float x, float y, float z);
    219 
    220 /**
    221  * Multiple matrix m with a translation matrix
    222  *
    223  * @param m
    224  * @param x
    225  * @param y
    226  * @param z
    227  */
    228 extern void __attribute__((overloadable))
    229 rsMatrixTranslate(rs_matrix4x4 *m, float x, float y, float z);
    230 
    231 /**
    232  * Load an Ortho projection matrix constructed from the 6 planes
    233  *
    234  * @param m
    235  * @param left
    236  * @param right
    237  * @param bottom
    238  * @param top
    239  * @param near
    240  * @param far
    241  */
    242 extern void __attribute__((overloadable))
    243 rsMatrixLoadOrtho(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
    244 
    245 /**
    246  * Load an Frustum projection matrix constructed from the 6 planes
    247  *
    248  * @param m
    249  * @param left
    250  * @param right
    251  * @param bottom
    252  * @param top
    253  * @param near
    254  * @param far
    255  */
    256 extern void __attribute__((overloadable))
    257 rsMatrixLoadFrustum(rs_matrix4x4 *m, float left, float right, float bottom, float top, float near, float far);
    258 
    259 /**
    260  * Load an perspective projection matrix constructed from the 6 planes
    261  *
    262  * @param m
    263  * @param fovy Field of view, in degrees along the Y axis.
    264  * @param aspect Ratio of x / y.
    265  * @param near
    266  * @param far
    267  */
    268 extern void __attribute__((overloadable))
    269 rsMatrixLoadPerspective(rs_matrix4x4* m, float fovy, float aspect, float near, float far);
    270 
    271 #if !defined(RS_VERSION) || (RS_VERSION < 14)
    272 /**
    273  * Multiply a vector by a matrix and return the result vector.
    274  * API version 10-13
    275  */
    276 _RS_RUNTIME float4 __attribute__((overloadable))
    277 rsMatrixMultiply(rs_matrix4x4 *m, float4 in);
    278 
    279 /**
    280  * \overload
    281  */
    282 _RS_RUNTIME float4 __attribute__((overloadable))
    283 rsMatrixMultiply(rs_matrix4x4 *m, float3 in);
    284 
    285 /**
    286  * \overload
    287  */
    288 _RS_RUNTIME float4 __attribute__((overloadable))
    289 rsMatrixMultiply(rs_matrix4x4 *m, float2 in);
    290 
    291 /**
    292  * \overload
    293  */
    294 _RS_RUNTIME float3 __attribute__((overloadable))
    295 rsMatrixMultiply(rs_matrix3x3 *m, float3 in);
    296 
    297 /**
    298  * \overload
    299  */
    300 _RS_RUNTIME float3 __attribute__((overloadable))
    301 rsMatrixMultiply(rs_matrix3x3 *m, float2 in);
    302 
    303 /**
    304  * \overload
    305  */
    306 _RS_RUNTIME float2 __attribute__((overloadable))
    307 rsMatrixMultiply(rs_matrix2x2 *m, float2 in);
    308 #else
    309 /**
    310  * Multiply a vector by a matrix and return the result vector.
    311  * API version 14+
    312  */
    313 _RS_RUNTIME float4 __attribute__((overloadable))
    314 rsMatrixMultiply(const rs_matrix4x4 *m, float4 in);
    315 
    316 /**
    317  * \overload
    318  */
    319 _RS_RUNTIME float4 __attribute__((overloadable))
    320 rsMatrixMultiply(const rs_matrix4x4 *m, float3 in);
    321 
    322 /**
    323  * \overload
    324  */
    325 _RS_RUNTIME float4 __attribute__((overloadable))
    326 rsMatrixMultiply(const rs_matrix4x4 *m, float2 in);
    327 
    328 /**
    329  * \overload
    330  */
    331 _RS_RUNTIME float3 __attribute__((overloadable))
    332 rsMatrixMultiply(const rs_matrix3x3 *m, float3 in);
    333 
    334 /**
    335  * \overload
    336  */
    337 _RS_RUNTIME float3 __attribute__((overloadable))
    338 rsMatrixMultiply(const rs_matrix3x3 *m, float2 in);
    339 
    340 /**
    341  * \overload
    342  */
    343 _RS_RUNTIME float2 __attribute__((overloadable))
    344 rsMatrixMultiply(const rs_matrix2x2 *m, float2 in);
    345 #endif
    346 
    347 
    348 /**
    349  * Returns true if the matrix was successfully inversed
    350  *
    351  * @param m
    352  */
    353 extern bool __attribute__((overloadable)) rsMatrixInverse(rs_matrix4x4 *m);
    354 
    355 /**
    356  * Returns true if the matrix was successfully inversed and transposed.
    357  *
    358  * @param m
    359  */
    360 extern bool __attribute__((overloadable)) rsMatrixInverseTranspose(rs_matrix4x4 *m);
    361 
    362 /**
    363  * Transpose the matrix m.
    364  *
    365  * @param m
    366  */
    367 extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix4x4 *m);
    368 /**
    369  * \overload
    370  */
    371 extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix3x3 *m);
    372 /**
    373  * \overload
    374  */
    375 extern void __attribute__((overloadable)) rsMatrixTranspose(rs_matrix2x2 *m);
    376 
    377 
    378 #endif
    379