1c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# 2c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# Copyright (C) 2015 The Android Open Source Project 3c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# 4c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# Licensed under the Apache License, Version 2.0 (the "License"); 5c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# you may not use this file except in compliance with the License. 6c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# You may obtain a copy of the License at 7c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# 8c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# http://www.apache.org/licenses/LICENSE-2.0 9c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# 10c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# Unless required by applicable law or agreed to in writing, software 11c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# distributed under the License is distributed on an "AS IS" BASIS, 12c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# See the License for the specific language governing permissions and 14c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# limitations under the License. 15c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet# 16c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 17c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletheader: 1820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Matrix Functions 19c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 20c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet These functions let you manipulate square matrices of rank 2x2, 3x3, and 4x4. 216386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet They are particularly useful for graphical transformations and are compatible 226386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet with OpenGL. 23c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 246386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet We use a zero-based index for rows and columns. E.g. the last element of a 256386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet @rs_matrix4x4 is found at (3, 3). 26c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 276386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet RenderScript uses column-major matrices and column-based vectors. Transforming 286386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet a vector is done by postmultiplying the vector, e.g. <code>(matrix * vector)</code>, 296386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet as provided by @rsMatrixMultiply(). 30c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 316386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet To create a transformation matrix that performs two transformations at once, 326386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet multiply the two source matrices, with the first transformation as the right 336386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet argument. E.g. to create a transformation matrix that applies the 346386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet transformation s1 followed by s2, call <code>rsMatrixLoadMultiply(&combined, &s2, &s1)</code>. 35c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet This derives from <code>s2 * (s1 * v)</code>, which is <code>(s2 * s1) * v</code>. 36c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 37c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet We have two style of functions to create transformation matrices: 386386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet rsMatrixLoad<i>Transformation</i> and rsMatrix<i>Transformation</i>. The former 396386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet style simply stores the transformation matrix in the first argument. The latter 406386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet modifies a pre-existing transformation matrix so that the new transformation 416386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet happens first. E.g. if you call @rsMatrixTranslate() on a matrix that already 426386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet does a scaling, the resulting matrix when applied to a vector will first do the 436386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet translation then the scaling. 44be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletinclude: 45be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet #include "rs_vector_math.rsh" 46be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletend: 47be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet 48be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletfunction: rsExtractFrustumPlanes 496e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamversion: 9 23 50be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletret: void 516386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: const rs_matrix4x4* viewProj, "Matrix to extract planes from." 526386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* left, "Left plane." 536386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* right, "Right plane." 546386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* top, "Top plane." 556386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* bottom, "Bottom plane." 566386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* near, "Near plane." 576386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* far, "Far plane." 5820b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Compute frustum planes 59be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletdescription: 60be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet Computes 6 frustum planes from the view projection matrix 61be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletinline: 62be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet // x y z w = a b c d in the plane equation 63be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet left->x = viewProj->m[3] + viewProj->m[0]; 64be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet left->y = viewProj->m[7] + viewProj->m[4]; 65be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet left->z = viewProj->m[11] + viewProj->m[8]; 66be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet left->w = viewProj->m[15] + viewProj->m[12]; 67be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet 68be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet right->x = viewProj->m[3] - viewProj->m[0]; 69be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet right->y = viewProj->m[7] - viewProj->m[4]; 70be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet right->z = viewProj->m[11] - viewProj->m[8]; 71be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet right->w = viewProj->m[15] - viewProj->m[12]; 72be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet 73be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet top->x = viewProj->m[3] - viewProj->m[1]; 74be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet top->y = viewProj->m[7] - viewProj->m[5]; 75be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet top->z = viewProj->m[11] - viewProj->m[9]; 76be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet top->w = viewProj->m[15] - viewProj->m[13]; 77be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet 78be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet bottom->x = viewProj->m[3] + viewProj->m[1]; 79be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet bottom->y = viewProj->m[7] + viewProj->m[5]; 80be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet bottom->z = viewProj->m[11] + viewProj->m[9]; 81be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet bottom->w = viewProj->m[15] + viewProj->m[13]; 82be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet 83be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet near->x = viewProj->m[3] + viewProj->m[2]; 84be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet near->y = viewProj->m[7] + viewProj->m[6]; 85be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet near->z = viewProj->m[11] + viewProj->m[10]; 86be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet near->w = viewProj->m[15] + viewProj->m[14]; 87be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet 88be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet far->x = viewProj->m[3] - viewProj->m[2]; 89be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet far->y = viewProj->m[7] - viewProj->m[6]; 90be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet far->z = viewProj->m[11] - viewProj->m[10]; 91be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet far->w = viewProj->m[15] - viewProj->m[14]; 92be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet 93be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet float len = length(left->xyz); 94be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet *left /= len; 95be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet len = length(right->xyz); 96be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet *right /= len; 97be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet len = length(top->xyz); 98be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet *top /= len; 99be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet len = length(bottom->xyz); 100be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet *bottom /= len; 101be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet len = length(near->xyz); 102be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet *near /= len; 103be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet len = length(far->xyz); 104be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet *far /= len; 105be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillettest: none 106be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletend: 107be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet 1086e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham# New version. Same signature but doesn't contain a body. 1096e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamfunction: rsExtractFrustumPlanes 1106e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamversion: 24 1116e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamret: void 1126e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: const rs_matrix4x4* viewProj 1136e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* left 1146e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* righ 1156e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* top 1166e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* bottom 1176e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* near 1186e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* far 1196e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamtest: none 1206e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamend: 1216e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham 122be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletfunction: rsIsSphereInFrustum 1236e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamversion: 9 23 1246e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamattrib: always_inline 125be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletret: bool 1266386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* sphere, "float4 representing the sphere." 1276386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* left, "Left plane." 1286386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* right, "Right plane." 1296386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* top, "Top plane." 1306386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* bottom, "Bottom plane." 1316386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* near, "Near plane." 1326386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float4* far, "Far plane." 13320b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouilletsummary: Checks if a sphere is within the frustum planes 134be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletdescription: 13520b27d602a4778ed50a83df2147416a35b7c92beJean-Luc Brouillet Returns true if the sphere is within the 6 frustum planes. 136be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouilletinline: 137be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet float distToCenter = dot(left->xyz, sphere->xyz) + left->w; 138be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet if (distToCenter < -sphere->w) { 139be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet return false; 140be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet } 141be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet distToCenter = dot(right->xyz, sphere->xyz) + right->w; 142be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet if (distToCenter < -sphere->w) { 143be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet return false; 144be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet } 145be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet distToCenter = dot(top->xyz, sphere->xyz) + top->w; 146be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet if (distToCenter < -sphere->w) { 147be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet return false; 148be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet } 149be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet distToCenter = dot(bottom->xyz, sphere->xyz) + bottom->w; 150be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet if (distToCenter < -sphere->w) { 151be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet return false; 152be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet } 153be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet distToCenter = dot(near->xyz, sphere->xyz) + near->w; 154be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet if (distToCenter < -sphere->w) { 155be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet return false; 156be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet } 157be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet distToCenter = dot(far->xyz, sphere->xyz) + far->w; 158be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet if (distToCenter < -sphere->w) { 159be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet return false; 160be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet } 161be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillet return true; 162be2163801c33d6849ae580d42b919b8803d55095Jean-Luc Brouillettest: none 163c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 164c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 1656e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham# New version. Same signature but doesn't contain a body. 1666e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamfunction: rsIsSphereInFrustum 1676e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamversion: 24 1686e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamret: bool 1696e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* sphere 1706e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* left 1716e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* right 1726e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* top 1736e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* bottom 1746e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* near 1756e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamarg: float4* far 1766e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamtest: none 1776e13ee21796fd86802f2688c6220544c99b68c40Verena Beckhamend: 1786e13ee21796fd86802f2688c6220544c99b68c40Verena Beckham 179c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixGet 180c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillett: rs_matrix4x4, rs_matrix3x3, rs_matrix2x2 181c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float 1826386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: const #1* m, "Matrix to extract the element from." 1836386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: uint32_t col, "Zero-based column of the element to be extracted." 1846386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: uint32_t row, "Zero-based row of the element to extracted." 185c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Get one element 186c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 187c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Returns one element of a matrix. 188c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 189c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet <b>Warning:</b> The order of the column and row parameters may be unexpected. 190c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 191c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 192c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 193c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixInverse 194c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: bool 1956386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to invert." 196c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Inverts a matrix in place 197c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 198c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Returns true if the matrix was successfully inverted. 199c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 200c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 201c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 202c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixInverseTranspose 203c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: bool 2046386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to modify." 205c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Inverts and transpose a matrix in place 206c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 2076386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet The matrix is first inverted then transposed. Returns true if the matrix was 2086386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet successfully inverted. 209c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 210c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 211c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 212c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoad 213c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillett: rs_matrix4x4, rs_matrix3x3, rs_matrix2x2 214c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 2156386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: #1* destination, "Matrix to set." 2166386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: const float* array, "Array of values to set the matrix to. These arrays should be 4, 9, or 16 floats long, depending on the matrix size." 217c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Load or copy a matrix 218c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 219c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Set the elements of a matrix from an array of floats or from another matrix. 220c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 221c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet If loading from an array, the floats should be in row-major order, i.e. the element a 222c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet <code>row 0, column 0</code> should be first, followed by the element at 223c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet <code>row 0, column 1</code>, etc. 224c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2256386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet If loading from a matrix and the source is smaller than the destination, the rest 2266386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet of the destination is filled with elements of the identity matrix. E.g. 227c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet loading a rs_matrix2x2 into a rs_matrix4x4 will give: 228c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet <table style="max-width:300px"> 229c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet <tr><td>m00</td> <td>m01</td> <td>0.0</td> <td>0.0</td></tr> 230c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet <tr><td>m10</td> <td>m11</td> <td>0.0</td> <td>0.0</td></tr> 231c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet <tr><td>0.0</td> <td>0.0</td> <td>1.0</td> <td>0.0</td></tr> 232c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet <tr><td>0.0</td> <td>0.0</td> <td>0.0</td> <td>1.0</td></tr> 233c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet </table> 234c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 235c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 236c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 237c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoad 238c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillett: rs_matrix4x4, rs_matrix3x3, rs_matrix2x2 239c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 240c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: #1* destination 2416386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: const #1* source, "Source matrix." 242c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 243c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 244c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 245c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoad 246c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillett: rs_matrix3x3, rs_matrix2x2 247c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 248c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_matrix4x4* destination 249c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: const #1* source 250c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 251c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 252c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 253c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoadFrustum 254c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 2556386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to set." 256c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float left 257c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float right 258c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float bottom 259c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float top 260c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float near 261c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float far 262c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Load a frustum projection matrix 263c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 2646386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet Constructs a frustum projection matrix, transforming the box identified by 2656386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet the six clipping planes <code>left, right, bottom, top, near, far</code>. 266c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 2676386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet To apply this projection to a vector, multiply the vector by the created 2686386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet matrix using @rsMatrixMultiply(). 269c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 270c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 271c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 272c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoadIdentity 273c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillett: rs_matrix4x4, rs_matrix3x3, rs_matrix2x2 274c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 2756386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: #1* m, "Matrix to set." 276c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Load identity matrix 277c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 278c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Set the elements of a matrix to the identity matrix. 279c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 280c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 281c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 282c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoadMultiply 283c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillett: rs_matrix4x4, rs_matrix3x3, rs_matrix2x2 284c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 2856386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: #1* m, "Matrix to set." 2866386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: const #1* lhs, "Left matrix of the product." 2876386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: const #1* rhs, "Right matrix of the product." 288c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Multiply two matrices 289c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 290c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Sets m to the matrix product of <code>lhs * rhs</code>. 291c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 292c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet To combine two 4x4 transformaton matrices, multiply the second transformation matrix 293c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet by the first transformation matrix. E.g. to create a transformation matrix that applies 2946386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet the transformation s1 followed by s2, call <code>rsMatrixLoadMultiply(&combined, &s2, &s1)</code>. 295c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 296c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet <b>Warning:</b> Prior to version 21, storing the result back into right matrix is not supported and 297c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet will result in undefined behavior. Use rsMatrixMulitply instead. E.g. instead of doing 2986386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet rsMatrixLoadMultiply (&m2r, &m2r, &m2l), use rsMatrixMultiply (&m2r, &m2l). 2996386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet rsMatrixLoadMultiply (&m2l, &m2r, &m2l) works as expected. 300c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 301c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 302c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 303c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoadOrtho 304c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 3056386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to set." 306c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float left 307c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float right 308c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float bottom 309c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float top 310c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float near 311c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float far 312c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Load an orthographic projection matrix 313c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 3146386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet Constructs an orthographic projection matrix, transforming the box identified by the 3156386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet six clipping planes <code>left, right, bottom, top, near, far</code> into a unit cube 3166386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet with a corner at <code>(-1, -1, -1)</code> and the opposite at <code>(1, 1, 1)</code>. 317c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 3186386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet To apply this projection to a vector, multiply the vector by the created matrix 3196386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet using @rsMatrixMultiply(). 320c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 321c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet See https://en.wikipedia.org/wiki/Orthographic_projection . 322c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 323c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 324c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 325c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoadPerspective 326c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 3276386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to set." 328c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float fovy, "Field of view, in degrees along the Y axis." 329c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float aspect, "Ratio of x / y." 3306386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float near, "Near clipping plane." 3316386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float far, "Far clipping plane." 332c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Load a perspective projection matrix 333c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 334c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Constructs a perspective projection matrix, assuming a symmetrical field of view. 335c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 3366386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet To apply this projection to a vector, multiply the vector by the created matrix 3376386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet using @rsMatrixMultiply(). 338c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 339c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 340c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 341c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoadRotate 342c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 3436386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to set." 344c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float rot, "How much rotation to do, in degrees." 3456386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float x, "X component of the vector that is the axis of rotation." 3466386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float y, "Y component of the vector that is the axis of rotation." 3476386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float z, "Z component of the vector that is the axis of rotation." 348c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Load a rotation matrix 349c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 3506386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet This function creates a rotation matrix. The axis of rotation is the <code>(x, y, z)</code> vector. 351c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 3526386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet To rotate a vector, multiply the vector by the created matrix using @rsMatrixMultiply(). 353c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 354c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet See http://en.wikipedia.org/wiki/Rotation_matrix . 355c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 356c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 357c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 358c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoadScale 359c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 3606386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to set." 3616386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float x, "Multiple to scale the x components by." 3626386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float y, "Multiple to scale the y components by." 3636386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float z, "Multiple to scale the z components by." 364c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Load a scaling matrix 365c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 3666386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet This function creates a scaling matrix, where each component of a vector is multiplied 3676386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet by a number. This number can be negative. 368c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 3696386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet To scale a vector, multiply the vector by the created matrix using @rsMatrixMultiply(). 370c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 371c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 372c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 373c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixLoadTranslate 374c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 3756386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to set." 3766386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float x, "Number to add to each x component." 3776386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float y, "Number to add to each y component." 3786386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float z, "Number to add to each z component." 379c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Load a translation matrix 380c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 3816386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet This function creates a translation matrix, where a number is added to each element of 3826386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet a vector. 383c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 3846386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet To translate a vector, multiply the vector by the created matrix using 3856386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet @rsMatrixMultiply(). 386c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 387c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 388c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 389c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 390c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillett: rs_matrix4x4, rs_matrix3x3, rs_matrix2x2 391c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 3926386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: #1* m, "Left matrix of the product and the matrix to be set." 3936386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: const #1* rhs, "Right matrix of the product." 394c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Multiply a matrix by a vector or another matrix 395c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 396c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet For the matrix by matrix variant, sets m to the matrix product <code>m * rhs</code>. 397c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 398c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet When combining two 4x4 transformation matrices using this function, the resulting 399c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet matrix will correspond to performing the rhs transformation first followed by 400c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet the original m transformation. 401c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 402c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet For the matrix by vector variant, returns the post-multiplication of the vector 403c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet by the matrix, ie. <code>m * in</code>. 404c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 405c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet When multiplying a float3 to a @rs_matrix4x4, the vector is expanded with (1). 406c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 407c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet When multiplying a float2 to a @rs_matrix4x4, the vector is expanded with (0, 1). 408c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 409c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet When multiplying a float2 to a @rs_matrix3x3, the vector is expanded with (0). 410c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 411c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Starting with API 14, this function takes a const matrix as the first argument. 412c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 413c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 414c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 415c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 416c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 9 13 417c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float4 418c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_matrix4x4* m 419c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float4 in 420c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 421c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 422c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 423c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 424c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 9 13 425c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float4 426c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_matrix4x4* m 427c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float3 in 428c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 429c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 430c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 431c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 432c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 9 13 433c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float4 434c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_matrix4x4* m 435c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float2 in 436c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 437c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 438c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 439c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 440c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 9 13 441c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float3 442c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_matrix3x3* m 443c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float3 in 444c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 445c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 446c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 447c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 448c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 9 13 449c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float3 450c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_matrix3x3* m 451c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float2 in 452c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 453c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 454c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 455c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 456c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 9 13 457c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float2 458c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: rs_matrix2x2* m 459c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float2 in 460c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 461c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 462c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 463c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 464c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 14 465c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float4 466c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: const rs_matrix4x4* m 467c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float4 in 468c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 469c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 470c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 471c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 472c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 14 473c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float4 474c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: const rs_matrix4x4* m 475c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float3 in 476c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 477c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 478c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 479c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 480c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 14 481c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float4 482c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: const rs_matrix4x4* m 483c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float2 in 484c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 485c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 486c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 487c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 488c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 14 489c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float3 490c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: const rs_matrix3x3* m 491c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float3 in 492c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 493c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 494c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 495c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 496c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 14 497c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float3 498c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: const rs_matrix3x3* m 499c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float2 in 500c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 501c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 502c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 503c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixMultiply 504c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletversion: 14 505c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: float2 506c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: const rs_matrix2x2* m 507c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float2 in 508c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 509c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 510c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 511c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixRotate 512c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 5136386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to modify." 514c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletarg: float rot, "How much rotation to do, in degrees." 5156386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float x, "X component of the vector that is the axis of rotation." 5166386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float y, "Y component of the vector that is the axis of rotation." 5176386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float z, "Z component of the vector that is the axis of rotation." 518c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Apply a rotation to a transformation matrix 519c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 520c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Multiply the matrix m with a rotation matrix. 521c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5226386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet This function modifies a transformation matrix to first do a rotation. The axis of 5236386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet rotation is the <code>(x, y, z)</code> vector. 524c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5256386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet To apply this combined transformation to a vector, multiply the vector by the created 5266386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet matrix using @rsMatrixMultiply(). 527c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 528c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 529c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 530c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixScale 531c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 5326386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to modify." 5336386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float x, "Multiple to scale the x components by." 5346386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float y, "Multiple to scale the y components by." 5356386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float z, "Multiple to scale the z components by." 536c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Apply a scaling to a transformation matrix 537c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 538c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Multiply the matrix m with a scaling matrix. 539c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5406386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet This function modifies a transformation matrix to first do a scaling. When scaling, 5416386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet each component of a vector is multiplied by a number. This number can be negative. 542c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5436386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet To apply this combined transformation to a vector, multiply the vector by the created 5446386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet matrix using @rsMatrixMultiply(). 545c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 546c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 547c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 548c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixSet 549c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillett: rs_matrix4x4, rs_matrix3x3, rs_matrix2x2 550c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 5516386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: #1* m, "Matrix that will be modified." 5526386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: uint32_t col, "Zero-based column of the element to be set." 5536386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: uint32_t row, "Zero-based row of the element to be set." 5546386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float v, "Value to set." 555c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Set one element 556c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 557c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Set an element of a matrix. 558c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 559c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet <b>Warning:</b> The order of the column and row parameters may be unexpected. 560c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 561c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 562c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 563c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixTranslate 564c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 5656386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: rs_matrix4x4* m, "Matrix to modify." 5666386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float x, "Number to add to each x component." 5676386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float y, "Number to add to each y component." 5686386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: float z, "Number to add to each z component." 569c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Apply a translation to a transformation matrix 570c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 571c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Multiply the matrix m with a translation matrix. 572c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5736386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet This function modifies a transformation matrix to first do a translation. When 5746386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet translating, a number is added to each component of a vector. 575c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 5766386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet To apply this combined transformation to a vector, multiply the vector by the 5776386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouillet created matrix using @rsMatrixMultiply(). 578c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 579c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 580c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet 581c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletfunction: rsMatrixTranspose 582c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillett: rs_matrix4x4*, rs_matrix3x3*, rs_matrix2x2* 583c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletret: void 5846386ceb3bf25e442513224aaa45691dfe49562d9Jean-Luc Brouilletarg: #1 m, "Matrix to transpose." 585c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletsummary: Transpose a matrix place 586c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletdescription: 587c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillet Transpose the matrix m in place. 588c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouillettest: none 589c5184e202ced435258adb2cfe2013570e7190954Jean-Luc Brouilletend: 590