@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,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;