1 | /* |
2 | Simple DirectMedia Layer |
3 | Copyright (C) 1997-2025 Sam Lantinga <slouken@libsdl.org> |
4 | |
5 | This software is provided 'as-is', without any express or implied |
6 | warranty. In no event will the authors be held liable for any damages |
7 | arising from the use of this software. |
8 | |
9 | Permission is granted to anyone to use this software for any purpose, |
10 | including commercial applications, and to alter it and redistribute it |
11 | freely, subject to the following restrictions: |
12 | |
13 | 1. The origin of this software must not be misrepresented; you must not |
14 | claim that you wrote the original software. If you use this software |
15 | in a product, an acknowledgment in the product documentation would be |
16 | appreciated but is not required. |
17 | 2. Altered source versions must be plainly marked as such, and must not be |
18 | misrepresented as being the original software. |
19 | 3. This notice may not be removed or altered from any source distribution. |
20 | */ |
21 | #include "SDL_internal.h" |
22 | |
23 | #if defined(SDL_VIDEO_RENDER_D3D) || \ |
24 | defined(SDL_VIDEO_RENDER_D3D11) || \ |
25 | defined(SDL_VIDEO_RENDER_D3D12) || \ |
26 | defined(SDL_VIDEO_RENDER_VULKAN) |
27 | |
28 | #include "SDL_d3dmath.h" |
29 | |
30 | // Direct3D matrix math functions |
31 | |
32 | Float4X4 MatrixIdentity(void) |
33 | { |
34 | Float4X4 m; |
35 | SDL_zero(m); |
36 | m.v._11 = 1.0f; |
37 | m.v._22 = 1.0f; |
38 | m.v._33 = 1.0f; |
39 | m.v._44 = 1.0f; |
40 | return m; |
41 | } |
42 | |
43 | Float4X4 MatrixMultiply(Float4X4 M1, Float4X4 M2) |
44 | { |
45 | Float4X4 m; |
46 | m.v._11 = M1.v._11 * M2.v._11 + M1.v._12 * M2.v._21 + M1.v._13 * M2.v._31 + M1.v._14 * M2.v._41; |
47 | m.v._12 = M1.v._11 * M2.v._12 + M1.v._12 * M2.v._22 + M1.v._13 * M2.v._32 + M1.v._14 * M2.v._42; |
48 | m.v._13 = M1.v._11 * M2.v._13 + M1.v._12 * M2.v._23 + M1.v._13 * M2.v._33 + M1.v._14 * M2.v._43; |
49 | m.v._14 = M1.v._11 * M2.v._14 + M1.v._12 * M2.v._24 + M1.v._13 * M2.v._34 + M1.v._14 * M2.v._44; |
50 | m.v._21 = M1.v._21 * M2.v._11 + M1.v._22 * M2.v._21 + M1.v._23 * M2.v._31 + M1.v._24 * M2.v._41; |
51 | m.v._22 = M1.v._21 * M2.v._12 + M1.v._22 * M2.v._22 + M1.v._23 * M2.v._32 + M1.v._24 * M2.v._42; |
52 | m.v._23 = M1.v._21 * M2.v._13 + M1.v._22 * M2.v._23 + M1.v._23 * M2.v._33 + M1.v._24 * M2.v._43; |
53 | m.v._24 = M1.v._21 * M2.v._14 + M1.v._22 * M2.v._24 + M1.v._23 * M2.v._34 + M1.v._24 * M2.v._44; |
54 | m.v._31 = M1.v._31 * M2.v._11 + M1.v._32 * M2.v._21 + M1.v._33 * M2.v._31 + M1.v._34 * M2.v._41; |
55 | m.v._32 = M1.v._31 * M2.v._12 + M1.v._32 * M2.v._22 + M1.v._33 * M2.v._32 + M1.v._34 * M2.v._42; |
56 | m.v._33 = M1.v._31 * M2.v._13 + M1.v._32 * M2.v._23 + M1.v._33 * M2.v._33 + M1.v._34 * M2.v._43; |
57 | m.v._34 = M1.v._31 * M2.v._14 + M1.v._32 * M2.v._24 + M1.v._33 * M2.v._34 + M1.v._34 * M2.v._44; |
58 | m.v._41 = M1.v._41 * M2.v._11 + M1.v._42 * M2.v._21 + M1.v._43 * M2.v._31 + M1.v._44 * M2.v._41; |
59 | m.v._42 = M1.v._41 * M2.v._12 + M1.v._42 * M2.v._22 + M1.v._43 * M2.v._32 + M1.v._44 * M2.v._42; |
60 | m.v._43 = M1.v._41 * M2.v._13 + M1.v._42 * M2.v._23 + M1.v._43 * M2.v._33 + M1.v._44 * M2.v._43; |
61 | m.v._44 = M1.v._41 * M2.v._14 + M1.v._42 * M2.v._24 + M1.v._43 * M2.v._34 + M1.v._44 * M2.v._44; |
62 | return m; |
63 | } |
64 | |
65 | Float4X4 MatrixScaling(float x, float y, float z) |
66 | { |
67 | Float4X4 m; |
68 | SDL_zero(m); |
69 | m.v._11 = x; |
70 | m.v._22 = y; |
71 | m.v._33 = z; |
72 | m.v._44 = 1.0f; |
73 | return m; |
74 | } |
75 | |
76 | Float4X4 MatrixTranslation(float x, float y, float z) |
77 | { |
78 | Float4X4 m; |
79 | SDL_zero(m); |
80 | m.v._11 = 1.0f; |
81 | m.v._22 = 1.0f; |
82 | m.v._33 = 1.0f; |
83 | m.v._44 = 1.0f; |
84 | m.v._41 = x; |
85 | m.v._42 = y; |
86 | m.v._43 = z; |
87 | return m; |
88 | } |
89 | |
90 | Float4X4 MatrixRotationX(float r) |
91 | { |
92 | float sinR = SDL_sinf(r); |
93 | float cosR = SDL_cosf(r); |
94 | Float4X4 m; |
95 | SDL_zero(m); |
96 | m.v._11 = 1.0f; |
97 | m.v._22 = cosR; |
98 | m.v._23 = sinR; |
99 | m.v._32 = -sinR; |
100 | m.v._33 = cosR; |
101 | m.v._44 = 1.0f; |
102 | return m; |
103 | } |
104 | |
105 | Float4X4 MatrixRotationY(float r) |
106 | { |
107 | float sinR = SDL_sinf(r); |
108 | float cosR = SDL_cosf(r); |
109 | Float4X4 m; |
110 | SDL_zero(m); |
111 | m.v._11 = cosR; |
112 | m.v._13 = -sinR; |
113 | m.v._22 = 1.0f; |
114 | m.v._31 = sinR; |
115 | m.v._33 = cosR; |
116 | m.v._44 = 1.0f; |
117 | return m; |
118 | } |
119 | |
120 | Float4X4 MatrixRotationZ(float r) |
121 | { |
122 | float sinR = SDL_sinf(r); |
123 | float cosR = SDL_cosf(r); |
124 | Float4X4 m; |
125 | SDL_zero(m); |
126 | m.v._11 = cosR; |
127 | m.v._12 = sinR; |
128 | m.v._21 = -sinR; |
129 | m.v._22 = cosR; |
130 | m.v._33 = 1.0f; |
131 | m.v._44 = 1.0f; |
132 | return m; |
133 | } |
134 | |
135 | #endif // SDL_VIDEO_RENDER_D3D || SDL_VIDEO_RENDER_D3D11 || SDL_VIDEO_RENDER_D3D12 || SDL_VIDEO_RENDER_VULKAN |
136 | |