@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,253 @@
1
+ /**
2
+ * ShaderLoader - Fetch, cache, and manage external shader files for VIB3+
3
+ *
4
+ * Loads .glsl and .wgsl shader files from src/shaders/ and provides them
5
+ * to visualization systems via the UnifiedRenderBridge.
6
+ *
7
+ * Features:
8
+ * - Async fetch with in-memory caching
9
+ * - Parallel loading of GLSL + WGSL pairs
10
+ * - Base path configuration for deployment flexibility
11
+ * - Error reporting per shader file
12
+ *
13
+ * Usage:
14
+ * const loader = new ShaderLoader({ basePath: 'src/shaders' });
15
+ * const sources = await loader.loadShaderPair('faceted', 'faceted/faceted.frag');
16
+ * // sources = { glslVertex, glslFragment, wgslFragment }
17
+ * bridge.compileShader('faceted', sources);
18
+ */
19
+
20
+ /**
21
+ * Default base path relative to the HTML entry point.
22
+ * Override via constructor options if shaders are served from a different location.
23
+ */
24
+ const DEFAULT_BASE_PATH = 'src/shaders';
25
+
26
+ /**
27
+ * Default vertex shader source used when no external vertex file is provided.
28
+ * Simple fullscreen quad via attribute positions.
29
+ */
30
+ const FALLBACK_VERTEX_GLSL = `
31
+ attribute vec2 a_position;
32
+ void main() {
33
+ gl_Position = vec4(a_position, 0.0, 1.0);
34
+ }
35
+ `;
36
+
37
+ /**
38
+ * Default WGSL vertex shader - oversized triangle technique (no vertex buffer).
39
+ */
40
+ const FALLBACK_VERTEX_WGSL = `
41
+ struct VertexOutput {
42
+ @builtin(position) position: vec4<f32>,
43
+ @location(0) uv: vec2<f32>,
44
+ };
45
+
46
+ @vertex
47
+ fn main(@builtin(vertex_index) vertexIndex: u32) -> VertexOutput {
48
+ var output: VertexOutput;
49
+ let x = f32(i32(vertexIndex & 1u) * 4 - 1);
50
+ let y = f32(i32(vertexIndex >> 1u) * 4 - 1);
51
+ output.position = vec4<f32>(x, y, 0.0, 1.0);
52
+ output.uv = vec2<f32>((x + 1.0) * 0.5, (1.0 - y) * 0.5);
53
+ return output;
54
+ }
55
+ `;
56
+
57
+ export class ShaderLoader {
58
+ /**
59
+ * @param {object} [options]
60
+ * @param {string} [options.basePath] - Base URL path for shader files
61
+ */
62
+ constructor(options = {}) {
63
+ /** @type {string} */
64
+ this.basePath = options.basePath || DEFAULT_BASE_PATH;
65
+
66
+ /** @type {Map<string, string>} path → source text */
67
+ this._cache = new Map();
68
+
69
+ /** @type {Map<string, Promise<string>>} in-flight fetches */
70
+ this._pending = new Map();
71
+
72
+ /** @type {Set<string>} paths that failed to load */
73
+ this._failed = new Set();
74
+ }
75
+
76
+ /**
77
+ * Fetch a single shader file by relative path.
78
+ * Results are cached; subsequent calls return from cache.
79
+ *
80
+ * @param {string} relativePath - e.g. 'common/rotation4d.glsl'
81
+ * @returns {Promise<string|null>} Shader source or null on failure
82
+ */
83
+ async load(relativePath) {
84
+ const key = relativePath;
85
+
86
+ // Return from cache
87
+ if (this._cache.has(key)) {
88
+ return this._cache.get(key);
89
+ }
90
+
91
+ // Return in-flight promise to avoid duplicate fetches
92
+ if (this._pending.has(key)) {
93
+ return this._pending.get(key);
94
+ }
95
+
96
+ // Known failure
97
+ if (this._failed.has(key)) {
98
+ return null;
99
+ }
100
+
101
+ const url = `${this.basePath}/${relativePath}`;
102
+ const fetchPromise = this._fetchShader(url, key);
103
+ this._pending.set(key, fetchPromise);
104
+
105
+ const result = await fetchPromise;
106
+ this._pending.delete(key);
107
+ return result;
108
+ }
109
+
110
+ /**
111
+ * Load a matched pair of GLSL + WGSL fragment shaders for a system,
112
+ * plus the common vertex shaders.
113
+ *
114
+ * @param {string} systemName - e.g. 'faceted', 'quantum', 'holographic'
115
+ * @param {string} fragmentBasePath - e.g. 'faceted/faceted.frag' (without extension)
116
+ * @param {object} [options]
117
+ * @param {string} [options.vertexGlslPath] - Override vertex GLSL path
118
+ * @param {string} [options.vertexWgslPath] - Override vertex WGSL path
119
+ * @returns {Promise<{glslVertex: string, glslFragment: string|null, wgslFragment: string|null}>}
120
+ */
121
+ async loadShaderPair(systemName, fragmentBasePath, options = {}) {
122
+ const vertGlslPath = options.vertexGlslPath || 'common/fullscreen.vert.glsl';
123
+ const vertWgslPath = options.vertexWgslPath || 'common/fullscreen.vert.wgsl';
124
+ const fragGlslPath = `${fragmentBasePath}.glsl`;
125
+ const fragWgslPath = `${fragmentBasePath}.wgsl`;
126
+
127
+ // Fetch all four in parallel
128
+ const [vertGlsl, vertWgsl, fragGlsl, fragWgsl] = await Promise.all([
129
+ this.load(vertGlslPath),
130
+ this.load(vertWgslPath),
131
+ this.load(fragGlslPath),
132
+ this.load(fragWgslPath)
133
+ ]);
134
+
135
+ return {
136
+ glslVertex: vertGlsl || FALLBACK_VERTEX_GLSL,
137
+ glslFragment: fragGlsl,
138
+ wgslVertex: vertWgsl || FALLBACK_VERTEX_WGSL,
139
+ wgslFragment: fragWgsl
140
+ };
141
+ }
142
+
143
+ /**
144
+ * Load all common library shader files.
145
+ * Returns an object keyed by library name.
146
+ *
147
+ * @returns {Promise<object>} { uniforms: { glsl, wgsl }, rotation4d: { glsl, wgsl }, geometry24: { glsl, wgsl } }
148
+ */
149
+ async loadCommonLibrary() {
150
+ const libs = ['uniforms', 'rotation4d', 'geometry24'];
151
+ const results = {};
152
+
153
+ await Promise.all(libs.map(async (name) => {
154
+ const [glsl, wgsl] = await Promise.all([
155
+ this.load(`common/${name}.glsl`),
156
+ this.load(`common/${name}.wgsl`)
157
+ ]);
158
+ results[name] = { glsl, wgsl };
159
+ }));
160
+
161
+ return results;
162
+ }
163
+
164
+ /**
165
+ * Preload all shader files for a given system.
166
+ *
167
+ * @param {string} systemName - 'quantum' | 'faceted' | 'holographic'
168
+ * @returns {Promise<{glslVertex: string, glslFragment: string|null, wgslFragment: string|null}>}
169
+ */
170
+ async preloadSystem(systemName) {
171
+ const fragPaths = {
172
+ quantum: 'quantum/quantum.frag',
173
+ faceted: 'faceted/faceted.frag',
174
+ holographic: 'holographic/holographic.frag'
175
+ };
176
+
177
+ const fragBase = fragPaths[systemName];
178
+ if (!fragBase) {
179
+ console.warn(`ShaderLoader: Unknown system "${systemName}"`);
180
+ return { glslVertex: FALLBACK_VERTEX_GLSL, glslFragment: null, wgslFragment: null };
181
+ }
182
+
183
+ return this.loadShaderPair(systemName, fragBase);
184
+ }
185
+
186
+ /**
187
+ * Preload all three systems' shaders in parallel.
188
+ *
189
+ * @returns {Promise<Map<string, object>>} system name → shader sources
190
+ */
191
+ async preloadAll() {
192
+ const systems = ['quantum', 'faceted', 'holographic'];
193
+ const results = new Map();
194
+
195
+ await Promise.all(systems.map(async (name) => {
196
+ results.set(name, await this.preloadSystem(name));
197
+ }));
198
+
199
+ return results;
200
+ }
201
+
202
+ /**
203
+ * Clear all cached shaders.
204
+ */
205
+ clearCache() {
206
+ this._cache.clear();
207
+ this._failed.clear();
208
+ }
209
+
210
+ /**
211
+ * Get cache statistics.
212
+ * @returns {{ cached: number, failed: number, pending: number }}
213
+ */
214
+ getStats() {
215
+ return {
216
+ cached: this._cache.size,
217
+ failed: this._failed.size,
218
+ pending: this._pending.size
219
+ };
220
+ }
221
+
222
+ /**
223
+ * @private
224
+ * @param {string} url
225
+ * @param {string} key
226
+ * @returns {Promise<string|null>}
227
+ */
228
+ async _fetchShader(url, key) {
229
+ try {
230
+ const response = await fetch(url);
231
+ if (!response.ok) {
232
+ console.warn(`ShaderLoader: Failed to fetch ${url} (${response.status})`);
233
+ this._failed.add(key);
234
+ return null;
235
+ }
236
+ const text = await response.text();
237
+ this._cache.set(key, text);
238
+ return text;
239
+ } catch (err) {
240
+ console.warn(`ShaderLoader: Network error fetching ${url}:`, err.message);
241
+ this._failed.add(key);
242
+ return null;
243
+ }
244
+ }
245
+ }
246
+
247
+ /**
248
+ * Singleton shader loader instance.
249
+ * Import this for convenient shared access across the app.
250
+ */
251
+ export const shaderLoader = new ShaderLoader();
252
+
253
+ export default ShaderLoader;