@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
@@ -18,6 +18,12 @@
18
18
  import { Vec4 } from './Vec4.js';
19
19
 
20
20
  export class Mat4x4 {
21
+ /**
22
+ * Internal token to skip initialization during construction
23
+ * @private
24
+ */
25
+ static UNINITIALIZED = {};
26
+
21
27
  /**
22
28
  * Create a new 4x4 matrix
23
29
  * Default is identity matrix
@@ -26,6 +32,8 @@ export class Mat4x4 {
26
32
  constructor(elements = null) {
27
33
  this.data = new Float32Array(16);
28
34
 
35
+ if (elements === Mat4x4.UNINITIALIZED) return;
36
+
29
37
  if (elements) {
30
38
  if (elements.length !== 16) {
31
39
  throw new Error('Mat4x4 requires exactly 16 elements');
@@ -45,12 +53,7 @@ export class Mat4x4 {
45
53
  * @returns {Mat4x4}
46
54
  */
47
55
  static identity() {
48
- return new Mat4x4([
49
- 1, 0, 0, 0,
50
- 0, 1, 0, 0,
51
- 0, 0, 1, 0,
52
- 0, 0, 0, 1
53
- ]);
56
+ return new Mat4x4();
54
57
  }
55
58
 
56
59
  /**
@@ -58,7 +61,7 @@ export class Mat4x4 {
58
61
  * @returns {Mat4x4}
59
62
  */
60
63
  static zero() {
61
- return new Mat4x4(new Float32Array(16));
64
+ return new Mat4x4(Mat4x4.UNINITIALIZED);
62
65
  }
63
66
 
64
67
  /**
@@ -157,24 +160,46 @@ export class Mat4x4 {
157
160
  /**
158
161
  * Multiply two matrices
159
162
  * @param {Mat4x4} m - Right operand
163
+ * @param {Mat4x4} [target=null] - Optional target matrix to store result
160
164
  * @returns {Mat4x4} New matrix = this * m
161
165
  */
162
- multiply(m) {
166
+ multiply(m, target = null) {
167
+ const out = target || new Mat4x4(Mat4x4.UNINITIALIZED);
168
+ const r = out.data;
163
169
  const a = this.data;
164
170
  const b = m.data;
165
- const result = new Float32Array(16);
166
-
167
- for (let col = 0; col < 4; col++) {
168
- for (let row = 0; row < 4; row++) {
169
- let sum = 0;
170
- for (let k = 0; k < 4; k++) {
171
- sum += a[k * 4 + row] * b[col * 4 + k];
172
- }
173
- result[col * 4 + row] = sum;
174
- }
175
- }
176
171
 
177
- return new Mat4x4(result);
172
+ const a00 = a[0], a01 = a[4], a02 = a[8], a03 = a[12];
173
+ const a10 = a[1], a11 = a[5], a12 = a[9], a13 = a[13];
174
+ const a20 = a[2], a21 = a[6], a22 = a[10], a23 = a[14];
175
+ const a30 = a[3], a31 = a[7], a32 = a[11], a33 = a[15];
176
+
177
+ const b00 = b[0], b01 = b[4], b02 = b[8], b03 = b[12];
178
+ const b10 = b[1], b11 = b[5], b12 = b[9], b13 = b[13];
179
+ const b20 = b[2], b21 = b[6], b22 = b[10], b23 = b[14];
180
+ const b30 = b[3], b31 = b[7], b32 = b[11], b33 = b[15];
181
+
182
+ r[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
183
+ r[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
184
+ r[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;
185
+ r[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;
186
+
187
+ r[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
188
+ r[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
189
+ r[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;
190
+ r[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;
191
+
192
+ r[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;
193
+ r[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;
194
+ r[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;
195
+ r[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;
196
+
197
+ r[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;
198
+ r[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;
199
+ r[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;
200
+ r[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;
201
+
202
+ return out;
178
203
  }
179
204
 
180
205
  /**
@@ -183,8 +208,44 @@ export class Mat4x4 {
183
208
  * @returns {Mat4x4} this
184
209
  */
185
210
  multiplyInPlace(m) {
186
- const result = this.multiply(m);
187
- this.data.set(result.data);
211
+ const a = this.data;
212
+ const b = m.data;
213
+
214
+ // Cache values to avoid aliasing issues and repeated array access
215
+ const a00 = a[0], a01 = a[4], a02 = a[8], a03 = a[12];
216
+ const a10 = a[1], a11 = a[5], a12 = a[9], a13 = a[13];
217
+ const a20 = a[2], a21 = a[6], a22 = a[10], a23 = a[14];
218
+ const a30 = a[3], a31 = a[7], a32 = a[11], a33 = a[15];
219
+
220
+ const b00 = b[0], b01 = b[4], b02 = b[8], b03 = b[12];
221
+ const b10 = b[1], b11 = b[5], b12 = b[9], b13 = b[13];
222
+ const b20 = b[2], b21 = b[6], b22 = b[10], b23 = b[14];
223
+ const b30 = b[3], b31 = b[7], b32 = b[11], b33 = b[15];
224
+
225
+ // Column 0
226
+ a[0] = a00 * b00 + a01 * b10 + a02 * b20 + a03 * b30;
227
+ a[1] = a10 * b00 + a11 * b10 + a12 * b20 + a13 * b30;
228
+ a[2] = a20 * b00 + a21 * b10 + a22 * b20 + a23 * b30;
229
+ a[3] = a30 * b00 + a31 * b10 + a32 * b20 + a33 * b30;
230
+
231
+ // Column 1
232
+ a[4] = a00 * b01 + a01 * b11 + a02 * b21 + a03 * b31;
233
+ a[5] = a10 * b01 + a11 * b11 + a12 * b21 + a13 * b31;
234
+ a[6] = a20 * b01 + a21 * b11 + a22 * b21 + a23 * b31;
235
+ a[7] = a30 * b01 + a31 * b11 + a32 * b21 + a33 * b31;
236
+
237
+ // Column 2
238
+ a[8] = a00 * b02 + a01 * b12 + a02 * b22 + a03 * b32;
239
+ a[9] = a10 * b02 + a11 * b12 + a12 * b22 + a13 * b32;
240
+ a[10] = a20 * b02 + a21 * b12 + a22 * b22 + a23 * b32;
241
+ a[11] = a30 * b02 + a31 * b12 + a32 * b22 + a33 * b32;
242
+
243
+ // Column 3
244
+ a[12] = a00 * b03 + a01 * b13 + a02 * b23 + a03 * b33;
245
+ a[13] = a10 * b03 + a11 * b13 + a12 * b23 + a13 * b33;
246
+ a[14] = a20 * b03 + a21 * b13 + a22 * b23 + a23 * b33;
247
+ a[15] = a30 * b03 + a31 * b13 + a32 * b23 + a33 * b33;
248
+
188
249
  return this;
189
250
  }
190
251
 
@@ -202,16 +263,22 @@ export class Mat4x4 {
202
263
  /**
203
264
  * Transform a Vec4 by this matrix
204
265
  * @param {Vec4} v
266
+ * @param {Vec4} [target=null] - Optional target vector to store result
205
267
  * @returns {Vec4} Transformed vector
206
268
  */
207
- multiplyVec4(v) {
269
+ multiplyVec4(v, target = null) {
208
270
  const m = this.data;
209
- return new Vec4(
210
- m[0] * v.x + m[4] * v.y + m[8] * v.z + m[12] * v.w,
211
- m[1] * v.x + m[5] * v.y + m[9] * v.z + m[13] * v.w,
212
- m[2] * v.x + m[6] * v.y + m[10] * v.z + m[14] * v.w,
213
- m[3] * v.x + m[7] * v.y + m[11] * v.z + m[15] * v.w
214
- );
271
+ const out = target || new Vec4();
272
+
273
+ // Cache components to support aliasing (target === v)
274
+ const x = v.x, y = v.y, z = v.z, w = v.w;
275
+
276
+ out.x = m[0] * x + m[4] * y + m[8] * z + m[12] * w;
277
+ out.y = m[1] * x + m[5] * y + m[9] * z + m[13] * w;
278
+ out.z = m[2] * x + m[6] * y + m[10] * z + m[14] * w;
279
+ out.w = m[3] * x + m[7] * y + m[11] * z + m[15] * w;
280
+
281
+ return out;
215
282
  }
216
283
 
217
284
  /**
@@ -253,27 +320,36 @@ export class Mat4x4 {
253
320
  /**
254
321
  * Add another matrix
255
322
  * @param {Mat4x4} m
323
+ * @param {Mat4x4} [target=null] - Optional target matrix
256
324
  * @returns {Mat4x4} New matrix
257
325
  */
258
- add(m) {
259
- const result = new Float32Array(16);
326
+ add(m, target = null) {
327
+ const out = target || new Mat4x4(Mat4x4.UNINITIALIZED);
328
+ const r = out.data;
329
+ const a = this.data;
330
+ const b = m.data;
331
+
260
332
  for (let i = 0; i < 16; i++) {
261
- result[i] = this.data[i] + m.data[i];
333
+ r[i] = a[i] + b[i];
262
334
  }
263
- return new Mat4x4(result);
335
+ return out;
264
336
  }
265
337
 
266
338
  /**
267
339
  * Multiply by scalar
268
340
  * @param {number} s
341
+ * @param {Mat4x4} [target=null] - Optional target matrix
269
342
  * @returns {Mat4x4} New matrix
270
343
  */
271
- scale(s) {
272
- const result = new Float32Array(16);
344
+ scale(s, target = null) {
345
+ const out = target || new Mat4x4(Mat4x4.UNINITIALIZED);
346
+ const r = out.data;
347
+ const a = this.data;
348
+
273
349
  for (let i = 0; i < 16; i++) {
274
- result[i] = this.data[i] * s;
350
+ r[i] = a[i] * s;
275
351
  }
276
- return new Mat4x4(result);
352
+ return out;
277
353
  }
278
354
 
279
355
  /**
@@ -282,12 +358,13 @@ export class Mat4x4 {
282
358
  */
283
359
  transpose() {
284
360
  const m = this.data;
285
- return new Mat4x4([
286
- m[0], m[4], m[8], m[12],
287
- m[1], m[5], m[9], m[13],
288
- m[2], m[6], m[10], m[14],
289
- m[3], m[7], m[11], m[15]
290
- ]);
361
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
362
+ const r = out.data;
363
+ r[0] = m[0]; r[4] = m[1]; r[8] = m[2]; r[12] = m[3];
364
+ r[1] = m[4]; r[5] = m[5]; r[9] = m[6]; r[13] = m[7];
365
+ r[2] = m[8]; r[6] = m[9]; r[10] = m[10]; r[14] = m[11];
366
+ r[3] = m[12]; r[7] = m[13]; r[11] = m[14]; r[15] = m[15];
367
+ return out;
291
368
  }
292
369
 
293
370
  /**
@@ -342,7 +419,8 @@ export class Mat4x4 {
342
419
  */
343
420
  inverse() {
344
421
  const m = this.data;
345
- const inv = new Float32Array(16);
422
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
423
+ const inv = out.data;
346
424
 
347
425
  inv[0] = m[5] * m[10] * m[15] - m[5] * m[11] * m[14] - m[9] * m[6] * m[15] +
348
426
  m[9] * m[7] * m[14] + m[13] * m[6] * m[11] - m[13] * m[7] * m[10];
@@ -403,7 +481,7 @@ export class Mat4x4 {
403
481
  inv[i] *= invDet;
404
482
  }
405
483
 
406
- return new Mat4x4(inv);
484
+ return out;
407
485
  }
408
486
 
409
487
  /**
@@ -490,6 +568,122 @@ export class Mat4x4 {
490
568
  return new Mat4x4(json.data);
491
569
  }
492
570
 
571
+ // ========== IN-PLACE ROTATIONS ==========
572
+
573
+ /**
574
+ * Rotate in XY plane in place
575
+ * @param {number} angle
576
+ * @returns {Mat4x4} this
577
+ */
578
+ rotateXY(angle) {
579
+ const c = Math.cos(angle);
580
+ const s = Math.sin(angle);
581
+ const m = this.data;
582
+
583
+ for (let i = 0; i < 4; i++) {
584
+ const a0 = m[i]; // Col 0
585
+ const a1 = m[i + 4]; // Col 1
586
+ m[i] = a0 * c + a1 * s;
587
+ m[i + 4] = -a0 * s + a1 * c;
588
+ }
589
+ return this;
590
+ }
591
+
592
+ /**
593
+ * Rotate in XZ plane in place
594
+ * @param {number} angle
595
+ * @returns {Mat4x4} this
596
+ */
597
+ rotateXZ(angle) {
598
+ const c = Math.cos(angle);
599
+ const s = Math.sin(angle);
600
+ const m = this.data;
601
+
602
+ for (let i = 0; i < 4; i++) {
603
+ const a0 = m[i]; // Col 0
604
+ const a2 = m[i + 8]; // Col 2
605
+ m[i] = a0 * c - a2 * s;
606
+ m[i + 8] = a0 * s + a2 * c;
607
+ }
608
+ return this;
609
+ }
610
+
611
+ /**
612
+ * Rotate in YZ plane in place
613
+ * @param {number} angle
614
+ * @returns {Mat4x4} this
615
+ */
616
+ rotateYZ(angle) {
617
+ const c = Math.cos(angle);
618
+ const s = Math.sin(angle);
619
+ const m = this.data;
620
+
621
+ for (let i = 0; i < 4; i++) {
622
+ const a1 = m[i + 4]; // Col 1
623
+ const a2 = m[i + 8]; // Col 2
624
+ m[i + 4] = a1 * c + a2 * s;
625
+ m[i + 8] = -a1 * s + a2 * c;
626
+ }
627
+ return this;
628
+ }
629
+
630
+ /**
631
+ * Rotate in XW plane in place
632
+ * @param {number} angle
633
+ * @returns {Mat4x4} this
634
+ */
635
+ rotateXW(angle) {
636
+ const c = Math.cos(angle);
637
+ const s = Math.sin(angle);
638
+ const m = this.data;
639
+
640
+ for (let i = 0; i < 4; i++) {
641
+ const a0 = m[i]; // Col 0
642
+ const a3 = m[i + 12]; // Col 3
643
+ m[i] = a0 * c + a3 * s;
644
+ m[i + 12] = -a0 * s + a3 * c;
645
+ }
646
+ return this;
647
+ }
648
+
649
+ /**
650
+ * Rotate in YW plane in place
651
+ * @param {number} angle
652
+ * @returns {Mat4x4} this
653
+ */
654
+ rotateYW(angle) {
655
+ const c = Math.cos(angle);
656
+ const s = Math.sin(angle);
657
+ const m = this.data;
658
+
659
+ for (let i = 0; i < 4; i++) {
660
+ const a1 = m[i + 4]; // Col 1
661
+ const a3 = m[i + 12]; // Col 3
662
+ m[i + 4] = a1 * c + a3 * s;
663
+ m[i + 12] = -a1 * s + a3 * c;
664
+ }
665
+ return this;
666
+ }
667
+
668
+ /**
669
+ * Rotate in ZW plane in place
670
+ * @param {number} angle
671
+ * @returns {Mat4x4} this
672
+ */
673
+ rotateZW(angle) {
674
+ const c = Math.cos(angle);
675
+ const s = Math.sin(angle);
676
+ const m = this.data;
677
+
678
+ for (let i = 0; i < 4; i++) {
679
+ const a2 = m[i + 8]; // Col 2
680
+ const a3 = m[i + 12]; // Col 3
681
+ m[i + 8] = a2 * c + a3 * s;
682
+ m[i + 12] = -a2 * s + a3 * c;
683
+ }
684
+ return this;
685
+ }
686
+
493
687
  // ========== ROTATION MATRICES FOR ALL 6 PLANES ==========
494
688
 
495
689
  /**
@@ -500,12 +694,13 @@ export class Mat4x4 {
500
694
  static rotationXY(angle) {
501
695
  const c = Math.cos(angle);
502
696
  const s = Math.sin(angle);
503
- return new Mat4x4([
504
- c, s, 0, 0,
505
- -s, c, 0, 0,
506
- 0, 0, 1, 0,
507
- 0, 0, 0, 1
508
- ]);
697
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
698
+ const r = out.data;
699
+ r[0] = c; r[1] = s;
700
+ r[4] = -s; r[5] = c;
701
+ r[10] = 1;
702
+ r[15] = 1;
703
+ return out;
509
704
  }
510
705
 
511
706
  /**
@@ -516,12 +711,13 @@ export class Mat4x4 {
516
711
  static rotationXZ(angle) {
517
712
  const c = Math.cos(angle);
518
713
  const s = Math.sin(angle);
519
- return new Mat4x4([
520
- c, 0, -s, 0,
521
- 0, 1, 0, 0,
522
- s, 0, c, 0,
523
- 0, 0, 0, 1
524
- ]);
714
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
715
+ const r = out.data;
716
+ r[0] = c; r[2] = -s;
717
+ r[5] = 1;
718
+ r[8] = s; r[10] = c;
719
+ r[15] = 1;
720
+ return out;
525
721
  }
526
722
 
527
723
  /**
@@ -532,12 +728,13 @@ export class Mat4x4 {
532
728
  static rotationYZ(angle) {
533
729
  const c = Math.cos(angle);
534
730
  const s = Math.sin(angle);
535
- return new Mat4x4([
536
- 1, 0, 0, 0,
537
- 0, c, s, 0,
538
- 0, -s, c, 0,
539
- 0, 0, 0, 1
540
- ]);
731
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
732
+ const r = out.data;
733
+ r[0] = 1;
734
+ r[5] = c; r[6] = s;
735
+ r[9] = -s; r[10] = c;
736
+ r[15] = 1;
737
+ return out;
541
738
  }
542
739
 
543
740
  /**
@@ -549,12 +746,13 @@ export class Mat4x4 {
549
746
  static rotationXW(angle) {
550
747
  const c = Math.cos(angle);
551
748
  const s = Math.sin(angle);
552
- return new Mat4x4([
553
- c, 0, 0, s,
554
- 0, 1, 0, 0,
555
- 0, 0, 1, 0,
556
- -s, 0, 0, c
557
- ]);
749
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
750
+ const r = out.data;
751
+ r[0] = c; r[3] = s;
752
+ r[5] = 1;
753
+ r[10] = 1;
754
+ r[12] = -s; r[15] = c;
755
+ return out;
558
756
  }
559
757
 
560
758
  /**
@@ -565,12 +763,13 @@ export class Mat4x4 {
565
763
  static rotationYW(angle) {
566
764
  const c = Math.cos(angle);
567
765
  const s = Math.sin(angle);
568
- return new Mat4x4([
569
- 1, 0, 0, 0,
570
- 0, c, 0, s,
571
- 0, 0, 1, 0,
572
- 0, -s, 0, c
573
- ]);
766
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
767
+ const r = out.data;
768
+ r[0] = 1;
769
+ r[5] = c; r[7] = s;
770
+ r[10] = 1;
771
+ r[13] = -s; r[15] = c;
772
+ return out;
574
773
  }
575
774
 
576
775
  /**
@@ -581,12 +780,13 @@ export class Mat4x4 {
581
780
  static rotationZW(angle) {
582
781
  const c = Math.cos(angle);
583
782
  const s = Math.sin(angle);
584
- return new Mat4x4([
585
- 1, 0, 0, 0,
586
- 0, 1, 0, 0,
587
- 0, 0, c, s,
588
- 0, 0, -s, c
589
- ]);
783
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
784
+ const r = out.data;
785
+ r[0] = 1;
786
+ r[5] = 1;
787
+ r[10] = c; r[11] = s;
788
+ r[14] = -s; r[15] = c;
789
+ return out;
590
790
  }
591
791
 
592
792
  /**
@@ -624,12 +824,12 @@ export class Mat4x4 {
624
824
  static rotationFromAngles(angles) {
625
825
  let result = Mat4x4.identity();
626
826
 
627
- if (angles.xy) result = result.multiply(Mat4x4.rotationXY(angles.xy));
628
- if (angles.xz) result = result.multiply(Mat4x4.rotationXZ(angles.xz));
629
- if (angles.yz) result = result.multiply(Mat4x4.rotationYZ(angles.yz));
630
- if (angles.xw) result = result.multiply(Mat4x4.rotationXW(angles.xw));
631
- if (angles.yw) result = result.multiply(Mat4x4.rotationYW(angles.yw));
632
- if (angles.zw) result = result.multiply(Mat4x4.rotationZW(angles.zw));
827
+ if (angles.xy) result.rotateXY(angles.xy);
828
+ if (angles.xz) result.rotateXZ(angles.xz);
829
+ if (angles.yz) result.rotateYZ(angles.yz);
830
+ if (angles.xw) result.rotateXW(angles.xw);
831
+ if (angles.yw) result.rotateYW(angles.yw);
832
+ if (angles.zw) result.rotateZW(angles.zw);
633
833
 
634
834
  return result;
635
835
  }
@@ -658,12 +858,13 @@ export class Mat4x4 {
658
858
  * @returns {Mat4x4}
659
859
  */
660
860
  static uniformScale(s) {
661
- return new Mat4x4([
662
- s, 0, 0, 0,
663
- 0, s, 0, 0,
664
- 0, 0, s, 0,
665
- 0, 0, 0, s
666
- ]);
861
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
862
+ const r = out.data;
863
+ r[0] = s;
864
+ r[5] = s;
865
+ r[10] = s;
866
+ r[15] = s;
867
+ return out;
667
868
  }
668
869
 
669
870
  /**
@@ -675,12 +876,13 @@ export class Mat4x4 {
675
876
  * @returns {Mat4x4}
676
877
  */
677
878
  static scale(sx, sy, sz, sw = 1) {
678
- return new Mat4x4([
679
- sx, 0, 0, 0,
680
- 0, sy, 0, 0,
681
- 0, 0, sz, 0,
682
- 0, 0, 0, sw
683
- ]);
879
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
880
+ const r = out.data;
881
+ r[0] = sx;
882
+ r[5] = sy;
883
+ r[10] = sz;
884
+ r[15] = sw;
885
+ return out;
684
886
  }
685
887
 
686
888
  /**
@@ -696,12 +898,13 @@ export class Mat4x4 {
696
898
  static translation(tx, ty, tz, tw = 0) {
697
899
  // For true 4D translation, you need 5D homogeneous coordinates
698
900
  // This is a placeholder that adds the translation to the W column
699
- return new Mat4x4([
700
- 1, 0, 0, 0,
701
- 0, 1, 0, 0,
702
- 0, 0, 1, 0,
703
- tx, ty, tz, 1 + tw
704
- ]);
901
+ const out = new Mat4x4(Mat4x4.UNINITIALIZED);
902
+ const r = out.data;
903
+ r[0] = 1;
904
+ r[5] = 1;
905
+ r[10] = 1;
906
+ r[12] = tx; r[13] = ty; r[14] = tz; r[15] = 1 + tw;
907
+ return out;
705
908
  }
706
909
  }
707
910