@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
@@ -22,6 +22,11 @@ export class QuantumEngine {
22
22
  /** @type {HTMLCanvasElement|null} */
23
23
  this.canvasOverride = options.canvas || null;
24
24
 
25
+ // Multi-canvas override: { background, shadow, content, highlight, accent }
26
+ // Enables 5-layer mode without DOM ID lookup (for landing page / multi-instance)
27
+ /** @type {Object<string, HTMLCanvasElement>|null} */
28
+ this.canvasSet = options.canvases || null;
29
+
25
30
  // Bridge rendering state
26
31
  /** @type {MultiCanvasBridge|null} */
27
32
  this._multiCanvasBridge = null;
@@ -89,6 +94,37 @@ export class QuantumEngine {
89
94
  return;
90
95
  }
91
96
 
97
+ // Multi-canvas override: 5-layer mode with provided canvas elements
98
+ // Used by landing page adapters to create multiple independent 5-layer instances
99
+ if (this.canvasSet) {
100
+ const layerDefs = [
101
+ { key: 'background', role: 'background', reactivity: 0.4 },
102
+ { key: 'shadow', role: 'shadow', reactivity: 0.6 },
103
+ { key: 'content', role: 'content', reactivity: 1.0 },
104
+ { key: 'highlight', role: 'highlight', reactivity: 1.3 },
105
+ { key: 'accent', role: 'accent', reactivity: 1.6 },
106
+ ];
107
+
108
+ layerDefs.forEach(layer => {
109
+ const canvas = this.canvasSet[layer.key];
110
+ if (!canvas) return;
111
+ try {
112
+ const visualizer = new QuantumHolographicVisualizer(
113
+ canvas, layer.role, layer.reactivity, 0
114
+ );
115
+ if (visualizer.gl) {
116
+ this.visualizers.push(visualizer);
117
+ console.log(`🌌 Created quantum layer (canvasSet): ${layer.role}`);
118
+ }
119
+ } catch (error) {
120
+ console.warn(`Failed to create quantum layer ${layer.role}:`, error);
121
+ }
122
+ });
123
+
124
+ console.log(`✅ Created ${this.visualizers.length} quantum visualizers via canvasSet`);
125
+ return;
126
+ }
127
+
92
128
  const layers = [
93
129
  { id: 'quantum-background-canvas', role: 'background', reactivity: 0.4 },
94
130
  { id: 'quantum-shadow-canvas', role: 'shadow', reactivity: 0.6 },
@@ -340,22 +376,27 @@ export class QuantumEngine {
340
376
  console.log('🌌 Quantum gesture reactivity skipped (single-canvas override mode)');
341
377
  return;
342
378
  }
343
-
379
+
344
380
  console.log('🌌 Setting up Quantum: velocity + click + scroll + multi-parameter reactivity');
345
-
381
+
346
382
  // Enhanced state for smooth effects
347
383
  this.clickFlashIntensity = 0;
348
384
  this.scrollMorph = 1.0; // Base morph factor
349
385
  this.velocitySmoothing = 0.8; // Smoother velocity transitions
350
-
351
- const quantumCanvases = [
352
- 'quantum-background-canvas', 'quantum-shadow-canvas', 'quantum-content-canvas',
353
- 'quantum-highlight-canvas', 'quantum-accent-canvas'
354
- ];
355
-
356
- quantumCanvases.forEach(canvasId => {
357
- const canvas = document.getElementById(canvasId);
358
- if (!canvas) return;
386
+
387
+ // Gather canvases: from canvasSet (landing page) or DOM IDs (main app)
388
+ const canvasElements = [];
389
+ if (this.canvasSet) {
390
+ Object.values(this.canvasSet).forEach(c => { if (c) canvasElements.push(c); });
391
+ } else {
392
+ ['quantum-background-canvas', 'quantum-shadow-canvas', 'quantum-content-canvas',
393
+ 'quantum-highlight-canvas', 'quantum-accent-canvas'].forEach(id => {
394
+ const c = document.getElementById(id);
395
+ if (c) canvasElements.push(c);
396
+ });
397
+ }
398
+
399
+ canvasElements.forEach(canvas => {
359
400
 
360
401
  // Mouse movement -> smooth velocity + multiple parameters
361
402
  canvas.addEventListener('mousemove', (e) => {
@@ -368,20 +409,19 @@ export class QuantumEngine {
368
409
  this.updateEnhancedQuantumParameters(mouseX, mouseY);
369
410
  });
370
411
 
371
- // Touch movement -> same enhanced parameters
412
+ // Touch movement -> same enhanced parameters
372
413
  canvas.addEventListener('touchmove', (e) => {
373
414
  if (!this.isActive) return;
374
- e.preventDefault();
375
-
415
+
376
416
  if (e.touches.length > 0) {
377
417
  const touch = e.touches[0];
378
418
  const rect = canvas.getBoundingClientRect();
379
419
  const touchX = (touch.clientX - rect.left) / rect.width;
380
420
  const touchY = (touch.clientY - rect.top) / rect.height;
381
-
421
+
382
422
  this.updateEnhancedQuantumParameters(touchX, touchY);
383
423
  }
384
- }, { passive: false });
424
+ }, { passive: true });
385
425
 
386
426
  // Click -> quantum flash effect
387
427
  canvas.addEventListener('click', (e) => {
@@ -398,9 +438,8 @@ export class QuantumEngine {
398
438
  // Wheel -> quantum morphing scroll effect
399
439
  canvas.addEventListener('wheel', (e) => {
400
440
  if (!this.isActive) return;
401
- e.preventDefault();
402
441
  this.updateQuantumScroll(e.deltaY);
403
- }, { passive: false });
442
+ }, { passive: true });
404
443
  });
405
444
 
406
445
  // Start smooth animation loops
@@ -483,7 +522,11 @@ export class QuantumEngine {
483
522
  this.lastMousePosition.x = x;
484
523
  this.lastMousePosition.y = y;
485
524
 
486
- console.log(`🌌 Quantum EXPERIMENTAL: X=${x.toFixed(2)}→Rot=${rotationAngle.toFixed(2)}, Y=${y.toFixed(2)}→Density=${Math.round(gridDensity)}, Dist=${normalizedDistance.toFixed(2)}→Hue=${Math.round(hue)}, Hemisphere=${leftHemisphere ? 'L' : 'R'}${topHemisphere ? 'T' : 'B'}`);
525
+ // Debug logging (throttled to avoid console spam)
526
+ if (!this._lastLogTime || performance.now() - this._lastLogTime > 2000) {
527
+ this._lastLogTime = performance.now();
528
+ console.log(`Quantum: Rot=${rotationAngle.toFixed(2)}, Density=${Math.round(gridDensity)}, Hue=${Math.round(hue)}`);
529
+ }
487
530
  }
488
531
 
489
532
  triggerQuantumClick() {
@@ -495,7 +538,7 @@ export class QuantumEngine {
495
538
  this.quantumSpeedWave = 2.0; // Speed wave effect
496
539
  this.quantumHueShift = 60; // Color explosion shift
497
540
 
498
- console.log('💥 Quantum energy burst: flash + chaos + speed + hue explosion');
541
+ // Quantum energy burst triggered
499
542
  }
500
543
 
501
544
  updateQuantumScroll(deltaY) {
@@ -511,81 +554,60 @@ export class QuantumEngine {
511
554
  window.updateParameter('morphFactor', this.scrollMorph.toFixed(2));
512
555
  }
513
556
 
514
- console.log(`🌀 Quantum scroll morph: ${this.scrollMorph.toFixed(2)}`);
557
+ // Quantum scroll morph updated
515
558
  }
516
559
 
517
560
  startQuantumEffectLoops() {
561
+ this._effectsLoopActive = true;
518
562
  const quantumEffects = () => {
519
- let hasActiveEffects = false;
520
-
563
+ if (!this._effectsLoopActive) return;
564
+
521
565
  // QUANTUM FLASH EFFECT (saturation + morph)
522
566
  if (this.clickFlashIntensity > 0.01) {
523
- hasActiveEffects = true;
524
-
525
- // Flash affects saturation - quantum shimmer effect
526
- const flashSaturation = 0.9 + (this.clickFlashIntensity * 0.1); // 0.9-1.0 boost
527
- const flashMorph = this.scrollMorph + (this.clickFlashIntensity * 0.5); // Morph boost
528
-
567
+ const flashSaturation = 0.9 + (this.clickFlashIntensity * 0.1);
568
+ const flashMorph = this.scrollMorph + (this.clickFlashIntensity * 0.5);
569
+
529
570
  if (window.updateParameter) {
530
571
  window.updateParameter('saturation', flashSaturation.toFixed(2));
531
572
  window.updateParameter('morphFactor', flashMorph.toFixed(2));
532
573
  }
533
-
534
- // Smooth decay
535
574
  this.clickFlashIntensity *= 0.91;
536
575
  }
537
-
576
+
538
577
  // DRAMATIC CHAOS BLAST EFFECT (fluid decay)
539
578
  if (this.quantumChaosBlast > 0.01) {
540
- hasActiveEffects = true;
541
-
542
- const baseChaos = 0.3; // Quantum default chaos
579
+ const baseChaos = 0.3;
543
580
  const currentChaos = baseChaos + this.quantumChaosBlast;
544
-
545
581
  if (window.updateParameter) {
546
582
  window.updateParameter('chaos', Math.min(1.0, currentChaos).toFixed(2));
547
583
  }
548
-
549
- // Smooth decay
550
- this.quantumChaosBlast *= 0.88; // Slightly faster than faceted for quantum energy feel
584
+ this.quantumChaosBlast *= 0.88;
551
585
  }
552
-
553
- // DRAMATIC SPEED WAVE EFFECT (fluid decay)
586
+
587
+ // DRAMATIC SPEED WAVE EFFECT (fluid decay)
554
588
  if (this.quantumSpeedWave > 0.01) {
555
- hasActiveEffects = true;
556
-
557
- const baseSpeed = 1.0; // Quantum default speed
589
+ const baseSpeed = 1.0;
558
590
  const currentSpeed = baseSpeed + this.quantumSpeedWave;
559
-
560
591
  if (window.updateParameter) {
561
592
  window.updateParameter('speed', Math.min(3.0, currentSpeed).toFixed(2));
562
593
  }
563
-
564
- // Smooth wave decay
565
594
  this.quantumSpeedWave *= 0.89;
566
595
  }
567
-
596
+
568
597
  // QUANTUM HUE EXPLOSION EFFECT (fluid decay)
569
598
  if (this.quantumHueShift > 1) {
570
- hasActiveEffects = true;
571
-
572
- const baseHue = 280; // Quantum purple-blue
599
+ const baseHue = 280;
573
600
  const currentHue = (baseHue + this.quantumHueShift) % 360;
574
-
575
601
  if (window.updateParameter) {
576
602
  window.updateParameter('hue', Math.round(currentHue));
577
603
  }
578
-
579
- // Smooth color return
580
604
  this.quantumHueShift *= 0.90;
581
605
  }
582
-
583
- if (this.isActive) {
584
- requestAnimationFrame(quantumEffects);
585
- }
606
+
607
+ this._effectsRafId = requestAnimationFrame(quantumEffects);
586
608
  };
587
-
588
- quantumEffects();
609
+
610
+ this._effectsRafId = requestAnimationFrame(quantumEffects);
589
611
  }
590
612
 
591
613
  async enableAudio() {
@@ -691,16 +713,17 @@ export class QuantumEngine {
691
713
  if (window.mobileDebug) {
692
714
  window.mobileDebug.log(`🎬 Quantum Engine: Starting render loop with ${this.visualizers?.length} visualizers, isActive=${this.isActive}`);
693
715
  }
694
-
716
+
717
+ this._renderLoopActive = true;
695
718
  const render = () => {
719
+ if (!this._renderLoopActive) return;
696
720
  this.renderFrame();
697
-
698
- requestAnimationFrame(render);
721
+ this._renderRafId = requestAnimationFrame(render);
699
722
  };
700
-
701
- render();
723
+
724
+ this._renderRafId = requestAnimationFrame(render);
702
725
  console.log('🎬 Quantum render loop started');
703
-
726
+
704
727
  if (window.mobileDebug) {
705
728
  window.mobileDebug.log(`✅ Quantum Engine: Render loop started, will render when isActive=true`);
706
729
  }
@@ -777,6 +800,20 @@ export class QuantumEngine {
777
800
  destroy() {
778
801
  this.isActive = false;
779
802
 
803
+ // Cancel render loop
804
+ this._renderLoopActive = false;
805
+ if (this._renderRafId) {
806
+ cancelAnimationFrame(this._renderRafId);
807
+ this._renderRafId = null;
808
+ }
809
+
810
+ // Cancel effects loop
811
+ this._effectsLoopActive = false;
812
+ if (this._effectsRafId) {
813
+ cancelAnimationFrame(this._effectsRafId);
814
+ this._effectsRafId = null;
815
+ }
816
+
780
817
  // Disconnect from universal reactivity
781
818
  if (window.universalReactivity) {
782
819
  window.universalReactivity.disconnectSystem('quantum');
@@ -6,6 +6,17 @@
6
6
 
7
7
  import { GeometryLibrary } from '../geometry/GeometryLibrary.js';
8
8
 
9
+ // Role-specific intensity values for 5-layer canvas architecture.
10
+ // IMPORTANT: Must stay in sync with shader epsilon comparisons in the fragment shader
11
+ // at the "LAYER-BY-LAYER COLOR SYSTEM" section (search for layerIndex).
12
+ const ROLE_INTENSITIES = {
13
+ 'background': 0.4,
14
+ 'shadow': 0.6,
15
+ 'content': 1.0,
16
+ 'highlight': 1.3,
17
+ 'accent': 1.6
18
+ };
19
+
9
20
  export class QuantumHolographicVisualizer {
10
21
  constructor(canvasIdOrElement, role, reactivity, variant) {
11
22
  this.canvas = (canvasIdOrElement instanceof HTMLCanvasElement)
@@ -14,6 +25,7 @@ export class QuantumHolographicVisualizer {
14
25
  this.role = role;
15
26
  this.reactivity = reactivity;
16
27
  this.variant = variant;
28
+ this._canvasLabel = typeof canvasIdOrElement === 'string' ? canvasIdOrElement : canvasIdOrElement?.id || 'unknown';
17
29
 
18
30
  // CRITICAL FIX: Define contextOptions as instance property to match SmartCanvasPool
19
31
  this.contextOptions = {
@@ -34,9 +46,9 @@ export class QuantumHolographicVisualizer {
34
46
  this.canvas.getContext('experimental-webgl', this.contextOptions);
35
47
 
36
48
  if (!this.gl) {
37
- console.error(`WebGL not supported for ${canvasId}`);
49
+ console.error(`WebGL not supported for ${this._canvasLabel}`);
38
50
  if (window.mobileDebug) {
39
- window.mobileDebug.log(`❌ ${canvasId}: WebGL context creation failed`);
51
+ window.mobileDebug.log(`❌ ${this._canvasLabel}: WebGL context creation failed`);
40
52
  }
41
53
  // Show user-friendly error instead of white screen
42
54
  this.showWebGLError();
@@ -44,7 +56,7 @@ export class QuantumHolographicVisualizer {
44
56
  } else {
45
57
  if (window.mobileDebug) {
46
58
  const version = this.gl.getParameter(this.gl.VERSION);
47
- window.mobileDebug.log(`✅ ${canvasId}: WebGL context created - ${version}`);
59
+ window.mobileDebug.log(`✅ ${this._canvasLabel}: WebGL context created - ${version}`);
48
60
  }
49
61
  }
50
62
 
@@ -59,15 +71,15 @@ export class QuantumHolographicVisualizer {
59
71
  this._onContextLost = (e) => {
60
72
  e.preventDefault();
61
73
  this._contextLost = true;
62
- console.warn(`WebGL context lost for ${canvasId}`);
74
+ console.warn(`WebGL context lost for ${this._canvasLabel}`);
63
75
  };
64
76
  this._onContextRestored = () => {
65
- console.log(`WebGL context restored for ${canvasId}`);
77
+ console.log(`WebGL context restored for ${this._canvasLabel}`);
66
78
  this._contextLost = false;
67
79
  try {
68
80
  this.init();
69
81
  } catch (err) {
70
- console.error(`Failed to reinit after context restore for ${canvasId}:`, err);
82
+ console.error(`Failed to reinit after context restore for ${this._canvasLabel}:`, err);
71
83
  }
72
84
  };
73
85
  this.canvas.addEventListener('webglcontextlost', this._onContextLost);
@@ -276,6 +288,7 @@ uniform float u_rot4dZW;
276
288
  uniform float u_mouseIntensity;
277
289
  uniform float u_clickIntensity;
278
290
  uniform float u_roleIntensity;
291
+ uniform float u_breath;
279
292
 
280
293
  // 6D rotation matrices - 3D space rotations (XY, XZ, YZ)
281
294
  mat4 rotateXY(float theta) {
@@ -681,15 +694,18 @@ void main() {
681
694
  geometryIntensity += shimmer * geometryIntensity;
682
695
 
683
696
  // Apply user intensity control
684
- float finalIntensity = geometryIntensity * u_intensity;
697
+ // Breath modulation (Exhale system)
698
+ float breathMod = 1.0 + (u_breath * 0.4);
699
+ float finalIntensity = geometryIntensity * u_intensity * breathMod;
685
700
 
686
701
  // LAYER-BY-LAYER COLOR SYSTEM with user hue/saturation/intensity controls
687
702
  // Determine canvas layer from role/variant (0=background, 1=shadow, 2=content, 3=highlight, 4=accent)
703
+ // Values must match ROLE_INTENSITIES in JS: bg=0.4, shadow=0.6, content=1.0, highlight=1.3, accent=1.6
688
704
  int layerIndex = 0;
689
- if (u_roleIntensity == 0.7) layerIndex = 1; // shadow layer
690
- else if (u_roleIntensity == 1.0) layerIndex = 2; // content layer
691
- else if (u_roleIntensity == 0.85) layerIndex = 3; // highlight layer
692
- else if (u_roleIntensity == 0.6) layerIndex = 4; // accent layer
705
+ if (abs(u_roleIntensity - 0.6) < 0.05) layerIndex = 1; // shadow layer
706
+ else if (abs(u_roleIntensity - 1.0) < 0.05) layerIndex = 2; // content layer
707
+ else if (abs(u_roleIntensity - 1.3) < 0.05) layerIndex = 3; // highlight layer
708
+ else if (abs(u_roleIntensity - 1.6) < 0.05) layerIndex = 4; // accent layer
693
709
 
694
710
  // Get layer-specific base color using user hue/saturation controls
695
711
  float colorTime = timeSpeed * 2.0 + value * 3.0;
@@ -792,7 +808,8 @@ void main() {
792
808
  rot4dZW: this.gl.getUniformLocation(this.program, 'u_rot4dZW'),
793
809
  mouseIntensity: this.gl.getUniformLocation(this.program, 'u_mouseIntensity'),
794
810
  clickIntensity: this.gl.getUniformLocation(this.program, 'u_clickIntensity'),
795
- roleIntensity: this.gl.getUniformLocation(this.program, 'u_roleIntensity')
811
+ roleIntensity: this.gl.getUniformLocation(this.program, 'u_roleIntensity'),
812
+ breath: this.gl.getUniformLocation(this.program, 'u_breath')
796
813
  };
797
814
  }
798
815
 
@@ -1012,15 +1029,6 @@ void main() {
1012
1029
  this._renderParamsLogged = true;
1013
1030
  }
1014
1031
 
1015
- // Role-specific intensity for quantum effects
1016
- const roleIntensities = {
1017
- 'background': 0.4,
1018
- 'shadow': 0.6,
1019
- 'content': 1.0,
1020
- 'highlight': 1.3,
1021
- 'accent': 1.6
1022
- };
1023
-
1024
1032
  const time = Date.now() - this.startTime;
1025
1033
 
1026
1034
  // Set uniforms
@@ -1064,7 +1072,8 @@ void main() {
1064
1072
  this.gl.uniform1f(this.uniforms.rot4dZW, this.params.rot4dZW || 0.0);
1065
1073
  this.gl.uniform1f(this.uniforms.mouseIntensity, this.mouseIntensity);
1066
1074
  this.gl.uniform1f(this.uniforms.clickIntensity, this.clickIntensity);
1067
- this.gl.uniform1f(this.uniforms.roleIntensity, roleIntensities[this.role] || 1.0);
1075
+ this.gl.uniform1f(this.uniforms.roleIntensity, ROLE_INTENSITIES[this.role] || 1.0);
1076
+ this.gl.uniform1f(this.uniforms.breath, this.params.breath || 0.0);
1068
1077
 
1069
1078
  this.gl.drawArrays(this.gl.TRIANGLE_STRIP, 0, 4);
1070
1079
  }
@@ -23,10 +23,11 @@ export { ReactivityManager } from './ReactivityManager.js';
23
23
  /**
24
24
  * Create a pre-configured ReactivityManager with common settings
25
25
  */
26
- export function createReactivityManager(options = {}) {
26
+ export async function createReactivityManager(options = {}) {
27
27
  const { config, parameterUpdateFn } = options;
28
28
 
29
- const manager = new (await import('./ReactivityManager.js')).ReactivityManager(parameterUpdateFn);
29
+ const { ReactivityManager } = await import('./ReactivityManager.js');
30
+ const manager = new ReactivityManager(parameterUpdateFn);
30
31
 
31
32
  if (config) {
32
33
  manager.loadConfig(config);
@@ -39,7 +40,6 @@ export function createReactivityManager(options = {}) {
39
40
  * Create ReactivityConfig from a preset name
40
41
  */
41
42
  export function createPresetConfig(presetName) {
42
- const { ReactivityConfig } = require('./ReactivityConfig.js');
43
43
  const config = new ReactivityConfig();
44
44
 
45
45
  switch (presetName) {
@@ -89,5 +89,3 @@ export function createPresetConfig(presetName) {
89
89
 
90
90
  return config;
91
91
  }
92
-
93
- console.log('🎛️ VIB3+ Reactivity System loaded');