@vib3code/sdk 2.0.1

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 (258) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
  3. package/DOCS/CI_TESTING.md +38 -0
  4. package/DOCS/CLI_ONBOARDING.md +75 -0
  5. package/DOCS/CONTROL_REFERENCE.md +64 -0
  6. package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
  7. package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
  8. package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
  9. package/DOCS/ENV_SETUP.md +189 -0
  10. package/DOCS/EXPORT_FORMATS.md +417 -0
  11. package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
  12. package/DOCS/LICENSING_TIERS.md +275 -0
  13. package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
  14. package/DOCS/OBS_SETUP_GUIDE.md +98 -0
  15. package/DOCS/PROJECT_SETUP.md +66 -0
  16. package/DOCS/RENDERER_LIFECYCLE.md +40 -0
  17. package/DOCS/REPO_MANIFEST.md +121 -0
  18. package/DOCS/SESSION_014_PLAN.md +195 -0
  19. package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
  20. package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
  21. package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
  22. package/DOCS/SYSTEM_INVENTORY.md +520 -0
  23. package/DOCS/TELEMETRY_EXPORTS.md +34 -0
  24. package/DOCS/WEBGPU_STATUS.md +38 -0
  25. package/DOCS/XR_BENCHMARKS.md +608 -0
  26. package/LICENSE +21 -0
  27. package/README.md +426 -0
  28. package/docs/.nojekyll +0 -0
  29. package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
  30. package/docs/02-hyperspatial_ego_death.html +346 -0
  31. package/docs/03-post_cartesian_sublime.html +346 -0
  32. package/docs/04-crystalline_void_meditation.html +346 -0
  33. package/docs/05-quantum_decoherence_ballet.html +346 -0
  34. package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
  35. package/docs/07-hyperspatial_ego_death.html +346 -0
  36. package/docs/08-post_cartesian_sublime.html +346 -0
  37. package/docs/09-crystalline_void_meditation.html +346 -0
  38. package/docs/10-quantum_decoherence_ballet.html +346 -0
  39. package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
  40. package/docs/12-hyperspatial_ego_death.html +346 -0
  41. package/docs/13-post_cartesian_sublime.html +346 -0
  42. package/docs/index.html +794 -0
  43. package/docs/test-hub.html +441 -0
  44. package/docs/url-state.js +102 -0
  45. package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
  46. package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
  47. package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
  48. package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
  49. package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
  50. package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
  51. package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
  52. package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
  53. package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
  54. package/docs/vib3-exports/index.html +238 -0
  55. package/docs/webgpu-live.html +702 -0
  56. package/package.json +367 -0
  57. package/src/advanced/AIPresetGenerator.js +777 -0
  58. package/src/advanced/MIDIController.js +703 -0
  59. package/src/advanced/OffscreenWorker.js +1051 -0
  60. package/src/advanced/WebGPUCompute.js +1051 -0
  61. package/src/advanced/WebXRRenderer.js +680 -0
  62. package/src/agent/cli/AgentCLI.js +615 -0
  63. package/src/agent/cli/index.js +14 -0
  64. package/src/agent/index.js +73 -0
  65. package/src/agent/mcp/MCPServer.js +950 -0
  66. package/src/agent/mcp/index.js +9 -0
  67. package/src/agent/mcp/tools.js +548 -0
  68. package/src/agent/telemetry/EventStream.js +669 -0
  69. package/src/agent/telemetry/Instrumentation.js +618 -0
  70. package/src/agent/telemetry/TelemetryExporters.js +427 -0
  71. package/src/agent/telemetry/TelemetryService.js +464 -0
  72. package/src/agent/telemetry/index.js +52 -0
  73. package/src/benchmarks/BenchmarkRunner.js +381 -0
  74. package/src/benchmarks/MetricsCollector.js +299 -0
  75. package/src/benchmarks/index.js +9 -0
  76. package/src/benchmarks/scenes.js +259 -0
  77. package/src/cli/index.js +675 -0
  78. package/src/config/ApiConfig.js +88 -0
  79. package/src/core/CanvasManager.js +217 -0
  80. package/src/core/ErrorReporter.js +117 -0
  81. package/src/core/ParameterMapper.js +333 -0
  82. package/src/core/Parameters.js +396 -0
  83. package/src/core/RendererContracts.js +200 -0
  84. package/src/core/UnifiedResourceManager.js +370 -0
  85. package/src/core/VIB3Engine.js +636 -0
  86. package/src/core/renderers/FacetedRendererAdapter.js +32 -0
  87. package/src/core/renderers/HolographicRendererAdapter.js +29 -0
  88. package/src/core/renderers/QuantumRendererAdapter.js +29 -0
  89. package/src/core/renderers/RendererLifecycleManager.js +63 -0
  90. package/src/creative/ColorPresetsSystem.js +980 -0
  91. package/src/creative/ParameterTimeline.js +1061 -0
  92. package/src/creative/PostProcessingPipeline.js +1113 -0
  93. package/src/creative/TransitionAnimator.js +683 -0
  94. package/src/export/CSSExporter.js +226 -0
  95. package/src/export/CardGeneratorBase.js +279 -0
  96. package/src/export/ExportManager.js +580 -0
  97. package/src/export/FacetedCardGenerator.js +279 -0
  98. package/src/export/HolographicCardGenerator.js +543 -0
  99. package/src/export/LottieExporter.js +552 -0
  100. package/src/export/QuantumCardGenerator.js +315 -0
  101. package/src/export/SVGExporter.js +519 -0
  102. package/src/export/ShaderExporter.js +903 -0
  103. package/src/export/TradingCardGenerator.js +3055 -0
  104. package/src/export/TradingCardManager.js +181 -0
  105. package/src/export/VIB3PackageExporter.js +559 -0
  106. package/src/export/index.js +14 -0
  107. package/src/export/systems/TradingCardSystemFaceted.js +494 -0
  108. package/src/export/systems/TradingCardSystemHolographic.js +452 -0
  109. package/src/export/systems/TradingCardSystemQuantum.js +411 -0
  110. package/src/faceted/FacetedSystem.js +963 -0
  111. package/src/features/CollectionManager.js +433 -0
  112. package/src/gallery/CollectionManager.js +240 -0
  113. package/src/gallery/GallerySystem.js +485 -0
  114. package/src/geometry/GeometryFactory.js +314 -0
  115. package/src/geometry/GeometryLibrary.js +72 -0
  116. package/src/geometry/buffers/BufferBuilder.js +338 -0
  117. package/src/geometry/buffers/index.js +18 -0
  118. package/src/geometry/generators/Crystal.js +420 -0
  119. package/src/geometry/generators/Fractal.js +298 -0
  120. package/src/geometry/generators/KleinBottle.js +197 -0
  121. package/src/geometry/generators/Sphere.js +192 -0
  122. package/src/geometry/generators/Tesseract.js +160 -0
  123. package/src/geometry/generators/Tetrahedron.js +225 -0
  124. package/src/geometry/generators/Torus.js +304 -0
  125. package/src/geometry/generators/Wave.js +341 -0
  126. package/src/geometry/index.js +142 -0
  127. package/src/geometry/warp/HypersphereCore.js +211 -0
  128. package/src/geometry/warp/HypertetraCore.js +386 -0
  129. package/src/geometry/warp/index.js +57 -0
  130. package/src/holograms/HolographicVisualizer.js +1073 -0
  131. package/src/holograms/RealHolographicSystem.js +966 -0
  132. package/src/holograms/variantRegistry.js +69 -0
  133. package/src/integrations/FigmaPlugin.js +854 -0
  134. package/src/integrations/OBSMode.js +754 -0
  135. package/src/integrations/ThreeJsPackage.js +660 -0
  136. package/src/integrations/TouchDesignerExport.js +552 -0
  137. package/src/integrations/frameworks/Vib3React.js +591 -0
  138. package/src/integrations/frameworks/Vib3Svelte.js +654 -0
  139. package/src/integrations/frameworks/Vib3Vue.js +628 -0
  140. package/src/llm/LLMParameterInterface.js +240 -0
  141. package/src/llm/LLMParameterUI.js +577 -0
  142. package/src/math/Mat4x4.js +708 -0
  143. package/src/math/Projection.js +341 -0
  144. package/src/math/Rotor4D.js +637 -0
  145. package/src/math/Vec4.js +476 -0
  146. package/src/math/constants.js +164 -0
  147. package/src/math/index.js +68 -0
  148. package/src/math/projections.js +54 -0
  149. package/src/math/rotations.js +196 -0
  150. package/src/quantum/QuantumEngine.js +906 -0
  151. package/src/quantum/QuantumVisualizer.js +1103 -0
  152. package/src/reactivity/ReactivityConfig.js +499 -0
  153. package/src/reactivity/ReactivityManager.js +586 -0
  154. package/src/reactivity/SpatialInputSystem.js +1783 -0
  155. package/src/reactivity/index.js +93 -0
  156. package/src/render/CommandBuffer.js +465 -0
  157. package/src/render/MultiCanvasBridge.js +340 -0
  158. package/src/render/RenderCommand.js +514 -0
  159. package/src/render/RenderResourceRegistry.js +523 -0
  160. package/src/render/RenderState.js +552 -0
  161. package/src/render/RenderTarget.js +512 -0
  162. package/src/render/ShaderLoader.js +253 -0
  163. package/src/render/ShaderProgram.js +599 -0
  164. package/src/render/UnifiedRenderBridge.js +496 -0
  165. package/src/render/backends/WebGLBackend.js +1108 -0
  166. package/src/render/backends/WebGPUBackend.js +1409 -0
  167. package/src/render/commands/CommandBufferExecutor.js +607 -0
  168. package/src/render/commands/RenderCommandBuffer.js +661 -0
  169. package/src/render/commands/index.js +17 -0
  170. package/src/render/index.js +367 -0
  171. package/src/scene/Disposable.js +498 -0
  172. package/src/scene/MemoryPool.js +618 -0
  173. package/src/scene/Node4D.js +697 -0
  174. package/src/scene/ResourceManager.js +599 -0
  175. package/src/scene/Scene4D.js +540 -0
  176. package/src/scene/index.js +98 -0
  177. package/src/schemas/error.schema.json +84 -0
  178. package/src/schemas/extension.schema.json +88 -0
  179. package/src/schemas/index.js +214 -0
  180. package/src/schemas/parameters.schema.json +142 -0
  181. package/src/schemas/tool-pack.schema.json +44 -0
  182. package/src/schemas/tool-response.schema.json +127 -0
  183. package/src/shaders/common/fullscreen.vert.glsl +5 -0
  184. package/src/shaders/common/fullscreen.vert.wgsl +17 -0
  185. package/src/shaders/common/geometry24.glsl +65 -0
  186. package/src/shaders/common/geometry24.wgsl +54 -0
  187. package/src/shaders/common/rotation4d.glsl +85 -0
  188. package/src/shaders/common/rotation4d.wgsl +86 -0
  189. package/src/shaders/common/uniforms.glsl +44 -0
  190. package/src/shaders/common/uniforms.wgsl +48 -0
  191. package/src/shaders/faceted/faceted.frag.glsl +129 -0
  192. package/src/shaders/faceted/faceted.frag.wgsl +164 -0
  193. package/src/shaders/holographic/holographic.frag.glsl +406 -0
  194. package/src/shaders/holographic/holographic.frag.wgsl +185 -0
  195. package/src/shaders/quantum/quantum.frag.glsl +513 -0
  196. package/src/shaders/quantum/quantum.frag.wgsl +361 -0
  197. package/src/testing/ParallelTestFramework.js +519 -0
  198. package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
  199. package/src/testing/exportFormats.test.js +8 -0
  200. package/src/testing/projections.test.js +14 -0
  201. package/src/testing/rotations.test.js +37 -0
  202. package/src/ui/InteractivityMenu.js +516 -0
  203. package/src/ui/StatusManager.js +96 -0
  204. package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
  205. package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
  206. package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
  207. package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
  208. package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
  209. package/src/variations/VariationManager.js +431 -0
  210. package/src/viewer/AudioReactivity.js +505 -0
  211. package/src/viewer/CardBending.js +481 -0
  212. package/src/viewer/GalleryUI.js +832 -0
  213. package/src/viewer/ReactivityManager.js +590 -0
  214. package/src/viewer/TradingCardExporter.js +600 -0
  215. package/src/viewer/ViewerPortal.js +374 -0
  216. package/src/viewer/index.js +12 -0
  217. package/src/wasm/WasmLoader.js +296 -0
  218. package/src/wasm/index.js +132 -0
  219. package/tools/agentic/mcpTools.js +88 -0
  220. package/tools/cli/agent-cli.js +92 -0
  221. package/tools/export/formats.js +24 -0
  222. package/tools/math/rotation-baseline.mjs +64 -0
  223. package/tools/shader-sync-verify.js +937 -0
  224. package/tools/telemetry/manifestPipeline.js +141 -0
  225. package/tools/telemetry/telemetryEvents.js +35 -0
  226. package/types/adaptive-sdk.d.ts +185 -0
  227. package/types/advanced/AIPresetGenerator.d.ts +81 -0
  228. package/types/advanced/MIDIController.d.ts +100 -0
  229. package/types/advanced/OffscreenWorker.d.ts +82 -0
  230. package/types/advanced/WebGPUCompute.d.ts +52 -0
  231. package/types/advanced/WebXRRenderer.d.ts +77 -0
  232. package/types/advanced/index.d.ts +46 -0
  233. package/types/core/ErrorReporter.d.ts +50 -0
  234. package/types/core/VIB3Engine.d.ts +204 -0
  235. package/types/creative/ColorPresetsSystem.d.ts +91 -0
  236. package/types/creative/ParameterTimeline.d.ts +74 -0
  237. package/types/creative/PostProcessingPipeline.d.ts +109 -0
  238. package/types/creative/TransitionAnimator.d.ts +71 -0
  239. package/types/creative/index.d.ts +35 -0
  240. package/types/integrations/FigmaPlugin.d.ts +46 -0
  241. package/types/integrations/OBSMode.d.ts +74 -0
  242. package/types/integrations/ThreeJsPackage.d.ts +62 -0
  243. package/types/integrations/TouchDesignerExport.d.ts +36 -0
  244. package/types/integrations/Vib3React.d.ts +74 -0
  245. package/types/integrations/Vib3Svelte.d.ts +63 -0
  246. package/types/integrations/Vib3Vue.d.ts +55 -0
  247. package/types/integrations/index.d.ts +52 -0
  248. package/types/reactivity/SpatialInputSystem.d.ts +173 -0
  249. package/types/reactivity/index.d.ts +394 -0
  250. package/types/render/CommandBuffer.d.ts +169 -0
  251. package/types/render/RenderCommand.d.ts +312 -0
  252. package/types/render/RenderState.d.ts +279 -0
  253. package/types/render/RenderTarget.d.ts +254 -0
  254. package/types/render/ShaderProgram.d.ts +277 -0
  255. package/types/render/UnifiedRenderBridge.d.ts +143 -0
  256. package/types/render/WebGLBackend.d.ts +168 -0
  257. package/types/render/WebGPUBackend.d.ts +186 -0
  258. package/types/render/index.d.ts +141 -0
@@ -0,0 +1,54 @@
1
+ /**
2
+ * Projection Utilities - Functional API for 4D→3D projections
3
+ *
4
+ * Provides functional wrappers around the Projection class for
5
+ * convenience in tests and direct usage.
6
+ */
7
+
8
+ /**
9
+ * Perspective projection of a 4D point to 3D.
10
+ *
11
+ * Formula: P.xyz = v.xyz / (distance - v.w)
12
+ *
13
+ * @param {number[]} v - 4-element array [x, y, z, w]
14
+ * @param {object} [options]
15
+ * @param {number} [options.distance=2] - Projection distance
16
+ * @param {number} [options.epsilon=1e-5] - Minimum absolute denominator
17
+ * @returns {{ x: number, y: number, z: number, denom: number }}
18
+ */
19
+ export function perspectiveProject4D(v, options = {}) {
20
+ const distance = options.distance ?? 2;
21
+ const epsilon = options.epsilon ?? 1e-5;
22
+ const raw = distance - v[3];
23
+ const denom = Math.abs(raw) < epsilon ? (raw >= 0 ? epsilon : -epsilon) : raw;
24
+ const scale = 1 / denom;
25
+ return {
26
+ x: v[0] * scale,
27
+ y: v[1] * scale,
28
+ z: v[2] * scale,
29
+ denom,
30
+ };
31
+ }
32
+
33
+ /**
34
+ * Stereographic projection of a 4D point to 3D.
35
+ *
36
+ * Formula: P.xyz = v.xyz / (1 - v.w)
37
+ *
38
+ * @param {number[]} v - 4-element array [x, y, z, w]
39
+ * @param {object} [options]
40
+ * @param {number} [options.epsilon=1e-5] - Minimum absolute denominator
41
+ * @returns {{ x: number, y: number, z: number, denom: number }}
42
+ */
43
+ export function stereographicProject4D(v, options = {}) {
44
+ const epsilon = options.epsilon ?? 1e-5;
45
+ const raw = 1 - v[3];
46
+ const denom = Math.abs(raw) < epsilon ? (raw >= 0 ? epsilon : -epsilon) : raw;
47
+ const scale = 1 / denom;
48
+ return {
49
+ x: v[0] * scale,
50
+ y: v[1] * scale,
51
+ z: v[2] * scale,
52
+ denom,
53
+ };
54
+ }
@@ -0,0 +1,196 @@
1
+ /**
2
+ * Rotation Utilities - Functional API for 4D rotation matrices
3
+ *
4
+ * Uses Float64 (native JS number) precision for CPU-side math.
5
+ * The Mat4x4 class uses Float32Array for GPU upload, but these
6
+ * utilities preserve full double precision for iterative algorithms.
7
+ */
8
+
9
+ /**
10
+ * Canonical rotation plane names in order: XY, XZ, YZ, XW, YW, ZW
11
+ */
12
+ export const ROTATION_PLANES = ['XY', 'XZ', 'YZ', 'XW', 'YW', 'ZW'];
13
+
14
+ // Axis indices for each rotation plane
15
+ const PLANE_AXES = {
16
+ XY: [0, 1],
17
+ XZ: [0, 2],
18
+ YZ: [1, 2],
19
+ XW: [0, 3],
20
+ YW: [1, 3],
21
+ ZW: [2, 3],
22
+ };
23
+
24
+ /**
25
+ * Create a 4D rotation matrix for a given plane and angle.
26
+ * Returns a 16-element Float64 array (column-major).
27
+ *
28
+ * @param {string} plane - One of 'XY','XZ','YZ','XW','YW','ZW'
29
+ * @param {number} angle - Radians
30
+ * @returns {number[]} 16-element column-major matrix
31
+ */
32
+ export function createRotationMatrix4D(plane, angle) {
33
+ const upper = plane.toUpperCase();
34
+ const axes = PLANE_AXES[upper];
35
+ if (!axes) throw new Error(`Invalid rotation plane: ${plane}`);
36
+
37
+ // Start with identity
38
+ const m = [
39
+ 1, 0, 0, 0,
40
+ 0, 1, 0, 0,
41
+ 0, 0, 1, 0,
42
+ 0, 0, 0, 1,
43
+ ];
44
+
45
+ const c = Math.cos(angle);
46
+ const s = Math.sin(angle);
47
+ const [a, b] = axes;
48
+
49
+ // Column-major: element at (row, col) = m[col * 4 + row]
50
+ m[a * 4 + a] = c;
51
+ m[a * 4 + b] = s;
52
+ m[b * 4 + a] = -s;
53
+ m[b * 4 + b] = c;
54
+
55
+ return m;
56
+ }
57
+
58
+ /**
59
+ * Return a 16-element identity matrix.
60
+ * @returns {number[]}
61
+ */
62
+ export function identityMatrix4x4() {
63
+ return [
64
+ 1, 0, 0, 0,
65
+ 0, 1, 0, 0,
66
+ 0, 0, 1, 0,
67
+ 0, 0, 0, 1,
68
+ ];
69
+ }
70
+
71
+ /**
72
+ * Multiply two 16-element column-major matrices (Float64).
73
+ * @param {number[]} a
74
+ * @param {number[]} b
75
+ * @returns {number[]}
76
+ */
77
+ export function multiplyMatrix4x4(a, b) {
78
+ const result = new Array(16);
79
+ for (let col = 0; col < 4; col++) {
80
+ for (let row = 0; row < 4; row++) {
81
+ let sum = 0;
82
+ for (let k = 0; k < 4; k++) {
83
+ sum += a[k * 4 + row] * b[col * 4 + k];
84
+ }
85
+ result[col * 4 + row] = sum;
86
+ }
87
+ }
88
+ return result;
89
+ }
90
+
91
+ /**
92
+ * Transpose a 16-element column-major matrix.
93
+ * @param {number[]} m
94
+ * @returns {number[]}
95
+ */
96
+ export function transposeMatrix4x4(m) {
97
+ return [
98
+ m[0], m[4], m[8], m[12],
99
+ m[1], m[5], m[9], m[13],
100
+ m[2], m[6], m[10], m[14],
101
+ m[3], m[7], m[11], m[15],
102
+ ];
103
+ }
104
+
105
+ /**
106
+ * Apply a 16-element column-major matrix to a 4-element vector.
107
+ * @param {number[]} m - 16-element matrix
108
+ * @param {number[]} v - 4-element vector [x, y, z, w]
109
+ * @returns {number[]} Transformed 4-element vector
110
+ */
111
+ export function applyMatrix4x4(m, v) {
112
+ const x = v[0], y = v[1], z = v[2], w = v[3];
113
+ return [
114
+ m[0] * x + m[4] * y + m[8] * z + m[12] * w,
115
+ m[1] * x + m[5] * y + m[9] * z + m[13] * w,
116
+ m[2] * x + m[6] * y + m[10] * z + m[14] * w,
117
+ m[3] * x + m[7] * y + m[11] * z + m[15] * w,
118
+ ];
119
+ }
120
+
121
+ /**
122
+ * Compute the Euclidean length of a 4D vector.
123
+ * @param {number[]} v
124
+ * @returns {number}
125
+ */
126
+ export function vectorLength4D(v) {
127
+ return Math.sqrt(v[0] * v[0] + v[1] * v[1] + v[2] * v[2] + v[3] * v[3]);
128
+ }
129
+
130
+ /**
131
+ * Normalize a 4D vector to unit length.
132
+ * @param {number[]} v
133
+ * @returns {number[]}
134
+ */
135
+ export function normalizeVector4D(v) {
136
+ const len = vectorLength4D(v);
137
+ if (len < 1e-10) return [0, 0, 0, 0];
138
+ return [v[0] / len, v[1] / len, v[2] / len, v[3] / len];
139
+ }
140
+
141
+ /**
142
+ * Normalize rotation angle keys to canonical uppercase plane names,
143
+ * filling missing planes with 0.
144
+ *
145
+ * Accepts keys in any case (e.g. 'xy', 'XZ', 'zw').
146
+ *
147
+ * @param {object} angles - Sparse angle map
148
+ * @returns {object} Full map with all 6 planes as uppercase keys
149
+ */
150
+ export function normalizeRotationAngles(angles) {
151
+ const result = {};
152
+ for (const plane of ROTATION_PLANES) {
153
+ result[plane] = 0;
154
+ }
155
+ for (const [key, value] of Object.entries(angles)) {
156
+ const upper = key.toUpperCase();
157
+ if (ROTATION_PLANES.includes(upper)) {
158
+ result[upper] = value;
159
+ }
160
+ }
161
+ return result;
162
+ }
163
+
164
+ /**
165
+ * Create individual rotation matrices for all six planes from an angle map.
166
+ * Missing planes default to angle 0 (identity rotation).
167
+ *
168
+ * @param {object} angles - Sparse angle map (any case keys)
169
+ * @returns {object} Map of plane name -> 16-element matrix
170
+ */
171
+ export function createRotationMatricesFromAngles(angles) {
172
+ const normalized = normalizeRotationAngles(angles);
173
+ const result = {};
174
+ for (const plane of ROTATION_PLANES) {
175
+ result[plane] = createRotationMatrix4D(plane, normalized[plane]);
176
+ }
177
+ return result;
178
+ }
179
+
180
+ /**
181
+ * Compose a single rotation matrix from an angle map by multiplying
182
+ * individual plane rotations in canonical order (XY*XZ*YZ*XW*YW*ZW).
183
+ *
184
+ * @param {object} angles - Sparse angle map (any case keys)
185
+ * @returns {number[]} 16-element composed rotation matrix
186
+ */
187
+ export function composeRotationMatrixFromAngles(angles) {
188
+ const normalized = normalizeRotationAngles(angles);
189
+ let result = identityMatrix4x4();
190
+ for (const plane of ROTATION_PLANES) {
191
+ if (normalized[plane] !== 0) {
192
+ result = multiplyMatrix4x4(result, createRotationMatrix4D(plane, normalized[plane]));
193
+ }
194
+ }
195
+ return result;
196
+ }