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