@vib3code/sdk 2.0.3-canary.45332e3 → 2.0.3-canary.4e0dace

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 (74) hide show
  1. package/DOCS/AGENT_HARNESS_ARCHITECTURE.md +2 -0
  2. package/DOCS/ANDROID_DEPLOYMENT.md +59 -0
  3. package/DOCS/ARCHITECTURE.md +1 -0
  4. package/DOCS/CI_TESTING.md +2 -0
  5. package/DOCS/CLI_ONBOARDING.md +2 -0
  6. package/DOCS/CONTROL_REFERENCE.md +2 -0
  7. package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +2 -0
  8. package/DOCS/ENV_SETUP.md +2 -0
  9. package/DOCS/EPIC_SCROLL_EVENTS.md +2 -0
  10. package/DOCS/EXPANSION_DESIGN.md +979 -0
  11. package/DOCS/EXPANSION_DESIGN_ULTRA.md +389 -0
  12. package/DOCS/EXPORT_FORMATS.md +2 -0
  13. package/DOCS/GPU_DISPOSAL_GUIDE.md +2 -0
  14. package/DOCS/HANDOFF_LANDING_PAGE.md +2 -0
  15. package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +2 -0
  16. package/DOCS/LICENSING_TIERS.md +2 -0
  17. package/DOCS/MASTER_PLAN_2026-01-31.md +2 -0
  18. package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +3 -1
  19. package/DOCS/OBS_SETUP_GUIDE.md +2 -0
  20. package/DOCS/OPTIMIZATION_PLAN_MATH.md +119 -0
  21. package/DOCS/PRODUCT_STRATEGY.md +2 -0
  22. package/DOCS/PROJECT_SETUP.md +2 -0
  23. package/DOCS/README.md +5 -3
  24. package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +2 -0
  25. package/DOCS/RENDERER_LIFECYCLE.md +2 -0
  26. package/DOCS/REPO_MANIFEST.md +2 -0
  27. package/DOCS/ROADMAP.md +2 -0
  28. package/DOCS/SCROLL_TIMELINE_v3.md +2 -0
  29. package/DOCS/SITE_REFACTOR_PLAN.md +2 -0
  30. package/DOCS/STATUS.md +2 -0
  31. package/DOCS/SYSTEM_INVENTORY.md +2 -0
  32. package/DOCS/TELEMETRY_EXPORTS.md +2 -0
  33. package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +2 -0
  34. package/DOCS/VISUAL_ANALYSIS_FACETAD.md +2 -0
  35. package/DOCS/VISUAL_ANALYSIS_SIMONE.md +2 -0
  36. package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +2 -0
  37. package/DOCS/WEBGPU_STATUS.md +2 -0
  38. package/DOCS/XR_BENCHMARKS.md +2 -0
  39. package/DOCS/archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +1 -34
  40. package/DOCS/archive/DEV_TRACK_ANALYSIS.md +1 -80
  41. package/DOCS/archive/DEV_TRACK_PLAN_2026-01-07.md +1 -42
  42. package/DOCS/archive/SESSION_014_PLAN.md +1 -195
  43. package/DOCS/archive/SESSION_LOG_2026-01-07.md +1 -56
  44. package/DOCS/archive/STRATEGIC_BLUEPRINT_2026-01-07.md +1 -72
  45. package/DOCS/archive/SYSTEM_AUDIT_2026-01-30.md +1 -741
  46. package/DOCS/archive/WEBGPU_STATUS_2026-02-15_STALE.md +1 -38
  47. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-01-31.md +2 -0
  48. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +2 -0
  49. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +2 -0
  50. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +2 -0
  51. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-16.md +2 -0
  52. package/DOCS/dev-tracks/PERF_UPGRADE_2026-02-16.md +310 -0
  53. package/DOCS/dev-tracks/README.md +2 -0
  54. package/package.json +2 -4
  55. package/src/cli/index.js +59 -5
  56. package/src/experimental/GameLoop.js +72 -0
  57. package/src/experimental/LatticePhysics.js +100 -0
  58. package/src/experimental/LiveDirector.js +143 -0
  59. package/src/experimental/PlayerController4D.js +154 -0
  60. package/src/experimental/VIB3Actor.js +138 -0
  61. package/src/experimental/VIB3Compositor.js +117 -0
  62. package/src/experimental/VIB3Link.js +122 -0
  63. package/src/experimental/VIB3Orchestrator.js +146 -0
  64. package/src/experimental/VIB3Universe.js +109 -0
  65. package/src/experimental/demos/CrystalLabyrinth.js +202 -0
  66. package/src/geometry/generators/Crystal.js +2 -2
  67. package/src/geometry/warp/HypersphereCore.js +53 -24
  68. package/src/math/Mat4x4.js +238 -92
  69. package/src/math/Projection.js +39 -4
  70. package/src/math/Rotor4D.js +69 -46
  71. package/src/math/Vec4.js +200 -103
  72. package/src/scene/Node4D.js +74 -24
  73. package/src/testing/ProjectionClass.test.js +38 -0
  74. package/tools/update_projection.py +109 -0
@@ -36,16 +36,28 @@ export class Projection {
36
36
  *
37
37
  * @param {Vec4} v - 4D point
38
38
  * @param {number} d - Distance parameter (typically 1.5-5)
39
+ * @param {object} [options] - Projection options
40
+ * @param {Vec4} [target] - Optional target vector to write result to
39
41
  * @returns {Vec4} Projected point (w=0)
40
42
  */
41
- static perspective(v, d = 2, options = {}) {
43
+ static perspective(v, d = 2, options = {}, target = null) {
42
44
  if (typeof d === 'object') {
43
45
  options = d;
44
46
  d = options.d ?? 2;
45
47
  }
46
- const epsilon = options.epsilon ?? DEFAULT_EPSILON;
48
+
49
+ // Handle options overload or direct target argument
50
+ if (!target && options && options.target) {
51
+ target = options.target;
52
+ }
53
+
54
+ const epsilon = (options && options.epsilon) ?? DEFAULT_EPSILON;
47
55
  const denom = clampDenominator(d - v.w, epsilon);
48
56
  const scale = 1 / denom;
57
+
58
+ if (target) {
59
+ return target.set(v.x * scale, v.y * scale, v.z * scale, 0);
60
+ }
49
61
  return new Vec4(v.x * scale, v.y * scale, v.z * scale, 0);
50
62
  }
51
63
 
@@ -126,10 +138,33 @@ export class Projection {
126
138
  * Project array of Vec4s using perspective projection
127
139
  * @param {Vec4[]} vectors
128
140
  * @param {number} d
141
+ * @param {object} [options]
142
+ * @param {Vec4[]} [target] - Optional target array to write results to
129
143
  * @returns {Vec4[]}
130
144
  */
131
- static perspectiveArray(vectors, d = 2, options = {}) {
132
- return vectors.map(v => Projection.perspective(v, d, options));
145
+ static perspectiveArray(vectors, d = 2, options = {}, target = null) {
146
+ // Handle options overload for 'd'
147
+ if (typeof d === 'object') {
148
+ options = d;
149
+ d = options.d ?? 2;
150
+ }
151
+
152
+ if (!target) {
153
+ return vectors.map(v => Projection.perspective(v, d, options));
154
+ }
155
+
156
+ const count = vectors.length;
157
+ // Iterate and reuse
158
+ for (let i = 0; i < count; i++) {
159
+ const out = target[i];
160
+ if (out) {
161
+ Projection.perspective(vectors[i], d, options, out);
162
+ } else {
163
+ target[i] = Projection.perspective(vectors[i], d, options);
164
+ }
165
+ }
166
+
167
+ return target;
133
168
  }
134
169
 
135
170
  /**
@@ -323,14 +323,17 @@ export class Rotor4D {
323
323
  /**
324
324
  * Rotate a 4D vector using sandwich product: v' = R v R†
325
325
  *
326
+ * Matrix math is inlined to avoid allocating a temporary Float32Array(16).
327
+ * Pass an optional target Vec4 to eliminate all allocations.
328
+ *
326
329
  * @param {Vec4} v - Vector to rotate
327
- * @param {Vec4} [target] - Optional target vector to write result to
328
- * @returns {Vec4} Rotated vector
330
+ * @param {Vec4} [target] - Optional pre-allocated Vec4 to write result into
331
+ * @returns {Vec4} Rotated vector (target if provided, otherwise new Vec4)
329
332
  */
330
333
  rotate(v, target) {
331
- // Direct matrix multiplication without allocation
334
+ const x = v.x, y = v.y, z = v.z, w = v.w;
332
335
 
333
- // Normalize components for stability (same as toMatrix)
336
+ // Normalize for numerical stability (same as toMatrix)
334
337
  const n = this.norm();
335
338
  const invN = n > 1e-10 ? 1 / n : 1;
336
339
 
@@ -343,7 +346,7 @@ export class Rotor4D {
343
346
  const zw = this.zw * invN;
344
347
  const xyzw = this.xyzw * invN;
345
348
 
346
- // Pre-compute products
349
+ // Squared terms
347
350
  const s2 = s * s;
348
351
  const xy2 = xy * xy;
349
352
  const xz2 = xz * xz;
@@ -353,22 +356,20 @@ export class Rotor4D {
353
356
  const zw2 = zw * zw;
354
357
  const xyzw2 = xyzw * xyzw;
355
358
 
356
- // Cross terms
359
+ // Cross terms (pre-multiplied by 2)
357
360
  const sxy = 2 * s * xy;
358
361
  const sxz = 2 * s * xz;
359
362
  const syz = 2 * s * yz;
360
363
  const sxw = 2 * s * xw;
361
364
  const syw = 2 * s * yw;
362
365
  const szw = 2 * s * zw;
363
- // const sxyzw = 2 * s * xyzw; // Unused in rotation matrix
364
366
 
365
- const xyxz = 2 * xy * xz;
367
+ const xzyz = 2 * xz * yz;
366
368
  const xyyz = 2 * xy * yz;
369
+ const xyxz = 2 * xy * xz;
367
370
  const xyxw = 2 * xy * xw;
368
371
  const xyyw = 2 * xy * yw;
369
- // const xyzw_c = 2 * xy * zw; // Unused in rotation matrix
370
372
 
371
- const xzyz = 2 * xz * yz;
372
373
  const xzxw = 2 * xz * xw;
373
374
  const xzyw = 2 * xz * yw;
374
375
  const xzzw = 2 * xz * zw;
@@ -388,40 +389,33 @@ export class Rotor4D {
388
389
  const ywxyzw = 2 * yw * xyzw;
389
390
  const zwxyzw = 2 * zw * xyzw;
390
391
 
391
- // Matrix elements
392
- // Col 0
393
- const m00 = s2 - xy2 - xz2 + yz2 - xw2 + yw2 + zw2 - xyzw2;
394
- const m01 = sxy + xzyz + xwyw - zwxyzw;
395
- const m02 = sxz - xyyz + xwzw + ywxyzw;
396
- const m03 = sxw - xyyw - xzzw - yzxyzw;
397
-
398
- // Col 1
399
- const m10 = -sxy + xzyz + xwyw + zwxyzw;
400
- const m11 = s2 - xy2 + xz2 - yz2 + xw2 - yw2 + zw2 - xyzw2;
401
- const m12 = syz + xyxz + ywzw - xwxyzw;
402
- const m13 = syw + xyxw - yzzw + xzxyzw;
403
-
404
- // Col 2
405
- const m20 = -sxz - xyyz + xwzw - ywxyzw;
406
- const m21 = -syz + xyxz + ywzw + xwxyzw;
407
- const m22 = s2 + xy2 - xz2 - yz2 + xw2 + yw2 - zw2 - xyzw2;
408
- const m23 = szw + xzxw + yzyw - xyxyzw;
409
-
410
- // Col 3
411
- const m30 = -sxw - xyyw - xzzw + yzxyzw;
412
- const m31 = -syw + xyxw - yzzw - xzxyzw;
413
- const m32 = -szw + xzxw + yzyw + xyxyzw;
414
- const m33 = s2 + xy2 + xz2 + yz2 - xw2 - yw2 - zw2 - xyzw2;
415
-
416
- const x = v.x;
417
- const y = v.y;
418
- const z = v.z;
419
- const w = v.w;
420
-
421
- const rx = m00 * x + m10 * y + m20 * z + m30 * w;
422
- const ry = m01 * x + m11 * y + m21 * z + m31 * w;
423
- const rz = m02 * x + m12 * y + m22 * z + m32 * w;
424
- const rw = m03 * x + m13 * y + m23 * z + m33 * w;
392
+ // Column-major 4x4 rotation matrix entries (inlined from toMatrix)
393
+ // Column 0
394
+ const m0 = s2 - xy2 - xz2 + yz2 - xw2 + yw2 + zw2 - xyzw2;
395
+ const m1 = sxy + xzyz + xwyw - zwxyzw;
396
+ const m2 = sxz - xyyz + xwzw + ywxyzw;
397
+ const m3 = sxw - xyyw - xzzw - yzxyzw;
398
+ // Column 1
399
+ const m4 = -sxy + xzyz + xwyw + zwxyzw;
400
+ const m5 = s2 - xy2 + xz2 - yz2 + xw2 - yw2 + zw2 - xyzw2;
401
+ const m6 = syz + xyxz + ywzw - xwxyzw;
402
+ const m7 = syw + xyxw - yzzw + xzxyzw;
403
+ // Column 2
404
+ const m8 = -sxz - xyyz + xwzw - ywxyzw;
405
+ const m9 = -syz + xyxz + ywzw + xwxyzw;
406
+ const m10 = s2 + xy2 - xz2 - yz2 + xw2 + yw2 - zw2 - xyzw2;
407
+ const m11 = szw + xzxw + yzyw - xyxyzw;
408
+ // Column 3
409
+ const m12 = -sxw - xyyw - xzzw + yzxyzw;
410
+ const m13 = -syw + xyxw - yzzw - xzxyzw;
411
+ const m14 = -szw + xzxw + yzyw + xyxyzw;
412
+ const m15 = s2 + xy2 + xz2 + yz2 - xw2 - yw2 - zw2 - xyzw2;
413
+
414
+ // Matrix-vector multiply
415
+ const rx = m0 * x + m4 * y + m8 * z + m12 * w;
416
+ const ry = m1 * x + m5 * y + m9 * z + m13 * w;
417
+ const rz = m2 * x + m6 * y + m10 * z + m14 * w;
418
+ const rw = m3 * x + m7 * y + m11 * z + m15 * w;
425
419
 
426
420
  if (target) {
427
421
  target.x = rx;
@@ -430,15 +424,15 @@ export class Rotor4D {
430
424
  target.w = rw;
431
425
  return target;
432
426
  }
433
-
434
427
  return new Vec4(rx, ry, rz, rw);
435
428
  }
436
429
 
437
430
  /**
438
431
  * Convert rotor to 4x4 rotation matrix (column-major for WebGL)
432
+ * @param {Float32Array|Array} [target] - Optional target array to write into
439
433
  * @returns {Float32Array} 16-element array in column-major order
440
434
  */
441
- toMatrix() {
435
+ toMatrix(target = null) {
442
436
  // Normalize first for numerical stability
443
437
  const n = this.norm();
444
438
  const invN = n > 1e-10 ? 1 / n : 1;
@@ -502,6 +496,35 @@ export class Rotor4D {
502
496
  // Formula derived from sandwich product R v R†
503
497
  // Diagonal: s² minus bivectors containing that axis, plus others
504
498
  // Off-diagonal: 2*s*bivector terms for single-plane contributions
499
+
500
+ if (target) {
501
+ // Column 0 (transformed X axis)
502
+ target[0] = s2 - xy2 - xz2 + yz2 - xw2 + yw2 + zw2 - xyzw2;
503
+ target[1] = sxy + xzyz + xwyw - zwxyzw;
504
+ target[2] = sxz - xyyz + xwzw + ywxyzw;
505
+ target[3] = sxw - xyyw - xzzw - yzxyzw;
506
+
507
+ // Column 1 (transformed Y axis)
508
+ target[4] = -sxy + xzyz + xwyw + zwxyzw;
509
+ target[5] = s2 - xy2 + xz2 - yz2 + xw2 - yw2 + zw2 - xyzw2;
510
+ target[6] = syz + xyxz + ywzw - xwxyzw;
511
+ target[7] = syw + xyxw - yzzw + xzxyzw;
512
+
513
+ // Column 2 (transformed Z axis)
514
+ target[8] = -sxz - xyyz + xwzw - ywxyzw;
515
+ target[9] = -syz + xyxz + ywzw + xwxyzw;
516
+ target[10] = s2 + xy2 - xz2 - yz2 + xw2 + yw2 - zw2 - xyzw2;
517
+ target[11] = szw + xzxw + yzyw - xyxyzw;
518
+
519
+ // Column 3 (transformed W axis)
520
+ target[12] = -sxw - xyyw - xzzw + yzxyzw;
521
+ target[13] = -syw + xyxw - yzzw - xzxyzw;
522
+ target[14] = -szw + xzxw + yzyw + xyxyzw;
523
+ target[15] = s2 + xy2 + xz2 + yz2 - xw2 - yw2 - zw2 - xyzw2;
524
+
525
+ return target;
526
+ }
527
+
505
528
  return new Float32Array([
506
529
  // Column 0 (transformed X axis)
507
530
  s2 - xy2 - xz2 + yz2 - xw2 + yw2 + zw2 - xyzw2,