SH4ZAM! 0.7.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 a permutation matrix, which reorders the components of transformed vectors to be in WZYX order.
321SHZ_INLINE void shz_xmtrx_init_permutation_wzyx(void) SHZ_NOEXCEPT;
322
323/*! Initializes XMTRX to the viewport matrix with the given dimensions.
324
325 fr[n + 0] | fr[n + 4] | fr[n + 8] | fr[n + 12]
326 -----------|-----------|-----------|-----------
327 w*0.5f | 0.0f | 0.0f | w*0.5f
328 0.0f | -h*0.5f | 0.0f | h*0.5f
329 0.0f | 0.0f | 1.0f | 0.0f
330 0.0f | 0.0f | 0.0f | 1.0f
331*/
332SHZ_INLINE void shz_xmtrx_init_screen(float width, float height) SHZ_NOEXCEPT;
333
334/*! Initializes XMTRX to a "lookAt" view matrix, equivalent to gluLookAt().
335
336 \warning This routine clobbers any previous XMTRX contents.
337*/
338SHZ_INLINE void shz_xmtrx_init_lookat(shz_vec3_t eye, shz_vec3_t center, shz_vec3_t up) SHZ_NOEXCEPT;
339
340/*! Initializes XMTRX to an orthographic projection matrix, equivalent to glOrtho().
341
342 \warning This routine clobbers any previous XMTRX contents.
343*/
344SHZ_INLINE void shz_xmtrx_init_ortho(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
345
346/*! Initializes XMTRX to a frustum projection matrix, equivalent to glFrustum().
347
348 \warning This routine clobbers any previous XMTRX contents.
349*/
350SHZ_INLINE void shz_xmtrx_init_frustum(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
351
352/*! Initializes XMTRX to a perspective projection matrix.
353
354 \warning This routine clobbers any previous XMTRX contents.
355*/
356SHZ_INLINE void shz_xmtrx_init_perspective(float fov, float aspect, float znear) SHZ_NOEXCEPT;
357
358/*! Initializes XMTRX to a 3D rotation matrix with its orientation given by a quaternion.
359
360 \warning This routine clobbers any previous XMTRX contents.
361 \warning This routine is out-of-line.
362*/
363void shz_xmtrx_init_rotation_quat(shz_quat_t q) SHZ_NOEXCEPT;
364
365//! @}
366
367/*! \name Apply Operation
368 \brief Updates only relevant values of XMTRX based on the given transform.
369 @{
370*/
371
372//! Multiplies and accumulates the given 4x4 matrix onto XMTRX.
373SHZ_INLINE void shz_xmtrx_apply_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
374
375//! Multiplies and accumulates the given 16-entry float array as a 4x4 matrix onto XMTRX.
376SHZ_INLINE void shz_xmtrx_apply_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
377
378//! Multiplies and accumulates the transpose of the given 4x4 matrix onto XMTRX.
379SHZ_INLINE void shz_xmtrx_apply_transpose_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
380
381//! Multiplies and accumulates the transpose of the given 16-entry float array as a 4x4 matrix onto XMTRX.
382SHZ_INLINE void shz_xmtrx_apply_transpose_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
383
384//! Multiplies and accumulates XMTRX onto \p matrix, storing the result as XMTRX.
385SHZ_INLINE void shz_xmtrx_apply_reverse_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
386
387//! Multiplies and accumulates XMTRX onto the given float array as a 4x4 matrix, storing the result as XMTRX.
388SHZ_INLINE void shz_xmtrx_apply_reverse_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
389
390//! Multiplies and accumulates XMTRX onto the transpose of \p matrix, storing the result as XMTRX.
391SHZ_INLINE void shz_xmtrx_apply_reverse_transpose_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
392
393//! Multiplies and accumulates XMTRX onto the transpose of the given float array as a 4x4 matrix, storing the result as XMTRX.
394SHZ_INLINE void shz_xmtrx_apply_reverse_transpose_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
395
396//! Multiplies and accumulates the given 3x4 matrix onto XMTRX, not modifying other elements.
397SHZ_INLINE void shz_xmtrx_apply_3x4(const shz_mat3x4_t* matrix) SHZ_NOEXCEPT;
398
399//! Multiplies and accumulates the given 3x3 matrix onto XMTRX, not modifying other elements.
400SHZ_INLINE void shz_xmtrx_apply_3x3(const shz_mat3x3_t* matrix) SHZ_NOEXCEPT;
401
402//! Multiplies and accumulateas the transpose of the given 3x3 matrix onto XMTRX, not modifying other elements.
403SHZ_INLINE void shz_xmtrx_apply_transpose_3x3(const shz_mat3x3_t* matrix) SHZ_NOEXCEPT;
404
405//! Multiplies and accumulates the given 2x2 matrix onto XMTRX, not modifying other elements.
406SHZ_INLINE void shz_xmtrx_apply_2x2(const shz_mat2x2_t* matrix) SHZ_NOEXCEPT;
407
408//! Adds the values of the given 3 components to the 3D translation components of XMTRX.
409SHZ_INLINE void shz_xmtrx_apply_translation(float x, float y, float z) SHZ_NOEXCEPT;
410
411//! Multiplies the values of the inner 3x3 matrix by the given 3D scaling terms.
412SHZ_INLINE void shz_xmtrx_apply_scale(float x, float y, float z) SHZ_NOEXCEPT;
413
414//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p x radians about the X axis.
415SHZ_INLINE void shz_xmtrx_apply_rotation_x(float x) SHZ_NOEXCEPT;
416
417//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p y radians about the Y axis.
418SHZ_INLINE void shz_xmtrx_apply_rotation_y(float y) SHZ_NOEXCEPT;
419
420//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p z radians about the Z axis.
421SHZ_INLINE void shz_xmtrx_apply_rotation_z(float z) SHZ_NOEXCEPT;
422
423/*! Multiplies and accumulates XMTRX by a 3D X-Y-Z rotation matrix, with the corresponding angles given in radians.
424
425 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
426
427 \note
428 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
429
430 \sa shz_xmtrx_apply_rotation_zyx(), shz_xmtrx_apply_rotation_yxz()
431*/
432SHZ_INLINE void shz_xmtrx_apply_rotation_xyz(float xAngle, float yAngle, float zAngle) SHZ_NOEXCEPT;
433
434/*! Multiplies and accumulates XMTRX by a 3D Z-Y-X rotation matrix, with the corresponding angles given in radians.
435
436 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
437
438 \note
439 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
440
441 \sa shz_xmtrx_apply_rotation_xyz(), shz_xmtrx_apply_rotation_yxz()
442*/
443SHZ_INLINE void shz_xmtrx_apply_rotation_zyx(float zAngle, float yAngle, float xAngle) SHZ_NOEXCEPT;
444
445/*! Multiplies and accumulates XMTRX by a 3D Z-X-Y rotation matrix, with the corresponding angles given in radians.
446
447 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
448
449 \note
450 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
451
452 \sa shz_xmtrx_apply_rotation_zyx(), shz_xmtrx_apply_rotation_yxz()
453*/
454SHZ_INLINE void shz_xmtrx_apply_rotation_zxy(float zAngle, float xAngle, float yAngle) SHZ_NOEXCEPT;
455
456/*! Multiplies and accumulates XMTRX by a 3D Y-X-Z rotation matrix, with the corresponding angles given in radians.
457
458 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
459
460 \note
461 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
462
463 \sa shz_xmtrx_apply_rotation_xyz(), shz_xmtrx_apply_rotation_zyx()
464*/
465SHZ_INLINE void shz_xmtrx_apply_rotation_yxz(float yAngle, float xAngle, float zAngle) SHZ_NOEXCEPT;
466
467//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p angle radians about the axis with the given components.
468SHZ_INLINE void shz_xmtrx_apply_rotation(float angle, float x, float y, float z) SHZ_NOEXCEPT;
469
470//! Transforms the values of the inner 3x3 matrix by the rotation matrix represented by the given quaternion.
471SHZ_INLINE void shz_xmtrx_apply_rotation_quat(shz_quat_t quat) SHZ_NOEXCEPT;
472
473//! Applies the 3D "lookAt" matrix constructed with the given vector components onto XMTRX. Equivalent to gluLookAt().
474SHZ_INLINE void shz_xmtrx_apply_lookat(shz_vec3_t eye, shz_vec3_t center, shz_vec3_t up) SHZ_NOEXCEPT;
475
476//! Applies a 2D orthographic projection matrix onto XMTRX, equivalent to glOrtho().
477SHZ_INLINE void shz_xmtrx_apply_ortho(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
478
479//! Applies a frustum projection matrix onto XMTRX, equivalent to glFrustum().
480SHZ_INLINE void shz_xmtrx_apply_frustum(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
481
482/*! Multiplies and accumulates the perspective matrix constructed from the given values onto XMTRX.
483
484 fr[n + 0] | fr[n + 4] | fr[n + 8] | fr[n + 12]
485 -----------|-----------|-----------|-----------
486 cot(f)/a | 0.0f | 0.0f | 0.0f
487 0.0f | cot(f) | 0.0f | 0.0f
488 0.0f | 0.0f | 0.0f | nz
489 0.0f | 0.0f | -1.0f | 0.0f
490*/
491SHZ_INLINE void shz_xmtrx_apply_perspective(float fov, float aspect, float znear) SHZ_NOEXCEPT;
492
493/*! Multiplies and accumulates the viewport matrix created with the given components.
494
495 fr[n + 0] | fr[n + 4] | fr[n + 8] | fr[n + 12]
496 -----------|-----------|-----------|-----------
497 w*0.5f | 0.0f | 0.0f | w*0.5f
498 0.0f | -h*0.5f | 0.0f | h*0.5f
499 0.0f | 0.0f | 1.0f | 0.0f
500 0.0f | 0.0f | 0.0f | 1.0f
501*/
502SHZ_INLINE void shz_xmtrx_apply_screen(float width, float height) SHZ_NOEXCEPT;
503
504//! Multiplies and accumulates the 3D symmetric skew matrix with the given components onto XMTRX.
505SHZ_INLINE void shz_xmtrx_apply_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT;
506
507//! Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors to be in WXYZ order.
508SHZ_INLINE void shz_xmtrx_apply_permutation_wxyz(void) SHZ_NOEXCEPT;
509
510//! Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors to be in YZWX order.
511SHZ_INLINE void shz_xmtrx_apply_permutation_yzwx(void) SHZ_NOEXCEPT;
512
513//! Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors to be in WZYX order.
514SHZ_INLINE void shz_xmtrx_apply_permutation_wzyx(void) SHZ_NOEXCEPT;
515
516//! Multiplies and accumulatse the XMTRX matrix by itself, squaring it.
517SHZ_INLINE void shz_xmtrx_apply_self(void) SHZ_NOEXCEPT;
518
519//! @}
520
521/*! \name GL Transformations
522 \brief OpenGL-style 4x4 matrix transforms.
523 @{
524*/
525
526//! Multiplies and accumulates XMTRX by a 3D translation matrix with the given components (glTranslatef() equivalent).
527SHZ_INLINE void shz_xmtrx_translate(float x, float y, float z) SHZ_NOEXCEPT;
528
529//! Multiplies and accumulates XMTRX by a 3D scaling matrix with the given components (glScalef() equivalent).
530SHZ_INLINE void shz_xmtrx_scale(float x, float y, float z) SHZ_NOEXCEPT;
531
532//! Multiplies and accumulates XMTRX by a 3D rotation matrix about the X axis.
533SHZ_INLINE void shz_xmtrx_rotate_x(float radians) SHZ_NOEXCEPT;
534
535//! Multiplies and accumulates XMTRX by a 3D rotation matrix about the Y axis.
536SHZ_INLINE void shz_xmtrx_rotate_y(float radians) SHZ_NOEXCEPT;
537
538//! Multiplies and accumulates XMTRX by a 3D rotation matrix about the Z axis.
539SHZ_INLINE void shz_xmtrx_rotate_z(float radians) SHZ_NOEXCEPT;
540
541//! Multiplies and accumulates XMTRX by 3D rotation matrices about the X then Y then Z axes.
542SHZ_INLINE void shz_xmtrx_rotate_xyz(float xRadians, float yRadians, float zRadians) SHZ_NOEXCEPT;
543
544//! Multiplies and accumulates XMTRX by 3D rotation matrices about the Z then Y then X axes.
545SHZ_INLINE void shz_xmtrx_rotate_zyx(float zRadians, float yRadians, float xRadians) SHZ_NOEXCEPT;
546
547//! Multiplies and accumulates XMTRX by 3D rotation matrices about the Z then X then Y axes.
548SHZ_INLINE void shz_xmtrx_rotate_zxy(float zRadians, float xRadians, float yRadians) SHZ_NOEXCEPT;
549
550//! Multiplies and accumulates XMTRX by 3D rotation matrices about the Y then X then Z axes.
551SHZ_INLINE void shz_xmtrx_rotate_yxz(float yRadians, float xRadians, float zRadians) SHZ_NOEXCEPT;
552
553//! Multiplies and accumulates XMTRX by the 3D rotation matrix formed by the given axis and angle (glRotatef equivalent).
554SHZ_INLINE void shz_xmtrx_rotate(float radians, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT;
555
556//!@}
557
558/*! \name Compound Operations
559 \brief Multiple operations combined into one pipelined transaction.
560 @{
561*/
562
563/*! Loads XMTRX with the result of applying \p matrix2 onto \p matrix1.
564
565 This operation is equivalent to:
566 shz_xmtrx_load_4x4(matrix1);
567 shz_xmtrx_apply_4x4(matrix2);
568
569 However, it has been optimized and pipelined for performing the load
570 and multiply in parallel.
571
572 \sa shz_xmtrx_load_4x4(), shz_xmtrx_apply_4x4(), shz_xmtrx_load_apply_store_4x4()
573*/
574SHZ_INLINE void shz_xmtrx_load_apply_4x4(const shz_mat4x4_t* matrix1,
575 const shz_mat4x4_t* matrix2) SHZ_NOEXCEPT;
576
577/*! Loads XMTRX with the result of applying unaligned \p matrix2 onto \p matrix1.
578
579 This routine is equivalent to shz_xmtrx_load_apply_4x4(), except that the two
580 operand matrices do not require 8-byte alignment and can simply be 16-element
581 single-precision float arrays.
582
583 \sa shz_xmtrx_load_apply_4x4()
584*/
585SHZ_INLINE void shz_xmtrx_load_apply_unaligned_4x4(const float matrix1[16],
586 const float matrix2[16]) SHZ_NOEXCEPT;
587
588/*! Multiplies XMTRX by the matrix, \p in, storing the result within the matrix, \p out.
589
590 This routine is roughly equivalent to:
591 shz_xmtrx_apply_4x4(in);
592 shz_xmtrx_store_4x4(out);
593
594 However, it has been optimized and pipelined for performing the multiply and store in parallel.
595
596 \note
597 This is useful for when you want to multiply a batch of matrices by the same matrix, held within XMTRX.
598
599 \warning
600 The result of the multiplication is not stored within XMTRX, despite it getting clobbered.
601
602 \sa shz_xmtrx_apply_4x4(), shz_xmtrx_store_4x4(), shz_xmtrx_apply_store_unaligned_4x4()
603*/
604 SHZ_INLINE void shz_xmtrx_apply_store_4x4(shz_mat4x4_t* out,
605 const shz_mat4x4_t* in) SHZ_NOEXCEPT;
606
607/*! Multiplies XMTRX by the unaligned matrix, \p in, storing the result within the unaligned matrix, \p out.
608
609 This routine is roughly equivalent to:
610 shz_xmtrx_apply_unaligned_4x4(in);
611 shz_xmtrx_store_unaligned_4x4(out);
612
613 However, it has been optimized and pipelined for performing the multiply and store in parallel.
614
615 \note
616 This is useful for when you want to multiply a batch of matrices by the same matrix, held within XMTRX.
617
618 \warning
619 The result of the multiplication is not stored within XMTRX, despite it getting clobbered.
620
621 \sa shz_xmtrx_apply_unaligned_4x4(), shz_xmtrx_store_unaligned_4x4(), shz_xmtrx_apply_store_4x4()
622*/
623 SHZ_INLINE void shz_xmtrx_apply_store_unaligned_4x4(float out[16],
624 const float in[16]) SHZ_NOEXCEPT;
625
626/*! Loads XMTRX with the 4x4 result of applying \p matrix2 onto \p matrix1, storing the result.
627
628 This operation is equivalent to:
629 shz_xmtrx_load_4x4(matrix1);
630 shz_xmtrx_apply_4x4(matrix2);
631 shz_xmtrx_store_4x4(out);
632
633 However, it has been optimized and pipelined for performing the loads, multiplies, and
634 stores in parallel.
635
636 \sa shz_xmtrx_load_apply(), shz_xmtrx_load_apply_store_unaligned_4x4()
637*/
638SHZ_INLINE void shz_xmtrx_load_apply_store_4x4(shz_mat4x4_t* out,
639 const shz_mat4x4_t* matrix1,
640 const shz_mat4x4_t* matrix2) SHZ_NOEXCEPT;
641
642/*! Loads XMTRX with the result of applying unaligned \p matrix2 onto unaligned \p matrix1, storing the result.
643
644 This routine is equivalent to shz_xmtrx_load_apply_store_4x4(), except that the three
645 operand matrices do not require 8-byte alignment and can simply be 16-element
646 single-precision float arrays.
647
648 \sa shz_xmtrx_load_apply_store_4x4()
649*/
650SHZ_INLINE void shz_xmtrx_load_apply_store_unaligned_4x4(float out[16],
651 const float matrix1[16],
652 const float matrix2[16]) SHZ_NOEXCEPT;
653
654/*! Loads XMTRX with the 3x4 result of applying \p matrix2 onto \p matrix1, storing the result.
655
656 This operation is equivalent to:
657 shz_xmtrx_load_3x4(matrix1);
658 shz_xmtrx_apply_3x4(matrix2);
659 shz_xmtrx_store_3x4(out);
660
661 However, it has been optimized and pipelined for performing the loads, multiplies,
662 and stores in parallel.
663
664 \note
665 The resulting matrix does not get stored within XMTRX, despite it getting clobbered.
666
667 \sa shz_xmtrx_load_3x4(), shz_xmtrx_apply_3x4(), shz_xmtrx_store_3x4()
668*/
669SHZ_INLINE void shz_xmtrx_load_apply_store_3x4(shz_mat3x4_t* out,
670 const shz_mat3x4_t* matrix1,
671 const shz_mat3x4_t* matrix2) SHZ_NOEXCEPT;
672
673/*! Loads XMTRX with the 3x3 result of applying \p matrix2 onto \p matrix1, storing the result.
674
675 This operation is equivalent to:
676 shz_xmtrx_load_3x3(matrix1);
677 shz_xmtrx_apply_3x3(matrix2);
678 shz_xmtrx_store_3x3(out);
679
680 However, it has been optimized and pipelined for performing the loads, multiplies,
681 and stores in parallel.
682
683 \note
684 The resulting matrix does not get stored within XMTRX, despite it getting clobbered.
685
686 \sa shz_xmtrx_load_3x3(), shz_xmtrx_apply_3x3(), shz_xmtrx_store_3x3()
687*/
688SHZ_INLINE void shz_xmtrx_load_apply_store_3x3(shz_mat3x3_t* out,
689 const shz_mat3x3_t* matrix1,
690 const shz_mat3x3_t* matrix2) SHZ_NOEXCEPT;
691
692//! @}
693
694/*! \name Transformations
695 \brief Transforming vectors and points against XMTRX.
696 @{
697*/
698
699//! Returns the 4D vector that is the result of transforming \p vec by XMTRX.
700SHZ_INLINE shz_vec4_t shz_xmtrx_transform_vec4(shz_vec4_t vec) SHZ_NOEXCEPT;
701
702//! Returns the 3D vector that is the result of transforming \p vec by XMTRX.
703SHZ_INLINE shz_vec3_t shz_xmtrx_transform_vec3(shz_vec3_t vec) SHZ_NOEXCEPT;
704
705//! Returns the 2D vector that is the result of transforming \p vec by XMTRX.
706SHZ_INLINE shz_vec2_t shz_xmtrx_transform_vec2(shz_vec2_t vec) SHZ_NOEXCEPT;
707
708//! Returns the 2D point that is the result of transforming \p pt by XMTRX.
709SHZ_INLINE shz_vec2_t shz_xmtrx_transform_point2(shz_vec2_t pt) SHZ_NOEXCEPT;
710
711//! Returns the 3D point that is the result of transforming \p pt by XMTRX.
712SHZ_INLINE shz_vec3_t shz_xmtrx_transform_point3(shz_vec3_t pt) SHZ_NOEXCEPT;
713
714//! @}
715
716/*! \name Setters
717 \brief Sets the values of related XMTRX components.
718 @{
719*/
720
721//! Sets only the translational components of XMTRX to the given values.
722SHZ_INLINE void shz_xmtrx_set_translation(float x, float y, float z) SHZ_NOEXCEPT;
723
724//! @}
725
726/*! \name Getters
727 \brief Gets the values of related XMTRX components.
728 @{
729*/
730
731//! Returns the translational components from the last column of XMTRX, as a 3D vector.
732SHZ_INLINE shz_vec3_t shz_xmtrx_get_translation(void) SHZ_NOEXCEPT;
733
734//! @}
735
736/*! \name Component-Wise Matrix Operations
737 \brief Operations applying each component of a matrix onto XMTRX.
738 @{
739*/
740
741//! Adds each element within \p mat to each element within XMTRX, storing the result in XMTRX.
742SHZ_INLINE void shz_xmtrx_add_4x4(const shz_mat4x4_t* mat) SHZ_NOEXCEPT;
743
744//! Subtracts each element within \p mat from each element within XMTRX, storing the result in XMTRX.
745SHZ_INLINE void shz_xmtrx_sub_4x4(const shz_mat4x4_t* mat) SHZ_NOEXCEPT;
746
747//! @}
748
749/*! \name Miscellaneous
750 \brief Random operations and conversions on XMTRX.
751 @{
752*/
753
754//! Adds the values of a 3D symmetric skew matrix constructed from the given components to XMTRX.
755SHZ_INLINE void shz_xmtrx_add_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT;
756
757//! Adds the values of a 4D diagonal matrix constructed from the given components to XMTRX.
758SHZ_INLINE void shz_xmtrx_add_diagonal(float x, float y, float z, float w) SHZ_NOEXCEPT;
759
760//! Transposes the elements within XMTRX, in-place.
761SHZ_INLINE void shz_xmtrx_transpose(void) SHZ_NOEXCEPT;
762
763//! Negates each element held within XMTRX.
764SHZ_INLINE void shz_xmtrx_negate(void) SHZ_NOEXCEPT;
765
766//! Takes the absolute value of each element held within XMTRX.
767SHZ_INLINE void shz_xmtrx_abs(void) SHZ_NOEXCEPT;
768
769//! Constructs a quaternion from the 3D rotation matrix within XMTRX.
770shz_quat_t shz_xmtrx_to_quat(void) SHZ_NOEXCEPT;
771
772//! Returns the determinant of XMTRX.
773float shz_xmtrx_determinant(void) SHZ_NOEXCEPT;
774
775/*! Inverts XMTRX in-place.
776
777 Stores XMTRX to memory, computes the inverse via shz_mat4x4_inverse(),
778 and reloads the result.
779
780 \warning This routine is out-of-line.
781*/
782void shz_xmtrx_invert(void) SHZ_NOEXCEPT;
783
784//! @}
785
786#include "inline/shz_xmtrx.inl.h"
787
788SHZ_DECLS_END
789
790#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_apply_permutation_wzyx(void) SHZ_NOEXCEPT
Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors...
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_init_permutation_wzyx(void) SHZ_NOEXCEPT
Initializes XMTRX to a permutation matrix, which reorders the components of transformed vectors to be...
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_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