@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.
- package/CHANGELOG.md +118 -0
- package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
- package/DOCS/CI_TESTING.md +38 -0
- package/DOCS/CLI_ONBOARDING.md +75 -0
- package/DOCS/CONTROL_REFERENCE.md +64 -0
- package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
- package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
- package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
- package/DOCS/ENV_SETUP.md +189 -0
- package/DOCS/EXPORT_FORMATS.md +417 -0
- package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
- package/DOCS/LICENSING_TIERS.md +275 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
- package/DOCS/OBS_SETUP_GUIDE.md +98 -0
- package/DOCS/PROJECT_SETUP.md +66 -0
- package/DOCS/RENDERER_LIFECYCLE.md +40 -0
- package/DOCS/REPO_MANIFEST.md +121 -0
- package/DOCS/SESSION_014_PLAN.md +195 -0
- package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
- package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
- package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
- package/DOCS/SYSTEM_INVENTORY.md +520 -0
- package/DOCS/TELEMETRY_EXPORTS.md +34 -0
- package/DOCS/WEBGPU_STATUS.md +38 -0
- package/DOCS/XR_BENCHMARKS.md +608 -0
- package/LICENSE +21 -0
- package/README.md +426 -0
- package/docs/.nojekyll +0 -0
- package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/02-hyperspatial_ego_death.html +346 -0
- package/docs/03-post_cartesian_sublime.html +346 -0
- package/docs/04-crystalline_void_meditation.html +346 -0
- package/docs/05-quantum_decoherence_ballet.html +346 -0
- package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/07-hyperspatial_ego_death.html +346 -0
- package/docs/08-post_cartesian_sublime.html +346 -0
- package/docs/09-crystalline_void_meditation.html +346 -0
- package/docs/10-quantum_decoherence_ballet.html +346 -0
- package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/12-hyperspatial_ego_death.html +346 -0
- package/docs/13-post_cartesian_sublime.html +346 -0
- package/docs/index.html +794 -0
- package/docs/test-hub.html +441 -0
- package/docs/url-state.js +102 -0
- package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
- package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
- package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
- package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
- package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
- package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
- package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
- package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
- package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
- package/docs/vib3-exports/index.html +238 -0
- package/docs/webgpu-live.html +702 -0
- package/package.json +367 -0
- package/src/advanced/AIPresetGenerator.js +777 -0
- package/src/advanced/MIDIController.js +703 -0
- package/src/advanced/OffscreenWorker.js +1051 -0
- package/src/advanced/WebGPUCompute.js +1051 -0
- package/src/advanced/WebXRRenderer.js +680 -0
- package/src/agent/cli/AgentCLI.js +615 -0
- package/src/agent/cli/index.js +14 -0
- package/src/agent/index.js +73 -0
- package/src/agent/mcp/MCPServer.js +950 -0
- package/src/agent/mcp/index.js +9 -0
- package/src/agent/mcp/tools.js +548 -0
- package/src/agent/telemetry/EventStream.js +669 -0
- package/src/agent/telemetry/Instrumentation.js +618 -0
- package/src/agent/telemetry/TelemetryExporters.js +427 -0
- package/src/agent/telemetry/TelemetryService.js +464 -0
- package/src/agent/telemetry/index.js +52 -0
- package/src/benchmarks/BenchmarkRunner.js +381 -0
- package/src/benchmarks/MetricsCollector.js +299 -0
- package/src/benchmarks/index.js +9 -0
- package/src/benchmarks/scenes.js +259 -0
- package/src/cli/index.js +675 -0
- package/src/config/ApiConfig.js +88 -0
- package/src/core/CanvasManager.js +217 -0
- package/src/core/ErrorReporter.js +117 -0
- package/src/core/ParameterMapper.js +333 -0
- package/src/core/Parameters.js +396 -0
- package/src/core/RendererContracts.js +200 -0
- package/src/core/UnifiedResourceManager.js +370 -0
- package/src/core/VIB3Engine.js +636 -0
- package/src/core/renderers/FacetedRendererAdapter.js +32 -0
- package/src/core/renderers/HolographicRendererAdapter.js +29 -0
- package/src/core/renderers/QuantumRendererAdapter.js +29 -0
- package/src/core/renderers/RendererLifecycleManager.js +63 -0
- package/src/creative/ColorPresetsSystem.js +980 -0
- package/src/creative/ParameterTimeline.js +1061 -0
- package/src/creative/PostProcessingPipeline.js +1113 -0
- package/src/creative/TransitionAnimator.js +683 -0
- package/src/export/CSSExporter.js +226 -0
- package/src/export/CardGeneratorBase.js +279 -0
- package/src/export/ExportManager.js +580 -0
- package/src/export/FacetedCardGenerator.js +279 -0
- package/src/export/HolographicCardGenerator.js +543 -0
- package/src/export/LottieExporter.js +552 -0
- package/src/export/QuantumCardGenerator.js +315 -0
- package/src/export/SVGExporter.js +519 -0
- package/src/export/ShaderExporter.js +903 -0
- package/src/export/TradingCardGenerator.js +3055 -0
- package/src/export/TradingCardManager.js +181 -0
- package/src/export/VIB3PackageExporter.js +559 -0
- package/src/export/index.js +14 -0
- package/src/export/systems/TradingCardSystemFaceted.js +494 -0
- package/src/export/systems/TradingCardSystemHolographic.js +452 -0
- package/src/export/systems/TradingCardSystemQuantum.js +411 -0
- package/src/faceted/FacetedSystem.js +963 -0
- package/src/features/CollectionManager.js +433 -0
- package/src/gallery/CollectionManager.js +240 -0
- package/src/gallery/GallerySystem.js +485 -0
- package/src/geometry/GeometryFactory.js +314 -0
- package/src/geometry/GeometryLibrary.js +72 -0
- package/src/geometry/buffers/BufferBuilder.js +338 -0
- package/src/geometry/buffers/index.js +18 -0
- package/src/geometry/generators/Crystal.js +420 -0
- package/src/geometry/generators/Fractal.js +298 -0
- package/src/geometry/generators/KleinBottle.js +197 -0
- package/src/geometry/generators/Sphere.js +192 -0
- package/src/geometry/generators/Tesseract.js +160 -0
- package/src/geometry/generators/Tetrahedron.js +225 -0
- package/src/geometry/generators/Torus.js +304 -0
- package/src/geometry/generators/Wave.js +341 -0
- package/src/geometry/index.js +142 -0
- package/src/geometry/warp/HypersphereCore.js +211 -0
- package/src/geometry/warp/HypertetraCore.js +386 -0
- package/src/geometry/warp/index.js +57 -0
- package/src/holograms/HolographicVisualizer.js +1073 -0
- package/src/holograms/RealHolographicSystem.js +966 -0
- package/src/holograms/variantRegistry.js +69 -0
- package/src/integrations/FigmaPlugin.js +854 -0
- package/src/integrations/OBSMode.js +754 -0
- package/src/integrations/ThreeJsPackage.js +660 -0
- package/src/integrations/TouchDesignerExport.js +552 -0
- package/src/integrations/frameworks/Vib3React.js +591 -0
- package/src/integrations/frameworks/Vib3Svelte.js +654 -0
- package/src/integrations/frameworks/Vib3Vue.js +628 -0
- package/src/llm/LLMParameterInterface.js +240 -0
- package/src/llm/LLMParameterUI.js +577 -0
- package/src/math/Mat4x4.js +708 -0
- package/src/math/Projection.js +341 -0
- package/src/math/Rotor4D.js +637 -0
- package/src/math/Vec4.js +476 -0
- package/src/math/constants.js +164 -0
- package/src/math/index.js +68 -0
- package/src/math/projections.js +54 -0
- package/src/math/rotations.js +196 -0
- package/src/quantum/QuantumEngine.js +906 -0
- package/src/quantum/QuantumVisualizer.js +1103 -0
- package/src/reactivity/ReactivityConfig.js +499 -0
- package/src/reactivity/ReactivityManager.js +586 -0
- package/src/reactivity/SpatialInputSystem.js +1783 -0
- package/src/reactivity/index.js +93 -0
- package/src/render/CommandBuffer.js +465 -0
- package/src/render/MultiCanvasBridge.js +340 -0
- package/src/render/RenderCommand.js +514 -0
- package/src/render/RenderResourceRegistry.js +523 -0
- package/src/render/RenderState.js +552 -0
- package/src/render/RenderTarget.js +512 -0
- package/src/render/ShaderLoader.js +253 -0
- package/src/render/ShaderProgram.js +599 -0
- package/src/render/UnifiedRenderBridge.js +496 -0
- package/src/render/backends/WebGLBackend.js +1108 -0
- package/src/render/backends/WebGPUBackend.js +1409 -0
- package/src/render/commands/CommandBufferExecutor.js +607 -0
- package/src/render/commands/RenderCommandBuffer.js +661 -0
- package/src/render/commands/index.js +17 -0
- package/src/render/index.js +367 -0
- package/src/scene/Disposable.js +498 -0
- package/src/scene/MemoryPool.js +618 -0
- package/src/scene/Node4D.js +697 -0
- package/src/scene/ResourceManager.js +599 -0
- package/src/scene/Scene4D.js +540 -0
- package/src/scene/index.js +98 -0
- package/src/schemas/error.schema.json +84 -0
- package/src/schemas/extension.schema.json +88 -0
- package/src/schemas/index.js +214 -0
- package/src/schemas/parameters.schema.json +142 -0
- package/src/schemas/tool-pack.schema.json +44 -0
- package/src/schemas/tool-response.schema.json +127 -0
- package/src/shaders/common/fullscreen.vert.glsl +5 -0
- package/src/shaders/common/fullscreen.vert.wgsl +17 -0
- package/src/shaders/common/geometry24.glsl +65 -0
- package/src/shaders/common/geometry24.wgsl +54 -0
- package/src/shaders/common/rotation4d.glsl +85 -0
- package/src/shaders/common/rotation4d.wgsl +86 -0
- package/src/shaders/common/uniforms.glsl +44 -0
- package/src/shaders/common/uniforms.wgsl +48 -0
- package/src/shaders/faceted/faceted.frag.glsl +129 -0
- package/src/shaders/faceted/faceted.frag.wgsl +164 -0
- package/src/shaders/holographic/holographic.frag.glsl +406 -0
- package/src/shaders/holographic/holographic.frag.wgsl +185 -0
- package/src/shaders/quantum/quantum.frag.glsl +513 -0
- package/src/shaders/quantum/quantum.frag.wgsl +361 -0
- package/src/testing/ParallelTestFramework.js +519 -0
- package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
- package/src/testing/exportFormats.test.js +8 -0
- package/src/testing/projections.test.js +14 -0
- package/src/testing/rotations.test.js +37 -0
- package/src/ui/InteractivityMenu.js +516 -0
- package/src/ui/StatusManager.js +96 -0
- package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
- package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
- package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
- package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
- package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
- package/src/variations/VariationManager.js +431 -0
- package/src/viewer/AudioReactivity.js +505 -0
- package/src/viewer/CardBending.js +481 -0
- package/src/viewer/GalleryUI.js +832 -0
- package/src/viewer/ReactivityManager.js +590 -0
- package/src/viewer/TradingCardExporter.js +600 -0
- package/src/viewer/ViewerPortal.js +374 -0
- package/src/viewer/index.js +12 -0
- package/src/wasm/WasmLoader.js +296 -0
- package/src/wasm/index.js +132 -0
- package/tools/agentic/mcpTools.js +88 -0
- package/tools/cli/agent-cli.js +92 -0
- package/tools/export/formats.js +24 -0
- package/tools/math/rotation-baseline.mjs +64 -0
- package/tools/shader-sync-verify.js +937 -0
- package/tools/telemetry/manifestPipeline.js +141 -0
- package/tools/telemetry/telemetryEvents.js +35 -0
- package/types/adaptive-sdk.d.ts +185 -0
- package/types/advanced/AIPresetGenerator.d.ts +81 -0
- package/types/advanced/MIDIController.d.ts +100 -0
- package/types/advanced/OffscreenWorker.d.ts +82 -0
- package/types/advanced/WebGPUCompute.d.ts +52 -0
- package/types/advanced/WebXRRenderer.d.ts +77 -0
- package/types/advanced/index.d.ts +46 -0
- package/types/core/ErrorReporter.d.ts +50 -0
- package/types/core/VIB3Engine.d.ts +204 -0
- package/types/creative/ColorPresetsSystem.d.ts +91 -0
- package/types/creative/ParameterTimeline.d.ts +74 -0
- package/types/creative/PostProcessingPipeline.d.ts +109 -0
- package/types/creative/TransitionAnimator.d.ts +71 -0
- package/types/creative/index.d.ts +35 -0
- package/types/integrations/FigmaPlugin.d.ts +46 -0
- package/types/integrations/OBSMode.d.ts +74 -0
- package/types/integrations/ThreeJsPackage.d.ts +62 -0
- package/types/integrations/TouchDesignerExport.d.ts +36 -0
- package/types/integrations/Vib3React.d.ts +74 -0
- package/types/integrations/Vib3Svelte.d.ts +63 -0
- package/types/integrations/Vib3Vue.d.ts +55 -0
- package/types/integrations/index.d.ts +52 -0
- package/types/reactivity/SpatialInputSystem.d.ts +173 -0
- package/types/reactivity/index.d.ts +394 -0
- package/types/render/CommandBuffer.d.ts +169 -0
- package/types/render/RenderCommand.d.ts +312 -0
- package/types/render/RenderState.d.ts +279 -0
- package/types/render/RenderTarget.d.ts +254 -0
- package/types/render/ShaderProgram.d.ts +277 -0
- package/types/render/UnifiedRenderBridge.d.ts +143 -0
- package/types/render/WebGLBackend.d.ts +168 -0
- package/types/render/WebGPUBackend.d.ts +186 -0
- 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;
|