SH4ZAM! 0.8.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//! Initializes XMTRX to the 4x4 identity matrix.
221SHZ_INLINE void shz_xmtrx_init_identity(void) SHZ_NOEXCEPT;
222
223/*! Safely initializes XMTRX to be a 4D identity matrix.
224
225 \deprecated
226 shz_xmtrx_init_identity() is already safe now by default. This routine
227 simply calls directly into it and should not be used.
228
229 \sa shz_xmtrx_init_identity()
230*/
231SHZ_DEPRECATED("Operation is always safe now. Use default version.")
232SHZ_INLINE void shz_xmtrx_init_identity_safe(void) SHZ_NOEXCEPT;
233
234//! Initializes XMTRX to contain the value of 0.0f for each element.
235SHZ_INLINE void shz_xmtrx_init_zero(void) SHZ_NOEXCEPT;
236
237//! Initializes XMTRX to contain the value of 1.0f for each element.
238SHZ_INLINE void shz_xmtrx_init_one(void) SHZ_NOEXCEPT;
239
240//! Initializes XMTRX to contain the given \p value for each element.
241SHZ_INLINE void shz_xmtrx_init_fill(float value) SHZ_NOEXCEPT;
242
243//! Initializes XMTRX to be a 3D translation matrix to the given coordinates.
244SHZ_INLINE void shz_xmtrx_init_translation(float x, float y, float z) SHZ_NOEXCEPT;
245
246//! Initializes XMTRX to be a 3D scale matrix with the given dimensions.
247SHZ_INLINE void shz_xmtrx_init_scale(float x, float y, float z) SHZ_NOEXCEPT;
248
249//! Initializes XMTRX to be a 3D rotation matrix by \p x radians about the X axis.
250SHZ_INLINE void shz_xmtrx_init_rotation_x(float x) SHZ_NOEXCEPT;
251
252//! Initializes XMTRX to be a 3D rotation matrix by \p y radians about the Y axis.
253SHZ_INLINE void shz_xmtrx_init_rotation_y(float y) SHZ_NOEXCEPT;
254
255//! Initializes XMTRX to be a 3D rotation matrix by \p z radians about the Z axis.
256SHZ_INLINE void shz_xmtrx_init_rotation_z(float z) SHZ_NOEXCEPT;
257
258/*! Initializes XMTRX to be a 3D X-Y-Z rotation matrix, with the corresponding angles given in radians.
259
260 \note
261 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
262
263 \sa shz_xmtrx_init_rotation_zyx(), shz_xmtrx_init_rotation_yxz()
264*/
265SHZ_INLINE void shz_xmtrx_init_rotation_xyz(float xAngle, float yAngle, float zAngle) SHZ_NOEXCEPT;
266
267/*! Initializes XMTRX to be a 3D Z-Y-X rotation matrix, with the corresponding angles given in radians.
268
269 \note
270 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
271
272 \sa shz_xmtrx_init_rotation_xyz(), shz_xmtrx_init_rotation_yxz()
273*/
274SHZ_INLINE void shz_xmtrx_init_rotation_zyx(float zAngle, float yAngle, float xAngle) SHZ_NOEXCEPT;
275
276/*! Initializes XMTRX to be a 3D Z-X-Y rotation matrix, with the corresponding angles given in radians.
277
278 \note
279 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
280
281 \sa shz_xmtrx_init_rotation_zyx(), shz_xmtrx_init_rotation_yxz()
282*/
283SHZ_INLINE void shz_xmtrx_init_rotation_zxy(float zAngle, float xAngle, float yAngle) SHZ_NOEXCEPT;
284
285/*! Initializes XMTRX to be a 3D Y-X-Z rotation matrix, with the corresponding angles given in radians.
286
287 \note
288 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
289
290 \sa shz_xmtrx_init_rotation_yxz(), shz_xmtrx_init_rotation_xyz()
291*/
292SHZ_INLINE void shz_xmtrx_init_rotation_yxz(float yAngle, float xAngle, float zAngle) SHZ_NOEXCEPT;
293
294/*! Initializes XMTRX to a 3D rotation matrix of \p angle radians about the vector with the given components.
295
296 \note This routine works similarly to glRotatef() applied to an identitiy matrix. The given
297 axis will automatically be normalized internally.
298
299 \sa shz_xmtrx_init_rotation_dir()
300*/
301SHZ_INLINE void shz_xmtrx_init_rotation(float angle, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT;
302
303/*! Initializes XMTRX to contain a 3D rotation matrix of \p angle radians about the given \p axis.
304
305 This is a faster version of shz_xmtrx_init_rotation() or glRotatef() which requires being passed a unit
306 vector for the rotation axis.
307
308 \warning The vector components representing the axis of rotation must be prenormalized!
309
310 \sa shz_xmtrx_init_rotation()
311*/
312SHZ_INLINE void shz_xmtrx_init_rotation_dir(float angle, float x, float y, float z) SHZ_NOEXCEPT;
313
314//! Initializes XMTRX to be a diagonal matrix with the given diagonal values.
315SHZ_INLINE void shz_xmtrx_init_diagonal(float x, float y, float z, float w) SHZ_NOEXCEPT;
316
317//! Initializes XMTRX to be an upper triangular matrix with the given column values.
318SHZ_INLINE void shz_xmtrx_init_upper_triangular(float col1, shz_vec2_t col2, shz_vec3_t col3, shz_vec4_t col4) SHZ_NOEXCEPT;
319
320//! Initializes XMTRX to be a lower triangular matrix with the given column values.
321SHZ_INLINE void shz_xmtrx_init_lower_triangular(shz_vec4_t col1, shz_vec3_t col2, shz_vec2_t col3, float col4) SHZ_NOEXCEPT;
322
323//! Initializes XMTRX to be the 3D symmetric skew matrix formed from the given vector components.
324SHZ_INLINE void shz_xmtrx_init_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT;
325
326//! Initializes XMTRX to the 4D matrix resulting from taking the outer product of the two 4D vectors.
327SHZ_INLINE void shz_xmtrx_init_outer_product(shz_vec4_t x, shz_vec4_t y) SHZ_NOEXCEPT;
328
329//! Initializes XMTRX to a permutation matrix, which reorders the components of transformed vectors to be in WXYZ order.
330SHZ_INLINE void shz_xmtrx_init_permutation_wxyz(void) SHZ_NOEXCEPT;
331
332//! Initializes XMTRX to a permutation matrix, which reorders the components of transformed vectors to be in YZWX order.
333SHZ_INLINE void shz_xmtrx_init_permutation_yzwx(void) SHZ_NOEXCEPT;
334
335//! Initializes XMTRX to a permutation matrix, which reorders the components of transformed vectors to be in WZYX order.
336SHZ_INLINE void shz_xmtrx_init_permutation_wzyx(void) SHZ_NOEXCEPT;
337
338/*! Initializes XMTRX to the viewport matrix with the given dimensions.
339
340 fr[n + 0] | fr[n + 4] | fr[n + 8] | fr[n + 12]
341 -----------|-----------|-----------|-----------
342 w*0.5f | 0.0f | 0.0f | w*0.5f
343 0.0f | -h*0.5f | 0.0f | h*0.5f
344 0.0f | 0.0f | 1.0f | 0.0f
345 0.0f | 0.0f | 0.0f | 1.0f
346*/
347SHZ_INLINE void shz_xmtrx_init_screen(float width, float height) SHZ_NOEXCEPT;
348
349/*! Initializes XMTRX to a "lookAt" view matrix, equivalent to gluLookAt().
350
351 \warning This routine clobbers any previous XMTRX contents.
352*/
353SHZ_INLINE void shz_xmtrx_init_lookat(shz_vec3_t eye, shz_vec3_t center, shz_vec3_t up) SHZ_NOEXCEPT;
354
355/*! Initializes XMTRX to an orthographic projection matrix, equivalent to glOrtho().
356
357 \warning This routine clobbers any previous XMTRX contents.
358*/
359SHZ_INLINE void shz_xmtrx_init_ortho(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
360
361/*! Initializes XMTRX to a frustum projection matrix, equivalent to glFrustum().
362
363 \warning This routine clobbers any previous XMTRX contents.
364*/
365SHZ_INLINE void shz_xmtrx_init_frustum(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
366
367/*! Initializes XMTRX to a perspective projection matrix.
368
369 \warning This routine clobbers any previous XMTRX contents.
370*/
371SHZ_INLINE void shz_xmtrx_init_perspective(float fov, float aspect, float znear) SHZ_NOEXCEPT;
372
373/*! Initializes XMTRX to a 3D rotation matrix with its orientation given by a quaternion.
374
375 \warning This routine clobbers any previous XMTRX contents.
376 \warning This routine is out-of-line.
377*/
378void shz_xmtrx_init_rotation_quat(shz_quat_t q) SHZ_NOEXCEPT;
379
380//! @}
381
382/*! \name Apply Operation
383 \brief Updates only relevant values of XMTRX based on the given transform.
384 @{
385*/
386
387//! Multiplies and accumulates the given 4x4 matrix onto XMTRX.
388SHZ_INLINE void shz_xmtrx_apply_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
389
390//! Multiplies and accumulates the given 16-entry float array as a 4x4 matrix onto XMTRX.
391SHZ_INLINE void shz_xmtrx_apply_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
392
393//! Multiplies and accumulates the transpose of the given 4x4 matrix onto XMTRX.
394SHZ_INLINE void shz_xmtrx_apply_transpose_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
395
396//! Multiplies and accumulates the transpose of the given 16-entry float array as a 4x4 matrix onto XMTRX.
397SHZ_INLINE void shz_xmtrx_apply_transpose_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
398
399//! Multiplies and accumulates XMTRX onto \p matrix, storing the result as XMTRX.
400SHZ_INLINE void shz_xmtrx_apply_reverse_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
401
402//! Multiplies and accumulates XMTRX onto the given float array as a 4x4 matrix, storing the result as XMTRX.
403SHZ_INLINE void shz_xmtrx_apply_reverse_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
404
405//! Multiplies and accumulates XMTRX onto the transpose of \p matrix, storing the result as XMTRX.
406SHZ_INLINE void shz_xmtrx_apply_reverse_transpose_4x4(const shz_mat4x4_t* matrix) SHZ_NOEXCEPT;
407
408//! Multiplies and accumulates XMTRX onto the transpose of the given float array as a 4x4 matrix, storing the result as XMTRX.
409SHZ_INLINE void shz_xmtrx_apply_reverse_transpose_unaligned_4x4(const float matrix[16]) SHZ_NOEXCEPT;
410
411//! Multiplies and accumulates the given 3x4 matrix onto XMTRX, not modifying other elements.
412SHZ_INLINE void shz_xmtrx_apply_3x4(const shz_mat3x4_t* matrix) SHZ_NOEXCEPT;
413
414//! Multiplies and accumulates the given 3x3 matrix onto XMTRX, not modifying other elements.
415SHZ_INLINE void shz_xmtrx_apply_3x3(const shz_mat3x3_t* matrix) SHZ_NOEXCEPT;
416
417//! Multiplies and accumulates the transpose of the given 3x3 matrix onto XMTRX, not modifying other elements.
418SHZ_INLINE void shz_xmtrx_apply_transpose_3x3(const shz_mat3x3_t* matrix) SHZ_NOEXCEPT;
419
420//! Multiplies and accumulates the given 2x2 matrix onto XMTRX, not modifying other elements.
421SHZ_INLINE void shz_xmtrx_apply_2x2(const shz_mat2x2_t* matrix) SHZ_NOEXCEPT;
422
423//! Adds the values of the given 3 components to the 3D translation components of XMTRX.
424SHZ_INLINE void shz_xmtrx_apply_translation(float x, float y, float z) SHZ_NOEXCEPT;
425
426//! Multiplies the values of the inner 3x3 matrix by the given 3D scaling terms.
427SHZ_INLINE void shz_xmtrx_apply_scale(float x, float y, float z) SHZ_NOEXCEPT;
428
429//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p x radians about the X axis.
430SHZ_INLINE void shz_xmtrx_apply_rotation_x(float x) SHZ_NOEXCEPT;
431
432//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p y radians about the Y axis.
433SHZ_INLINE void shz_xmtrx_apply_rotation_y(float y) SHZ_NOEXCEPT;
434
435//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p z radians about the Z axis.
436SHZ_INLINE void shz_xmtrx_apply_rotation_z(float z) SHZ_NOEXCEPT;
437
438/*! Multiplies and accumulates XMTRX by a 3D X-Y-Z rotation matrix, with the corresponding angles given in radians.
439
440 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
441
442 \note
443 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
444
445 \sa shz_xmtrx_apply_rotation_zyx(), shz_xmtrx_apply_rotation_yxz()
446*/
447SHZ_INLINE void shz_xmtrx_apply_rotation_xyz(float xAngle, float yAngle, float zAngle) SHZ_NOEXCEPT;
448
449/*! Multiplies and accumulates XMTRX by a 3D Z-Y-X rotation matrix, with the corresponding angles given in radians.
450
451 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
452
453 \note
454 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
455
456 \sa shz_xmtrx_apply_rotation_xyz(), shz_xmtrx_apply_rotation_yxz()
457*/
458SHZ_INLINE void shz_xmtrx_apply_rotation_zyx(float zAngle, float yAngle, float xAngle) SHZ_NOEXCEPT;
459
460/*! Multiplies and accumulates XMTRX by a 3D Z-X-Y rotation matrix, with the corresponding angles given in radians.
461
462 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
463
464 \note
465 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
466
467 \sa shz_xmtrx_apply_rotation_zyx(), shz_xmtrx_apply_rotation_yxz()
468*/
469SHZ_INLINE void shz_xmtrx_apply_rotation_zxy(float zAngle, float xAngle, float yAngle) SHZ_NOEXCEPT;
470
471/*! Multiplies and accumulates XMTRX by a 3D Y-X-Z rotation matrix, with the corresponding angles given in radians.
472
473 The transform is applied to the inner 3x3 values within XMTRX, preserving the translational components.
474
475 \note
476 The given angles are represented as Tait-Bryan angles, representing an extrinsic rotation.
477
478 \sa shz_xmtrx_apply_rotation_xyz(), shz_xmtrx_apply_rotation_zyx()
479*/
480SHZ_INLINE void shz_xmtrx_apply_rotation_yxz(float yAngle, float xAngle, float zAngle) SHZ_NOEXCEPT;
481
482//! Transforms the values of the inner 3x3 matrix by a rotation matrix of \p angle radians about the axis with the given components.
483SHZ_INLINE void shz_xmtrx_apply_rotation(float angle, float x, float y, float z) SHZ_NOEXCEPT;
484
485//! Transforms the values of the inner 3x3 matrix by the rotation matrix represented by the given quaternion.
486SHZ_INLINE void shz_xmtrx_apply_rotation_quat(shz_quat_t quat) SHZ_NOEXCEPT;
487
488//! Applies the 3D "lookAt" matrix constructed with the given vector components onto XMTRX. Equivalent to gluLookAt().
489SHZ_INLINE void shz_xmtrx_apply_lookat(shz_vec3_t eye, shz_vec3_t center, shz_vec3_t up) SHZ_NOEXCEPT;
490
491//! Applies a 2D orthographic projection matrix onto XMTRX, equivalent to glOrtho().
492SHZ_INLINE void shz_xmtrx_apply_ortho(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
493
494//! Applies a frustum projection matrix onto XMTRX, equivalent to glFrustum().
495SHZ_INLINE void shz_xmtrx_apply_frustum(float left, float right, float bottom, float top, float znear, float zfar) SHZ_NOEXCEPT;
496
497/*! Multiplies and accumulates the perspective matrix constructed from the given values onto XMTRX.
498
499 fr[n + 0] | fr[n + 4] | fr[n + 8] | fr[n + 12]
500 -----------|-----------|-----------|-----------
501 cot(f)/a | 0.0f | 0.0f | 0.0f
502 0.0f | cot(f) | 0.0f | 0.0f
503 0.0f | 0.0f | 0.0f | nz
504 0.0f | 0.0f | -1.0f | 0.0f
505*/
506SHZ_INLINE void shz_xmtrx_apply_perspective(float fov, float aspect, float znear) SHZ_NOEXCEPT;
507
508/*! Multiplies and accumulates the viewport matrix created with the given components.
509
510 fr[n + 0] | fr[n + 4] | fr[n + 8] | fr[n + 12]
511 -----------|-----------|-----------|-----------
512 w*0.5f | 0.0f | 0.0f | w*0.5f
513 0.0f | -h*0.5f | 0.0f | h*0.5f
514 0.0f | 0.0f | 1.0f | 0.0f
515 0.0f | 0.0f | 0.0f | 1.0f
516*/
517SHZ_INLINE void shz_xmtrx_apply_screen(float width, float height) SHZ_NOEXCEPT;
518
519//! Multiplies and accumulates the 3D symmetric skew matrix with the given components onto XMTRX.
520SHZ_INLINE void shz_xmtrx_apply_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT;
521
522//! Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors to be in WXYZ order.
523SHZ_INLINE void shz_xmtrx_apply_permutation_wxyz(void) SHZ_NOEXCEPT;
524
525//! Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors to be in YZWX order.
526SHZ_INLINE void shz_xmtrx_apply_permutation_yzwx(void) SHZ_NOEXCEPT;
527
528//! Multiplies and accumulates a permutation matrix, which reorders the components of transformed vectors to be in WZYX order.
529SHZ_INLINE void shz_xmtrx_apply_permutation_wzyx(void) SHZ_NOEXCEPT;
530
531//! Multiplies and accumulatse the XMTRX matrix by itself, squaring it.
532SHZ_INLINE void shz_xmtrx_apply_self(void) SHZ_NOEXCEPT;
533
534//! @}
535
536/*! \name GL Transformations
537 \brief OpenGL-style 4x4 matrix transforms.
538 @{
539*/
540
541//! Multiplies and accumulates XMTRX by a 3D translation matrix with the given components (glTranslatef() equivalent).
542SHZ_INLINE void shz_xmtrx_translate(float x, float y, float z) SHZ_NOEXCEPT;
543
544//! Multiplies and accumulates XMTRX by a 3D scaling matrix with the given components (glScalef() equivalent).
545SHZ_INLINE void shz_xmtrx_scale(float x, float y, float z) SHZ_NOEXCEPT;
546
547//! Multiplies and accumulates XMTRX by a 3D rotation matrix about the X axis.
548SHZ_INLINE void shz_xmtrx_rotate_x(float radians) SHZ_NOEXCEPT;
549
550//! Multiplies and accumulates XMTRX by a 3D rotation matrix about the Y axis.
551SHZ_INLINE void shz_xmtrx_rotate_y(float radians) SHZ_NOEXCEPT;
552
553//! Multiplies and accumulates XMTRX by a 3D rotation matrix about the Z axis.
554SHZ_INLINE void shz_xmtrx_rotate_z(float radians) SHZ_NOEXCEPT;
555
556//! Multiplies and accumulates XMTRX by 3D rotation matrices about the X then Y then Z axes.
557SHZ_INLINE void shz_xmtrx_rotate_xyz(float xRadians, float yRadians, float zRadians) SHZ_NOEXCEPT;
558
559//! Multiplies and accumulates XMTRX by 3D rotation matrices about the Z then Y then X axes.
560SHZ_INLINE void shz_xmtrx_rotate_zyx(float zRadians, float yRadians, float xRadians) SHZ_NOEXCEPT;
561
562//! Multiplies and accumulates XMTRX by 3D rotation matrices about the Z then X then Y axes.
563SHZ_INLINE void shz_xmtrx_rotate_zxy(float zRadians, float xRadians, float yRadians) SHZ_NOEXCEPT;
564
565//! Multiplies and accumulates XMTRX by 3D rotation matrices about the Y then X then Z axes.
566SHZ_INLINE void shz_xmtrx_rotate_yxz(float yRadians, float xRadians, float zRadians) SHZ_NOEXCEPT;
567
568//! Multiplies and accumulates XMTRX by the 3D rotation matrix formed by the given axis and angle (glRotatef equivalent).
569SHZ_INLINE void shz_xmtrx_rotate(float radians, float xAxis, float yAxis, float zAxis) SHZ_NOEXCEPT;
570
571//!@}
572
573/*! \name Reverse GL Transformations
574 \brief Pre-multiplication variants of OpenGL-style 4x4 matrix transforms.
575 @{
576*/
577
578//! Pre-multiplies and accumulates XMTRX onto the 3D translation matrix with the given components.
579SHZ_INLINE void shz_xmtrx_translate_reverse(float x, float y, float z) SHZ_NOEXCEPT;
580
581//! Pre-multiplies and accumulates XMTRX onto the 3D scaling matrix with the given components.
582SHZ_INLINE void shz_xmtrx_scale_reverse(float x, float y, float z) SHZ_NOEXCEPT;
583
584//!@}
585
586/*! \name Compound Operations
587 \brief Multiple operations combined into one pipelined transaction.
588 @{
589*/
590
591/*! Loads XMTRX with the result of applying \p matrix2 onto \p matrix1.
592
593 This operation is equivalent to:
594 shz_xmtrx_load_4x4(matrix1);
595 shz_xmtrx_apply_4x4(matrix2);
596
597 However, it has been optimized and pipelined for performing the load
598 and multiply in parallel.
599
600 \sa shz_xmtrx_load_4x4(), shz_xmtrx_apply_4x4(), shz_xmtrx_load_apply_store_4x4()
601*/
602SHZ_INLINE void shz_xmtrx_load_apply_4x4(const shz_mat4x4_t* matrix1,
603 const shz_mat4x4_t* matrix2) SHZ_NOEXCEPT;
604
605/*! Loads XMTRX with the result of applying unaligned \p matrix2 onto \p matrix1.
606
607 This routine is equivalent to shz_xmtrx_load_apply_4x4(), except that the two
608 operand matrices do not require 8-byte alignment and can simply be 16-element
609 single-precision float arrays.
610
611 \sa shz_xmtrx_load_apply_4x4()
612*/
613SHZ_INLINE void shz_xmtrx_load_apply_unaligned_4x4(const float matrix1[16],
614 const float matrix2[16]) SHZ_NOEXCEPT;
615
616/*! Multiplies XMTRX by the matrix, \p in, storing the result within the matrix, \p out.
617
618 This routine is roughly equivalent to:
619 shz_xmtrx_apply_4x4(in);
620 shz_xmtrx_store_4x4(out);
621
622 However, it has been optimized and pipelined for performing the multiply and store in parallel.
623
624 \note
625 This is useful for when you want to multiply a batch of matrices by the same matrix, held within XMTRX.
626
627 \warning
628 The result of the multiplication is not stored within XMTRX, despite it getting clobbered.
629
630 \sa shz_xmtrx_apply_4x4(), shz_xmtrx_store_4x4(), shz_xmtrx_apply_store_unaligned_4x4()
631*/
632 SHZ_INLINE void shz_xmtrx_apply_store_4x4(shz_mat4x4_t* out,
633 const shz_mat4x4_t* in) SHZ_NOEXCEPT;
634
635/*! Multiplies XMTRX by the unaligned matrix, \p in, storing the result within the unaligned matrix, \p out.
636
637 This routine is roughly equivalent to:
638 shz_xmtrx_apply_unaligned_4x4(in);
639 shz_xmtrx_store_unaligned_4x4(out);
640
641 However, it has been optimized and pipelined for performing the multiply and store in parallel.
642
643 \note
644 This is useful for when you want to multiply a batch of matrices by the same matrix, held within XMTRX.
645
646 \warning
647 The result of the multiplication is not stored within XMTRX, despite it getting clobbered.
648
649 \sa shz_xmtrx_apply_unaligned_4x4(), shz_xmtrx_store_unaligned_4x4(), shz_xmtrx_apply_store_4x4()
650*/
651 SHZ_INLINE void shz_xmtrx_apply_store_unaligned_4x4(float out[16],
652 const float in[16]) SHZ_NOEXCEPT;
653
654/*! Loads XMTRX with the 4x4 result of applying \p matrix2 onto \p matrix1, storing the result.
655
656 This operation is equivalent to:
657 shz_xmtrx_load_4x4(matrix1);
658 shz_xmtrx_apply_4x4(matrix2);
659 shz_xmtrx_store_4x4(out);
660
661 However, it has been optimized and pipelined for performing the loads, multiplies, and
662 stores in parallel.
663
664 \sa shz_xmtrx_load_apply(), shz_xmtrx_load_apply_store_unaligned_4x4()
665*/
666SHZ_INLINE void shz_xmtrx_load_apply_store_4x4(shz_mat4x4_t* out,
667 const shz_mat4x4_t* matrix1,
668 const shz_mat4x4_t* matrix2) SHZ_NOEXCEPT;
669
670/*! Loads XMTRX with the result of applying unaligned \p matrix2 onto unaligned \p matrix1, storing the result.
671
672 This routine is equivalent to shz_xmtrx_load_apply_store_4x4(), except that the three
673 operand matrices do not require 8-byte alignment and can simply be 16-element
674 single-precision float arrays.
675
676 \sa shz_xmtrx_load_apply_store_4x4()
677*/
678SHZ_INLINE void shz_xmtrx_load_apply_store_unaligned_4x4(float out[16],
679 const float matrix1[16],
680 const float matrix2[16]) SHZ_NOEXCEPT;
681
682/*! Loads XMTRX with the 3x4 result of applying \p matrix2 onto \p matrix1, storing the result.
683
684 This operation is equivalent to:
685 shz_xmtrx_load_3x4(matrix1);
686 shz_xmtrx_apply_3x4(matrix2);
687 shz_xmtrx_store_3x4(out);
688
689 However, it has been optimized and pipelined for performing the loads, multiplies,
690 and stores in parallel.
691
692 \note
693 The resulting matrix does not get stored within XMTRX, despite it getting clobbered.
694
695 \sa shz_xmtrx_load_3x4(), shz_xmtrx_apply_3x4(), shz_xmtrx_store_3x4()
696*/
697SHZ_INLINE void shz_xmtrx_load_apply_store_3x4(shz_mat3x4_t* out,
698 const shz_mat3x4_t* matrix1,
699 const shz_mat3x4_t* matrix2) SHZ_NOEXCEPT;
700
701/*! Loads XMTRX with the 3x3 result of applying \p matrix2 onto \p matrix1, storing the result.
702
703 This operation is equivalent to:
704 shz_xmtrx_load_3x3(matrix1);
705 shz_xmtrx_apply_3x3(matrix2);
706 shz_xmtrx_store_3x3(out);
707
708 However, it has been optimized and pipelined for performing the loads, multiplies,
709 and stores in parallel.
710
711 \note
712 The resulting matrix does not get stored within XMTRX, despite it getting clobbered.
713
714 \sa shz_xmtrx_load_3x3(), shz_xmtrx_apply_3x3(), shz_xmtrx_store_3x3()
715*/
716SHZ_INLINE void shz_xmtrx_load_apply_store_3x3(shz_mat3x3_t* out,
717 const shz_mat3x3_t* matrix1,
718 const shz_mat3x3_t* matrix2) SHZ_NOEXCEPT;
719
720//! @}
721
722/*! \name Transformations
723 \brief Transforming vectors and points against XMTRX.
724 @{
725*/
726
727//! Returns the 4D vector that is the result of transforming \p vec by XMTRX.
728SHZ_INLINE shz_vec4_t shz_xmtrx_transform_vec4(shz_vec4_t vec) SHZ_NOEXCEPT;
729
730//! Returns the 3D vector that is the result of transforming \p vec by XMTRX.
731SHZ_INLINE shz_vec3_t shz_xmtrx_transform_vec3(shz_vec3_t vec) SHZ_NOEXCEPT;
732
733//! Returns the 2D vector that is the result of transforming \p vec by XMTRX.
734SHZ_INLINE shz_vec2_t shz_xmtrx_transform_vec2(shz_vec2_t vec) SHZ_NOEXCEPT;
735
736//! Returns the 2D point that is the result of transforming \p pt by XMTRX.
737SHZ_INLINE shz_vec2_t shz_xmtrx_transform_point2(shz_vec2_t pt) SHZ_NOEXCEPT;
738
739//! Returns the 3D point that is the result of transforming \p pt by XMTRX.
740SHZ_INLINE shz_vec3_t shz_xmtrx_transform_point3(shz_vec3_t pt) SHZ_NOEXCEPT;
741
742//! @}
743
744/*! \name Setters
745 \brief Sets the values of related XMTRX components.
746 @{
747*/
748
749//! Sets only the translational components of XMTRX to the given values.
750SHZ_INLINE void shz_xmtrx_set_translation(float x, float y, float z) SHZ_NOEXCEPT;
751
752//! Sets only the inner 3x3 submatrix of XMTRX to be a scaling matrix.
753SHZ_INLINE void shz_xmtrx_set_scale(float x, float y, float z) SHZ_NOEXCEPT;
754
755//! @}
756
757/*! \name Getters
758 \brief Gets the values of related XMTRX components.
759 @{
760*/
761
762//! Returns the translational components from the last column of XMTRX, as a 3D vector.
763SHZ_INLINE shz_vec3_t shz_xmtrx_get_translation(void) SHZ_NOEXCEPT;
764
765/*! Returns the scaling components from the inner 3x3 matrix of XMTRX, as a 3D vector.
766
767 \warning This routine assumes XMTRX is a standard TRS-style transform matrix,
768 without shearing or reflection.
769*/
770SHZ_INLINE shz_vec3_t shz_xmtrx_get_scale(void) SHZ_NOEXCEPT;
771
772//! @}
773
774/*! \name Component-Wise Matrix Operations
775 \brief Operations applying each component of a matrix onto XMTRX.
776 @{
777*/
778
779//! Adds each element within \p mat to each element within XMTRX, storing the result in XMTRX.
780SHZ_INLINE void shz_xmtrx_add_4x4(const shz_mat4x4_t* mat) SHZ_NOEXCEPT;
781
782//! Subtracts each element within \p mat from each element within XMTRX, storing the result in XMTRX.
783SHZ_INLINE void shz_xmtrx_sub_4x4(const shz_mat4x4_t* mat) SHZ_NOEXCEPT;
784
785//! @}
786
787/*! \name Miscellaneous
788 \brief Random operations and conversions on XMTRX.
789 @{
790*/
791
792//! Adds the values of a 3D symmetric skew matrix constructed from the given components to XMTRX.
793SHZ_INLINE void shz_xmtrx_add_symmetric_skew(float x, float y, float z) SHZ_NOEXCEPT;
794
795//! Adds the values of a 4D diagonal matrix constructed from the given components to XMTRX.
796SHZ_INLINE void shz_xmtrx_add_diagonal(float x, float y, float z, float w) SHZ_NOEXCEPT;
797
798//! Transposes the elements within XMTRX, in-place.
799SHZ_INLINE void shz_xmtrx_transpose(void) SHZ_NOEXCEPT;
800
801//! Negates each element held within XMTRX.
802SHZ_INLINE void shz_xmtrx_negate(void) SHZ_NOEXCEPT;
803
804//! Takes the absolute value of each element held within XMTRX.
805SHZ_INLINE void shz_xmtrx_abs(void) SHZ_NOEXCEPT;
806
807//! Constructs a quaternion from the 3D rotation matrix within XMTRX.
808shz_quat_t shz_xmtrx_to_quat(void) SHZ_NOEXCEPT;
809
810//! Returns the determinant of XMTRX.
811float shz_xmtrx_determinant(void) SHZ_NOEXCEPT;
812
813/*! Inverts XMTRX in-place.
814
815 Stores XMTRX to memory, computes the inverse via shz_mat4x4_inverse(),
816 and reloads the result.
817
818 \warning This routine is out-of-line.
819*/
820void shz_xmtrx_invert(void) SHZ_NOEXCEPT;
821
822/*! Adds and accumulates a scaled 4x4 matrix onto XMTRX.
823
824 Each component of \p joint_matrix will be multiplied by \p weight, with the result
825 being added to the existing value of that component of XMTRX.
826
827 This is useful for accumulating weighted joint matrices onto an initially
828 zeroed-out XMTRX. This allows for in-place construction of a skin matrix, which can
829 then be directly used to transform the vertices of a mesh against for animation.
830
831 \sa shz_xmtrx_init_zero()
832*/
833SHZ_INLINE void shz_xmtrx_blend(const shz_mat4x4_t* joint_matrix, float weight) SHZ_NOEXCEPT;
834
835//! @}
836
837#include "inline/shz_xmtrx.inl.h"
838
839SHZ_DECLS_END
840
841#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_blend(const shz_mat4x4_t *joint_matrix, float weight) SHZ_NOEXCEPT
Adds and accumulates a scaled 4x4 matrix onto 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
Initializes XMTRX to the 4x4 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 vector with the given components...
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_set_scale(float x, float y, float z) SHZ_NOEXCEPT
Sets only the inner 3x3 submatrix of XMTRX to be a scaling matrix.
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_init_rotation_dir(float angle, float x, float y, float z) SHZ_NOEXCEPT
Initializes XMTRX to contain a 3D rotation matrix of angle radians about the given axis.
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_translate_reverse(float x, float y, float z) SHZ_NOEXCEPT
Pre-multiplies and accumulates XMTRX onto the 3D translation matrix with the given components.
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_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_scale_reverse(float x, float y, float z) SHZ_NOEXCEPT
Pre-multiplies and accumulates XMTRX onto the 3D scaling matrix with the given components.
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.
shz_vec3_t shz_xmtrx_get_scale(void) SHZ_NOEXCEPT
Returns the scaling components from the inner 3x3 matrix of XMTRX, as a 3D 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 accumulates the transpose of the given 3x3 matrix onto XMTRX, not modifying other elem...
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