@vib3code/sdk 2.0.1 → 2.0.3-canary.0a63e71

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (192) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/DOCS/AGENT_HARNESS_ARCHITECTURE.md +245 -0
  3. package/DOCS/ANDROID_DEPLOYMENT.md +59 -0
  4. package/DOCS/ARCHITECTURE.md +1 -0
  5. package/DOCS/CI_TESTING.md +2 -0
  6. package/DOCS/CLI_ONBOARDING.md +3 -1
  7. package/DOCS/CONTROL_REFERENCE.md +2 -0
  8. package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +119 -0
  9. package/DOCS/ENV_SETUP.md +2 -0
  10. package/DOCS/EPIC_SCROLL_EVENTS.md +775 -0
  11. package/DOCS/EXPANSION_DESIGN.md +979 -0
  12. package/DOCS/EXPANSION_DESIGN_ULTRA.md +389 -0
  13. package/DOCS/EXPORT_FORMATS.md +2 -0
  14. package/DOCS/GPU_DISPOSAL_GUIDE.md +2 -0
  15. package/DOCS/HANDOFF_LANDING_PAGE.md +156 -0
  16. package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +495 -0
  17. package/DOCS/LICENSING_TIERS.md +2 -0
  18. package/DOCS/MASTER_PLAN_2026-01-31.md +4 -2
  19. package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +939 -0
  20. package/DOCS/OBS_SETUP_GUIDE.md +2 -0
  21. package/DOCS/OPTIMIZATION_PLAN_MATH.md +119 -0
  22. package/DOCS/PRODUCT_STRATEGY.md +65 -0
  23. package/DOCS/PROJECT_SETUP.md +2 -0
  24. package/DOCS/README.md +105 -0
  25. package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +99 -0
  26. package/DOCS/RENDERER_LIFECYCLE.md +2 -0
  27. package/DOCS/REPO_MANIFEST.md +2 -0
  28. package/DOCS/ROADMAP.md +113 -0
  29. package/DOCS/SCROLL_TIMELINE_v3.md +271 -0
  30. package/DOCS/SITE_REFACTOR_PLAN.md +102 -0
  31. package/DOCS/STATUS.md +26 -0
  32. package/DOCS/SYSTEM_INVENTORY.md +37 -32
  33. package/DOCS/TELEMETRY_EXPORTS.md +2 -0
  34. package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +87 -0
  35. package/DOCS/VISUAL_ANALYSIS_FACETAD.md +135 -0
  36. package/DOCS/VISUAL_ANALYSIS_SIMONE.md +97 -0
  37. package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +88 -0
  38. package/DOCS/WEBGPU_STATUS.md +121 -38
  39. package/DOCS/XR_BENCHMARKS.md +2 -0
  40. package/DOCS/archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +1 -0
  41. package/DOCS/archive/DEV_TRACK_ANALYSIS.md +1 -0
  42. package/DOCS/archive/DEV_TRACK_PLAN_2026-01-07.md +1 -0
  43. package/DOCS/archive/SESSION_014_PLAN.md +1 -0
  44. package/DOCS/archive/SESSION_LOG_2026-01-07.md +1 -0
  45. package/DOCS/archive/STRATEGIC_BLUEPRINT_2026-01-07.md +1 -0
  46. package/DOCS/archive/SYSTEM_AUDIT_2026-01-30.md +1 -0
  47. package/DOCS/archive/WEBGPU_STATUS_2026-02-15_STALE.md +1 -0
  48. package/DOCS/{DEV_TRACK_SESSION_2026-01-31.md → dev-tracks/DEV_TRACK_SESSION_2026-01-31.md} +3 -1
  49. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +233 -0
  50. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +129 -0
  51. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +144 -0
  52. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-16.md +110 -0
  53. package/DOCS/dev-tracks/PERF_UPGRADE_2026-02-16.md +310 -0
  54. package/DOCS/dev-tracks/README.md +12 -0
  55. package/README.md +26 -13
  56. package/cpp/CMakeLists.txt +236 -0
  57. package/cpp/bindings/embind.cpp +269 -0
  58. package/cpp/build.sh +129 -0
  59. package/cpp/geometry/Crystal.cpp +103 -0
  60. package/cpp/geometry/Fractal.cpp +136 -0
  61. package/cpp/geometry/GeometryGenerator.cpp +262 -0
  62. package/cpp/geometry/KleinBottle.cpp +71 -0
  63. package/cpp/geometry/Sphere.cpp +134 -0
  64. package/cpp/geometry/Tesseract.cpp +94 -0
  65. package/cpp/geometry/Tetrahedron.cpp +83 -0
  66. package/cpp/geometry/Torus.cpp +65 -0
  67. package/cpp/geometry/WarpFunctions.cpp +238 -0
  68. package/cpp/geometry/Wave.cpp +85 -0
  69. package/cpp/include/vib3_ffi.h +238 -0
  70. package/cpp/math/Mat4x4.cpp +409 -0
  71. package/cpp/math/Mat4x4.hpp +209 -0
  72. package/cpp/math/Projection.cpp +142 -0
  73. package/cpp/math/Projection.hpp +148 -0
  74. package/cpp/math/Rotor4D.cpp +322 -0
  75. package/cpp/math/Rotor4D.hpp +204 -0
  76. package/cpp/math/Vec4.cpp +303 -0
  77. package/cpp/math/Vec4.hpp +225 -0
  78. package/cpp/src/vib3_ffi.cpp +607 -0
  79. package/cpp/tests/Geometry_test.cpp +213 -0
  80. package/cpp/tests/Mat4x4_test.cpp +494 -0
  81. package/cpp/tests/Projection_test.cpp +298 -0
  82. package/cpp/tests/Rotor4D_test.cpp +423 -0
  83. package/cpp/tests/Vec4_test.cpp +489 -0
  84. package/docs/webgpu-live.html +1 -1
  85. package/package.json +41 -30
  86. package/src/agent/index.js +1 -3
  87. package/src/agent/mcp/MCPServer.js +1220 -144
  88. package/src/agent/mcp/index.js +1 -1
  89. package/src/agent/mcp/stdio-server.js +264 -0
  90. package/src/agent/mcp/tools.js +498 -31
  91. package/src/cli/index.js +431 -47
  92. package/src/core/CanvasManager.js +97 -204
  93. package/src/core/ErrorReporter.js +1 -1
  94. package/src/core/Parameters.js +1 -1
  95. package/src/core/VIB3Engine.js +93 -4
  96. package/src/core/VitalitySystem.js +53 -0
  97. package/src/core/index.js +18 -0
  98. package/src/core/renderers/FacetedRendererAdapter.js +10 -9
  99. package/src/core/renderers/HolographicRendererAdapter.js +13 -9
  100. package/src/core/renderers/QuantumRendererAdapter.js +11 -7
  101. package/src/creative/AestheticMapper.js +628 -0
  102. package/src/creative/ChoreographyPlayer.js +481 -0
  103. package/src/creative/index.js +11 -0
  104. package/src/experimental/GameLoop.js +72 -0
  105. package/src/experimental/LatticePhysics.js +100 -0
  106. package/src/experimental/LiveDirector.js +143 -0
  107. package/src/experimental/PlayerController4D.js +154 -0
  108. package/src/experimental/VIB3Actor.js +138 -0
  109. package/src/experimental/VIB3Compositor.js +117 -0
  110. package/src/experimental/VIB3Link.js +122 -0
  111. package/src/experimental/VIB3Orchestrator.js +146 -0
  112. package/src/experimental/VIB3Universe.js +109 -0
  113. package/src/experimental/demos/CrystalLabyrinth.js +202 -0
  114. package/src/export/TradingCardManager.js +3 -4
  115. package/src/export/index.js +11 -1
  116. package/src/faceted/FacetedSystem.js +260 -394
  117. package/src/games/glyph-war/GlyphWarVisualizer.js +641 -0
  118. package/src/geometry/generators/Crystal.js +2 -2
  119. package/src/geometry/warp/HypersphereCore.js +53 -24
  120. package/src/holograms/HolographicVisualizer.js +84 -98
  121. package/src/holograms/RealHolographicSystem.js +194 -43
  122. package/src/math/Mat4x4.js +308 -105
  123. package/src/math/Rotor4D.js +124 -40
  124. package/src/math/Vec4.js +200 -103
  125. package/src/math/index.js +7 -7
  126. package/src/polychora/PolychoraSystem.js +77 -0
  127. package/src/quantum/QuantumEngine.js +103 -66
  128. package/src/quantum/QuantumVisualizer.js +31 -22
  129. package/src/reactivity/index.js +3 -5
  130. package/src/render/LayerPresetManager.js +372 -0
  131. package/src/render/LayerReactivityBridge.js +344 -0
  132. package/src/render/LayerRelationshipGraph.js +610 -0
  133. package/src/render/MultiCanvasBridge.js +148 -25
  134. package/src/render/ShaderLoader.js +38 -0
  135. package/src/render/ShaderProgram.js +4 -4
  136. package/src/render/UnifiedRenderBridge.js +4 -1
  137. package/src/render/backends/WebGPUBackend.js +8 -4
  138. package/src/render/index.js +27 -2
  139. package/src/scene/Node4D.js +74 -24
  140. package/src/scene/index.js +4 -4
  141. package/src/shaders/common/geometry24.glsl +65 -0
  142. package/src/shaders/common/geometry24.wgsl +54 -0
  143. package/src/shaders/common/rotation4d.glsl +4 -4
  144. package/src/shaders/common/rotation4d.wgsl +2 -2
  145. package/src/shaders/common/uniforms.wgsl +15 -8
  146. package/src/shaders/faceted/faceted.frag.glsl +220 -80
  147. package/src/shaders/faceted/faceted.frag.wgsl +144 -90
  148. package/src/shaders/holographic/holographic.frag.glsl +28 -9
  149. package/src/shaders/holographic/holographic.frag.wgsl +112 -41
  150. package/src/shaders/quantum/quantum.frag.glsl +1 -0
  151. package/src/shaders/quantum/quantum.frag.wgsl +6 -4
  152. package/src/testing/ParallelTestFramework.js +2 -2
  153. package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +2 -2
  154. package/src/viewer/GalleryUI.js +17 -0
  155. package/src/viewer/ViewerPortal.js +2 -2
  156. package/src/viewer/index.js +1 -1
  157. package/tools/headless-renderer.js +258 -0
  158. package/tools/shader-sync-verify.js +14 -8
  159. package/tools/site-analysis/all-reports.json +32 -0
  160. package/tools/site-analysis/combined-analysis.md +50 -0
  161. package/tools/site-analyzer.mjs +779 -0
  162. package/tools/visual-catalog/capture.js +276 -0
  163. package/tools/visual-catalog/composite.js +138 -0
  164. package/types/adaptive-sdk.d.ts +204 -5
  165. package/types/agent/cli.d.ts +78 -0
  166. package/types/agent/index.d.ts +18 -0
  167. package/types/agent/mcp.d.ts +87 -0
  168. package/types/agent/telemetry.d.ts +190 -0
  169. package/types/core/VIB3Engine.d.ts +26 -0
  170. package/types/core/index.d.ts +261 -0
  171. package/types/creative/AestheticMapper.d.ts +72 -0
  172. package/types/creative/ChoreographyPlayer.d.ts +96 -0
  173. package/types/creative/index.d.ts +17 -0
  174. package/types/export/index.d.ts +243 -0
  175. package/types/geometry/index.d.ts +164 -0
  176. package/types/math/index.d.ts +214 -0
  177. package/types/render/LayerPresetManager.d.ts +78 -0
  178. package/types/render/LayerReactivityBridge.d.ts +85 -0
  179. package/types/render/LayerRelationshipGraph.d.ts +174 -0
  180. package/types/render/index.d.ts +3 -0
  181. package/types/scene/index.d.ts +204 -0
  182. package/types/systems/index.d.ts +244 -0
  183. package/types/variations/index.d.ts +62 -0
  184. package/types/viewer/index.d.ts +225 -0
  185. package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +0 -34
  186. package/DOCS/DEV_TRACK_ANALYSIS.md +0 -77
  187. package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +0 -42
  188. package/DOCS/SESSION_014_PLAN.md +0 -195
  189. package/DOCS/SESSION_LOG_2026-01-07.md +0 -56
  190. package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +0 -72
  191. package/DOCS/SYSTEM_AUDIT_2026-01-30.md +0 -738
  192. /package/src/viewer/{ReactivityManager.js → ViewerInputHandler.js} +0 -0
@@ -0,0 +1,409 @@
1
+ /**
2
+ * Mat4x4.cpp - 4x4 Matrix Implementation
3
+ */
4
+
5
+ #include "Mat4x4.hpp"
6
+ #include <cmath>
7
+ #include <algorithm>
8
+
9
+ namespace vib3 {
10
+
11
+ // Constructors
12
+
13
+ Mat4x4::Mat4x4() noexcept : data{} {
14
+ // Zero-initialized
15
+ }
16
+
17
+ Mat4x4::Mat4x4(float diagonal) noexcept : data{} {
18
+ data[0] = diagonal;
19
+ data[5] = diagonal;
20
+ data[10] = diagonal;
21
+ data[15] = diagonal;
22
+ }
23
+
24
+ Mat4x4::Mat4x4(const std::array<float, 16>& elements) noexcept : data(elements) {}
25
+
26
+ Mat4x4::Mat4x4(const Vec4& col0, const Vec4& col1, const Vec4& col2, const Vec4& col3) noexcept {
27
+ setColumn(0, col0);
28
+ setColumn(1, col1);
29
+ setColumn(2, col2);
30
+ setColumn(3, col3);
31
+ }
32
+
33
+ // Static factories
34
+
35
+ Mat4x4 Mat4x4::identity() noexcept {
36
+ return Mat4x4(1.0f);
37
+ }
38
+
39
+ Mat4x4 Mat4x4::zero() noexcept {
40
+ return Mat4x4();
41
+ }
42
+
43
+ // Rotation matrices
44
+
45
+ Mat4x4 Mat4x4::rotationXY(float angle) noexcept {
46
+ float c = std::cos(angle);
47
+ float s = std::sin(angle);
48
+
49
+ Mat4x4 m = identity();
50
+ m.at(0, 0) = c;
51
+ m.at(0, 1) = -s;
52
+ m.at(1, 0) = s;
53
+ m.at(1, 1) = c;
54
+ return m;
55
+ }
56
+
57
+ Mat4x4 Mat4x4::rotationXZ(float angle) noexcept {
58
+ float c = std::cos(angle);
59
+ float s = std::sin(angle);
60
+
61
+ Mat4x4 m = identity();
62
+ m.at(0, 0) = c;
63
+ m.at(0, 2) = -s;
64
+ m.at(2, 0) = s;
65
+ m.at(2, 2) = c;
66
+ return m;
67
+ }
68
+
69
+ Mat4x4 Mat4x4::rotationYZ(float angle) noexcept {
70
+ float c = std::cos(angle);
71
+ float s = std::sin(angle);
72
+
73
+ Mat4x4 m = identity();
74
+ m.at(1, 1) = c;
75
+ m.at(1, 2) = -s;
76
+ m.at(2, 1) = s;
77
+ m.at(2, 2) = c;
78
+ return m;
79
+ }
80
+
81
+ Mat4x4 Mat4x4::rotationXW(float angle) noexcept {
82
+ float c = std::cos(angle);
83
+ float s = std::sin(angle);
84
+
85
+ Mat4x4 m = identity();
86
+ m.at(0, 0) = c;
87
+ m.at(0, 3) = -s;
88
+ m.at(3, 0) = s;
89
+ m.at(3, 3) = c;
90
+ return m;
91
+ }
92
+
93
+ Mat4x4 Mat4x4::rotationYW(float angle) noexcept {
94
+ float c = std::cos(angle);
95
+ float s = std::sin(angle);
96
+
97
+ Mat4x4 m = identity();
98
+ m.at(1, 1) = c;
99
+ m.at(1, 3) = -s;
100
+ m.at(3, 1) = s;
101
+ m.at(3, 3) = c;
102
+ return m;
103
+ }
104
+
105
+ Mat4x4 Mat4x4::rotationZW(float angle) noexcept {
106
+ float c = std::cos(angle);
107
+ float s = std::sin(angle);
108
+
109
+ Mat4x4 m = identity();
110
+ m.at(2, 2) = c;
111
+ m.at(2, 3) = -s;
112
+ m.at(3, 2) = s;
113
+ m.at(3, 3) = c;
114
+ return m;
115
+ }
116
+
117
+ Mat4x4 Mat4x4::rotationFromAngles(float xy, float xz, float yz,
118
+ float xw, float yw, float zw) noexcept {
119
+ // Compose rotations: XY * XZ * YZ * XW * YW * ZW
120
+ Mat4x4 result = identity();
121
+
122
+ if (std::abs(xy) > 1e-8f) result *= rotationXY(xy);
123
+ if (std::abs(xz) > 1e-8f) result *= rotationXZ(xz);
124
+ if (std::abs(yz) > 1e-8f) result *= rotationYZ(yz);
125
+ if (std::abs(xw) > 1e-8f) result *= rotationXW(xw);
126
+ if (std::abs(yw) > 1e-8f) result *= rotationYW(yw);
127
+ if (std::abs(zw) > 1e-8f) result *= rotationZW(zw);
128
+
129
+ return result;
130
+ }
131
+
132
+ Mat4x4 Mat4x4::rotationFromAngles(const std::array<float, 6>& angles) noexcept {
133
+ return rotationFromAngles(angles[0], angles[1], angles[2],
134
+ angles[3], angles[4], angles[5]);
135
+ }
136
+
137
+ // Scale matrices
138
+
139
+ Mat4x4 Mat4x4::scale(float sx, float sy, float sz, float sw) noexcept {
140
+ Mat4x4 m;
141
+ m.at(0, 0) = sx;
142
+ m.at(1, 1) = sy;
143
+ m.at(2, 2) = sz;
144
+ m.at(3, 3) = sw;
145
+ return m;
146
+ }
147
+
148
+ Mat4x4 Mat4x4::scale(float uniform) noexcept {
149
+ return scale(uniform, uniform, uniform, uniform);
150
+ }
151
+
152
+ Mat4x4 Mat4x4::scale(const Vec4& s) noexcept {
153
+ return scale(s.x, s.y, s.z, s.w);
154
+ }
155
+
156
+ // Translation (homogeneous coordinates style)
157
+
158
+ Mat4x4 Mat4x4::translation(float tx, float ty, float tz, float tw) noexcept {
159
+ Mat4x4 m = identity();
160
+ m.at(0, 3) = tx;
161
+ m.at(1, 3) = ty;
162
+ m.at(2, 3) = tz;
163
+ m.at(3, 3) = 1.0f + tw;
164
+ return m;
165
+ }
166
+
167
+ Mat4x4 Mat4x4::translation(const Vec4& t) noexcept {
168
+ return translation(t.x, t.y, t.z, t.w);
169
+ }
170
+
171
+ // Element access
172
+
173
+ float& Mat4x4::at(size_t row, size_t col) noexcept {
174
+ return data[col * 4 + row]; // Column-major
175
+ }
176
+
177
+ const float& Mat4x4::at(size_t row, size_t col) const noexcept {
178
+ return data[col * 4 + row];
179
+ }
180
+
181
+ Vec4 Mat4x4::column(size_t col) const noexcept {
182
+ size_t base = col * 4;
183
+ return Vec4(data[base], data[base + 1], data[base + 2], data[base + 3]);
184
+ }
185
+
186
+ void Mat4x4::setColumn(size_t col, const Vec4& v) noexcept {
187
+ size_t base = col * 4;
188
+ data[base] = v.x;
189
+ data[base + 1] = v.y;
190
+ data[base + 2] = v.z;
191
+ data[base + 3] = v.w;
192
+ }
193
+
194
+ Vec4 Mat4x4::row(size_t r) const noexcept {
195
+ return Vec4(at(r, 0), at(r, 1), at(r, 2), at(r, 3));
196
+ }
197
+
198
+ void Mat4x4::setRow(size_t r, const Vec4& v) noexcept {
199
+ at(r, 0) = v.x;
200
+ at(r, 1) = v.y;
201
+ at(r, 2) = v.z;
202
+ at(r, 3) = v.w;
203
+ }
204
+
205
+ // Matrix operations
206
+
207
+ Mat4x4 Mat4x4::operator*(const Mat4x4& other) const noexcept {
208
+ Mat4x4 result;
209
+
210
+ for (size_t col = 0; col < 4; ++col) {
211
+ Vec4 c = other.column(col);
212
+ result.setColumn(col, *this * c);
213
+ }
214
+
215
+ return result;
216
+ }
217
+
218
+ Mat4x4& Mat4x4::operator*=(const Mat4x4& other) noexcept {
219
+ *this = *this * other;
220
+ return *this;
221
+ }
222
+
223
+ Vec4 Mat4x4::operator*(const Vec4& v) const noexcept {
224
+ return Vec4(
225
+ at(0, 0) * v.x + at(0, 1) * v.y + at(0, 2) * v.z + at(0, 3) * v.w,
226
+ at(1, 0) * v.x + at(1, 1) * v.y + at(1, 2) * v.z + at(1, 3) * v.w,
227
+ at(2, 0) * v.x + at(2, 1) * v.y + at(2, 2) * v.z + at(2, 3) * v.w,
228
+ at(3, 0) * v.x + at(3, 1) * v.y + at(3, 2) * v.z + at(3, 3) * v.w
229
+ );
230
+ }
231
+
232
+ Vec4 Mat4x4::multiplyVec4(const Vec4& v) const noexcept {
233
+ return *this * v;
234
+ }
235
+
236
+ Mat4x4 Mat4x4::operator*(float scalar) const noexcept {
237
+ Mat4x4 result;
238
+ for (size_t i = 0; i < 16; ++i) {
239
+ result.data[i] = data[i] * scalar;
240
+ }
241
+ return result;
242
+ }
243
+
244
+ Mat4x4& Mat4x4::operator*=(float scalar) noexcept {
245
+ for (float& elem : data) {
246
+ elem *= scalar;
247
+ }
248
+ return *this;
249
+ }
250
+
251
+ Mat4x4 Mat4x4::operator+(const Mat4x4& other) const noexcept {
252
+ Mat4x4 result;
253
+ for (size_t i = 0; i < 16; ++i) {
254
+ result.data[i] = data[i] + other.data[i];
255
+ }
256
+ return result;
257
+ }
258
+
259
+ Mat4x4& Mat4x4::operator+=(const Mat4x4& other) noexcept {
260
+ for (size_t i = 0; i < 16; ++i) {
261
+ data[i] += other.data[i];
262
+ }
263
+ return *this;
264
+ }
265
+
266
+ Mat4x4 Mat4x4::operator-(const Mat4x4& other) const noexcept {
267
+ Mat4x4 result;
268
+ for (size_t i = 0; i < 16; ++i) {
269
+ result.data[i] = data[i] - other.data[i];
270
+ }
271
+ return result;
272
+ }
273
+
274
+ Mat4x4& Mat4x4::operator-=(const Mat4x4& other) noexcept {
275
+ for (size_t i = 0; i < 16; ++i) {
276
+ data[i] -= other.data[i];
277
+ }
278
+ return *this;
279
+ }
280
+
281
+ Mat4x4 Mat4x4::transposed() const noexcept {
282
+ Mat4x4 result;
283
+ for (size_t r = 0; r < 4; ++r) {
284
+ for (size_t c = 0; c < 4; ++c) {
285
+ result.at(c, r) = at(r, c);
286
+ }
287
+ }
288
+ return result;
289
+ }
290
+
291
+ void Mat4x4::transpose() noexcept {
292
+ std::swap(at(0, 1), at(1, 0));
293
+ std::swap(at(0, 2), at(2, 0));
294
+ std::swap(at(0, 3), at(3, 0));
295
+ std::swap(at(1, 2), at(2, 1));
296
+ std::swap(at(1, 3), at(3, 1));
297
+ std::swap(at(2, 3), at(3, 2));
298
+ }
299
+
300
+ // Determinant using cofactor expansion
301
+
302
+ float Mat4x4::determinant() const noexcept {
303
+ float a00 = at(0, 0), a01 = at(0, 1), a02 = at(0, 2), a03 = at(0, 3);
304
+ float a10 = at(1, 0), a11 = at(1, 1), a12 = at(1, 2), a13 = at(1, 3);
305
+ float a20 = at(2, 0), a21 = at(2, 1), a22 = at(2, 2), a23 = at(2, 3);
306
+ float a30 = at(3, 0), a31 = at(3, 1), a32 = at(3, 2), a33 = at(3, 3);
307
+
308
+ float b00 = a00 * a11 - a01 * a10;
309
+ float b01 = a00 * a12 - a02 * a10;
310
+ float b02 = a00 * a13 - a03 * a10;
311
+ float b03 = a01 * a12 - a02 * a11;
312
+ float b04 = a01 * a13 - a03 * a11;
313
+ float b05 = a02 * a13 - a03 * a12;
314
+ float b06 = a20 * a31 - a21 * a30;
315
+ float b07 = a20 * a32 - a22 * a30;
316
+ float b08 = a20 * a33 - a23 * a30;
317
+ float b09 = a21 * a32 - a22 * a31;
318
+ float b10 = a21 * a33 - a23 * a31;
319
+ float b11 = a22 * a33 - a23 * a32;
320
+
321
+ return b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
322
+ }
323
+
324
+ // Inverse using adjugate method
325
+
326
+ Mat4x4 Mat4x4::inverse() const noexcept {
327
+ float a00 = at(0, 0), a01 = at(0, 1), a02 = at(0, 2), a03 = at(0, 3);
328
+ float a10 = at(1, 0), a11 = at(1, 1), a12 = at(1, 2), a13 = at(1, 3);
329
+ float a20 = at(2, 0), a21 = at(2, 1), a22 = at(2, 2), a23 = at(2, 3);
330
+ float a30 = at(3, 0), a31 = at(3, 1), a32 = at(3, 2), a33 = at(3, 3);
331
+
332
+ float b00 = a00 * a11 - a01 * a10;
333
+ float b01 = a00 * a12 - a02 * a10;
334
+ float b02 = a00 * a13 - a03 * a10;
335
+ float b03 = a01 * a12 - a02 * a11;
336
+ float b04 = a01 * a13 - a03 * a11;
337
+ float b05 = a02 * a13 - a03 * a12;
338
+ float b06 = a20 * a31 - a21 * a30;
339
+ float b07 = a20 * a32 - a22 * a30;
340
+ float b08 = a20 * a33 - a23 * a30;
341
+ float b09 = a21 * a32 - a22 * a31;
342
+ float b10 = a21 * a33 - a23 * a31;
343
+ float b11 = a22 * a33 - a23 * a32;
344
+
345
+ float det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;
346
+
347
+ if (std::abs(det) < 1e-10f) {
348
+ return identity(); // Singular matrix
349
+ }
350
+
351
+ float invDet = 1.0f / det;
352
+
353
+ Mat4x4 result;
354
+ result.at(0, 0) = (a11 * b11 - a12 * b10 + a13 * b09) * invDet;
355
+ result.at(0, 1) = (-a01 * b11 + a02 * b10 - a03 * b09) * invDet;
356
+ result.at(0, 2) = (a31 * b05 - a32 * b04 + a33 * b03) * invDet;
357
+ result.at(0, 3) = (-a21 * b05 + a22 * b04 - a23 * b03) * invDet;
358
+ result.at(1, 0) = (-a10 * b11 + a12 * b08 - a13 * b07) * invDet;
359
+ result.at(1, 1) = (a00 * b11 - a02 * b08 + a03 * b07) * invDet;
360
+ result.at(1, 2) = (-a30 * b05 + a32 * b02 - a33 * b01) * invDet;
361
+ result.at(1, 3) = (a20 * b05 - a22 * b02 + a23 * b01) * invDet;
362
+ result.at(2, 0) = (a10 * b10 - a11 * b08 + a13 * b06) * invDet;
363
+ result.at(2, 1) = (-a00 * b10 + a01 * b08 - a03 * b06) * invDet;
364
+ result.at(2, 2) = (a30 * b04 - a31 * b02 + a33 * b00) * invDet;
365
+ result.at(2, 3) = (-a20 * b04 + a21 * b02 - a23 * b00) * invDet;
366
+ result.at(3, 0) = (-a10 * b09 + a11 * b07 - a12 * b06) * invDet;
367
+ result.at(3, 1) = (a00 * b09 - a01 * b07 + a02 * b06) * invDet;
368
+ result.at(3, 2) = (-a30 * b03 + a31 * b01 - a32 * b00) * invDet;
369
+ result.at(3, 3) = (a20 * b03 - a21 * b01 + a22 * b00) * invDet;
370
+
371
+ return result;
372
+ }
373
+
374
+ bool Mat4x4::isOrthogonal(float epsilon) const noexcept {
375
+ // Check if M * M^T = I
376
+ Mat4x4 product = *this * transposed();
377
+
378
+ for (size_t i = 0; i < 4; ++i) {
379
+ for (size_t j = 0; j < 4; ++j) {
380
+ float expected = (i == j) ? 1.0f : 0.0f;
381
+ if (std::abs(product.at(i, j) - expected) > epsilon) {
382
+ return false;
383
+ }
384
+ }
385
+ }
386
+ return true;
387
+ }
388
+
389
+ bool Mat4x4::isIdentity(float epsilon) const noexcept {
390
+ for (size_t i = 0; i < 4; ++i) {
391
+ for (size_t j = 0; j < 4; ++j) {
392
+ float expected = (i == j) ? 1.0f : 0.0f;
393
+ if (std::abs(at(i, j) - expected) > epsilon) {
394
+ return false;
395
+ }
396
+ }
397
+ }
398
+ return true;
399
+ }
400
+
401
+ bool Mat4x4::operator==(const Mat4x4& other) const noexcept {
402
+ return data == other.data;
403
+ }
404
+
405
+ bool Mat4x4::operator!=(const Mat4x4& other) const noexcept {
406
+ return !(*this == other);
407
+ }
408
+
409
+ } // namespace vib3
@@ -0,0 +1,209 @@
1
+ /**
2
+ * Mat4x4.hpp - 4x4 Matrix for VIB3+ SDK
3
+ *
4
+ * Column-major layout for direct GPU upload.
5
+ * All 6 rotation plane matrices for 4D rotation.
6
+ */
7
+
8
+ #pragma once
9
+
10
+ #include "Vec4.hpp"
11
+ #include <array>
12
+
13
+ namespace vib3 {
14
+
15
+ // Forward declaration
16
+ class Rotor4D;
17
+
18
+ /**
19
+ * 4x4 Matrix class (column-major)
20
+ *
21
+ * Layout: [col0, col1, col2, col3] where each column is Vec4
22
+ * Element access: m[col][row] or m.at(row, col)
23
+ */
24
+ class alignas(64) Mat4x4 {
25
+ public:
26
+ std::array<float, 16> data;
27
+
28
+ // Constructors
29
+ Mat4x4() noexcept;
30
+ explicit Mat4x4(float diagonal) noexcept;
31
+ Mat4x4(const std::array<float, 16>& elements) noexcept;
32
+ Mat4x4(const Vec4& col0, const Vec4& col1, const Vec4& col2, const Vec4& col3) noexcept;
33
+
34
+ // Static factories
35
+ static Mat4x4 identity() noexcept;
36
+ static Mat4x4 zero() noexcept;
37
+
38
+ /**
39
+ * Create rotation matrix for XY plane (around Z axis in 3D)
40
+ */
41
+ static Mat4x4 rotationXY(float angle) noexcept;
42
+
43
+ /**
44
+ * Create rotation matrix for XZ plane (around Y axis in 3D)
45
+ */
46
+ static Mat4x4 rotationXZ(float angle) noexcept;
47
+
48
+ /**
49
+ * Create rotation matrix for YZ plane (around X axis in 3D)
50
+ */
51
+ static Mat4x4 rotationYZ(float angle) noexcept;
52
+
53
+ /**
54
+ * Create rotation matrix for XW plane (4D rotation)
55
+ */
56
+ static Mat4x4 rotationXW(float angle) noexcept;
57
+
58
+ /**
59
+ * Create rotation matrix for YW plane (4D rotation)
60
+ */
61
+ static Mat4x4 rotationYW(float angle) noexcept;
62
+
63
+ /**
64
+ * Create rotation matrix for ZW plane (4D rotation)
65
+ */
66
+ static Mat4x4 rotationZW(float angle) noexcept;
67
+
68
+ /**
69
+ * Create combined rotation from all 6 angles
70
+ * Order: XY * XZ * YZ * XW * YW * ZW
71
+ */
72
+ static Mat4x4 rotationFromAngles(float xy, float xz, float yz,
73
+ float xw, float yw, float zw) noexcept;
74
+
75
+ /**
76
+ * Create combined rotation from angle array
77
+ */
78
+ static Mat4x4 rotationFromAngles(const std::array<float, 6>& angles) noexcept;
79
+
80
+ /**
81
+ * Create scale matrix
82
+ */
83
+ static Mat4x4 scale(float sx, float sy, float sz, float sw) noexcept;
84
+ static Mat4x4 scale(float uniform) noexcept;
85
+ static Mat4x4 scale(const Vec4& s) noexcept;
86
+
87
+ /**
88
+ * Create translation matrix (in homogeneous coordinates)
89
+ * Note: Standard 4D doesn't use translation matrices the same way
90
+ */
91
+ static Mat4x4 translation(float tx, float ty, float tz, float tw = 0) noexcept;
92
+ static Mat4x4 translation(const Vec4& t) noexcept;
93
+
94
+ // Element access
95
+
96
+ /**
97
+ * Access element (row, col) - note: stored column-major
98
+ */
99
+ float& at(size_t row, size_t col) noexcept;
100
+ const float& at(size_t row, size_t col) const noexcept;
101
+
102
+ /**
103
+ * Get column as Vec4
104
+ */
105
+ Vec4 column(size_t col) const noexcept;
106
+
107
+ /**
108
+ * Set column from Vec4
109
+ */
110
+ void setColumn(size_t col, const Vec4& v) noexcept;
111
+
112
+ /**
113
+ * Get row as Vec4
114
+ */
115
+ Vec4 row(size_t row) const noexcept;
116
+
117
+ /**
118
+ * Set row from Vec4
119
+ */
120
+ void setRow(size_t row, const Vec4& v) noexcept;
121
+
122
+ // Matrix operations
123
+
124
+ /**
125
+ * Matrix multiplication
126
+ */
127
+ Mat4x4 operator*(const Mat4x4& other) const noexcept;
128
+
129
+ /**
130
+ * Compound multiplication
131
+ */
132
+ Mat4x4& operator*=(const Mat4x4& other) noexcept;
133
+
134
+ /**
135
+ * Transform a Vec4
136
+ */
137
+ Vec4 operator*(const Vec4& v) const noexcept;
138
+
139
+ /**
140
+ * Scalar multiplication
141
+ */
142
+ Mat4x4 operator*(float scalar) const noexcept;
143
+ Mat4x4& operator*=(float scalar) noexcept;
144
+
145
+ /**
146
+ * Matrix addition
147
+ */
148
+ Mat4x4 operator+(const Mat4x4& other) const noexcept;
149
+ Mat4x4& operator+=(const Mat4x4& other) noexcept;
150
+
151
+ /**
152
+ * Matrix subtraction
153
+ */
154
+ Mat4x4 operator-(const Mat4x4& other) const noexcept;
155
+ Mat4x4& operator-=(const Mat4x4& other) noexcept;
156
+
157
+ /**
158
+ * Transpose
159
+ */
160
+ Mat4x4 transposed() const noexcept;
161
+
162
+ /**
163
+ * Transpose in place
164
+ */
165
+ void transpose() noexcept;
166
+
167
+ /**
168
+ * Determinant
169
+ */
170
+ float determinant() const noexcept;
171
+
172
+ /**
173
+ * Inverse (returns identity if singular)
174
+ */
175
+ Mat4x4 inverse() const noexcept;
176
+
177
+ /**
178
+ * Check if orthogonal (columns are orthonormal)
179
+ */
180
+ bool isOrthogonal(float epsilon = 1e-5f) const noexcept;
181
+
182
+ /**
183
+ * Check if identity matrix
184
+ */
185
+ bool isIdentity(float epsilon = 1e-5f) const noexcept;
186
+
187
+ // Comparison
188
+
189
+ bool operator==(const Mat4x4& other) const noexcept;
190
+ bool operator!=(const Mat4x4& other) const noexcept;
191
+
192
+ /**
193
+ * Get pointer to data for GPU upload
194
+ */
195
+ const float* ptr() const noexcept { return data.data(); }
196
+ float* ptr() noexcept { return data.data(); }
197
+
198
+ /**
199
+ * Transform Vec4 (same as operator*)
200
+ */
201
+ Vec4 multiplyVec4(const Vec4& v) const noexcept;
202
+ };
203
+
204
+ // Free function operators
205
+ inline Mat4x4 operator*(float scalar, const Mat4x4& m) noexcept {
206
+ return m * scalar;
207
+ }
208
+
209
+ } // namespace vib3