@vib3code/sdk 2.0.1

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 (258) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
  3. package/DOCS/CI_TESTING.md +38 -0
  4. package/DOCS/CLI_ONBOARDING.md +75 -0
  5. package/DOCS/CONTROL_REFERENCE.md +64 -0
  6. package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
  7. package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
  8. package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
  9. package/DOCS/ENV_SETUP.md +189 -0
  10. package/DOCS/EXPORT_FORMATS.md +417 -0
  11. package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
  12. package/DOCS/LICENSING_TIERS.md +275 -0
  13. package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
  14. package/DOCS/OBS_SETUP_GUIDE.md +98 -0
  15. package/DOCS/PROJECT_SETUP.md +66 -0
  16. package/DOCS/RENDERER_LIFECYCLE.md +40 -0
  17. package/DOCS/REPO_MANIFEST.md +121 -0
  18. package/DOCS/SESSION_014_PLAN.md +195 -0
  19. package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
  20. package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
  21. package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
  22. package/DOCS/SYSTEM_INVENTORY.md +520 -0
  23. package/DOCS/TELEMETRY_EXPORTS.md +34 -0
  24. package/DOCS/WEBGPU_STATUS.md +38 -0
  25. package/DOCS/XR_BENCHMARKS.md +608 -0
  26. package/LICENSE +21 -0
  27. package/README.md +426 -0
  28. package/docs/.nojekyll +0 -0
  29. package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
  30. package/docs/02-hyperspatial_ego_death.html +346 -0
  31. package/docs/03-post_cartesian_sublime.html +346 -0
  32. package/docs/04-crystalline_void_meditation.html +346 -0
  33. package/docs/05-quantum_decoherence_ballet.html +346 -0
  34. package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
  35. package/docs/07-hyperspatial_ego_death.html +346 -0
  36. package/docs/08-post_cartesian_sublime.html +346 -0
  37. package/docs/09-crystalline_void_meditation.html +346 -0
  38. package/docs/10-quantum_decoherence_ballet.html +346 -0
  39. package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
  40. package/docs/12-hyperspatial_ego_death.html +346 -0
  41. package/docs/13-post_cartesian_sublime.html +346 -0
  42. package/docs/index.html +794 -0
  43. package/docs/test-hub.html +441 -0
  44. package/docs/url-state.js +102 -0
  45. package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
  46. package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
  47. package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
  48. package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
  49. package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
  50. package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
  51. package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
  52. package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
  53. package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
  54. package/docs/vib3-exports/index.html +238 -0
  55. package/docs/webgpu-live.html +702 -0
  56. package/package.json +367 -0
  57. package/src/advanced/AIPresetGenerator.js +777 -0
  58. package/src/advanced/MIDIController.js +703 -0
  59. package/src/advanced/OffscreenWorker.js +1051 -0
  60. package/src/advanced/WebGPUCompute.js +1051 -0
  61. package/src/advanced/WebXRRenderer.js +680 -0
  62. package/src/agent/cli/AgentCLI.js +615 -0
  63. package/src/agent/cli/index.js +14 -0
  64. package/src/agent/index.js +73 -0
  65. package/src/agent/mcp/MCPServer.js +950 -0
  66. package/src/agent/mcp/index.js +9 -0
  67. package/src/agent/mcp/tools.js +548 -0
  68. package/src/agent/telemetry/EventStream.js +669 -0
  69. package/src/agent/telemetry/Instrumentation.js +618 -0
  70. package/src/agent/telemetry/TelemetryExporters.js +427 -0
  71. package/src/agent/telemetry/TelemetryService.js +464 -0
  72. package/src/agent/telemetry/index.js +52 -0
  73. package/src/benchmarks/BenchmarkRunner.js +381 -0
  74. package/src/benchmarks/MetricsCollector.js +299 -0
  75. package/src/benchmarks/index.js +9 -0
  76. package/src/benchmarks/scenes.js +259 -0
  77. package/src/cli/index.js +675 -0
  78. package/src/config/ApiConfig.js +88 -0
  79. package/src/core/CanvasManager.js +217 -0
  80. package/src/core/ErrorReporter.js +117 -0
  81. package/src/core/ParameterMapper.js +333 -0
  82. package/src/core/Parameters.js +396 -0
  83. package/src/core/RendererContracts.js +200 -0
  84. package/src/core/UnifiedResourceManager.js +370 -0
  85. package/src/core/VIB3Engine.js +636 -0
  86. package/src/core/renderers/FacetedRendererAdapter.js +32 -0
  87. package/src/core/renderers/HolographicRendererAdapter.js +29 -0
  88. package/src/core/renderers/QuantumRendererAdapter.js +29 -0
  89. package/src/core/renderers/RendererLifecycleManager.js +63 -0
  90. package/src/creative/ColorPresetsSystem.js +980 -0
  91. package/src/creative/ParameterTimeline.js +1061 -0
  92. package/src/creative/PostProcessingPipeline.js +1113 -0
  93. package/src/creative/TransitionAnimator.js +683 -0
  94. package/src/export/CSSExporter.js +226 -0
  95. package/src/export/CardGeneratorBase.js +279 -0
  96. package/src/export/ExportManager.js +580 -0
  97. package/src/export/FacetedCardGenerator.js +279 -0
  98. package/src/export/HolographicCardGenerator.js +543 -0
  99. package/src/export/LottieExporter.js +552 -0
  100. package/src/export/QuantumCardGenerator.js +315 -0
  101. package/src/export/SVGExporter.js +519 -0
  102. package/src/export/ShaderExporter.js +903 -0
  103. package/src/export/TradingCardGenerator.js +3055 -0
  104. package/src/export/TradingCardManager.js +181 -0
  105. package/src/export/VIB3PackageExporter.js +559 -0
  106. package/src/export/index.js +14 -0
  107. package/src/export/systems/TradingCardSystemFaceted.js +494 -0
  108. package/src/export/systems/TradingCardSystemHolographic.js +452 -0
  109. package/src/export/systems/TradingCardSystemQuantum.js +411 -0
  110. package/src/faceted/FacetedSystem.js +963 -0
  111. package/src/features/CollectionManager.js +433 -0
  112. package/src/gallery/CollectionManager.js +240 -0
  113. package/src/gallery/GallerySystem.js +485 -0
  114. package/src/geometry/GeometryFactory.js +314 -0
  115. package/src/geometry/GeometryLibrary.js +72 -0
  116. package/src/geometry/buffers/BufferBuilder.js +338 -0
  117. package/src/geometry/buffers/index.js +18 -0
  118. package/src/geometry/generators/Crystal.js +420 -0
  119. package/src/geometry/generators/Fractal.js +298 -0
  120. package/src/geometry/generators/KleinBottle.js +197 -0
  121. package/src/geometry/generators/Sphere.js +192 -0
  122. package/src/geometry/generators/Tesseract.js +160 -0
  123. package/src/geometry/generators/Tetrahedron.js +225 -0
  124. package/src/geometry/generators/Torus.js +304 -0
  125. package/src/geometry/generators/Wave.js +341 -0
  126. package/src/geometry/index.js +142 -0
  127. package/src/geometry/warp/HypersphereCore.js +211 -0
  128. package/src/geometry/warp/HypertetraCore.js +386 -0
  129. package/src/geometry/warp/index.js +57 -0
  130. package/src/holograms/HolographicVisualizer.js +1073 -0
  131. package/src/holograms/RealHolographicSystem.js +966 -0
  132. package/src/holograms/variantRegistry.js +69 -0
  133. package/src/integrations/FigmaPlugin.js +854 -0
  134. package/src/integrations/OBSMode.js +754 -0
  135. package/src/integrations/ThreeJsPackage.js +660 -0
  136. package/src/integrations/TouchDesignerExport.js +552 -0
  137. package/src/integrations/frameworks/Vib3React.js +591 -0
  138. package/src/integrations/frameworks/Vib3Svelte.js +654 -0
  139. package/src/integrations/frameworks/Vib3Vue.js +628 -0
  140. package/src/llm/LLMParameterInterface.js +240 -0
  141. package/src/llm/LLMParameterUI.js +577 -0
  142. package/src/math/Mat4x4.js +708 -0
  143. package/src/math/Projection.js +341 -0
  144. package/src/math/Rotor4D.js +637 -0
  145. package/src/math/Vec4.js +476 -0
  146. package/src/math/constants.js +164 -0
  147. package/src/math/index.js +68 -0
  148. package/src/math/projections.js +54 -0
  149. package/src/math/rotations.js +196 -0
  150. package/src/quantum/QuantumEngine.js +906 -0
  151. package/src/quantum/QuantumVisualizer.js +1103 -0
  152. package/src/reactivity/ReactivityConfig.js +499 -0
  153. package/src/reactivity/ReactivityManager.js +586 -0
  154. package/src/reactivity/SpatialInputSystem.js +1783 -0
  155. package/src/reactivity/index.js +93 -0
  156. package/src/render/CommandBuffer.js +465 -0
  157. package/src/render/MultiCanvasBridge.js +340 -0
  158. package/src/render/RenderCommand.js +514 -0
  159. package/src/render/RenderResourceRegistry.js +523 -0
  160. package/src/render/RenderState.js +552 -0
  161. package/src/render/RenderTarget.js +512 -0
  162. package/src/render/ShaderLoader.js +253 -0
  163. package/src/render/ShaderProgram.js +599 -0
  164. package/src/render/UnifiedRenderBridge.js +496 -0
  165. package/src/render/backends/WebGLBackend.js +1108 -0
  166. package/src/render/backends/WebGPUBackend.js +1409 -0
  167. package/src/render/commands/CommandBufferExecutor.js +607 -0
  168. package/src/render/commands/RenderCommandBuffer.js +661 -0
  169. package/src/render/commands/index.js +17 -0
  170. package/src/render/index.js +367 -0
  171. package/src/scene/Disposable.js +498 -0
  172. package/src/scene/MemoryPool.js +618 -0
  173. package/src/scene/Node4D.js +697 -0
  174. package/src/scene/ResourceManager.js +599 -0
  175. package/src/scene/Scene4D.js +540 -0
  176. package/src/scene/index.js +98 -0
  177. package/src/schemas/error.schema.json +84 -0
  178. package/src/schemas/extension.schema.json +88 -0
  179. package/src/schemas/index.js +214 -0
  180. package/src/schemas/parameters.schema.json +142 -0
  181. package/src/schemas/tool-pack.schema.json +44 -0
  182. package/src/schemas/tool-response.schema.json +127 -0
  183. package/src/shaders/common/fullscreen.vert.glsl +5 -0
  184. package/src/shaders/common/fullscreen.vert.wgsl +17 -0
  185. package/src/shaders/common/geometry24.glsl +65 -0
  186. package/src/shaders/common/geometry24.wgsl +54 -0
  187. package/src/shaders/common/rotation4d.glsl +85 -0
  188. package/src/shaders/common/rotation4d.wgsl +86 -0
  189. package/src/shaders/common/uniforms.glsl +44 -0
  190. package/src/shaders/common/uniforms.wgsl +48 -0
  191. package/src/shaders/faceted/faceted.frag.glsl +129 -0
  192. package/src/shaders/faceted/faceted.frag.wgsl +164 -0
  193. package/src/shaders/holographic/holographic.frag.glsl +406 -0
  194. package/src/shaders/holographic/holographic.frag.wgsl +185 -0
  195. package/src/shaders/quantum/quantum.frag.glsl +513 -0
  196. package/src/shaders/quantum/quantum.frag.wgsl +361 -0
  197. package/src/testing/ParallelTestFramework.js +519 -0
  198. package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
  199. package/src/testing/exportFormats.test.js +8 -0
  200. package/src/testing/projections.test.js +14 -0
  201. package/src/testing/rotations.test.js +37 -0
  202. package/src/ui/InteractivityMenu.js +516 -0
  203. package/src/ui/StatusManager.js +96 -0
  204. package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
  205. package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
  206. package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
  207. package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
  208. package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
  209. package/src/variations/VariationManager.js +431 -0
  210. package/src/viewer/AudioReactivity.js +505 -0
  211. package/src/viewer/CardBending.js +481 -0
  212. package/src/viewer/GalleryUI.js +832 -0
  213. package/src/viewer/ReactivityManager.js +590 -0
  214. package/src/viewer/TradingCardExporter.js +600 -0
  215. package/src/viewer/ViewerPortal.js +374 -0
  216. package/src/viewer/index.js +12 -0
  217. package/src/wasm/WasmLoader.js +296 -0
  218. package/src/wasm/index.js +132 -0
  219. package/tools/agentic/mcpTools.js +88 -0
  220. package/tools/cli/agent-cli.js +92 -0
  221. package/tools/export/formats.js +24 -0
  222. package/tools/math/rotation-baseline.mjs +64 -0
  223. package/tools/shader-sync-verify.js +937 -0
  224. package/tools/telemetry/manifestPipeline.js +141 -0
  225. package/tools/telemetry/telemetryEvents.js +35 -0
  226. package/types/adaptive-sdk.d.ts +185 -0
  227. package/types/advanced/AIPresetGenerator.d.ts +81 -0
  228. package/types/advanced/MIDIController.d.ts +100 -0
  229. package/types/advanced/OffscreenWorker.d.ts +82 -0
  230. package/types/advanced/WebGPUCompute.d.ts +52 -0
  231. package/types/advanced/WebXRRenderer.d.ts +77 -0
  232. package/types/advanced/index.d.ts +46 -0
  233. package/types/core/ErrorReporter.d.ts +50 -0
  234. package/types/core/VIB3Engine.d.ts +204 -0
  235. package/types/creative/ColorPresetsSystem.d.ts +91 -0
  236. package/types/creative/ParameterTimeline.d.ts +74 -0
  237. package/types/creative/PostProcessingPipeline.d.ts +109 -0
  238. package/types/creative/TransitionAnimator.d.ts +71 -0
  239. package/types/creative/index.d.ts +35 -0
  240. package/types/integrations/FigmaPlugin.d.ts +46 -0
  241. package/types/integrations/OBSMode.d.ts +74 -0
  242. package/types/integrations/ThreeJsPackage.d.ts +62 -0
  243. package/types/integrations/TouchDesignerExport.d.ts +36 -0
  244. package/types/integrations/Vib3React.d.ts +74 -0
  245. package/types/integrations/Vib3Svelte.d.ts +63 -0
  246. package/types/integrations/Vib3Vue.d.ts +55 -0
  247. package/types/integrations/index.d.ts +52 -0
  248. package/types/reactivity/SpatialInputSystem.d.ts +173 -0
  249. package/types/reactivity/index.d.ts +394 -0
  250. package/types/render/CommandBuffer.d.ts +169 -0
  251. package/types/render/RenderCommand.d.ts +312 -0
  252. package/types/render/RenderState.d.ts +279 -0
  253. package/types/render/RenderTarget.d.ts +254 -0
  254. package/types/render/ShaderProgram.d.ts +277 -0
  255. package/types/render/UnifiedRenderBridge.d.ts +143 -0
  256. package/types/render/WebGLBackend.d.ts +168 -0
  257. package/types/render/WebGPUBackend.d.ts +186 -0
  258. package/types/render/index.d.ts +141 -0
@@ -0,0 +1,340 @@
1
+ /**
2
+ * MultiCanvasBridge - Multi-canvas rendering orchestrator for VIB3+
3
+ *
4
+ * The Quantum and Holographic visualization systems use a 5-layer canvas
5
+ * architecture (background, shadow, content, highlight, accent) where each
6
+ * layer has its own WebGL/WebGPU context. This bridge manages multiple
7
+ * UnifiedRenderBridge instances — one per canvas — and coordinates shader
8
+ * compilation, uniform updates, and rendering across all layers.
9
+ *
10
+ * Usage:
11
+ * const multi = new MultiCanvasBridge();
12
+ * await multi.initialize({
13
+ * canvases: {
14
+ * background: document.getElementById('bg-canvas'),
15
+ * shadow: document.getElementById('shadow-canvas'),
16
+ * content: document.getElementById('content-canvas'),
17
+ * highlight: document.getElementById('highlight-canvas'),
18
+ * accent: document.getElementById('accent-canvas'),
19
+ * },
20
+ * preferWebGPU: true
21
+ * });
22
+ *
23
+ * multi.compileShaderAll('holographic', shaderSources);
24
+ * multi.setSharedUniforms({ u_time: t, u_resolution: [w, h] });
25
+ * multi.setLayerUniforms('background', { u_layerOpacity: 0.2, u_densityMult: 0.4 });
26
+ * multi.renderAll('holographic');
27
+ */
28
+
29
+ import { UnifiedRenderBridge } from './UnifiedRenderBridge.js';
30
+
31
+ /**
32
+ * Default layer configuration matching the VIB3+ holographic system.
33
+ * Each layer has role-specific opacity, density, and speed multipliers.
34
+ */
35
+ const DEFAULT_LAYER_CONFIG = {
36
+ background: { layerScale: 1.0, layerOpacity: 0.2, densityMult: 0.4, speedMult: 0.2 },
37
+ shadow: { layerScale: 1.0, layerOpacity: 0.4, densityMult: 0.8, speedMult: 0.3 },
38
+ content: { layerScale: 1.0, layerOpacity: 0.8, densityMult: 1.0, speedMult: 0.5 },
39
+ highlight: { layerScale: 1.0, layerOpacity: 0.6, densityMult: 1.5, speedMult: 0.8 },
40
+ accent: { layerScale: 1.0, layerOpacity: 0.3, densityMult: 2.5, speedMult: 0.4 }
41
+ };
42
+
43
+ /**
44
+ * Standard layer order (back to front).
45
+ */
46
+ const LAYER_ORDER = ['background', 'shadow', 'content', 'highlight', 'accent'];
47
+
48
+ export class MultiCanvasBridge {
49
+ constructor() {
50
+ /** @type {Map<string, UnifiedRenderBridge>} layer name → bridge */
51
+ this._bridges = new Map();
52
+
53
+ /** @type {Map<string, HTMLCanvasElement>} layer name → canvas */
54
+ this._canvases = new Map();
55
+
56
+ /** @type {object} Shared uniforms applied to all layers */
57
+ this._sharedUniforms = {};
58
+
59
+ /** @type {Map<string, object>} Per-layer uniform overrides */
60
+ this._layerUniforms = new Map();
61
+
62
+ /** @type {Map<string, object>} Per-layer config (opacity, density, speed) */
63
+ this._layerConfig = new Map();
64
+
65
+ /** @type {boolean} */
66
+ this._initialized = false;
67
+
68
+ /** @type {string|null} Active backend type (set after init) */
69
+ this._backendType = null;
70
+ }
71
+
72
+ /**
73
+ * Initialize bridges for all canvases.
74
+ *
75
+ * @param {object} options
76
+ * @param {object} options.canvases - Map of layer name → HTMLCanvasElement
77
+ * @param {boolean} [options.preferWebGPU=true] - Try WebGPU for each canvas
78
+ * @param {boolean} [options.debug=false]
79
+ * @param {object} [options.layerConfig] - Override default layer configuration
80
+ * @returns {Promise<void>}
81
+ */
82
+ async initialize(options) {
83
+ const {
84
+ canvases,
85
+ preferWebGPU = true,
86
+ debug = false,
87
+ layerConfig = {}
88
+ } = options;
89
+
90
+ // Initialize bridges in parallel
91
+ const entries = Object.entries(canvases);
92
+ const results = await Promise.allSettled(
93
+ entries.map(async ([layerName, canvas]) => {
94
+ const bridge = await UnifiedRenderBridge.create(canvas, { preferWebGPU, debug });
95
+ return { layerName, canvas, bridge };
96
+ })
97
+ );
98
+
99
+ for (const result of results) {
100
+ if (result.status === 'fulfilled') {
101
+ const { layerName, canvas, bridge } = result.value;
102
+ this._bridges.set(layerName, bridge);
103
+ this._canvases.set(layerName, canvas);
104
+
105
+ // Apply layer config (user override > default)
106
+ const config = {
107
+ ...(DEFAULT_LAYER_CONFIG[layerName] || {}),
108
+ ...(layerConfig[layerName] || {})
109
+ };
110
+ this._layerConfig.set(layerName, config);
111
+ this._layerUniforms.set(layerName, {});
112
+
113
+ if (!this._backendType) {
114
+ this._backendType = bridge.getBackendType();
115
+ }
116
+ } else {
117
+ console.error(`MultiCanvasBridge: Failed to init layer "${result.reason}"`);
118
+ }
119
+ }
120
+
121
+ this._initialized = this._bridges.size > 0;
122
+ if (debug) {
123
+ console.log(`MultiCanvasBridge: ${this._bridges.size}/${entries.length} layers initialized (${this._backendType})`);
124
+ }
125
+ }
126
+
127
+ /**
128
+ * Check if the bridge is initialized.
129
+ * @returns {boolean}
130
+ */
131
+ get initialized() {
132
+ return this._initialized;
133
+ }
134
+
135
+ /**
136
+ * Get the active backend type.
137
+ * @returns {string|null}
138
+ */
139
+ get backendType() {
140
+ return this._backendType;
141
+ }
142
+
143
+ /**
144
+ * Get layer names in render order.
145
+ * @returns {string[]}
146
+ */
147
+ get layerNames() {
148
+ return LAYER_ORDER.filter(name => this._bridges.has(name));
149
+ }
150
+
151
+ /**
152
+ * Get the bridge for a specific layer.
153
+ * @param {string} layerName
154
+ * @returns {UnifiedRenderBridge|undefined}
155
+ */
156
+ getBridge(layerName) {
157
+ return this._bridges.get(layerName);
158
+ }
159
+
160
+ // ========================================================================
161
+ // Shader Compilation
162
+ // ========================================================================
163
+
164
+ /**
165
+ * Compile shaders on all layer bridges.
166
+ *
167
+ * @param {string} shaderName - e.g. 'holographic'
168
+ * @param {object} sources - { glslVertex, glslFragment, wgslFragment }
169
+ * @returns {{ succeeded: string[], failed: string[] }}
170
+ */
171
+ compileShaderAll(shaderName, sources) {
172
+ const succeeded = [];
173
+ const failed = [];
174
+
175
+ for (const [layerName, bridge] of this._bridges) {
176
+ const ok = bridge.compileShader(shaderName, sources);
177
+ if (ok) {
178
+ succeeded.push(layerName);
179
+ } else {
180
+ failed.push(layerName);
181
+ }
182
+ }
183
+
184
+ return { succeeded, failed };
185
+ }
186
+
187
+ /**
188
+ * Compile a shader on a single layer.
189
+ *
190
+ * @param {string} layerName
191
+ * @param {string} shaderName
192
+ * @param {object} sources
193
+ * @returns {boolean}
194
+ */
195
+ compileShader(layerName, shaderName, sources) {
196
+ const bridge = this._bridges.get(layerName);
197
+ if (!bridge) return false;
198
+ return bridge.compileShader(shaderName, sources);
199
+ }
200
+
201
+ // ========================================================================
202
+ // Uniform Management
203
+ // ========================================================================
204
+
205
+ /**
206
+ * Set uniforms shared across all layers (e.g. time, resolution, geometry).
207
+ *
208
+ * @param {object} uniforms
209
+ */
210
+ setSharedUniforms(uniforms) {
211
+ this._sharedUniforms = uniforms;
212
+ }
213
+
214
+ /**
215
+ * Set per-layer uniform overrides (e.g. layerOpacity, densityMult).
216
+ *
217
+ * @param {string} layerName
218
+ * @param {object} uniforms
219
+ */
220
+ setLayerUniforms(layerName, uniforms) {
221
+ const existing = this._layerUniforms.get(layerName) || {};
222
+ this._layerUniforms.set(layerName, { ...existing, ...uniforms });
223
+ }
224
+
225
+ /**
226
+ * Update the layer configuration.
227
+ *
228
+ * @param {string} layerName
229
+ * @param {object} config - Partial config update
230
+ */
231
+ setLayerConfig(layerName, config) {
232
+ const existing = this._layerConfig.get(layerName) || {};
233
+ this._layerConfig.set(layerName, { ...existing, ...config });
234
+ }
235
+
236
+ /**
237
+ * Build the merged uniform set for a specific layer.
238
+ *
239
+ * Priority: shared < layer config < layer overrides
240
+ *
241
+ * @param {string} layerName
242
+ * @returns {object}
243
+ */
244
+ _buildLayerUniforms(layerName) {
245
+ const config = this._layerConfig.get(layerName) || {};
246
+ const overrides = this._layerUniforms.get(layerName) || {};
247
+
248
+ return {
249
+ ...this._sharedUniforms,
250
+ u_layerScale: config.layerScale || 1.0,
251
+ u_layerOpacity: config.layerOpacity || 1.0,
252
+ u_densityMult: config.densityMult || 1.0,
253
+ u_speedMult: config.speedMult || 1.0,
254
+ ...overrides
255
+ };
256
+ }
257
+
258
+ // ========================================================================
259
+ // Rendering
260
+ // ========================================================================
261
+
262
+ /**
263
+ * Render all layers in order using the named shader.
264
+ *
265
+ * @param {string} shaderName - Shader program to use
266
+ * @param {object} [options]
267
+ * @param {number[]} [options.clearColor] - RGBA clear color
268
+ */
269
+ renderAll(shaderName, options = {}) {
270
+ for (const layerName of this.layerNames) {
271
+ this.renderLayer(layerName, shaderName, options);
272
+ }
273
+ }
274
+
275
+ /**
276
+ * Render a single layer.
277
+ *
278
+ * @param {string} layerName
279
+ * @param {string} shaderName
280
+ * @param {object} [options]
281
+ */
282
+ renderLayer(layerName, shaderName, options = {}) {
283
+ const bridge = this._bridges.get(layerName);
284
+ if (!bridge) return;
285
+
286
+ const uniforms = this._buildLayerUniforms(layerName);
287
+ bridge.setUniforms(uniforms);
288
+ bridge.render(shaderName, {
289
+ clearColor: options.clearColor || [0, 0, 0, 0],
290
+ clear: true
291
+ });
292
+ }
293
+
294
+ // ========================================================================
295
+ // Canvas Management
296
+ // ========================================================================
297
+
298
+ /**
299
+ * Resize all canvases.
300
+ *
301
+ * @param {number} width - CSS width
302
+ * @param {number} height - CSS height
303
+ * @param {number} [pixelRatio=1]
304
+ */
305
+ resizeAll(width, height, pixelRatio = 1) {
306
+ for (const [, bridge] of this._bridges) {
307
+ bridge.resize(width, height, pixelRatio);
308
+ }
309
+ }
310
+
311
+ /**
312
+ * Get the number of active layers.
313
+ * @returns {number}
314
+ */
315
+ get layerCount() {
316
+ return this._bridges.size;
317
+ }
318
+
319
+ // ========================================================================
320
+ // Cleanup
321
+ // ========================================================================
322
+
323
+ /**
324
+ * Dispose all bridges and clear state.
325
+ */
326
+ dispose() {
327
+ for (const [, bridge] of this._bridges) {
328
+ bridge.dispose();
329
+ }
330
+ this._bridges.clear();
331
+ this._canvases.clear();
332
+ this._layerUniforms.clear();
333
+ this._layerConfig.clear();
334
+ this._sharedUniforms = {};
335
+ this._initialized = false;
336
+ this._backendType = null;
337
+ }
338
+ }
339
+
340
+ export default MultiCanvasBridge;