@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.
- package/CHANGELOG.md +36 -0
- package/DOCS/AGENT_HARNESS_ARCHITECTURE.md +245 -0
- package/DOCS/ANDROID_DEPLOYMENT.md +59 -0
- package/DOCS/ARCHITECTURE.md +1 -0
- package/DOCS/CI_TESTING.md +2 -0
- package/DOCS/CLI_ONBOARDING.md +3 -1
- package/DOCS/CONTROL_REFERENCE.md +2 -0
- package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +119 -0
- package/DOCS/ENV_SETUP.md +2 -0
- package/DOCS/EPIC_SCROLL_EVENTS.md +775 -0
- package/DOCS/EXPANSION_DESIGN.md +979 -0
- package/DOCS/EXPANSION_DESIGN_ULTRA.md +389 -0
- package/DOCS/EXPORT_FORMATS.md +2 -0
- package/DOCS/GPU_DISPOSAL_GUIDE.md +2 -0
- package/DOCS/HANDOFF_LANDING_PAGE.md +156 -0
- package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +495 -0
- package/DOCS/LICENSING_TIERS.md +2 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +4 -2
- package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +939 -0
- package/DOCS/OBS_SETUP_GUIDE.md +2 -0
- package/DOCS/OPTIMIZATION_PLAN_MATH.md +119 -0
- package/DOCS/PRODUCT_STRATEGY.md +65 -0
- package/DOCS/PROJECT_SETUP.md +2 -0
- package/DOCS/README.md +105 -0
- package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +99 -0
- package/DOCS/RENDERER_LIFECYCLE.md +2 -0
- package/DOCS/REPO_MANIFEST.md +2 -0
- package/DOCS/ROADMAP.md +113 -0
- package/DOCS/SCROLL_TIMELINE_v3.md +271 -0
- package/DOCS/SITE_REFACTOR_PLAN.md +102 -0
- package/DOCS/STATUS.md +26 -0
- package/DOCS/SYSTEM_INVENTORY.md +37 -32
- package/DOCS/TELEMETRY_EXPORTS.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +87 -0
- package/DOCS/VISUAL_ANALYSIS_FACETAD.md +135 -0
- package/DOCS/VISUAL_ANALYSIS_SIMONE.md +97 -0
- package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +88 -0
- package/DOCS/WEBGPU_STATUS.md +121 -38
- package/DOCS/XR_BENCHMARKS.md +2 -0
- package/DOCS/archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +1 -0
- package/DOCS/archive/DEV_TRACK_ANALYSIS.md +1 -0
- package/DOCS/archive/DEV_TRACK_PLAN_2026-01-07.md +1 -0
- package/DOCS/archive/SESSION_014_PLAN.md +1 -0
- package/DOCS/archive/SESSION_LOG_2026-01-07.md +1 -0
- package/DOCS/archive/STRATEGIC_BLUEPRINT_2026-01-07.md +1 -0
- package/DOCS/archive/SYSTEM_AUDIT_2026-01-30.md +1 -0
- package/DOCS/archive/WEBGPU_STATUS_2026-02-15_STALE.md +1 -0
- package/DOCS/{DEV_TRACK_SESSION_2026-01-31.md → dev-tracks/DEV_TRACK_SESSION_2026-01-31.md} +3 -1
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +233 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +129 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +144 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-16.md +110 -0
- package/DOCS/dev-tracks/PERF_UPGRADE_2026-02-16.md +310 -0
- package/DOCS/dev-tracks/README.md +12 -0
- package/README.md +26 -13
- package/cpp/CMakeLists.txt +236 -0
- package/cpp/bindings/embind.cpp +269 -0
- package/cpp/build.sh +129 -0
- package/cpp/geometry/Crystal.cpp +103 -0
- package/cpp/geometry/Fractal.cpp +136 -0
- package/cpp/geometry/GeometryGenerator.cpp +262 -0
- package/cpp/geometry/KleinBottle.cpp +71 -0
- package/cpp/geometry/Sphere.cpp +134 -0
- package/cpp/geometry/Tesseract.cpp +94 -0
- package/cpp/geometry/Tetrahedron.cpp +83 -0
- package/cpp/geometry/Torus.cpp +65 -0
- package/cpp/geometry/WarpFunctions.cpp +238 -0
- package/cpp/geometry/Wave.cpp +85 -0
- package/cpp/include/vib3_ffi.h +238 -0
- package/cpp/math/Mat4x4.cpp +409 -0
- package/cpp/math/Mat4x4.hpp +209 -0
- package/cpp/math/Projection.cpp +142 -0
- package/cpp/math/Projection.hpp +148 -0
- package/cpp/math/Rotor4D.cpp +322 -0
- package/cpp/math/Rotor4D.hpp +204 -0
- package/cpp/math/Vec4.cpp +303 -0
- package/cpp/math/Vec4.hpp +225 -0
- package/cpp/src/vib3_ffi.cpp +607 -0
- package/cpp/tests/Geometry_test.cpp +213 -0
- package/cpp/tests/Mat4x4_test.cpp +494 -0
- package/cpp/tests/Projection_test.cpp +298 -0
- package/cpp/tests/Rotor4D_test.cpp +423 -0
- package/cpp/tests/Vec4_test.cpp +489 -0
- package/docs/webgpu-live.html +1 -1
- package/package.json +41 -30
- package/src/agent/index.js +1 -3
- package/src/agent/mcp/MCPServer.js +1220 -144
- package/src/agent/mcp/index.js +1 -1
- package/src/agent/mcp/stdio-server.js +264 -0
- package/src/agent/mcp/tools.js +498 -31
- package/src/cli/index.js +431 -47
- package/src/core/CanvasManager.js +97 -204
- package/src/core/ErrorReporter.js +1 -1
- package/src/core/Parameters.js +1 -1
- package/src/core/VIB3Engine.js +93 -4
- package/src/core/VitalitySystem.js +53 -0
- package/src/core/index.js +18 -0
- package/src/core/renderers/FacetedRendererAdapter.js +10 -9
- package/src/core/renderers/HolographicRendererAdapter.js +13 -9
- package/src/core/renderers/QuantumRendererAdapter.js +11 -7
- package/src/creative/AestheticMapper.js +628 -0
- package/src/creative/ChoreographyPlayer.js +481 -0
- package/src/creative/index.js +11 -0
- package/src/experimental/GameLoop.js +72 -0
- package/src/experimental/LatticePhysics.js +100 -0
- package/src/experimental/LiveDirector.js +143 -0
- package/src/experimental/PlayerController4D.js +154 -0
- package/src/experimental/VIB3Actor.js +138 -0
- package/src/experimental/VIB3Compositor.js +117 -0
- package/src/experimental/VIB3Link.js +122 -0
- package/src/experimental/VIB3Orchestrator.js +146 -0
- package/src/experimental/VIB3Universe.js +109 -0
- package/src/experimental/demos/CrystalLabyrinth.js +202 -0
- package/src/export/TradingCardManager.js +3 -4
- package/src/export/index.js +11 -1
- package/src/faceted/FacetedSystem.js +260 -394
- package/src/games/glyph-war/GlyphWarVisualizer.js +641 -0
- package/src/geometry/generators/Crystal.js +2 -2
- package/src/geometry/warp/HypersphereCore.js +53 -24
- package/src/holograms/HolographicVisualizer.js +84 -98
- package/src/holograms/RealHolographicSystem.js +194 -43
- package/src/math/Mat4x4.js +308 -105
- package/src/math/Rotor4D.js +124 -40
- package/src/math/Vec4.js +200 -103
- package/src/math/index.js +7 -7
- package/src/polychora/PolychoraSystem.js +77 -0
- package/src/quantum/QuantumEngine.js +103 -66
- package/src/quantum/QuantumVisualizer.js +31 -22
- package/src/reactivity/index.js +3 -5
- package/src/render/LayerPresetManager.js +372 -0
- package/src/render/LayerReactivityBridge.js +344 -0
- package/src/render/LayerRelationshipGraph.js +610 -0
- package/src/render/MultiCanvasBridge.js +148 -25
- package/src/render/ShaderLoader.js +38 -0
- package/src/render/ShaderProgram.js +4 -4
- package/src/render/UnifiedRenderBridge.js +4 -1
- package/src/render/backends/WebGPUBackend.js +8 -4
- package/src/render/index.js +27 -2
- package/src/scene/Node4D.js +74 -24
- package/src/scene/index.js +4 -4
- package/src/shaders/common/geometry24.glsl +65 -0
- package/src/shaders/common/geometry24.wgsl +54 -0
- package/src/shaders/common/rotation4d.glsl +4 -4
- package/src/shaders/common/rotation4d.wgsl +2 -2
- package/src/shaders/common/uniforms.wgsl +15 -8
- package/src/shaders/faceted/faceted.frag.glsl +220 -80
- package/src/shaders/faceted/faceted.frag.wgsl +144 -90
- package/src/shaders/holographic/holographic.frag.glsl +28 -9
- package/src/shaders/holographic/holographic.frag.wgsl +112 -41
- package/src/shaders/quantum/quantum.frag.glsl +1 -0
- package/src/shaders/quantum/quantum.frag.wgsl +6 -4
- package/src/testing/ParallelTestFramework.js +2 -2
- package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +2 -2
- package/src/viewer/GalleryUI.js +17 -0
- package/src/viewer/ViewerPortal.js +2 -2
- package/src/viewer/index.js +1 -1
- package/tools/headless-renderer.js +258 -0
- package/tools/shader-sync-verify.js +14 -8
- package/tools/site-analysis/all-reports.json +32 -0
- package/tools/site-analysis/combined-analysis.md +50 -0
- package/tools/site-analyzer.mjs +779 -0
- package/tools/visual-catalog/capture.js +276 -0
- package/tools/visual-catalog/composite.js +138 -0
- package/types/adaptive-sdk.d.ts +204 -5
- package/types/agent/cli.d.ts +78 -0
- package/types/agent/index.d.ts +18 -0
- package/types/agent/mcp.d.ts +87 -0
- package/types/agent/telemetry.d.ts +190 -0
- package/types/core/VIB3Engine.d.ts +26 -0
- package/types/core/index.d.ts +261 -0
- package/types/creative/AestheticMapper.d.ts +72 -0
- package/types/creative/ChoreographyPlayer.d.ts +96 -0
- package/types/creative/index.d.ts +17 -0
- package/types/export/index.d.ts +243 -0
- package/types/geometry/index.d.ts +164 -0
- package/types/math/index.d.ts +214 -0
- package/types/render/LayerPresetManager.d.ts +78 -0
- package/types/render/LayerReactivityBridge.d.ts +85 -0
- package/types/render/LayerRelationshipGraph.d.ts +174 -0
- package/types/render/index.d.ts +3 -0
- package/types/scene/index.d.ts +204 -0
- package/types/systems/index.d.ts +244 -0
- package/types/variations/index.d.ts +62 -0
- package/types/viewer/index.d.ts +225 -0
- package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +0 -34
- package/DOCS/DEV_TRACK_ANALYSIS.md +0 -77
- package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +0 -42
- package/DOCS/SESSION_014_PLAN.md +0 -195
- package/DOCS/SESSION_LOG_2026-01-07.md +0 -56
- package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +0 -72
- package/DOCS/SYSTEM_AUDIT_2026-01-30.md +0 -738
- /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
|
-
|
|
352
|
-
|
|
353
|
-
|
|
354
|
-
|
|
355
|
-
|
|
356
|
-
|
|
357
|
-
|
|
358
|
-
|
|
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
|
-
|
|
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:
|
|
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:
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
557
|
+
// Quantum scroll morph updated
|
|
515
558
|
}
|
|
516
559
|
|
|
517
560
|
startQuantumEffectLoops() {
|
|
561
|
+
this._effectsLoopActive = true;
|
|
518
562
|
const quantumEffects = () => {
|
|
519
|
-
|
|
520
|
-
|
|
563
|
+
if (!this._effectsLoopActive) return;
|
|
564
|
+
|
|
521
565
|
// QUANTUM FLASH EFFECT (saturation + morph)
|
|
522
566
|
if (this.clickFlashIntensity > 0.01) {
|
|
523
|
-
|
|
524
|
-
|
|
525
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 ${
|
|
49
|
+
console.error(`WebGL not supported for ${this._canvasLabel}`);
|
|
38
50
|
if (window.mobileDebug) {
|
|
39
|
-
window.mobileDebug.log(`❌ ${
|
|
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(`✅ ${
|
|
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 ${
|
|
74
|
+
console.warn(`WebGL context lost for ${this._canvasLabel}`);
|
|
63
75
|
};
|
|
64
76
|
this._onContextRestored = () => {
|
|
65
|
-
console.log(`WebGL context restored for ${
|
|
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 ${
|
|
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
|
-
|
|
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
|
|
690
|
-
else if (u_roleIntensity
|
|
691
|
-
else if (u_roleIntensity
|
|
692
|
-
else if (u_roleIntensity
|
|
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,
|
|
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
|
}
|
package/src/reactivity/index.js
CHANGED
|
@@ -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
|
|
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');
|