@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,599 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* ShaderProgram - Shader compilation and uniform management
|
|
3
|
+
*
|
|
4
|
+
* Provides:
|
|
5
|
+
* - Vertex/fragment shader compilation
|
|
6
|
+
* - Uniform location caching
|
|
7
|
+
* - Attribute binding
|
|
8
|
+
* - Shader source management
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
let shaderIdCounter = 0;
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Shader stages
|
|
15
|
+
*/
|
|
16
|
+
export const ShaderStage = {
|
|
17
|
+
VERTEX: 'vertex',
|
|
18
|
+
FRAGMENT: 'fragment',
|
|
19
|
+
COMPUTE: 'compute'
|
|
20
|
+
};
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Uniform types
|
|
24
|
+
*/
|
|
25
|
+
export const UniformType = {
|
|
26
|
+
FLOAT: 'float',
|
|
27
|
+
VEC2: 'vec2',
|
|
28
|
+
VEC3: 'vec3',
|
|
29
|
+
VEC4: 'vec4',
|
|
30
|
+
INT: 'int',
|
|
31
|
+
IVEC2: 'ivec2',
|
|
32
|
+
IVEC3: 'ivec3',
|
|
33
|
+
IVEC4: 'ivec4',
|
|
34
|
+
BOOL: 'bool',
|
|
35
|
+
MAT2: 'mat2',
|
|
36
|
+
MAT3: 'mat3',
|
|
37
|
+
MAT4: 'mat4',
|
|
38
|
+
SAMPLER_2D: 'sampler2D',
|
|
39
|
+
SAMPLER_CUBE: 'samplerCube',
|
|
40
|
+
SAMPLER_3D: 'sampler3D'
|
|
41
|
+
};
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Uniform descriptor
|
|
45
|
+
*/
|
|
46
|
+
export class UniformDescriptor {
|
|
47
|
+
/**
|
|
48
|
+
* @param {string} name
|
|
49
|
+
* @param {string} type
|
|
50
|
+
* @param {any} defaultValue
|
|
51
|
+
*/
|
|
52
|
+
constructor(name, type, defaultValue = null) {
|
|
53
|
+
/** @type {string} */
|
|
54
|
+
this.name = name;
|
|
55
|
+
|
|
56
|
+
/** @type {string} */
|
|
57
|
+
this.type = type;
|
|
58
|
+
|
|
59
|
+
/** @type {any} */
|
|
60
|
+
this.defaultValue = defaultValue;
|
|
61
|
+
|
|
62
|
+
/** @type {number|null} Location (set by backend) */
|
|
63
|
+
this.location = null;
|
|
64
|
+
|
|
65
|
+
/** @type {number} Size for arrays */
|
|
66
|
+
this.arraySize = 1;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Attribute descriptor
|
|
72
|
+
*/
|
|
73
|
+
export class AttributeDescriptor {
|
|
74
|
+
/**
|
|
75
|
+
* @param {string} name
|
|
76
|
+
* @param {number} location
|
|
77
|
+
* @param {string} type
|
|
78
|
+
*/
|
|
79
|
+
constructor(name, location, type = 'vec4') {
|
|
80
|
+
/** @type {string} */
|
|
81
|
+
this.name = name;
|
|
82
|
+
|
|
83
|
+
/** @type {number} */
|
|
84
|
+
this.location = location;
|
|
85
|
+
|
|
86
|
+
/** @type {string} */
|
|
87
|
+
this.type = type;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
|
|
91
|
+
/**
|
|
92
|
+
* Shader source with metadata
|
|
93
|
+
*/
|
|
94
|
+
export class ShaderSource {
|
|
95
|
+
/**
|
|
96
|
+
* @param {string} stage
|
|
97
|
+
* @param {string} code
|
|
98
|
+
* @param {object} [options]
|
|
99
|
+
*/
|
|
100
|
+
constructor(stage, code, options = {}) {
|
|
101
|
+
/** @type {string} */
|
|
102
|
+
this.stage = stage;
|
|
103
|
+
|
|
104
|
+
/** @type {string} */
|
|
105
|
+
this.code = code;
|
|
106
|
+
|
|
107
|
+
/** @type {string} Entry point name */
|
|
108
|
+
this.entryPoint = options.entryPoint || 'main';
|
|
109
|
+
|
|
110
|
+
/** @type {object} Defines for preprocessing */
|
|
111
|
+
this.defines = options.defines || {};
|
|
112
|
+
|
|
113
|
+
/** @type {string[]} Include paths */
|
|
114
|
+
this.includes = options.includes || [];
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get preprocessed code with defines
|
|
119
|
+
* @returns {string}
|
|
120
|
+
*/
|
|
121
|
+
getProcessedCode() {
|
|
122
|
+
let processedCode = this.code;
|
|
123
|
+
|
|
124
|
+
// Add defines at the beginning (after version directive if present)
|
|
125
|
+
const defineLines = Object.entries(this.defines)
|
|
126
|
+
.map(([key, value]) => `#define ${key} ${value}`)
|
|
127
|
+
.join('\n');
|
|
128
|
+
|
|
129
|
+
if (defineLines) {
|
|
130
|
+
const versionMatch = processedCode.match(/^#version\s+\d+.*$/m);
|
|
131
|
+
if (versionMatch) {
|
|
132
|
+
const versionLine = versionMatch[0];
|
|
133
|
+
const restOfCode = processedCode.slice(versionMatch.index + versionLine.length);
|
|
134
|
+
processedCode = versionLine + '\n' + defineLines + restOfCode;
|
|
135
|
+
} else {
|
|
136
|
+
processedCode = defineLines + '\n' + processedCode;
|
|
137
|
+
}
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
return processedCode;
|
|
141
|
+
}
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* ShaderProgram class
|
|
146
|
+
*/
|
|
147
|
+
export class ShaderProgram {
|
|
148
|
+
/**
|
|
149
|
+
* @param {object} options
|
|
150
|
+
*/
|
|
151
|
+
constructor(options = {}) {
|
|
152
|
+
/** @type {number} */
|
|
153
|
+
this.id = ++shaderIdCounter;
|
|
154
|
+
|
|
155
|
+
/** @type {string|null} */
|
|
156
|
+
this.name = options.name || null;
|
|
157
|
+
|
|
158
|
+
/** @type {ShaderSource|null} */
|
|
159
|
+
this.vertexSource = options.vertex
|
|
160
|
+
? new ShaderSource(ShaderStage.VERTEX, options.vertex, options.vertexOptions)
|
|
161
|
+
: null;
|
|
162
|
+
|
|
163
|
+
/** @type {ShaderSource|null} */
|
|
164
|
+
this.fragmentSource = options.fragment
|
|
165
|
+
? new ShaderSource(ShaderStage.FRAGMENT, options.fragment, options.fragmentOptions)
|
|
166
|
+
: null;
|
|
167
|
+
|
|
168
|
+
/** @type {Map<string, UniformDescriptor>} */
|
|
169
|
+
this._uniforms = new Map();
|
|
170
|
+
|
|
171
|
+
/** @type {Map<string, AttributeDescriptor>} */
|
|
172
|
+
this._attributes = new Map();
|
|
173
|
+
|
|
174
|
+
/** @type {Map<string, any>} Cached uniform values */
|
|
175
|
+
this._uniformCache = new Map();
|
|
176
|
+
|
|
177
|
+
/** @type {object|null} Backend handle */
|
|
178
|
+
this._handle = null;
|
|
179
|
+
|
|
180
|
+
/** @type {boolean} */
|
|
181
|
+
this._compiled = false;
|
|
182
|
+
|
|
183
|
+
/** @type {string|null} Compilation errors */
|
|
184
|
+
this._error = null;
|
|
185
|
+
|
|
186
|
+
// Parse uniforms and attributes from source
|
|
187
|
+
if (options.uniforms) {
|
|
188
|
+
for (const uniform of options.uniforms) {
|
|
189
|
+
this.addUniform(uniform.name, uniform.type, uniform.defaultValue);
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
|
|
193
|
+
if (options.attributes) {
|
|
194
|
+
for (const attr of options.attributes) {
|
|
195
|
+
this.addAttribute(attr.name, attr.location, attr.type);
|
|
196
|
+
}
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
/**
|
|
201
|
+
* Add uniform descriptor
|
|
202
|
+
* @param {string} name
|
|
203
|
+
* @param {string} type
|
|
204
|
+
* @param {any} defaultValue
|
|
205
|
+
* @returns {this}
|
|
206
|
+
*/
|
|
207
|
+
addUniform(name, type, defaultValue = null) {
|
|
208
|
+
this._uniforms.set(name, new UniformDescriptor(name, type, defaultValue));
|
|
209
|
+
return this;
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
/**
|
|
213
|
+
* Add attribute descriptor
|
|
214
|
+
* @param {string} name
|
|
215
|
+
* @param {number} location
|
|
216
|
+
* @param {string} type
|
|
217
|
+
* @returns {this}
|
|
218
|
+
*/
|
|
219
|
+
addAttribute(name, location, type = 'vec4') {
|
|
220
|
+
this._attributes.set(name, new AttributeDescriptor(name, location, type));
|
|
221
|
+
return this;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Get uniform descriptor
|
|
226
|
+
* @param {string} name
|
|
227
|
+
* @returns {UniformDescriptor|undefined}
|
|
228
|
+
*/
|
|
229
|
+
getUniform(name) {
|
|
230
|
+
return this._uniforms.get(name);
|
|
231
|
+
}
|
|
232
|
+
|
|
233
|
+
/**
|
|
234
|
+
* Get attribute descriptor
|
|
235
|
+
* @param {string} name
|
|
236
|
+
* @returns {AttributeDescriptor|undefined}
|
|
237
|
+
*/
|
|
238
|
+
getAttribute(name) {
|
|
239
|
+
return this._attributes.get(name);
|
|
240
|
+
}
|
|
241
|
+
|
|
242
|
+
/**
|
|
243
|
+
* Get all uniforms
|
|
244
|
+
* @returns {UniformDescriptor[]}
|
|
245
|
+
*/
|
|
246
|
+
get uniforms() {
|
|
247
|
+
return Array.from(this._uniforms.values());
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
/**
|
|
251
|
+
* Get all attributes
|
|
252
|
+
* @returns {AttributeDescriptor[]}
|
|
253
|
+
*/
|
|
254
|
+
get attributes() {
|
|
255
|
+
return Array.from(this._attributes.values());
|
|
256
|
+
}
|
|
257
|
+
|
|
258
|
+
/**
|
|
259
|
+
* Set uniform value (cached)
|
|
260
|
+
* @param {string} name
|
|
261
|
+
* @param {any} value
|
|
262
|
+
* @returns {boolean} True if value changed
|
|
263
|
+
*/
|
|
264
|
+
setUniformValue(name, value) {
|
|
265
|
+
const cached = this._uniformCache.get(name);
|
|
266
|
+
|
|
267
|
+
// Simple equality check (won't work for arrays/objects)
|
|
268
|
+
if (cached === value) {
|
|
269
|
+
return false;
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
this._uniformCache.set(name, value);
|
|
273
|
+
return true;
|
|
274
|
+
}
|
|
275
|
+
|
|
276
|
+
/**
|
|
277
|
+
* Get cached uniform value
|
|
278
|
+
* @param {string} name
|
|
279
|
+
* @returns {any}
|
|
280
|
+
*/
|
|
281
|
+
getUniformValue(name) {
|
|
282
|
+
return this._uniformCache.get(name);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
/**
|
|
286
|
+
* Clear uniform cache
|
|
287
|
+
*/
|
|
288
|
+
clearUniformCache() {
|
|
289
|
+
this._uniformCache.clear();
|
|
290
|
+
}
|
|
291
|
+
|
|
292
|
+
/**
|
|
293
|
+
* Set backend handle
|
|
294
|
+
* @param {object} handle
|
|
295
|
+
*/
|
|
296
|
+
setHandle(handle) {
|
|
297
|
+
this._handle = handle;
|
|
298
|
+
this._compiled = true;
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
/**
|
|
302
|
+
* Get backend handle
|
|
303
|
+
* @returns {object|null}
|
|
304
|
+
*/
|
|
305
|
+
getHandle() {
|
|
306
|
+
return this._handle;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
/**
|
|
310
|
+
* Check if compiled
|
|
311
|
+
* @returns {boolean}
|
|
312
|
+
*/
|
|
313
|
+
get isCompiled() {
|
|
314
|
+
return this._compiled;
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
/**
|
|
318
|
+
* Get compilation error
|
|
319
|
+
* @returns {string|null}
|
|
320
|
+
*/
|
|
321
|
+
get error() {
|
|
322
|
+
return this._error;
|
|
323
|
+
}
|
|
324
|
+
|
|
325
|
+
/**
|
|
326
|
+
* Set compilation error
|
|
327
|
+
* @param {string} error
|
|
328
|
+
*/
|
|
329
|
+
setError(error) {
|
|
330
|
+
this._error = error;
|
|
331
|
+
this._compiled = false;
|
|
332
|
+
}
|
|
333
|
+
|
|
334
|
+
/**
|
|
335
|
+
* Dispose shader resources
|
|
336
|
+
*/
|
|
337
|
+
dispose() {
|
|
338
|
+
this._handle = null;
|
|
339
|
+
this._compiled = false;
|
|
340
|
+
this._uniformCache.clear();
|
|
341
|
+
}
|
|
342
|
+
|
|
343
|
+
/**
|
|
344
|
+
* Clone shader program
|
|
345
|
+
* @returns {ShaderProgram}
|
|
346
|
+
*/
|
|
347
|
+
clone() {
|
|
348
|
+
const shader = new ShaderProgram({
|
|
349
|
+
name: this.name ? `${this.name}_clone` : null,
|
|
350
|
+
vertex: this.vertexSource?.code,
|
|
351
|
+
fragment: this.fragmentSource?.code
|
|
352
|
+
});
|
|
353
|
+
|
|
354
|
+
for (const uniform of this._uniforms.values()) {
|
|
355
|
+
shader.addUniform(uniform.name, uniform.type, uniform.defaultValue);
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
for (const attr of this._attributes.values()) {
|
|
359
|
+
shader.addAttribute(attr.name, attr.location, attr.type);
|
|
360
|
+
}
|
|
361
|
+
|
|
362
|
+
return shader;
|
|
363
|
+
}
|
|
364
|
+
}
|
|
365
|
+
|
|
366
|
+
/**
|
|
367
|
+
* Common shader library with reusable code
|
|
368
|
+
*/
|
|
369
|
+
export const ShaderLib = {
|
|
370
|
+
/**
|
|
371
|
+
* 4D rotation matrices for 6 planes
|
|
372
|
+
*/
|
|
373
|
+
rotation4D: `
|
|
374
|
+
mat4 rotateXY(float angle) {
|
|
375
|
+
float c = cos(angle), s = sin(angle);
|
|
376
|
+
return mat4(
|
|
377
|
+
c, -s, 0, 0,
|
|
378
|
+
s, c, 0, 0,
|
|
379
|
+
0, 0, 1, 0,
|
|
380
|
+
0, 0, 0, 1
|
|
381
|
+
);
|
|
382
|
+
}
|
|
383
|
+
|
|
384
|
+
mat4 rotateXZ(float angle) {
|
|
385
|
+
float c = cos(angle), s = sin(angle);
|
|
386
|
+
return mat4(
|
|
387
|
+
c, 0, -s, 0,
|
|
388
|
+
0, 1, 0, 0,
|
|
389
|
+
s, 0, c, 0,
|
|
390
|
+
0, 0, 0, 1
|
|
391
|
+
);
|
|
392
|
+
}
|
|
393
|
+
|
|
394
|
+
mat4 rotateYZ(float angle) {
|
|
395
|
+
float c = cos(angle), s = sin(angle);
|
|
396
|
+
return mat4(
|
|
397
|
+
1, 0, 0, 0,
|
|
398
|
+
0, c, -s, 0,
|
|
399
|
+
0, s, c, 0,
|
|
400
|
+
0, 0, 0, 1
|
|
401
|
+
);
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
mat4 rotateXW(float angle) {
|
|
405
|
+
float c = cos(angle), s = sin(angle);
|
|
406
|
+
return mat4(
|
|
407
|
+
c, 0, 0, -s,
|
|
408
|
+
0, 1, 0, 0,
|
|
409
|
+
0, 0, 1, 0,
|
|
410
|
+
s, 0, 0, c
|
|
411
|
+
);
|
|
412
|
+
}
|
|
413
|
+
|
|
414
|
+
mat4 rotateYW(float angle) {
|
|
415
|
+
float c = cos(angle), s = sin(angle);
|
|
416
|
+
return mat4(
|
|
417
|
+
1, 0, 0, 0,
|
|
418
|
+
0, c, 0, -s,
|
|
419
|
+
0, 0, 1, 0,
|
|
420
|
+
0, s, 0, c
|
|
421
|
+
);
|
|
422
|
+
}
|
|
423
|
+
|
|
424
|
+
mat4 rotateZW(float angle) {
|
|
425
|
+
float c = cos(angle), s = sin(angle);
|
|
426
|
+
return mat4(
|
|
427
|
+
1, 0, 0, 0,
|
|
428
|
+
0, 1, 0, 0,
|
|
429
|
+
0, 0, c, -s,
|
|
430
|
+
0, 0, s, c
|
|
431
|
+
);
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
mat4 rotate4D(float xy, float xz, float yz, float xw, float yw, float zw) {
|
|
435
|
+
return rotateXY(xy) * rotateXZ(xz) * rotateYZ(yz) *
|
|
436
|
+
rotateXW(xw) * rotateYW(yw) * rotateZW(zw);
|
|
437
|
+
}
|
|
438
|
+
`,
|
|
439
|
+
|
|
440
|
+
/**
|
|
441
|
+
* 4D to 3D projection functions
|
|
442
|
+
*/
|
|
443
|
+
projection4D: `
|
|
444
|
+
vec3 projectPerspective(vec4 p, float d) {
|
|
445
|
+
float w = d - p.w;
|
|
446
|
+
if (abs(w) < 0.0001) w = 0.0001;
|
|
447
|
+
return p.xyz / w;
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
vec3 projectStereographic(vec4 p) {
|
|
451
|
+
float denom = 1.0 - p.w;
|
|
452
|
+
if (abs(denom) < 0.0001) denom = 0.0001;
|
|
453
|
+
return p.xyz / denom;
|
|
454
|
+
}
|
|
455
|
+
|
|
456
|
+
vec3 projectOrthographic(vec4 p) {
|
|
457
|
+
return p.xyz;
|
|
458
|
+
}
|
|
459
|
+
`,
|
|
460
|
+
|
|
461
|
+
/**
|
|
462
|
+
* Basic vertex shader for 4D geometry
|
|
463
|
+
*/
|
|
464
|
+
vertex4D: `#version 300 es
|
|
465
|
+
precision highp float;
|
|
466
|
+
|
|
467
|
+
in vec4 a_position;
|
|
468
|
+
in vec4 a_color;
|
|
469
|
+
|
|
470
|
+
uniform mat4 u_modelMatrix;
|
|
471
|
+
uniform mat4 u_viewMatrix;
|
|
472
|
+
uniform mat4 u_projMatrix;
|
|
473
|
+
uniform mat4 u_rotation4D;
|
|
474
|
+
uniform float u_projDistance;
|
|
475
|
+
|
|
476
|
+
out vec4 v_color;
|
|
477
|
+
out float v_depth4D;
|
|
478
|
+
|
|
479
|
+
${/* Inject rotation4D and projection4D */ ''}
|
|
480
|
+
|
|
481
|
+
void main() {
|
|
482
|
+
// Apply 4D rotation
|
|
483
|
+
vec4 rotated = u_rotation4D * a_position;
|
|
484
|
+
|
|
485
|
+
// Project 4D -> 3D
|
|
486
|
+
vec3 projected = projectPerspective(rotated, u_projDistance);
|
|
487
|
+
|
|
488
|
+
// Apply 3D transforms
|
|
489
|
+
vec4 worldPos = u_modelMatrix * vec4(projected, 1.0);
|
|
490
|
+
vec4 viewPos = u_viewMatrix * worldPos;
|
|
491
|
+
gl_Position = u_projMatrix * viewPos;
|
|
492
|
+
|
|
493
|
+
v_color = a_color;
|
|
494
|
+
v_depth4D = rotated.w;
|
|
495
|
+
}
|
|
496
|
+
`,
|
|
497
|
+
|
|
498
|
+
/**
|
|
499
|
+
* Basic fragment shader with W-depth coloring
|
|
500
|
+
*/
|
|
501
|
+
fragment4D: `#version 300 es
|
|
502
|
+
precision highp float;
|
|
503
|
+
|
|
504
|
+
in vec4 v_color;
|
|
505
|
+
in float v_depth4D;
|
|
506
|
+
|
|
507
|
+
uniform float u_wFogDistance;
|
|
508
|
+
uniform bool u_wFogEnabled;
|
|
509
|
+
|
|
510
|
+
out vec4 fragColor;
|
|
511
|
+
|
|
512
|
+
void main() {
|
|
513
|
+
vec4 color = v_color;
|
|
514
|
+
|
|
515
|
+
// W-depth fog
|
|
516
|
+
if (u_wFogEnabled) {
|
|
517
|
+
float fogFactor = clamp(abs(v_depth4D) / u_wFogDistance, 0.0, 1.0);
|
|
518
|
+
color.a *= 1.0 - fogFactor;
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
fragColor = color;
|
|
522
|
+
}
|
|
523
|
+
`
|
|
524
|
+
};
|
|
525
|
+
|
|
526
|
+
/**
|
|
527
|
+
* ShaderCache - Caches compiled shaders
|
|
528
|
+
*/
|
|
529
|
+
export class ShaderCache {
|
|
530
|
+
constructor() {
|
|
531
|
+
/** @type {Map<string, ShaderProgram>} */
|
|
532
|
+
this._cache = new Map();
|
|
533
|
+
}
|
|
534
|
+
|
|
535
|
+
/**
|
|
536
|
+
* Get or create shader
|
|
537
|
+
* @param {string} key
|
|
538
|
+
* @param {function(): ShaderProgram} factory
|
|
539
|
+
* @returns {ShaderProgram}
|
|
540
|
+
*/
|
|
541
|
+
getOrCreate(key, factory) {
|
|
542
|
+
if (!this._cache.has(key)) {
|
|
543
|
+
this._cache.set(key, factory());
|
|
544
|
+
}
|
|
545
|
+
return this._cache.get(key);
|
|
546
|
+
}
|
|
547
|
+
|
|
548
|
+
/**
|
|
549
|
+
* Get shader by key
|
|
550
|
+
* @param {string} key
|
|
551
|
+
* @returns {ShaderProgram|undefined}
|
|
552
|
+
*/
|
|
553
|
+
get(key) {
|
|
554
|
+
return this._cache.get(key);
|
|
555
|
+
}
|
|
556
|
+
|
|
557
|
+
/**
|
|
558
|
+
* Add shader to cache
|
|
559
|
+
* @param {string} key
|
|
560
|
+
* @param {ShaderProgram} shader
|
|
561
|
+
*/
|
|
562
|
+
set(key, shader) {
|
|
563
|
+
this._cache.set(key, shader);
|
|
564
|
+
}
|
|
565
|
+
|
|
566
|
+
/**
|
|
567
|
+
* Check if shader exists
|
|
568
|
+
* @param {string} key
|
|
569
|
+
* @returns {boolean}
|
|
570
|
+
*/
|
|
571
|
+
has(key) {
|
|
572
|
+
return this._cache.has(key);
|
|
573
|
+
}
|
|
574
|
+
|
|
575
|
+
/**
|
|
576
|
+
* Clear cache
|
|
577
|
+
*/
|
|
578
|
+
clear() {
|
|
579
|
+
for (const shader of this._cache.values()) {
|
|
580
|
+
shader.dispose();
|
|
581
|
+
}
|
|
582
|
+
this._cache.clear();
|
|
583
|
+
}
|
|
584
|
+
|
|
585
|
+
/**
|
|
586
|
+
* Get cache size
|
|
587
|
+
* @returns {number}
|
|
588
|
+
*/
|
|
589
|
+
get size() {
|
|
590
|
+
return this._cache.size;
|
|
591
|
+
}
|
|
592
|
+
}
|
|
593
|
+
|
|
594
|
+
/**
|
|
595
|
+
* Global shader cache
|
|
596
|
+
*/
|
|
597
|
+
export const shaderCache = new ShaderCache();
|
|
598
|
+
|
|
599
|
+
export default ShaderProgram;
|