SH4ZAM! 0.1.0
Fast math library for the Sega Dreamcast's SH4 CPU
Loading...
Searching...
No Matches
shz_xmtrx.h
Go to the documentation of this file.
1/*! \file
2 * \brief Active Matrix API.
3 * \ingroup xmtrx
4 *
5 * This file provides an API built around manipulating and performing
6 * calculations using the SH4's "current" 4x4 matrix, which is held within
7 * a secondary back-bank of 16 single-precision floating-point registers.
8 *
9 * \todo
10 * - shz_xmtrx_xxx_fft()
11 * - shz_xmtrx_invert() (within XMTRX)
12 * - shz_xmtrx_position()
13 * - shz_xmtrx_size()
14 * - shz_xmtrx_angles()
15 * - shz_xmtrx_init_rotation_quat() (within XMTRX)
16 * - shz_xmtrx_apply_store_4x4()
17 *
18 * \author 2025, 2026 Falco Girgis
19 * \author 2025 Twada
20 * \author 2026 TapamN
21 *
22 * \copyright MIT License
23 */
24
25#ifndef SHZ_XMTRX_H
26#define SHZ_XMTRX_H
27
28#include "shz_vector.h"
29#include "shz_quat.h"
30
31/*! \defgroup xmtrx XMTRX
32 \brief API for managing the SH4's "active matrix."
33
34 `XMTRX` is the name given to identify the 16 FP registers contained
35 within the back-bank of the SH4's FPU. These 16 registers combine
36 to represent the SH4's 4x4 "active matrix," which can be subsequently
37 transformed against using the `FTRV` instruction (shz_xmtrx_trans_vec4()).
38
39 For maximum FP performance on the SH4, strategic usage of `XMTRX` to batch
40 transform operations together without having reload FP registers, is key.
41
42 Typically, for one-off operations, the in-memory API for \ref matrix is
43 what should be used; however, when operations can be batched, using `XMTRX`
44 to hold your matrix within registers is going to give the best performance.
45
46 Examples of such scenarios are:
47 - Applying multiple operations to a source matrix before storing the result.
48 - Transforming batches of vectors against a single matrix.
49
50 \note
51 Unless TLS has been disabled, the XMTRX API is thread-safe, with each thread
52 getting its own unique copy of XMTRX.
53
54 \sa matrix
55 */
56
57SHZ_DECLS_BEGIN
58
59/*! \cond Forward Declarations */
60SHZ_DECLARE_STRUCT_ALIGNED(shz_mat2x2, shz_mat2x2_t, 8);
62SHZ_DECLARE_STRUCT (shz_mat3x3, shz_mat3x3_t);
63SHZ_DECLARE_STRUCT (shz_mat4x3, shz_mat4x3_t);
64SHZ_DECLARE_STRUCT (shz_mat3x4, shz_mat3x4_t);
65/*! \endcond */
66
67//! Registers comprising XMTRX, in the FPU back-bank.
68typedef enum shz_xmtrx_reg {
69 SHZ_XMTRX_XF0, //!< FP register `xf0`.
70 SHZ_XMTRX_XF1, //!< FP register `xf1`.
71 SHZ_XMTRX_XF2, //!< FP register `xf2`.
72 SHZ_XMTRX_XF3, //!< FP register `xf3`.
73 SHZ_XMTRX_XF4, //!< FP register `xf4`.
74 SHZ_XMTRX_XF5, //!< FP register `xf5`.
75 SHZ_XMTRX_XF6, //!< FP register `xf6`.
76 SHZ_XMTRX_XF7, //!< FP register `xf7`.
77 SHZ_XMTRX_XF8, //!< FP register `xf8`.
78 SHZ_XMTRX_XF9, //!< FP register `xf9`.
79 SHZ_XMTRX_XF10, //!< FP register `xf10`.
80 SHZ_XMTRX_XF11, //!< FP register `xf11`.
81 SHZ_XMTRX_XF12, //!< FP register `xf12`.
82 SHZ_XMTRX_XF13, //!< FP register `xf13`.
83 SHZ_XMTRX_XF14, //!< FP register `xf14`.
84 SHZ_XMTRX_XF15 //!< FP register `xf15`.
85} shz_xmtrx_reg_t, shz_xmtrx_reg;
86
87/*! \name Accessors
88 \brief Setting and retrieving individual XMTRX register values.
89 @{
90*/
91
92//! Returns the floating-point value held within the given XMTRX register.
93SHZ_INLINE float shz_xmtrx_read(shz_xmtrx_reg_t xf) SHZ_NOEXCEPT;
94
95//! Sets the floating-point value held within the given XMTRX register to \p value.
96SHZ_INLINE void shz_xmtrx_write(shz_xmtrx_reg_t xf, float value) SHZ_NOEXCEPT;
97
98//! Returns the values at the the given row \p index, as a 4D vector.
99SHZ_INLINE shz_vec4_t shz_xmtrx_read_row(unsigned int index) SHZ_NOEXCEPT;
100
101//! Returns the values at the given column \p index, as a 4D vector.
102SHZ_INLINE shz_vec4_t shz_xmtrx_read_col(unsigned int index) SHZ_NOEXCEPT;
103
104//! Sets the values at the given row \p index to the given 4D vector.
105SHZ_INLINE void shz_xmtrx_write_row(unsigned int index, shz_vec4_t vector) SHZ_NOEXCEPT;
106
107//! Sets the values at the given column \p index to the given 4D vector.
108SHZ_INLINE void shz_xmtrx_write_col(unsigned int index, shz_vec4_t vector) SHZ_NOEXCEPT;
109
110//! Swaps the values of the rows with the given indices.
111SHZ_INLINE void shz_xmtrx_swap_rows(unsigned int index1, unsigned int index2) SHZ_NOEXCEPT;
112
113//! Swaps the values of the columns with the given indices.
114SHZ_INLINE void shz_xmtrx_swap_cols(unsigned int index1, unsigned int index2) SHZ_NOEXCEPT;
115
116//! @}
117
118/*! \name Loading
119 \brief Routines for loading XMTRX contents from memory.
120 @{
121*/
122
123//! Loads the given 4x4 matrix as XMTRX.
124SHZ_INLINE void shz_xmtrx_load_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
125
126//! Loads the given 4x4 matrix as XMTRX, with the 4th column for translation being loaded as the first column.
127SHZ_INLINE void shz_xmtrx_load_wxyz_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
128
129//! Loads the given array of unaligned 16 float values as the 4x4 XMTRX matrix.
130SHZ_INLINE void shz_xmtrx_load_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
131
132//! Sets XMTRX equal to the 4x4 matrix created from the 4 given 4D column vectors.
133SHZ_INLINE void shz_xmtrx_load_cols_4x4(const shz_vec4_t* c1,
134 const shz_vec4_t* c2,
135 const shz_vec4_t* c3,
136 const shz_vec4_t* c4) SHZ_NOEXCEPT;
137
138//! Sets XMTRX equal to the 4x4 matrix created from the 4 given 4D row vectors.
139SHZ_INLINE void shz_xmtrx_load_rows_4x4(const shz_vec4_t* r1,
140 const shz_vec4_t* r2,
141 const shz_vec4_t* r3,
142 const shz_vec4_t* r4) SHZ_NOEXCEPT;
143
144//! Loads XMTRX with the transpose of the given 4x4 matrix.
145SHZ_INLINE void shz_xmtrx_load_transpose_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
146
147//! Loads XMTRX with the transpose of the 4x4 matrix created from the given unaligned array of 16 floats.
148SHZ_INLINE void shz_xmtrx_load_transpose_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
149
150//! Loads the given 3x4 matrix into XMTRX, initializing its remaining elements to identity.
151SHZ_INLINE void shz_xmtrx_load_3x4(const shz_mat3x4_t* matrix) SHZ_NOEXCEPT;
152
153/*! Loads the 3x4 matrix formed from the given 3 4D column vectors into XMTRX.
154
155 All remaining elements are initialized to identity matrix values.
156
157 \sa shz_xmtrx_load_rows_3x4()
158*/
159SHZ_INLINE void shz_xmtrx_load_cols_4x3(const shz_vec4_t* c1,
160 const shz_vec4_t* c2,
161 const shz_vec4_t* c3) SHZ_NOEXCEPT;
162
163/*! Loads the 3x4 matrix formed from the given 3 4D row vectors into XMTRX.
164
165 All remaining elements are initialized to identity matrix values.
166
167 \sa shz_xmtrx_load_cols_3x4()
168*/
169SHZ_INLINE void shz_xmtrx_load_rows_3x4(const shz_vec4_t* r1,
170 const shz_vec4_t* r2,
171 const shz_vec4_t* r3) SHZ_NOEXCEPT;
172
173//! Loads the given 3x3 matrix into XMTRX, initalizing its remaining elements to identity.
174SHZ_INLINE void shz_xmtrx_load_3x3(const shz_mat3x3_t* matrix) SHZ_NOEXCEPT;
175
176//! Loads the transpose of the given 3x3 matrix into XMTRX, initializing its remaining elements to identity.
177SHZ_INLINE void shz_xmtrx_load_transpose_3x3(const float* matrix) SHZ_NOEXCEPT;
178
179//! Loads the given 2x2 matrix into XMTRX, initializing its remaining elements to identity.
180SHZ_INLINE void shz_xmtrx_load_2x2(const shz_mat2x2_t* matrix) SHZ_NOEXCEPT;
181
182//! @}
183
184/*! \name Storing
185 \brief Routines for saving XMTRX contents to memory.
186 @{
187*/
188
189//! Stores the current values held within XMTRX into the given 4x4 matrix.
190SHZ_INLINE void shz_xmtrx_store_4x4(shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
191
192//! Stores the current values held within XMTRX into the given unaligned 16-float array.
193SHZ_INLINE void shz_xmtrx_store_unaligned_4x4(float matrix[16]) SHZ_NOEXCEPT;
194
195//! Stores the transpose of the current values held within XMTRX into the given 4x4 matrix.
196SHZ_INLINE void shz_xmtrx_store_transpose_4x4(shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
197
198//! Stores the transpose of the the current values held within XMTRX into the given 16-element float array.
199SHZ_INLINE void shz_xmtrx_store_transpose_unaligned_4x4(float matrix[16]) SHZ_NOEXCEPT;
200
201//! Stores the top-left 3x4 values currently held within XMTRX into the given matrix.
202SHZ_INLINE void shz_xmtrx_store_3x4(shz_mat3x4_t* matrix) SHZ_NOEXCEPT;
203
204//! Stores the top-left 3x3 values currently held within XMTRX into the given matrix.
205SHZ_INLINE void shz_xmtrx_store_3x3(shz_mat3x3_t* matrix) SHZ_NOEXCEPT;
206
207//! Stores the transpose of the top-left 3x3 values currently held within XMTRX into the given matrix.
208SHZ_INLINE void shz_xmtrx_store_transpose_3x3(shz_mat3x3_t* matrix) SHZ_NOEXCEPT;
209
210//! Stores the top-left 2x2 values currently held within XMTRX into the given matrix.
211SHZ_INLINE void shz_xmtrx_store_2x2(shz_mat2x2_t* matrix) SHZ_NOEXCEPT;
212
213//! @}
214
215/*! \name Initialization
216 \brief Routines used to initialize the entirety of XMTRX.
217 @{
218*/
219
220/*! Quickly initializes XMTRX to be a 4D identity matrix.
221
222 \warning This routine will not properly zero-out NaN values!
223
224 \sa shz_xmtrx_init_identity_safe()
225*/
226SHZ_INLINE void shz_xmtrx_init_identity(void) SHZ_NOEXCEPT;
227
228/*! Safely initializes XMTRX to be a 4D identity matrix.
229
230 This routine is guaranteed to properly initialize XMTRX, regardless of NaN values.
231
232 \sa shz_xmtrx_init_identity()
233*/
234SHZ_INLINE void shz_xmtrx_init_identity_safe(void) SHZ_NOEXCEPT;
235
236//! Initializes XMTRX to contain the value of 0.0f for each element.
237SHZ_INLINE void shz_xmtrx_init_zero(void) SHZ_NOEXCEPT;
238
239//! Initializes XMTRX to contain the value of 1.0f for each element.
240SHZ_INLINE void shz_xmtrx_init_one(void) SHZ_NOEXCEPT;
241
242//! Initializes XMTRX to contain the given \p value for each element.
243SHZ_INLINE void shz_xmtrx_init_fill(float value) SHZ_NOEXCEPT;
244
245//! Initializes XMTRX to be a 3D translation matrix to the given coordinates.
246SHZ_INLINE void shz_xmtrx_init_translation(float x, float y, float z) SHZ_NOEXCEPT;
247
248//! Initializes XMTRX to be a 3D scale matrix with the given dimensions.
249SHZ_INLINE void shz_xmtrx_init_scale(float x, float y, float z) SHZ_NOEXCEPT;
250
251//! Initializes XMTRX to be a 3D rotation matrix by \p x radians about the X axis.
252SHZ_INLINE void shz_xmtrx_init_rotation_x(float x) SHZ_NOEXCEPT;
253
254//! Initializes XMTRX to be a 3D rotation matrix by \p y radians about the Y axis.
255SHZ_INLINE void shz_xmtrx_init_rotation_y(float y) SHZ_NOEXCEPT;
256
257//! Initializes XMTRX to be a 3D rotation matrix by \p z radians about the Z axis.
258SHZ_INLINE void shz_xmtrx_init_rotation_z(float z) SHZ_NOEXCEPT;
259
260/*! Initializes XMTRX to be a 3D X-Y-Z rotation matrix, with the corresponding angles given in radians.
261
262 \note
263 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
264
265 \sa shz_xmtrx_init_rotation_zyx(), shz_xmtrx_init_rotation_yxz()
266*/
267SHZ_INLINE void shz_xmtrx_init_rotation_xyz(float xAngle, float yAngle, float zAngle) SHZ_NOEXCEPT;
268
269/*! Initializes XMTRX to be a 3D Z-Y-X rotation matrix, with the corresponding angles given in radians.
270
271 \note
272 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
273
274 \sa shz_xmtrx_init_rotation_xyz(), shz_xmtrx_init_rotation_yxz()
275*/
276SHZ_INLINE void shz_xmtrx_init_rotation_zyx(float zAngle, float yAngle, float xAngle) SHZ_NOEXCEPT;
277
278/*! Initializes XMTRX to be a 3D Z-X-Y rotation matrix, with the corresponding angles given in radians.
279
280 \note
281 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
282
283 \sa shz_xmtrx_init_rotation_zyx(), shz_xmtrx_init_rotation_yxz()
284*/
285SHZ_INLINE void shz_xmtrx_init_rotation_zxy(float zAngle, float xAngle, float yAngle) SHZ_NOEXCEPT;
286
287/*! Initializes XMTRX to be a 3D Y-X-Z rotation matrix, with the corresponding angles given in radians.
288
289 \note
290 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
291
292 \sa shz_xmtrx_init_rotation_yxz(), shz_xmtrx_init_rotation_xyz()
293*/
294SHZ_INLINE void shz_xmtrx_init_rotation_yxz(float yAngle, float xAngle, float zAngle) SHZ_NOEXCEPT;
295
296//! Initializes XMTRX to a 3D rotation matrix of \p angle radians about the given \p axis.
297SHZ_INLINE void shz_xmtrx_init_rotation(float angle, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT;
298
299//! Initializes XMTRX to be a diagonal matrix with the given diagonal values.
300SHZ_INLINE void shz_xmtrx_init_diagonal(float x, float y, float z, float w) SHZ_NOEXCEPT;
301
302//! Initializes XMTRX to be an upper triangular matrix with the given column values.
303SHZ_INLINE void shz_xmtrx_init_upper_triangular(float col1, shz_vec2_t col2, shz_vec3_t col3, shz_vec4_t col4) SHZ_NOEXCEPT;
304
305//! Initializes XMTRX to be a lower triangular matrix with the given column values.
306SHZ_INLINE void shz_xmtrx_init_lower_triangular(shz_vec4_t col1, shz_vec3_t col2, shz_vec2_t col3, float col4) SHZ_NOEXCEPT;
307
308//! Initializes XMTRX to be the 3D symmetric skew matrix formed from the given vector components.
309SHZ_INLINE void shz_xmtrx_init_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT;
310
311//! Initializes XMTRX to the 4D matrix resulting from taking the outer product of the two 4D vectors.
312SHZ_INLINE void shz_xmtrx_init_outer_product(shz_vec4_t x, shz_vec4_t y) SHZ_NOEXCEPT;
313
314//! Initializes XMTRX to a permutation matrix, which reorders the components of transformed vectors to be in WXYZ order.
315SHZ_INLINE void shz_xmtrx_init_permutation_wxyz(void) SHZ_NOEXCEPT;
316
317//! Initializes XMTRX to a permutation matrix, which reorders the components of transformed vectors to be in YZWX order.
318SHZ_INLINE void shz_xmtrx_init_permutation_yzwx(void) SHZ_NOEXCEPT;
319
320/*! Initializes XMTRX to the viewport matrix with the given dimensions.
321
322 fr[n + 0] | fr[n + 4] | fr[n + 8] | fr[n + 12]
323 -----------|-----------|-----------|-----------
324 w*0.5f | 0.0f | 0.0f | w*0.5f
325 0.0f | -h*0.5f | 0.0f | h*0.5f
326 0.0f | 0.0f | 1.0f | 0.0f
327 0.0f | 0.0f | 0.0f | 1.0f
328*/
329SHZ_INLINE void shz_xmtrx_init_screen(float width, float height) SHZ_NOEXCEPT;
330
331/*! Initializes XMTRX to a "lookAt" view matrix, equivalent to gluLookAt().
332
333 \warning This routine clobbers any previous XMTRX contents.
334*/
335SHZ_INLINE void shz_xmtrx_init_lookat(shz_vec3_t eye, shz_vec3_t center, shz_vec3_t up) SHZ_NOEXCEPT;
336
337/*! Initializes XMTRX to an orthographic projection matrix, equivalent to glOrtho().
338
339 \warning This routine clobbers any previous XMTRX contents.
340*/
341SHZ_INLINE void shz_xmtrx_init_ortho(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
342
343/*! Initializes XMTRX to a frustum projection matrix, equivalent to glFrustum().
344
345 \warning This routine clobbers any previous XMTRX contents.
346*/
347SHZ_INLINE void shz_xmtrx_init_frustum(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
348
349/*! Initializes XMTRX to a perspective projection matrix.
350
351 \warning This routine clobbers any previous XMTRX contents.
352*/
353SHZ_INLINE void shz_xmtrx_init_perspective(float fov, float aspect, float znear) SHZ_NOEXCEPT;
354
355/*! Initializes XMTRX to a 3D rotation matrix with its orientation given by a quaternion.
356
357 \warning This routine clobbers any previous XMTRX contents.
358 \warning This routine is out-of-line.
359*/
360void shz_xmtrx_init_rotation_quat(shz_quat_t q) SHZ_NOEXCEPT;
361
362//! @}
363
364/*! \name Apply Operation
365 \brief Updates only relevant values of XMTRX based on the given transform.
366 @{
367*/
368
369//! Multiplies and accumulates the given 4x4 matrix onto XMTRX.
370SHZ_INLINE void shz_xmtrx_apply_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
371
372//! Multiplies and accumulates the given 16-entry float array as a 4x4 matrix onto XMTRX.
373SHZ_INLINE void shz_xmtrx_apply_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
374
375//! Multiplies and accumulates the transpose of the given 4x4 matrix onto XMTRX.
376SHZ_INLINE void shz_xmtrx_apply_transpose_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
377
378//! Multiplies and accumulates the transpose of the given 16-entry float array as a 4x4 matrix onto XMTRX.
379SHZ_INLINE void shz_xmtrx_apply_transpose_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
380
381//! Multiplies and accumulates XMTRX onto \p matrix, storing the result as XMTRX.
382SHZ_INLINE void shz_xmtrx_apply_reverse_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
383
384//! Multiplies and accumulates XMTRX onto the given float array as a 4x4 matrix, storing the result as XMTRX.
385SHZ_INLINE void shz_xmtrx_apply_reverse_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
386
387//! Multiplies and accumulates XMTRX onto the transpose of \p matrix, storing the result as XMTRX.
388SHZ_INLINE void shz_xmtrx_apply_reverse_transpose_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
389
390//! Multiplies and accumulates XMTRX onto the transpose of the given float array as a 4x4 matrix, storing the result as XMTRX.
391SHZ_INLINE void shz_xmtrx_apply_reverse_transpose_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
392
393//! Multiplies and accumulates the given 3x4 matrix onto XMTRX, not modifying other elements.
394SHZ_INLINE void shz_xmtrx_apply_3x4(const shz_mat3x4_t* matrix) SHZ_NOEXCEPT;
395
396//! Multiplies and accumulates the given 3x3 matrix onto XMTRX, not modifying other elements.
397SHZ_INLINE void shz_xmtrx_apply_3x3(const shz_mat3x3_t* matrix) SHZ_NOEXCEPT;
398
399//! Multiplies and accumulateas the transpose of the given 3x3 matrix onto XMTRX, not modifying other elements.
400SHZ_INLINE void shz_xmtrx_apply_transpose_3x3(const shz_mat3x3_t* matrix) SHZ_NOEXCEPT;
401
402//! Multiplies and accumulates the given 2x2 matrix onto XMTRX, not modifying other elements.
403SHZ_INLINE void shz_xmtrx_apply_2x2(const shz_mat2x2_t* matrix) SHZ_NOEXCEPT;
404
405//! Adds the values of the given 3 components to the 3D translation components of XMTRX.
406SHZ_INLINE void shz_xmtrx_apply_translation(float x, float y, float z) SHZ_NOEXCEPT;
407
408//! Multiplies the values of the inner 3x3 matrix by the given 3D scaling terms.
409SHZ_INLINE void shz_xmtrx_apply_scale(float x, float y, float z) SHZ_NOEXCEPT;
410
411//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p x radians about the X axis.
412SHZ_INLINE void shz_xmtrx_apply_rotation_x(float x) SHZ_NOEXCEPT;
413
414//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p y radians about the Y axis.
415SHZ_INLINE void shz_xmtrx_apply_rotation_y(float y) SHZ_NOEXCEPT;
416
417//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p z radians about the Z axis.
418SHZ_INLINE void shz_xmtrx_apply_rotation_z(float z) SHZ_NOEXCEPT;
419
420/*! Multiplies and accumulates XMTRX by a 3D X-Y-Z rotation matrix, with the corresponding angles given in radians.
421
422 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
423
424 \note
425 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
426
427 \sa shz_xmtrx_apply_rotation_zyx(), shz_xmtrx_apply_rotation_yxz()
428*/
429SHZ_INLINE void shz_xmtrx_apply_rotation_xyz(float xAngle, float yAngle, float zAngle) SHZ_NOEXCEPT;
430
431/*! Multiplies and accumulates XMTRX by a 3D Z-Y-X rotation matrix, with the corresponding angles given in radians.
432
433 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
434
435 \note
436 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
437
438 \sa shz_xmtrx_apply_rotation_xyz(), shz_xmtrx_apply_rotation_yxz()
439*/
440SHZ_INLINE void shz_xmtrx_apply_rotation_zyx(float zAngle, float yAngle, float xAngle) SHZ_NOEXCEPT;
441
442/*! Multiplies and accumulates XMTRX by a 3D Z-X-Y rotation matrix, with the corresponding angles given in radians.
443
444 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
445
446 \note
447 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
448
449 \sa shz_xmtrx_apply_rotation_zyx(), shz_xmtrx_apply_rotation_yxz()
450*/
451SHZ_INLINE void shz_xmtrx_apply_rotation_zxy(float zAngle, float xAngle, float yAngle) SHZ_NOEXCEPT;
452
453/*! Multiplies and accumulates XMTRX by a 3D Y-X-Z rotation matrix, with the corresponding angles given in radians.
454
455 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
456
457 \note
458 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
459
460 \sa shz_xmtrx_apply_rotation_xyz(), shz_xmtrx_apply_rotation_zyx()
461*/
462SHZ_INLINE void shz_xmtrx_apply_rotation_yxz(float yAngle, float xAngle, float zAngle) SHZ_NOEXCEPT;
463
464//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p angle radians about the axis with the given components.
465SHZ_INLINE void shz_xmtrx_apply_rotation(float angle, float x, float y, float z) SHZ_NOEXCEPT;
466
467//! Transforms the values of the inner 3x3 matrix by the rotation matrix represented by the given quaternion.
468SHZ_INLINE void shz_xmtrx_apply_rotation_quat(shz_quat_t quat) SHZ_NOEXCEPT;
469
470//! Applies the 3D "lookAt" matrix constructed with the given vector components onto XMTRX. Equivalent to gluLookAt().
471SHZ_INLINE void shz_xmtrx_apply_lookat(shz_vec3_t eye, shz_vec3_t center, shz_vec3_t up) SHZ_NOEXCEPT;
472
473//! Applies a 2D orthographic projection matrix onto XMTRX, equivalent to glOrtho().
474SHZ_INLINE void shz_xmtrx_apply_ortho(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
475
476//! Applies a frustum projection matrix onto XMTRX, equivalent to glFrustum().
477SHZ_INLINE void shz_xmtrx_apply_frustum(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
478
479/*! Multiplies and accumulates the perspective matrix constructed from the given values onto XMTRX.
480
481 fr[n + 0] | fr[n + 4] | fr[n + 8] | fr[n + 12]
482 -----------|-----------|-----------|-----------
483 cot(f)/a | 0.0f | 0.0f | 0.0f
484 0.0f | cot(f) | 0.0f | 0.0f
485 0.0f | 0.0f | 0.0f | nz
486 0.0f | 0.0f | -1.0f | 0.0f
487*/
488SHZ_INLINE void shz_xmtrx_apply_perspective(float fov, float aspect, float znear) SHZ_NOEXCEPT;
489
490/*! Multiplies and accumulates the viewport matrix created with the given components.
491
492 fr[n + 0] | fr[n + 4] | fr[n + 8] | fr[n + 12]
493 -----------|-----------|-----------|-----------
494 w*0.5f | 0.0f | 0.0f | w*0.5f
495 0.0f | -h*0.5f | 0.0f | h*0.5f
496 0.0f | 0.0f | 1.0f | 0.0f
497 0.0f | 0.0f | 0.0f | 1.0f
498*/
499SHZ_INLINE void shz_xmtrx_apply_screen(float width, float height) SHZ_NOEXCEPT;
500
501//! Multiplies and accumulates the 3D symmetric skew matrix with the given components onto XMTRX.
502SHZ_INLINE void shz_xmtrx_apply_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT;
503
504//! Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors to be in WXYZ order.
505SHZ_INLINE void shz_xmtrx_apply_permutation_wxyz(void) SHZ_NOEXCEPT;
506
507//! Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors to be in YZWX order.
508SHZ_INLINE void shz_xmtrx_apply_permutation_yzwx(void) SHZ_NOEXCEPT;
509
510//! Multiplies and accumulatse the XMTRX matrix by itself, squaring it.
511SHZ_INLINE void shz_xmtrx_apply_self(void) SHZ_NOEXCEPT;
512
513//! @}
514
515/*! \name GL Transformations
516 \brief OpenGL-style 4x4 matrix transforms.
517 @{
518*/
519
520//! Multiplies and accumulates XMTRX by a 3D translation matrix with the given components (glTranslatef() equivalent).
521SHZ_INLINE void shz_xmtrx_translate(float x, float y, float z) SHZ_NOEXCEPT;
522
523//! Multiplies and accumulates XMTRX by a 3D scaling matrix with the given components (glScalef() equivalent).
524SHZ_INLINE void shz_xmtrx_scale(float x, float y, float z) SHZ_NOEXCEPT;
525
526//! Multiplies and accumulates XMTRX by a 3D rotation matrix about the X axis.
527SHZ_INLINE void shz_xmtrx_rotate_x(float radians) SHZ_NOEXCEPT;
528
529//! Multiplies and accumulates XMTRX by a 3D rotation matrix about the Y axis.
530SHZ_INLINE void shz_xmtrx_rotate_y(float radians) SHZ_NOEXCEPT;
531
532//! Multiplies and accumulates XMTRX by a 3D rotation matrix about the Z axis.
533SHZ_INLINE void shz_xmtrx_rotate_z(float radians) SHZ_NOEXCEPT;
534
535//! Multiplies and accumulates XMTRX by 3D rotation matrices about the X then Y then Z axes.
536SHZ_INLINE void shz_xmtrx_rotate_xyz(float xRadians, float yRadians, float zRadians) SHZ_NOEXCEPT;
537
538//! Multiplies and accumulates XMTRX by 3D rotation matrices about the Z then Y then X axes.
539SHZ_INLINE void shz_xmtrx_rotate_zyx(float zRadians, float yRadians, float xRadians) SHZ_NOEXCEPT;
540
541//! Multiplies and accumulates XMTRX by 3D rotation matrices about the Z then X then Y axes.
542SHZ_INLINE void shz_xmtrx_rotate_zxy(float zRadians, float xRadians, float yRadians) SHZ_NOEXCEPT;
543
544//! Multiplies and accumulates XMTRX by 3D rotation matrices about the Y then X then Z axes.
545SHZ_INLINE void shz_xmtrx_rotate_yxz(float yRadians, float xRadians, float zRadians) SHZ_NOEXCEPT;
546
547//! Multiplies and accumulates XMTRX by the 3D rotation matrix formed by the given axis and angle (glRotatef equivalent).
548SHZ_INLINE void shz_xmtrx_rotate(float radians, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT;
549
550//!@}
551
552/*! \name Compound Operations
553 \brief Multiple operations combined into one pipelined transaction.
554 @{
555*/
556
557/*! Loads XMTRX with the result of applying \p matrix2 onto \p matrix1.
558
559 This operation is equivalent to:
560 shz_xmtrx_load_4x4(matrix1);
561 shz_xmtrx_apply_4x4(matrix2);
562
563 However, it has been optimized and pipelined for performing the load
564 and multiply in parallel.
565
566 \sa shz_xmtrx_load_4x4(), shz_xmtrx_apply_4x4(), shz_xmtrx_load_apply_store_4x4()
567*/
568SHZ_INLINE void shz_xmtrx_load_apply_4x4(const shz_mat4x4_t* matrix1,
569 const shz_mat4x4_t* matrix2) SHZ_NOEXCEPT;
570
571/*! Loads XMTRX with the result of applying unaligned \p matrix2 onto \p matrix1.
572
573 This routine is equivalent to shz_xmtrx_load_apply_4x4(), except that the two
574 operand matrices do not require 8-byte alignment and can simply be 16-element
575 single-precision float arrays.
576
577 \sa shz_xmtrx_load_apply_4x4()
578*/
579SHZ_INLINE void shz_xmtrx_load_apply_unaligned_4x4(const float matrix1[16],
580 const float matrix2[16]) SHZ_NOEXCEPT;
581
582/*! Multiplies XMTRX by the matrix, \p in, storing the result within the matrix, \p out.
583
584 This routine is roughly equivalent to:
585 shz_xmtrx_apply_4x4(in);
586 shz_xmtrx_store_4x4(out);
587
588 However, it has been optimized and pipelined for performing the multiply and store in parallel.
589
590 \note
591 This is useful for when you want to multiply a batch of matrices by the same matrix, held within XMTRX.
592
593 \warning
594 The result of the multiplication is not stored within XMTRX, despite it getting clobbered.
595
596 \sa shz_xmtrx_apply_4x4(), shz_xmtrx_store_4x4(), shz_xmtrx_apply_store_unaligned_4x4()
597*/
598 SHZ_INLINE void shz_xmtrx_apply_store_4x4(shz_mat4x4_t* out,
599 const shz_mat4x4_t* in) SHZ_NOEXCEPT;
600
601/*! Multiplies XMTRX by the unaligned matrix, \p in, storing the result within the unaligned matrix, \p out.
602
603 This routine is roughly equivalent to:
604 shz_xmtrx_apply_unaligned_4x4(in);
605 shz_xmtrx_store_unaligned_4x4(out);
606
607 However, it has been optimized and pipelined for performing the multiply and store in parallel.
608
609 \note
610 This is useful for when you want to multiply a batch of matrices by the same matrix, held within XMTRX.
611
612 \warning
613 The result of the multiplication is not stored within XMTRX, despite it getting clobbered.
614
615 \sa shz_xmtrx_apply_unaligned_4x4(), shz_xmtrx_store_unaligned_4x4(), shz_xmtrx_apply_store_4x4()
616*/
617 SHZ_INLINE void shz_xmtrx_apply_store_unaligned_4x4(float out[16],
618 const float in[16]) SHZ_NOEXCEPT;
619
620/*! Loads XMTRX with the 4x4 result of applying \p matrix2 onto \p matrix1, storing the result.
621
622 This operation is equivalent to:
623 shz_xmtrx_load_4x4(matrix1);
624 shz_xmtrx_apply_4x4(matrix2);
625 shz_xmtrx_store_4x4(out);
626
627 However, it has been optimized and pipelined for performing the loads, multiplies, and
628 stores in parallel.
629
630 \sa shz_xmtrx_load_apply(), shz_xmtrx_load_apply_store_unaligned_4x4()
631*/
632SHZ_INLINE void shz_xmtrx_load_apply_store_4x4(shz_mat4x4_t* out,
633 const shz_mat4x4_t* matrix1,
634 const shz_mat4x4_t* matrix2) SHZ_NOEXCEPT;
635
636/*! Loads XMTRX with the result of applying unaligned \p matrix2 onto unaligned \p matrix1, storing the result.
637
638 This routine is equivalent to shz_xmtrx_load_apply_store_4x4(), except that the three
639 operand matrices do not require 8-byte alignment and can simply be 16-element
640 single-precision float arrays.
641
642 \sa shz_xmtrx_load_apply_store_4x4()
643*/
644SHZ_INLINE void shz_xmtrx_load_apply_store_unaligned_4x4(float out[16],
645 const float matrix1[16],
646 const float matrix2[16]) SHZ_NOEXCEPT;
647
648/*! Loads XMTRX with the 3x4 result of applying \p matrix2 onto \p matrix1, storing the result.
649
650 This operation is equivalent to:
651 shz_xmtrx_load_3x4(matrix1);
652 shz_xmtrx_apply_3x4(matrix2);
653 shz_xmtrx_store_3x4(out);
654
655 However, it has been optimized and pipelined for performing the loads, multiplies,
656 and stores in parallel.
657
658 \note
659 The resulting matrix does not get stored within XMTRX, despite it getting clobbered.
660
661 \sa shz_xmtrx_load_3x4(), shz_xmtrx_apply_3x4(), shz_xmtrx_store_3x4()
662*/
663SHZ_INLINE void shz_xmtrx_load_apply_store_3x4(shz_mat3x4_t* out,
664 const shz_mat3x4_t* matrix1,
665 const shz_mat3x4_t* matrix2) SHZ_NOEXCEPT;
666
667/*! Loads XMTRX with the 3x3 result of applying \p matrix2 onto \p matrix1, storing the result.
668
669 This operation is equivalent to:
670 shz_xmtrx_load_3x3(matrix1);
671 shz_xmtrx_apply_3x3(matrix2);
672 shz_xmtrx_store_3x3(out);
673
674 However, it has been optimized and pipelined for performing the loads, multiplies,
675 and stores in parallel.
676
677 \note
678 The resulting matrix does not get stored within XMTRX, despite it getting clobbered.
679
680 \sa shz_xmtrx_load_3x3(), shz_xmtrx_apply_3x3(), shz_xmtrx_store_3x3()
681*/
682SHZ_INLINE void shz_xmtrx_load_apply_store_3x3(shz_mat3x3_t* out,
683 const shz_mat3x3_t* matrix1,
684 const shz_mat3x3_t* matrix2) SHZ_NOEXCEPT;
685
686//! @}
687
688/*! \name Transformations
689 \brief Transforming vectors and points against XMTRX.
690 @{
691*/
692
693//! Returns the 4D vector that is the result of transforming \p vec by XMTRX.
694SHZ_INLINE shz_vec4_t shz_xmtrx_transform_vec4(shz_vec4_t vec) SHZ_NOEXCEPT;
695
696//! Returns the 3D vector that is the result of transforming \p vec by XMTRX.
697SHZ_INLINE shz_vec3_t shz_xmtrx_transform_vec3(shz_vec3_t vec) SHZ_NOEXCEPT;
698
699//! Returns the 2D vector that is the result of transforming \p vec by XMTRX.
700SHZ_INLINE shz_vec2_t shz_xmtrx_transform_vec2(shz_vec2_t vec) SHZ_NOEXCEPT;
701
702//! Returns the 2D point that is the result of transforming \p pt by XMTRX.
703SHZ_INLINE shz_vec2_t shz_xmtrx_transform_point2(shz_vec2_t pt) SHZ_NOEXCEPT;
704
705//! Returns the 3D point that is the result of transforming \p pt by XMTRX.
706SHZ_INLINE shz_vec3_t shz_xmtrx_transform_point3(shz_vec3_t pt) SHZ_NOEXCEPT;
707
708//! @}
709
710/*! \name Setters
711 \brief Sets the values of related XMTRX components.
712 @{
713*/
714
715//! Sets only the translational components of XMTRX to the given values.
716SHZ_INLINE void shz_xmtrx_set_translation(float x, float y, float z) SHZ_NOEXCEPT;
717
718//! @}
719
720/*! \name Getters
721 \brief Gets the values of related XMTRX components.
722 @{
723*/
724
725//! Returns the translational components from the last column of XMTRX, as a 3D vector.
726SHZ_INLINE shz_vec3_t shz_xmtrx_get_translation(void) SHZ_NOEXCEPT;
727
728//! @}
729
730/*! \name Component-Wise Matrix Operations
731 \brief Operations applying each component of a matrix onto XMTRX.
732 @{
733*/
734
735//! Adds each element within \p mat to each element within XMTRX, storing the result in XMTRX.
736SHZ_INLINE void shz_xmtrx_add_4x4(const shz_mat4x4_t* mat) SHZ_NOEXCEPT;
737
738//! Subtracts each element within \p mat from each element within XMTRX, storing the result in XMTRX.
739SHZ_INLINE void shz_xmtrx_sub_4x4(const shz_mat4x4_t* mat) SHZ_NOEXCEPT;
740
741//! @}
742
743/*! \name Miscellaneous
744 \brief Random operations and conversions on XMTRX.
745 @{
746*/
747
748//! Adds the values of a 3D symmetric skew matrix constructed from the given components to XMTRX.
749SHZ_INLINE void shz_xmtrx_add_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT;
750
751//! Adds the values of a 4D diagonal matrix constructed from the given components to XMTRX.
752SHZ_INLINE void shz_xmtrx_add_diagonal(float x, float y, float z, float w) SHZ_NOEXCEPT;
753
754//! Transposes the elements within XMTRX, in-place.
755SHZ_INLINE void shz_xmtrx_transpose(void) SHZ_NOEXCEPT;
756
757//! Negates each element held within XMTRX.
758SHZ_INLINE void shz_xmtrx_negate(void) SHZ_NOEXCEPT;
759
760//! Takes the absolute value of each element held within XMTRX.
761SHZ_INLINE void shz_xmtrx_abs(void) SHZ_NOEXCEPT;
762
763//! Initializes XMTRX to the sin/cos weights used to multiply two samples within an FFT.
764SHZ_INLINE void shz_xmtrx_init_fft_weights(float radians) SHZ_NOEXCEPT;
765
766//! Constructs a quaternion from the 3D rotation matrix within XMTRX.
767shz_quat_t shz_xmtrx_to_quat(void) SHZ_NOEXCEPT;
768
769//! Returns the determinant of XMTRX.
770float shz_xmtrx_determinant(void) SHZ_NOEXCEPT;
771
772/*! Inverts XMTRX in-place.
773
774 Stores XMTRX to memory, computes the inverse via shz_mat4x4_inverse(),
775 and reloads the result.
776
777 \warning This routine is out-of-line.
778*/
779void shz_xmtrx_invert(void) SHZ_NOEXCEPT;
780
781//! @}
782
783#include "inline/shz_xmtrx.inl.h"
784
785SHZ_DECLS_END
786
787#endif // SHZ_XMTRX_H
#define SHZ_DECLARE_STRUCT(n, t)
Macro which forward declares a struct and its typedef.
Definition shz_cdefs.h:104
#define SHZ_DECLARE_STRUCT_ALIGNED(n, t, a)
Macro which forward declares a manually aligned struct and its typedef.
Definition shz_cdefs.h:106
void shz_xmtrx_rotate_z(float radians) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by a 3D rotation matrix about the Z axis.
float shz_xmtrx_determinant(void) SHZ_NOEXCEPT
Returns the determinant of XMTRX.
void shz_xmtrx_load_transpose_3x3(const float *matrix) SHZ_NOEXCEPT
Loads the transpose of the given 3x3 matrix into XMTRX, initializing its remaining elements to identi...
void shz_xmtrx_write_row(unsigned int index, shz_vec4_t vector) SHZ_NOEXCEPT
Sets the values at the given row index to the given 4D vector.
void shz_xmtrx_load_transpose_4x4(const shz_mat4x4_t *matrix) SHZ_NOEXCEPT
Loads XMTRX with the transpose of the given 4x4 matrix.
void shz_xmtrx_load_apply_store_4x4(shz_mat4x4_t *out, const shz_mat4x4_t *matrix1, const shz_mat4x4_t *matrix2) SHZ_NOEXCEPT
Loads XMTRX with the 4x4 result of applying matrix2 onto matrix1, storing the result.
void shz_xmtrx_init_ortho(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT
Initializes XMTRX to an orthographic projection matrix, equivalent to glOrtho().
void shz_xmtrx_init_identity(void) SHZ_NOEXCEPT
Quickly initializes XMTRX to be a 4D identity matrix.
shz_quat_t shz_xmtrx_to_quat(void) SHZ_NOEXCEPT
Constructs a quaternion from the 3D rotation matrix within XMTRX.
void shz_xmtrx_apply_rotation_zxy(float zAngle, float xAngle, float yAngle) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by a 3D Z-X-Y rotation matrix, with the corresponding angles given i...
void shz_xmtrx_rotate_xyz(float xRadians, float yRadians, float zRadians) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by 3D rotation matrices about the X then Y then Z axes.
void shz_xmtrx_load_apply_store_3x4(shz_mat3x4_t *out, const shz_mat3x4_t *matrix1, const shz_mat3x4_t *matrix2) SHZ_NOEXCEPT
Loads XMTRX with the 3x4 result of applying matrix2 onto matrix1, storing the result.
void shz_xmtrx_load_rows_4x4(const shz_vec4_t *r1, const shz_vec4_t *r2, const shz_vec4_t *r3, const shz_vec4_t *r4) SHZ_NOEXCEPT
Sets XMTRX equal to the 4x4 matrix created from the 4 given 4D row vectors.
void shz_xmtrx_init_fill(float value) SHZ_NOEXCEPT
Initializes XMTRX to contain the given value for each element.
void shz_xmtrx_apply_rotation_zyx(float zAngle, float yAngle, float xAngle) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by a 3D Z-Y-X rotation matrix, with the corresponding angles given i...
void shz_xmtrx_load_2x2(const shz_mat2x2_t *matrix) SHZ_NOEXCEPT
Loads the given 2x2 matrix into XMTRX, initializing its remaining elements to identity.
void shz_xmtrx_load_rows_3x4(const shz_vec4_t *r1, const shz_vec4_t *r2, const shz_vec4_t *r3) SHZ_NOEXCEPT
Loads the 3x4 matrix formed from the given 3 4D row vectors into XMTRX.
void shz_xmtrx_rotate_y(float radians) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by a 3D rotation matrix about the Y axis.
void shz_xmtrx_load_transpose_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT
Loads XMTRX with the transpose of the 4x4 matrix created from the given unaligned array of 16 floats.
shz_vec3_t shz_xmtrx_transform_point3(shz_vec3_t pt) SHZ_NOEXCEPT
Returns the 3D point that is the result of transforming pt by XMTRX.
void shz_xmtrx_apply_rotation_y(float y) SHZ_NOEXCEPT
Transforms the values of the inner 3x3 matrix by a rotation matrix of y radians about the Y axis.
void shz_xmtrx_init_translation(float x, float y, float z) SHZ_NOEXCEPT
Initializes XMTRX to be a 3D translation matrix to the given coordinates.
void shz_xmtrx_rotate_zxy(float zRadians, float xRadians, float yRadians) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by 3D rotation matrices about the Z then X then Y axes.
void shz_xmtrx_apply_store_unaligned_4x4(float out[16], const float in[16]) SHZ_NOEXCEPT
Multiplies XMTRX by the unaligned matrix, in, storing the result within the unaligned matrix,...
shz_vec2_t shz_xmtrx_transform_point2(shz_vec2_t pt) SHZ_NOEXCEPT
Returns the 2D point that is the result of transforming pt by XMTRX.
void shz_xmtrx_rotate_x(float radians) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by a 3D rotation matrix about the X axis.
shz_vec2_t shz_xmtrx_transform_vec2(shz_vec2_t vec) SHZ_NOEXCEPT
Returns the 2D vector that is the result of transforming vec by XMTRX.
void shz_xmtrx_init_rotation(float angle, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT
Initializes XMTRX to a 3D rotation matrix of angle radians about the given axis.
void shz_xmtrx_apply_reverse_4x4(const shz_mat4x4_t *matrix) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX onto matrix, storing the result as XMTRX.
float shz_xmtrx_read(shz_xmtrx_reg_t xf) SHZ_NOEXCEPT
Returns the floating-point value held within the given XMTRX register.
void shz_xmtrx_load_wxyz_4x4(const shz_mat4x4_t *matrix) SHZ_NOEXCEPT
Loads the given 4x4 matrix as XMTRX, with the 4th column for translation being loaded as the first co...
void shz_xmtrx_apply_3x3(const shz_mat3x3_t *matrix) SHZ_NOEXCEPT
Multiplies and accumulates the given 3x3 matrix onto XMTRX, not modifying other elements.
void shz_xmtrx_apply_screen(float width, float height) SHZ_NOEXCEPT
Multiplies and accumulates the viewport matrix created with the given components.
void shz_xmtrx_store_4x4(shz_mat4x4_t *matrix) SHZ_NOEXCEPT
Stores the current values held within XMTRX into the given 4x4 matrix.
void shz_xmtrx_load_4x4(const shz_mat4x4_t *matrix) SHZ_NOEXCEPT
Loads the given 4x4 matrix as XMTRX.
void shz_xmtrx_apply_transpose_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT
Multiplies and accumulates the transpose of the given 16-entry float array as a 4x4 matrix onto XMTRX...
void shz_xmtrx_set_translation(float x, float y, float z) SHZ_NOEXCEPT
Sets only the translational components of XMTRX to the given values.
shz_xmtrx_reg
Registers comprising XMTRX, in the FPU back-bank.
Definition shz_xmtrx.h:68
@ SHZ_XMTRX_XF8
FP register xf8.
Definition shz_xmtrx.h:77
@ SHZ_XMTRX_XF9
FP register xf9.
Definition shz_xmtrx.h:78
@ SHZ_XMTRX_XF12
FP register xf12.
Definition shz_xmtrx.h:81
@ SHZ_XMTRX_XF11
FP register xf11.
Definition shz_xmtrx.h:80
@ SHZ_XMTRX_XF14
FP register xf14.
Definition shz_xmtrx.h:83
@ SHZ_XMTRX_XF3
FP register xf3.
Definition shz_xmtrx.h:72
@ SHZ_XMTRX_XF6
FP register xf6.
Definition shz_xmtrx.h:75
@ SHZ_XMTRX_XF4
FP register xf4.
Definition shz_xmtrx.h:73
@ SHZ_XMTRX_XF13
FP register xf13.
Definition shz_xmtrx.h:82
@ SHZ_XMTRX_XF10
FP register xf10.
Definition shz_xmtrx.h:79
@ SHZ_XMTRX_XF2
FP register xf2.
Definition shz_xmtrx.h:71
@ SHZ_XMTRX_XF0
FP register xf0.
Definition shz_xmtrx.h:69
@ SHZ_XMTRX_XF5
FP register xf5.
Definition shz_xmtrx.h:74
@ SHZ_XMTRX_XF7
FP register xf7.
Definition shz_xmtrx.h:76
@ SHZ_XMTRX_XF15
FP register xf15.
Definition shz_xmtrx.h:84
@ SHZ_XMTRX_XF1
FP register xf1.
Definition shz_xmtrx.h:70
void shz_xmtrx_add_4x4(const shz_mat4x4_t *mat) SHZ_NOEXCEPT
Adds each element within mat to each element within XMTRX, storing the result in XMTRX.
void shz_xmtrx_init_permutation_wxyz(void) SHZ_NOEXCEPT
Initializes XMTRX to a permutation matrix, which reorders the components of transformed vectors to be...
void shz_xmtrx_invert(void) SHZ_NOEXCEPT
Inverts XMTRX in-place.
void shz_xmtrx_load_apply_4x4(const shz_mat4x4_t *matrix1, const shz_mat4x4_t *matrix2) SHZ_NOEXCEPT
Loads XMTRX with the result of applying matrix2 onto matrix1.
void shz_xmtrx_translate(float x, float y, float z) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by a 3D translation matrix with the given components (glTranslatef()...
shz_vec4_t shz_xmtrx_read_row(unsigned int index) SHZ_NOEXCEPT
Returns the values at the the given row index, as a 4D vector.
void shz_xmtrx_rotate_zyx(float zRadians, float yRadians, float xRadians) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by 3D rotation matrices about the Z then Y then X axes.
void shz_xmtrx_apply_permutation_yzwx(void) SHZ_NOEXCEPT
Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors...
void shz_xmtrx_init_rotation_z(float z) SHZ_NOEXCEPT
Initializes XMTRX to be a 3D rotation matrix by z radians about the Z axis.
void shz_xmtrx_rotate_yxz(float yRadians, float xRadians, float zRadians) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by 3D rotation matrices about the Y then X then Z axes.
void shz_xmtrx_apply_ortho(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT
Applies a 2D orthographic projection matrix onto XMTRX, equivalent to glOrtho().
void shz_xmtrx_apply_3x4(const shz_mat3x4_t *matrix) SHZ_NOEXCEPT
Multiplies and accumulates the given 3x4 matrix onto XMTRX, not modifying other elements.
void shz_xmtrx_apply_translation(float x, float y, float z) SHZ_NOEXCEPT
Adds the values of the given 3 components to the 3D translation components of XMTRX.
void shz_xmtrx_apply_rotation(float angle, float x, float y, float z) SHZ_NOEXCEPT
Transforms the values of the inner 3x3 matrix by a rotation matrix of angle radians about the axis wi...
void shz_xmtrx_abs(void) SHZ_NOEXCEPT
Takes the absolute value of each element held within XMTRX.
void shz_xmtrx_apply_permutation_wxyz(void) SHZ_NOEXCEPT
Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors...
void shz_xmtrx_apply_frustum(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT
Applies a frustum projection matrix onto XMTRX, equivalent to glFrustum().
void shz_xmtrx_store_3x3(shz_mat3x3_t *matrix) SHZ_NOEXCEPT
Stores the top-left 3x3 values currently held within XMTRX into the given matrix.
void shz_xmtrx_init_frustum(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT
Initializes XMTRX to a frustum projection matrix, equivalent to glFrustum().
void shz_xmtrx_apply_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT
Multiplies and accumulates the given 16-entry float array as a 4x4 matrix onto XMTRX.
void shz_xmtrx_load_cols_4x4(const shz_vec4_t *c1, const shz_vec4_t *c2, const shz_vec4_t *c3, const shz_vec4_t *c4) SHZ_NOEXCEPT
Sets XMTRX equal to the 4x4 matrix created from the 4 given 4D column vectors.
void shz_xmtrx_store_transpose_4x4(shz_mat4x4_t *matrix) SHZ_NOEXCEPT
Stores the transpose of the current values held within XMTRX into the given 4x4 matrix.
void shz_xmtrx_apply_self(void) SHZ_NOEXCEPT
Multiplies and accumulatse the XMTRX matrix by itself, squaring it.
void shz_xmtrx_load_apply_unaligned_4x4(const float matrix1[16], const float matrix2[16]) SHZ_NOEXCEPT
Loads XMTRX with the result of applying unaligned matrix2 onto matrix1.
void shz_xmtrx_transpose(void) SHZ_NOEXCEPT
Transposes the elements within XMTRX, in-place.
void shz_xmtrx_apply_rotation_z(float z) SHZ_NOEXCEPT
Transforms the values of the inner 3x3 matrix by a rotation matrix of z radians about the Z axis.
void shz_xmtrx_load_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT
Loads the given array of unaligned 16 float values as the 4x4 XMTRX matrix.
void shz_xmtrx_scale(float x, float y, float z) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by a 3D scaling matrix with the given components (glScalef() equival...
void shz_xmtrx_init_upper_triangular(float col1, shz_vec2_t col2, shz_vec3_t col3, shz_vec4_t col4) SHZ_NOEXCEPT
Initializes XMTRX to be an upper triangular matrix with the given column values.
void shz_xmtrx_init_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT
Initializes XMTRX to be the 3D symmetric skew matrix formed from the given vector components.
void shz_xmtrx_load_3x4(const shz_mat3x4_t *matrix) SHZ_NOEXCEPT
Loads the given 3x4 matrix into XMTRX, initializing its remaining elements to identity.
void shz_xmtrx_apply_rotation_quat(shz_quat_t quat) SHZ_NOEXCEPT
Transforms the values of the inner 3x3 matrix by the rotation matrix represented by the given quatern...
void shz_xmtrx_write_col(unsigned int index, shz_vec4_t vector) SHZ_NOEXCEPT
Sets the values at the given column index to the given 4D vector.
void shz_xmtrx_store_unaligned_4x4(float matrix[16]) SHZ_NOEXCEPT
Stores the current values held within XMTRX into the given unaligned 16-float array.
void shz_xmtrx_init_lower_triangular(shz_vec4_t col1, shz_vec3_t col2, shz_vec2_t col3, float col4) SHZ_NOEXCEPT
Initializes XMTRX to be a lower triangular matrix with the given column values.
void shz_xmtrx_init_rotation_quat(shz_quat_t q) SHZ_NOEXCEPT
Initializes XMTRX to a 3D rotation matrix with its orientation given by a quaternion.
void shz_xmtrx_apply_4x4(const shz_mat4x4_t *matrix) SHZ_NOEXCEPT
Multiplies and accumulates the given 4x4 matrix onto XMTRX.
void shz_xmtrx_apply_rotation_yxz(float yAngle, float xAngle, float zAngle) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by a 3D Y-X-Z rotation matrix, with the corresponding angles given i...
void shz_xmtrx_init_rotation_x(float x) SHZ_NOEXCEPT
Initializes XMTRX to be a 3D rotation matrix by x radians about the X axis.
void shz_xmtrx_store_transpose_3x3(shz_mat3x3_t *matrix) SHZ_NOEXCEPT
Stores the transpose of the top-left 3x3 values currently held within XMTRX into the given matrix.
void shz_xmtrx_apply_perspective(float fov, float aspect, float znear) SHZ_NOEXCEPT
Multiplies and accumulates the perspective matrix constructed from the given values onto XMTRX.
void shz_xmtrx_init_scale(float x, float y, float z) SHZ_NOEXCEPT
Initializes XMTRX to be a 3D scale matrix with the given dimensions.
void shz_xmtrx_load_3x3(const shz_mat3x3_t *matrix) SHZ_NOEXCEPT
Loads the given 3x3 matrix into XMTRX, initalizing its remaining elements to identity.
void shz_xmtrx_store_3x4(shz_mat3x4_t *matrix) SHZ_NOEXCEPT
Stores the top-left 3x4 values currently held within XMTRX into the given matrix.
void shz_xmtrx_init_diagonal(float x, float y, float z, float w) SHZ_NOEXCEPT
Initializes XMTRX to be a diagonal matrix with the given diagonal values.
void shz_xmtrx_write(shz_xmtrx_reg_t xf, float value) SHZ_NOEXCEPT
Sets the floating-point value held within the given XMTRX register to value.
void shz_xmtrx_apply_2x2(const shz_mat2x2_t *matrix) SHZ_NOEXCEPT
Multiplies and accumulates the given 2x2 matrix onto XMTRX, not modifying other elements.
void shz_xmtrx_init_identity_safe(void) SHZ_NOEXCEPT
Safely initializes XMTRX to be a 4D identity matrix.
void shz_xmtrx_load_apply_store_3x3(shz_mat3x3_t *out, const shz_mat3x3_t *matrix1, const shz_mat3x3_t *matrix2) SHZ_NOEXCEPT
Loads XMTRX with the 3x3 result of applying matrix2 onto matrix1, storing the result.
shz_vec4_t shz_xmtrx_transform_vec4(shz_vec4_t vec) SHZ_NOEXCEPT
Returns the 4D vector that is the result of transforming vec by XMTRX.
void shz_xmtrx_init_lookat(shz_vec3_t eye, shz_vec3_t center, shz_vec3_t up) SHZ_NOEXCEPT
Initializes XMTRX to a "lookAt" view matrix, equivalent to gluLookAt().
void shz_xmtrx_init_screen(float width, float height) SHZ_NOEXCEPT
Initializes XMTRX to the viewport matrix with the given dimensions.
void shz_xmtrx_init_outer_product(shz_vec4_t x, shz_vec4_t y) SHZ_NOEXCEPT
Initializes XMTRX to the 4D matrix resulting from taking the outer product of the two 4D vectors.
void shz_xmtrx_load_cols_4x3(const shz_vec4_t *c1, const shz_vec4_t *c2, const shz_vec4_t *c3) SHZ_NOEXCEPT
Loads the 3x4 matrix formed from the given 3 4D column vectors into XMTRX.
void shz_xmtrx_sub_4x4(const shz_mat4x4_t *mat) SHZ_NOEXCEPT
Subtracts each element within mat from each element within XMTRX, storing the result in XMTRX.
void shz_xmtrx_swap_rows(unsigned int index1, unsigned int index2) SHZ_NOEXCEPT
Swaps the values of the rows with the given indices.
void shz_xmtrx_apply_lookat(shz_vec3_t eye, shz_vec3_t center, shz_vec3_t up) SHZ_NOEXCEPT
Applies the 3D "lookAt" matrix constructed with the given vector components onto XMTRX....
void shz_xmtrx_add_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT
Adds the values of a 3D symmetric skew matrix constructed from the given components to XMTRX.
void shz_xmtrx_store_transpose_unaligned_4x4(float matrix[16]) SHZ_NOEXCEPT
Stores the transpose of the the current values held within XMTRX into the given 16-element float arra...
void shz_xmtrx_apply_reverse_transpose_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX onto the transpose of the given float array as a 4x4 matrix,...
void shz_xmtrx_apply_rotation_x(float x) SHZ_NOEXCEPT
Transforms the values of the inner 3x3 matrix by a rotation matrix of x radians about the X axis.
void shz_xmtrx_apply_scale(float x, float y, float z) SHZ_NOEXCEPT
Multiplies the values of the inner 3x3 matrix by the given 3D scaling terms.
void shz_xmtrx_load_apply_store_unaligned_4x4(float out[16], const float matrix1[16], const float matrix2[16]) SHZ_NOEXCEPT
Loads XMTRX with the result of applying unaligned matrix2 onto unaligned matrix1, storing the result.
void shz_xmtrx_init_rotation_xyz(float xAngle, float yAngle, float zAngle) SHZ_NOEXCEPT
Initializes XMTRX to be a 3D X-Y-Z rotation matrix, with the corresponding angles given in radians.
void shz_xmtrx_add_diagonal(float x, float y, float z, float w) SHZ_NOEXCEPT
Adds the values of a 4D diagonal matrix constructed from the given components to XMTRX.
void shz_xmtrx_init_rotation_zyx(float zAngle, float yAngle, float xAngle) SHZ_NOEXCEPT
Initializes XMTRX to be a 3D Z-Y-X rotation matrix, with the corresponding angles given in radians.
shz_vec4_t shz_xmtrx_read_col(unsigned int index) SHZ_NOEXCEPT
Returns the values at the given column index, as a 4D vector.
void shz_xmtrx_apply_rotation_xyz(float xAngle, float yAngle, float zAngle) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by a 3D X-Y-Z rotation matrix, with the corresponding angles given i...
void shz_xmtrx_init_rotation_yxz(float yAngle, float xAngle, float zAngle) SHZ_NOEXCEPT
Initializes XMTRX to be a 3D Y-X-Z rotation matrix, with the corresponding angles given in radians.
void shz_xmtrx_apply_transpose_3x3(const shz_mat3x3_t *matrix) SHZ_NOEXCEPT
Multiplies and accumulateas the transpose of the given 3x3 matrix onto XMTRX, not modifying other ele...
void shz_xmtrx_init_zero(void) SHZ_NOEXCEPT
Initializes XMTRX to contain the value of 0.0f for each element.
void shz_xmtrx_apply_transpose_4x4(const shz_mat4x4_t *matrix) SHZ_NOEXCEPT
Multiplies and accumulates the transpose of the given 4x4 matrix onto XMTRX.
void shz_xmtrx_negate(void) SHZ_NOEXCEPT
Negates each element held within XMTRX.
void shz_xmtrx_init_fft_weights(float radians) SHZ_NOEXCEPT
Initializes XMTRX to the sin/cos weights used to multiply two samples within an FFT.
void shz_xmtrx_init_rotation_zxy(float zAngle, float xAngle, float yAngle) SHZ_NOEXCEPT
Initializes XMTRX to be a 3D Z-X-Y rotation matrix, with the corresponding angles given in radians.
void shz_xmtrx_init_permutation_yzwx(void) SHZ_NOEXCEPT
Initializes XMTRX to a permutation matrix, which reorders the components of transformed vectors to be...
void shz_xmtrx_apply_store_4x4(shz_mat4x4_t *out, const shz_mat4x4_t *in) SHZ_NOEXCEPT
Multiplies XMTRX by the matrix, in, storing the result within the matrix, out.
shz_vec3_t shz_xmtrx_get_translation(void) SHZ_NOEXCEPT
Returns the translational components from the last column of XMTRX, as a 3D vector.
void shz_xmtrx_apply_reverse_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX onto the given float array as a 4x4 matrix, storing the result as XM...
void shz_xmtrx_swap_cols(unsigned int index1, unsigned int index2) SHZ_NOEXCEPT
Swaps the values of the columns with the given indices.
void shz_xmtrx_apply_reverse_transpose_4x4(const shz_mat4x4_t *matrix) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX onto the transpose of matrix, storing the result as XMTRX.
void shz_xmtrx_apply_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT
Multiplies and accumulates the 3D symmetric skew matrix with the given components onto XMTRX.
void shz_xmtrx_init_one(void) SHZ_NOEXCEPT
Initializes XMTRX to contain the value of 1.0f for each element.
void shz_xmtrx_store_2x2(shz_mat2x2_t *matrix) SHZ_NOEXCEPT
Stores the top-left 2x2 values currently held within XMTRX into the given matrix.
shz_vec3_t shz_xmtrx_transform_vec3(shz_vec3_t vec) SHZ_NOEXCEPT
Returns the 3D vector that is the result of transforming vec by XMTRX.
void shz_xmtrx_init_rotation_y(float y) SHZ_NOEXCEPT
Initializes XMTRX to be a 3D rotation matrix by y radians about the Y axis.
void shz_xmtrx_init_perspective(float fov, float aspect, float znear) SHZ_NOEXCEPT
Initializes XMTRX to a perspective projection matrix.
void shz_xmtrx_rotate(float radians, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT
Multiplies and accumulates XMTRX by the 3D rotation matrix formed by the given axis and angle (glRota...
Structure representing a 4x4 column-major matrix.
Definition shz_matrix.h:69