@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
@@ -5,6 +5,7 @@
5
5
  */
6
6
  import { HolographicVisualizer } from './HolographicVisualizer.js';
7
7
  import { MultiCanvasBridge } from '../render/MultiCanvasBridge.js';
8
+ import { LayerRelationshipGraph } from '../render/LayerRelationshipGraph.js';
8
9
  import { shaderLoader } from '../render/ShaderLoader.js';
9
10
 
10
11
  export class RealHolographicSystem {
@@ -19,6 +20,11 @@ export class RealHolographicSystem {
19
20
  /** @type {HTMLCanvasElement|null} */
20
21
  this.canvasOverride = options.canvas || null;
21
22
 
23
+ // Multi-canvas override: { background, shadow, content, highlight, accent }
24
+ // Enables 5-layer mode without DOM ID lookup (for landing page / multi-instance)
25
+ /** @type {Object<string, HTMLCanvasElement>|null} */
26
+ this.canvasSet = options.canvases || null;
27
+
22
28
  // Bridge rendering state
23
29
  /** @type {MultiCanvasBridge|null} */
24
30
  this._multiCanvasBridge = null;
@@ -27,6 +33,12 @@ export class RealHolographicSystem {
27
33
  /** @type {number} time accumulator for bridge rendering (ms) */
28
34
  this._bridgeTime = 0;
29
35
 
36
+ // Layer relationship graph โ€” keystone-driven inter-layer parameter system
37
+ /** @type {LayerRelationshipGraph} */
38
+ this._layerGraph = new LayerRelationshipGraph({
39
+ profile: options.relationshipProfile || 'holographic'
40
+ });
41
+
30
42
  // Conditional reactivity: Use built-in only if ReactivityManager not active
31
43
  this.useBuiltInReactivity = !window.reactivityManager;
32
44
 
@@ -87,6 +99,39 @@ export class RealHolographicSystem {
87
99
  return;
88
100
  }
89
101
 
102
+ // Multi-canvas override: 5-layer mode with provided canvas elements
103
+ // Used by landing page adapters to create multiple independent 5-layer instances
104
+ if (this.canvasSet) {
105
+ const layerDefs = [
106
+ { key: 'background', role: 'background', reactivity: 0.5 },
107
+ { key: 'shadow', role: 'shadow', reactivity: 0.7 },
108
+ { key: 'content', role: 'content', reactivity: 0.9 },
109
+ { key: 'highlight', role: 'highlight', reactivity: 1.1 },
110
+ { key: 'accent', role: 'accent', reactivity: 1.5 },
111
+ ];
112
+
113
+ let successfulLayers = 0;
114
+ layerDefs.forEach(layer => {
115
+ const canvas = this.canvasSet[layer.key];
116
+ if (!canvas) return;
117
+ try {
118
+ const visualizer = new HolographicVisualizer(
119
+ canvas, layer.role, layer.reactivity, this.currentVariant
120
+ );
121
+ if (visualizer.gl) {
122
+ this.visualizers.push(visualizer);
123
+ successfulLayers++;
124
+ console.log(`โœ… Created holographic layer (canvasSet): ${layer.role}`);
125
+ }
126
+ } catch (error) {
127
+ console.warn(`Failed to create holographic layer ${layer.role}:`, error);
128
+ }
129
+ });
130
+
131
+ console.log(`โœ… Created ${successfulLayers} holographic visualizers via canvasSet`);
132
+ return;
133
+ }
134
+
90
135
  // Create the 5 visualizers using HOLO canvas IDs
91
136
  const layers = [
92
137
  { id: 'holo-background-canvas', role: 'background', reactivity: 0.5 },
@@ -182,7 +227,11 @@ export class RealHolographicSystem {
182
227
  if (Object.keys(canvasMap).length === 0) return null;
183
228
 
184
229
  const bridge = new MultiCanvasBridge();
185
- await bridge.initialize({ canvases: canvasMap, preferWebGPU: options.preferWebGPU !== false });
230
+ await bridge.initialize({
231
+ canvases: canvasMap,
232
+ preferWebGPU: options.preferWebGPU !== false,
233
+ relationshipGraph: this._layerGraph
234
+ });
186
235
 
187
236
  // Load external shader files, fall back to inline if unavailable
188
237
  let sources = {
@@ -331,48 +380,130 @@ export class RealHolographicSystem {
331
380
  }
332
381
 
333
382
  updateParameter(param, value) {
334
- // Store custom parameter overrides
383
+ // Store custom parameter overrides (keystone state)
335
384
  if (!this.customParams) {
336
385
  this.customParams = {};
337
386
  }
338
387
  this.customParams[param] = value;
339
-
340
- console.log(`๐ŸŒŒ Updating holographic ${param}: ${value} (${this.visualizers.length} visualizers)`);
341
-
342
- // CRITICAL FIX: Call updateParameters method on ALL visualizers for immediate render
388
+
389
+ // Build keystone params from current state + this update
390
+ const keystoneParams = { ...this._buildKeystoneParams(), [param]: value };
391
+
392
+ // Resolve all layers through the relationship graph
393
+ const resolved = this._layerGraph.resolveAll(keystoneParams, Date.now());
394
+
395
+ // Apply resolved params to each visualizer by role
343
396
  this.visualizers.forEach((visualizer, index) => {
397
+ const role = visualizer.role || 'content';
398
+ const layerParams = resolved[role] || keystoneParams;
399
+
344
400
  try {
345
401
  if (visualizer.updateParameters) {
346
- // Use new updateParameters method with proper parameter mapping
347
- const params = {};
348
- params[param] = value;
349
- visualizer.updateParameters(params);
350
- console.log(`โœ… Updated holographic layer ${index} (${visualizer.role}) with ${param}=${value}`);
351
- } else {
352
- console.warn(`โš ๏ธ Holographic layer ${index} missing updateParameters method, using fallback`);
353
- // Fallback for older method (direct parameter setting)
354
- if (visualizer.variantParams) {
355
- visualizer.variantParams[param] = value;
356
-
357
- // If it's a geometry type change, regenerate role params with new geometry
358
- if (param === 'geometryType') {
359
- visualizer.roleParams = visualizer.generateRoleParams(visualizer.role);
360
- }
361
-
362
- // Force manual render for older visualizers
363
- if (visualizer.render) {
364
- visualizer.render();
365
- }
402
+ visualizer.updateParameters(layerParams);
403
+ } else if (visualizer.variantParams) {
404
+ Object.assign(visualizer.variantParams, layerParams);
405
+ if (param === 'geometryType' || param === 'geometry') {
406
+ visualizer.roleParams = visualizer.generateRoleParams(role);
366
407
  }
367
408
  }
368
409
  } catch (error) {
369
- console.error(`โŒ Failed to update holographic layer ${index}:`, error);
410
+ console.error(`Failed to update holographic layer ${index} (${role}):`, error);
370
411
  }
371
412
  });
372
-
373
- console.log(`๐Ÿ”„ Holographic parameter update complete: ${param}=${value}`);
374
413
  }
375
-
414
+
415
+ /**
416
+ * Update multiple parameters at once (RendererContract / VIB3Engine compatible).
417
+ * Resolves all layers through the relationship graph in a single pass.
418
+ * @param {Object} params - Key-value pairs of parameters to update
419
+ */
420
+ updateParameters(params) {
421
+ if (!params || typeof params !== 'object') return;
422
+
423
+ // Merge into custom params (keystone state)
424
+ if (!this.customParams) {
425
+ this.customParams = {};
426
+ }
427
+ Object.assign(this.customParams, params);
428
+
429
+ // Build keystone params + resolve all layers in one shot
430
+ const keystoneParams = { ...this._buildKeystoneParams(), ...params };
431
+ const resolved = this._layerGraph.resolveAll(keystoneParams, Date.now());
432
+
433
+ this.visualizers.forEach((visualizer, index) => {
434
+ const role = visualizer.role || 'content';
435
+ const layerParams = resolved[role] || keystoneParams;
436
+
437
+ try {
438
+ if (visualizer.updateParameters) {
439
+ visualizer.updateParameters(layerParams);
440
+ } else if (visualizer.variantParams) {
441
+ Object.assign(visualizer.variantParams, layerParams);
442
+ }
443
+ } catch (error) {
444
+ console.error(`Failed to update holographic layer ${index} (${role}):`, error);
445
+ }
446
+ });
447
+ }
448
+
449
+ // ========================================================================
450
+ // Layer Relationship Graph API
451
+ // ========================================================================
452
+
453
+ /**
454
+ * Build keystone parameters from current state.
455
+ * These are the driver values that get transformed by the relationship
456
+ * graph to produce each dependent layer's parameters.
457
+ * @private
458
+ * @returns {Object}
459
+ */
460
+ _buildKeystoneParams() {
461
+ const base = {};
462
+ // Pull from first (content) visualizer's variant params if available
463
+ const content = this.visualizers.find(v => v.role === 'content');
464
+ if (content && content.variantParams) {
465
+ Object.assign(base, content.variantParams);
466
+ }
467
+ // Merge custom overrides
468
+ if (this.customParams) {
469
+ Object.assign(base, this.customParams);
470
+ }
471
+ return base;
472
+ }
473
+
474
+ /**
475
+ * Get the layer relationship graph for direct configuration.
476
+ * @returns {LayerRelationshipGraph}
477
+ */
478
+ get layerGraph() {
479
+ return this._layerGraph;
480
+ }
481
+
482
+ /**
483
+ * Load a relationship profile by name.
484
+ * @param {string} profileName - holographic, symmetry, chord, storm, legacy
485
+ */
486
+ loadRelationshipProfile(profileName) {
487
+ this._layerGraph.loadProfile(profileName);
488
+ }
489
+
490
+ /**
491
+ * Set the keystone (driver) layer.
492
+ * @param {string} layerName - background, shadow, content, highlight, or accent
493
+ */
494
+ setKeystone(layerName) {
495
+ this._layerGraph.setKeystone(layerName);
496
+ }
497
+
498
+ /**
499
+ * Set the relationship for a dependent layer.
500
+ * @param {string} layerName
501
+ * @param {string|Function|Object} relationship - Preset name, function, or { preset, config }
502
+ */
503
+ setLayerRelationship(layerName, relationship) {
504
+ this._layerGraph.setRelationship(layerName, relationship);
505
+ }
506
+
376
507
  // Override updateVariant to preserve custom parameters
377
508
  updateVariant(newVariant) {
378
509
  if (newVariant < 0) newVariant = this.totalVariants - 1;
@@ -431,7 +562,9 @@ export class RealHolographicSystem {
431
562
  Object.assign(params, this.customParams);
432
563
  }
433
564
 
434
- console.log('๐ŸŒŒ Holographic system getParameters:', params);
565
+ // Include layer relationship graph config for serialization
566
+ params.layerRelationship = this._layerGraph.exportConfig();
567
+
435
568
  return params;
436
569
  }
437
570
 
@@ -701,7 +834,7 @@ export class RealHolographicSystem {
701
834
  window.updateParameter('morphFactor', depthMorph.toFixed(2));
702
835
  }
703
836
 
704
- console.log(`โœจ Holographic shimmer: angle=(${angleX.toFixed(2)}, ${angleY.toFixed(2)}) โ†’ Hue=${Math.round(shimmerHue)}, Intensity=${shimmerIntensity.toFixed(2)}`);
837
+ // Holographic shimmer updated
705
838
  }
706
839
 
707
840
  triggerHolographicColorBurst(x, y) {
@@ -723,11 +856,13 @@ export class RealHolographicSystem {
723
856
  this.burstChaosEffect = 0.6; // Chaos/morph burst effect
724
857
  this.burstSpeedBoost = 1.8; // Animation speed burst
725
858
 
726
- console.log(`๐ŸŒˆ๐Ÿ’ฅ HOLOGRAPHIC COLOR BURST: position=(${x.toFixed(2)}, ${y.toFixed(2)}), distance=${distanceFromCenter.toFixed(3)}`);
859
+ // Holographic color burst triggered
727
860
  }
728
-
861
+
729
862
  startHolographicColorBurstLoop() {
863
+ this._burstLoopActive = true;
730
864
  const burstAnimation = () => {
865
+ if (!this._burstLoopActive) return;
731
866
  // DRAMATIC HOLOGRAPHIC COLOR BURST ANIMATION (like Quantum's multi-parameter effects)
732
867
  let hasActiveEffects = false;
733
868
 
@@ -797,16 +932,16 @@ export class RealHolographicSystem {
797
932
  this.colorBurstIntensity *= 0.94;
798
933
  }
799
934
 
800
- if (this.isActive) {
801
- requestAnimationFrame(burstAnimation);
802
- }
935
+ this._burstRafId = requestAnimationFrame(burstAnimation);
803
936
  };
804
-
805
- burstAnimation();
937
+
938
+ this._burstRafId = requestAnimationFrame(burstAnimation);
806
939
  }
807
940
 
808
941
  startRenderLoop() {
942
+ this._renderLoopActive = true;
809
943
  const render = () => {
944
+ if (!this._renderLoopActive) return;
810
945
  if (this.isActive) {
811
946
  // Update audio reactivity
812
947
  this.updateAudio();
@@ -821,11 +956,11 @@ export class RealHolographicSystem {
821
956
  }
822
957
  }
823
958
 
824
- requestAnimationFrame(render);
959
+ this._renderRafId = requestAnimationFrame(render);
825
960
  };
826
961
 
827
- render();
828
- console.log(`๐ŸŽฌ REAL Holographic render loop started (${this._renderMode} mode)`);
962
+ this._renderRafId = requestAnimationFrame(render);
963
+ console.log(`REAL Holographic render loop started (${this._renderMode} mode)`);
829
964
  }
830
965
 
831
966
  getVariantName(variant = this.currentVariant) {
@@ -833,6 +968,22 @@ export class RealHolographicSystem {
833
968
  }
834
969
 
835
970
  destroy() {
971
+ this.isActive = false;
972
+
973
+ // Cancel render loop
974
+ this._renderLoopActive = false;
975
+ if (this._renderRafId) {
976
+ cancelAnimationFrame(this._renderRafId);
977
+ this._renderRafId = null;
978
+ }
979
+
980
+ // Cancel burst effect loop
981
+ this._burstLoopActive = false;
982
+ if (this._burstRafId) {
983
+ cancelAnimationFrame(this._burstRafId);
984
+ this._burstRafId = null;
985
+ }
986
+
836
987
  // Dispose bridge if active
837
988
  if (this._multiCanvasBridge) {
838
989
  this._multiCanvasBridge.dispose();
@@ -851,7 +1002,7 @@ export class RealHolographicSystem {
851
1002
  this.audioContext.close();
852
1003
  }
853
1004
 
854
- console.log('๐Ÿงน REAL Holographic System destroyed');
1005
+ console.log('REAL Holographic System destroyed');
855
1006
  }
856
1007
 
857
1008
  // ============================================