@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
|
@@ -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({
|
|
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
|
-
|
|
341
|
-
|
|
342
|
-
|
|
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
|
-
|
|
347
|
-
|
|
348
|
-
|
|
349
|
-
|
|
350
|
-
|
|
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(
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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(
|
|
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('
|
|
1005
|
+
console.log('REAL Holographic System destroyed');
|
|
855
1006
|
}
|
|
856
1007
|
|
|
857
1008
|
// ============================================
|