@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,903 @@
1
+ /**
2
+ * VIB3+ Shader Exporter
3
+ * Exports REAL Quantum/Faceted/Holographic shaders to standalone HTML
4
+ * With full reactivity support
5
+ */
6
+
7
+ export class ShaderExporter {
8
+
9
+ /**
10
+ * Get the actual Quantum system fragment shader
11
+ */
12
+ static getQuantumShader() {
13
+ return `
14
+ #ifdef GL_FRAGMENT_PRECISION_HIGH
15
+ precision highp float;
16
+ #else
17
+ precision mediump float;
18
+ #endif
19
+
20
+ uniform vec2 u_resolution;
21
+ uniform float u_time;
22
+ uniform vec2 u_mouse;
23
+ uniform float u_geometry;
24
+ uniform float u_gridDensity;
25
+ uniform float u_morphFactor;
26
+ uniform float u_chaos;
27
+ uniform float u_speed;
28
+ uniform float u_hue;
29
+ uniform float u_intensity;
30
+ uniform float u_saturation;
31
+ uniform float u_dimension;
32
+ uniform float u_rot4dXY;
33
+ uniform float u_rot4dXZ;
34
+ uniform float u_rot4dYZ;
35
+ uniform float u_rot4dXW;
36
+ uniform float u_rot4dYW;
37
+ uniform float u_rot4dZW;
38
+ uniform float u_mouseIntensity;
39
+ uniform float u_clickIntensity;
40
+ uniform float u_bass;
41
+ uniform float u_mid;
42
+ uniform float u_high;
43
+
44
+ mat4 rotateXY(float theta) {
45
+ float c = cos(theta); float s = sin(theta);
46
+ return mat4(c, -s, 0, 0, s, c, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
47
+ }
48
+ mat4 rotateXZ(float theta) {
49
+ float c = cos(theta); float s = sin(theta);
50
+ return mat4(c, 0, s, 0, 0, 1, 0, 0, -s, 0, c, 0, 0, 0, 0, 1);
51
+ }
52
+ mat4 rotateYZ(float theta) {
53
+ float c = cos(theta); float s = sin(theta);
54
+ return mat4(1, 0, 0, 0, 0, c, -s, 0, 0, s, c, 0, 0, 0, 0, 1);
55
+ }
56
+ mat4 rotateXW(float theta) {
57
+ float c = cos(theta); float s = sin(theta);
58
+ return mat4(c, 0, 0, -s, 0, 1, 0, 0, 0, 0, 1, 0, s, 0, 0, c);
59
+ }
60
+ mat4 rotateYW(float theta) {
61
+ float c = cos(theta); float s = sin(theta);
62
+ return mat4(1, 0, 0, 0, 0, c, 0, -s, 0, 0, 1, 0, 0, s, 0, c);
63
+ }
64
+ mat4 rotateZW(float theta) {
65
+ float c = cos(theta); float s = sin(theta);
66
+ return mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, c, -s, 0, 0, s, c);
67
+ }
68
+
69
+ vec3 project4Dto3D(vec4 p) {
70
+ float w = 2.5 / (2.5 + p.w);
71
+ return vec3(p.x * w, p.y * w, p.z * w);
72
+ }
73
+
74
+ vec3 warpHypersphereCore(vec3 p, int geometryIndex) {
75
+ float radius = length(p);
76
+ float morphBlend = clamp(u_morphFactor * 0.6 + (u_dimension - 3.0) * 0.25, 0.0, 2.0);
77
+ float w = sin(radius * (1.3 + float(geometryIndex) * 0.12) + u_time * 0.0008 * u_speed);
78
+ w *= (0.4 + morphBlend * 0.45);
79
+ vec4 p4d = vec4(p * (1.0 + morphBlend * 0.2), w);
80
+ p4d = rotateXY(u_rot4dXY) * rotateXZ(u_rot4dXZ) * rotateYZ(u_rot4dYZ) *
81
+ rotateXW(u_rot4dXW) * rotateYW(u_rot4dYW) * rotateZW(u_rot4dZW) * p4d;
82
+ vec3 projected = project4Dto3D(p4d);
83
+ return mix(p, projected, clamp(0.45 + morphBlend * 0.35, 0.0, 1.0));
84
+ }
85
+
86
+ vec3 warpHypertetraCore(vec3 p, int geometryIndex) {
87
+ vec3 c1 = normalize(vec3(1.0, 1.0, 1.0));
88
+ vec3 c2 = normalize(vec3(-1.0, -1.0, 1.0));
89
+ vec3 c3 = normalize(vec3(-1.0, 1.0, -1.0));
90
+ vec3 c4 = normalize(vec3(1.0, -1.0, -1.0));
91
+ float morphBlend = clamp(u_morphFactor * 0.8 + (u_dimension - 3.0) * 0.2, 0.0, 2.0);
92
+ float basisMix = dot(p, c1) * 0.14 + dot(p, c2) * 0.1 + dot(p, c3) * 0.08;
93
+ float w = sin(basisMix * 5.5 + u_time * 0.0009 * u_speed) * cos(dot(p, c4) * 4.2 - u_time * 0.0007 * u_speed);
94
+ w *= (0.5 + morphBlend * 0.4);
95
+ vec3 offset = vec3(dot(p, c1), dot(p, c2), dot(p, c3)) * 0.1 * morphBlend;
96
+ vec4 p4d = vec4(p + offset, w);
97
+ p4d = rotateXY(u_rot4dXY) * rotateXZ(u_rot4dXZ) * rotateYZ(u_rot4dYZ) *
98
+ rotateXW(u_rot4dXW) * rotateYW(u_rot4dYW) * rotateZW(u_rot4dZW) * p4d;
99
+ vec3 projected = project4Dto3D(p4d);
100
+ float planeInfluence = min(min(abs(dot(p, c1)), abs(dot(p, c2))), min(abs(dot(p, c3)), abs(dot(p, c4))));
101
+ vec3 blended = mix(p, projected, clamp(0.45 + morphBlend * 0.35, 0.0, 1.0));
102
+ return mix(blended, blended * (1.0 - planeInfluence * 0.55), 0.2 + morphBlend * 0.2);
103
+ }
104
+
105
+ vec3 applyCoreWarp(vec3 p, float geometryType) {
106
+ float coreFloat = floor(geometryType / 8.0);
107
+ int coreIndex = int(clamp(coreFloat, 0.0, 2.0));
108
+ int geometryIndex = int(mod(geometryType, 8.0));
109
+ if (coreIndex == 1) return warpHypersphereCore(p, geometryIndex);
110
+ if (coreIndex == 2) return warpHypertetraCore(p, geometryIndex);
111
+ return p;
112
+ }
113
+
114
+ float tetrahedronLattice(vec3 p, float gridSize) {
115
+ vec3 q = fract(p * gridSize) - 0.5;
116
+ float d1 = length(q);
117
+ float d2 = length(q - vec3(0.4, 0.0, 0.0));
118
+ float d3 = length(q - vec3(0.0, 0.4, 0.0));
119
+ float d4 = length(q - vec3(0.0, 0.0, 0.4));
120
+ float vertices = 1.0 - smoothstep(0.0, 0.04, min(min(d1, d2), min(d3, d4)));
121
+ float edges = max(max(
122
+ 1.0 - smoothstep(0.0, 0.02, abs(length(q.xy) - 0.2)),
123
+ 1.0 - smoothstep(0.0, 0.02, abs(length(q.yz) - 0.2))),
124
+ 1.0 - smoothstep(0.0, 0.02, abs(length(q.xz) - 0.2)));
125
+ return max(vertices, edges * 0.5);
126
+ }
127
+
128
+ float hypercubeLattice(vec3 p, float gridSize) {
129
+ vec3 grid = fract(p * gridSize);
130
+ vec3 edges = min(grid, 1.0 - grid);
131
+ float minEdge = min(min(edges.x, edges.y), edges.z);
132
+ float lattice = 1.0 - smoothstep(0.0, 0.03, minEdge);
133
+ vec3 centers = abs(grid - 0.5);
134
+ float maxCenter = max(max(centers.x, centers.y), centers.z);
135
+ float vertices = 1.0 - smoothstep(0.45, 0.5, maxCenter);
136
+ return max(lattice * 0.7, vertices);
137
+ }
138
+
139
+ float sphereLattice(vec3 p, float gridSize) {
140
+ vec3 cell = fract(p * gridSize) - 0.5;
141
+ float sphere = 1.0 - smoothstep(0.15, 0.25, length(cell));
142
+ float ringRadius = length(cell.xy);
143
+ float rings = max(
144
+ 1.0 - smoothstep(0.0, 0.02, abs(ringRadius - 0.3)),
145
+ 1.0 - smoothstep(0.0, 0.02, abs(ringRadius - 0.2)));
146
+ return max(sphere, rings * 0.6);
147
+ }
148
+
149
+ float torusLattice(vec3 p, float gridSize) {
150
+ vec3 cell = fract(p * gridSize) - 0.5;
151
+ float toroidalDist = length(vec2(length(cell.xy) - 0.3, cell.z));
152
+ return 1.0 - smoothstep(0.08, 0.12, toroidalDist);
153
+ }
154
+
155
+ float kleinLattice(vec3 p, float gridSize) {
156
+ vec3 cell = fract(p * gridSize) - 0.5;
157
+ float u = atan(cell.y, cell.x) / 3.14159 + 1.0;
158
+ float x = (2.0 + cos(u * 0.5)) * cos(u);
159
+ float y = (2.0 + cos(u * 0.5)) * sin(u);
160
+ float z = sin(u * 0.5) + cell.z + 0.5;
161
+ float dist = length(cell - vec3(x, y, z) * 0.1);
162
+ return 1.0 - smoothstep(0.1, 0.15, dist);
163
+ }
164
+
165
+ float fractalLattice(vec3 p, float gridSize) {
166
+ vec3 cell = fract(p * gridSize);
167
+ cell = abs(cell * 2.0 - 1.0);
168
+ float dist = length(max(abs(cell) - 0.3, 0.0));
169
+ for(int i = 0; i < 3; i++) {
170
+ cell = abs(cell * 2.0 - 1.0);
171
+ float subdist = length(max(abs(cell) - 0.3, 0.0)) / pow(2.0, float(i + 1));
172
+ dist = min(dist, subdist);
173
+ }
174
+ return 1.0 - smoothstep(0.0, 0.05, dist);
175
+ }
176
+
177
+ float waveLattice(vec3 p, float gridSize) {
178
+ float time = u_time * 0.001 * u_speed;
179
+ vec3 cell = fract(p * gridSize) - 0.5;
180
+ float wave1 = sin(p.x * gridSize * 2.0 + time * 2.0);
181
+ float wave2 = sin(p.y * gridSize * 1.8 + time * 1.5);
182
+ float wave3 = sin(p.z * gridSize * 2.2 + time * 1.8);
183
+ float interference = (wave1 + wave2 + wave3) / 3.0;
184
+ float amplitude = 1.0 - length(cell) * 2.0;
185
+ return max(0.0, interference * amplitude);
186
+ }
187
+
188
+ float crystalLattice(vec3 p, float gridSize) {
189
+ vec3 cell = fract(p * gridSize) - 0.5;
190
+ float crystal = max(max(abs(cell.x) + abs(cell.y), abs(cell.y) + abs(cell.z)), abs(cell.x) + abs(cell.z));
191
+ crystal = 1.0 - smoothstep(0.3, 0.4, crystal);
192
+ float faces = max(max(
193
+ 1.0 - smoothstep(0.0, 0.02, abs(abs(cell.x) - 0.35)),
194
+ 1.0 - smoothstep(0.0, 0.02, abs(abs(cell.y) - 0.35))),
195
+ 1.0 - smoothstep(0.0, 0.02, abs(abs(cell.z) - 0.35)));
196
+ return max(crystal, faces * 0.5);
197
+ }
198
+
199
+ float geometryFunction(vec4 p) {
200
+ int geomType = int(mod(u_geometry, 8.0));
201
+ vec3 p3d = project4Dto3D(p);
202
+ vec3 warped = applyCoreWarp(p3d, u_geometry);
203
+ float gridSize = (u_gridDensity + u_bass * 40.0) * 0.08;
204
+
205
+ if (geomType == 0) return tetrahedronLattice(warped, gridSize) * u_morphFactor;
206
+ else if (geomType == 1) return hypercubeLattice(warped, gridSize) * u_morphFactor;
207
+ else if (geomType == 2) return sphereLattice(warped, gridSize) * u_morphFactor;
208
+ else if (geomType == 3) return torusLattice(warped, gridSize) * u_morphFactor;
209
+ else if (geomType == 4) return kleinLattice(warped, gridSize) * u_morphFactor;
210
+ else if (geomType == 5) return fractalLattice(warped, gridSize) * u_morphFactor;
211
+ else if (geomType == 6) return waveLattice(warped, gridSize) * u_morphFactor;
212
+ else return crystalLattice(warped, gridSize) * u_morphFactor;
213
+ }
214
+
215
+ vec3 hsv2rgb(vec3 c) {
216
+ vec4 K = vec4(1.0, 2.0/3.0, 1.0/3.0, 3.0);
217
+ vec3 p = abs(fract(c.xxx + K.xyz) * 6.0 - K.www);
218
+ return c.z * mix(K.xxx, clamp(p - K.xxx, 0.0, 1.0), c.y);
219
+ }
220
+
221
+ void main() {
222
+ vec2 uv = (gl_FragCoord.xy - u_resolution.xy * 0.5) / min(u_resolution.x, u_resolution.y);
223
+ float timeSpeed = u_time * 0.0001 * u_speed;
224
+ vec4 pos = vec4(uv * 3.0, sin(timeSpeed * 3.0), cos(timeSpeed * 2.0));
225
+ pos.xy += (u_mouse - 0.5) * u_mouseIntensity * 2.0;
226
+
227
+ pos = rotateXY(u_rot4dXY) * rotateXZ(u_rot4dXZ) * rotateYZ(u_rot4dYZ) *
228
+ rotateXW(u_rot4dXW) * rotateYW(u_rot4dYW) * rotateZW(u_rot4dZW) * pos;
229
+
230
+ float value = geometryFunction(pos);
231
+ float noise = sin(pos.x * 7.0) * cos(pos.y * 11.0) * sin(pos.z * 13.0);
232
+ value += noise * (u_chaos + u_high * 0.6);
233
+
234
+ float geometryIntensity = 1.0 - clamp(abs(value * 0.8), 0.0, 1.0);
235
+ geometryIntensity = pow(geometryIntensity, 1.5);
236
+ geometryIntensity += u_clickIntensity * 0.3;
237
+
238
+ float shimmer = sin(uv.x * 20.0 + timeSpeed * 5.0) * cos(uv.y * 15.0 + timeSpeed * 3.0) * 0.1;
239
+ geometryIntensity += shimmer * geometryIntensity;
240
+
241
+ float hueShift = u_hue / 360.0 + u_mid * 0.3;
242
+ vec3 color = hsv2rgb(vec3(hueShift + value * 0.1, u_saturation, u_intensity));
243
+ color *= geometryIntensity;
244
+
245
+ gl_FragColor = vec4(color, geometryIntensity * u_intensity);
246
+ }`;
247
+ }
248
+
249
+ /**
250
+ * Get the EXACT Faceted system fragment shader from FacetedCardGeneratorExact.js
251
+ * This matches the original working VIB3+ engine at domusgpt.github.io/vib3-plus-engine
252
+ */
253
+ static getFacetedShader() {
254
+ return `precision highp float;
255
+
256
+ uniform vec2 u_resolution;
257
+ uniform float u_time;
258
+ uniform vec2 u_mouse;
259
+ uniform float u_geometry;
260
+ uniform float u_gridDensity;
261
+ uniform float u_morphFactor;
262
+ uniform float u_chaos;
263
+ uniform float u_speed;
264
+ uniform float u_hue;
265
+ uniform float u_intensity;
266
+ uniform float u_saturation;
267
+ uniform float u_dimension;
268
+ uniform float u_rot4dXW;
269
+ uniform float u_rot4dYW;
270
+ uniform float u_rot4dZW;
271
+ uniform float u_mouseIntensity;
272
+ uniform float u_clickIntensity;
273
+ uniform float u_bass;
274
+ uniform float u_mid;
275
+ uniform float u_high;
276
+
277
+ // 4D rotation matrices
278
+ mat4 rotateXW(float theta) {
279
+ float c = cos(theta);
280
+ float s = sin(theta);
281
+ return mat4(c, 0.0, 0.0, -s, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, s, 0.0, 0.0, c);
282
+ }
283
+
284
+ mat4 rotateYW(float theta) {
285
+ float c = cos(theta);
286
+ float s = sin(theta);
287
+ return mat4(1.0, 0.0, 0.0, 0.0, 0.0, c, 0.0, -s, 0.0, 0.0, 1.0, 0.0, 0.0, s, 0.0, c);
288
+ }
289
+
290
+ mat4 rotateZW(float theta) {
291
+ float c = cos(theta);
292
+ float s = sin(theta);
293
+ return mat4(1.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, c, -s, 0.0, 0.0, s, c);
294
+ }
295
+
296
+ vec3 project4Dto3D(vec4 p) {
297
+ float w = 2.5 / (2.5 + p.w);
298
+ return vec3(p.x * w, p.y * w, p.z * w);
299
+ }
300
+
301
+ // EXACT geometry functions from original VIB3+ Faceted system
302
+ float geometryFunction(vec4 p) {
303
+ int geomType = int(mod(u_geometry, 8.0));
304
+ float density = u_gridDensity * 0.08;
305
+
306
+ if (geomType == 0) {
307
+ // Tetrahedron lattice
308
+ vec4 pos = fract(p * density);
309
+ vec4 dist = min(pos, 1.0 - pos);
310
+ return min(min(dist.x, dist.y), min(dist.z, dist.w)) * u_morphFactor;
311
+ }
312
+ else if (geomType == 1) {
313
+ // Hypercube lattice
314
+ vec4 pos = fract(p * density);
315
+ vec4 dist = min(pos, 1.0 - pos);
316
+ float minDist = min(min(dist.x, dist.y), min(dist.z, dist.w));
317
+ return minDist * u_morphFactor;
318
+ }
319
+ else if (geomType == 2) {
320
+ // Sphere lattice
321
+ float r = length(p);
322
+ float spheres = abs(fract(r * density) - 0.5) * 2.0;
323
+ float theta = atan(p.y, p.x);
324
+ float harmonics = sin(theta * 3.0) * 0.2;
325
+ return (spheres + harmonics) * u_morphFactor;
326
+ }
327
+ else if (geomType == 3) {
328
+ // Torus lattice
329
+ float r1 = length(p.xy) - 2.0;
330
+ float torus = length(vec2(r1, p.z)) - 0.8;
331
+ float lattice = sin(p.x * density) * sin(p.y * density);
332
+ return (torus + lattice * 0.3) * u_morphFactor;
333
+ }
334
+ else if (geomType == 4) {
335
+ // Klein bottle lattice
336
+ float u = atan(p.y, p.x);
337
+ float v = atan(p.w, p.z);
338
+ float dist = length(p) - 2.0;
339
+ float lattice = sin(u * density) * sin(v * density);
340
+ return (dist + lattice * 0.4) * u_morphFactor;
341
+ }
342
+ else if (geomType == 5) {
343
+ // Fractal lattice
344
+ vec4 pos = fract(p * density);
345
+ pos = abs(pos * 2.0 - 1.0);
346
+ float dist = length(max(abs(pos) - 1.0, 0.0));
347
+ return dist * u_morphFactor;
348
+ }
349
+ else if (geomType == 6) {
350
+ // Wave lattice
351
+ float time = u_time * 0.001 * u_speed;
352
+ float wave1 = sin(p.x * density + time);
353
+ float wave2 = sin(p.y * density + time * 1.3);
354
+ float wave3 = sin(p.z * density * 0.8 + time * 0.7);
355
+ float interference = wave1 * wave2 * wave3;
356
+ return interference * u_morphFactor;
357
+ }
358
+ else {
359
+ // Crystal lattice (geomType == 7)
360
+ vec4 pos = fract(p * density) - 0.5;
361
+ float cube = max(max(abs(pos.x), abs(pos.y)), max(abs(pos.z), abs(pos.w)));
362
+ return cube * u_morphFactor;
363
+ }
364
+ }
365
+
366
+ void main() {
367
+ vec2 uv = (gl_FragCoord.xy - u_resolution.xy * 0.5) / min(u_resolution.x, u_resolution.y);
368
+
369
+ // 4D position with time animation
370
+ float timeSpeed = u_time * 0.0001 * u_speed;
371
+ vec4 pos = vec4(uv * 3.0, sin(timeSpeed * 3.0), cos(timeSpeed * 2.0));
372
+ pos.xy += (u_mouse - 0.5) * u_mouseIntensity * 2.0;
373
+
374
+ // Apply 4D rotations with audio reactivity
375
+ pos = rotateXW(u_rot4dXW + u_bass * 0.3) * pos;
376
+ pos = rotateYW(u_rot4dYW + u_mid * 0.2) * pos;
377
+ pos = rotateZW(u_rot4dZW + u_high * 0.25) * pos;
378
+
379
+ // Calculate geometry value
380
+ float value = geometryFunction(pos);
381
+
382
+ // Apply chaos
383
+ float noise = sin(pos.x * 7.0) * cos(pos.y * 11.0) * sin(pos.z * 13.0);
384
+ value += noise * (u_chaos + u_high * 0.2);
385
+
386
+ // Color based on geometry value and hue
387
+ float geometryIntensity = 1.0 - clamp(abs(value), 0.0, 1.0);
388
+ geometryIntensity += u_clickIntensity * 0.3;
389
+
390
+ float finalIntensity = geometryIntensity * u_intensity;
391
+ float hue = u_hue / 360.0 + value * 0.1 + u_mid * 0.1;
392
+
393
+ // Create color with saturation control
394
+ vec3 baseColor = vec3(
395
+ sin(hue * 6.28318 + 0.0) * 0.5 + 0.5,
396
+ sin(hue * 6.28318 + 2.0943) * 0.5 + 0.5,
397
+ sin(hue * 6.28318 + 4.1887) * 0.5 + 0.5
398
+ );
399
+
400
+ // Apply saturation
401
+ float gray = (baseColor.r + baseColor.g + baseColor.b) / 3.0;
402
+ vec3 color = mix(vec3(gray), baseColor, u_saturation) * finalIntensity;
403
+
404
+ gl_FragColor = vec4(color, finalIntensity * 0.9);
405
+ }`;
406
+ }
407
+
408
+ /**
409
+ * Get the actual Holographic system fragment shader
410
+ */
411
+ static getHolographicShader() {
412
+ return `
413
+ precision highp float;
414
+
415
+ uniform vec2 u_resolution;
416
+ uniform float u_time;
417
+ uniform vec2 u_mouse;
418
+ uniform float u_geometry;
419
+ uniform float u_gridDensity;
420
+ uniform float u_morphFactor;
421
+ uniform float u_chaos;
422
+ uniform float u_speed;
423
+ uniform float u_hue;
424
+ uniform float u_intensity;
425
+ uniform float u_rot4dXY, u_rot4dXZ, u_rot4dYZ;
426
+ uniform float u_rot4dXW, u_rot4dYW, u_rot4dZW;
427
+ uniform float u_mouseIntensity;
428
+ uniform float u_clickIntensity;
429
+ uniform float u_bass, u_mid, u_high;
430
+
431
+ mat4 rotateXY(float t){float c=cos(t),s=sin(t);return mat4(c,-s,0,0,s,c,0,0,0,0,1,0,0,0,0,1);}
432
+ mat4 rotateXZ(float t){float c=cos(t),s=sin(t);return mat4(c,0,s,0,0,1,0,0,-s,0,c,0,0,0,0,1);}
433
+ mat4 rotateYZ(float t){float c=cos(t),s=sin(t);return mat4(1,0,0,0,0,c,-s,0,0,s,c,0,0,0,0,1);}
434
+ mat4 rotateXW(float t){float c=cos(t),s=sin(t);return mat4(c,0,0,-s,0,1,0,0,0,0,1,0,s,0,0,c);}
435
+ mat4 rotateYW(float t){float c=cos(t),s=sin(t);return mat4(1,0,0,0,0,c,0,-s,0,0,1,0,0,s,0,c);}
436
+ mat4 rotateZW(float t){float c=cos(t),s=sin(t);return mat4(1,0,0,0,0,1,0,0,0,0,c,-s,0,0,s,c);}
437
+
438
+ vec3 project4Dto3D(vec4 p) {
439
+ float w = 2.5 / (2.5 + p.w);
440
+ return vec3(p.x * w, p.y * w, p.z * w);
441
+ }
442
+
443
+ vec3 warpHypersphereCore(vec3 p, int gi) {
444
+ float r = length(p);
445
+ float morph = clamp(u_morphFactor * 0.6 + 0.3, 0.0, 2.0);
446
+ float w = sin(r * (1.3 + float(gi) * 0.12) + u_time * 0.0008 * u_speed) * (0.4 + morph * 0.45);
447
+ vec4 p4d = vec4(p * (1.0 + morph * 0.2), w);
448
+ p4d = rotateXY(u_rot4dXY)*rotateXZ(u_rot4dXZ)*rotateYZ(u_rot4dYZ)*
449
+ rotateXW(u_rot4dXW)*rotateYW(u_rot4dYW)*rotateZW(u_rot4dZW)*p4d;
450
+ return mix(p, project4Dto3D(p4d), clamp(0.45 + morph * 0.35, 0.0, 1.0));
451
+ }
452
+
453
+ vec3 warpHypertetraCore(vec3 p, int gi) {
454
+ vec3 c1=normalize(vec3(1,1,1)),c2=normalize(vec3(-1,-1,1)),c3=normalize(vec3(-1,1,-1)),c4=normalize(vec3(1,-1,-1));
455
+ float morph = clamp(u_morphFactor * 0.8 + 0.2, 0.0, 2.0);
456
+ float bm = dot(p,c1)*0.14+dot(p,c2)*0.1+dot(p,c3)*0.08;
457
+ float w = sin(bm*5.5+u_time*0.0009*u_speed)*cos(dot(p,c4)*4.2-u_time*0.0007*u_speed)*(0.5+morph*0.4);
458
+ vec3 off = vec3(dot(p,c1),dot(p,c2),dot(p,c3))*0.1*morph;
459
+ vec4 p4d = vec4(p+off, w);
460
+ p4d = rotateXY(u_rot4dXY)*rotateXZ(u_rot4dXZ)*rotateYZ(u_rot4dYZ)*
461
+ rotateXW(u_rot4dXW)*rotateYW(u_rot4dYW)*rotateZW(u_rot4dZW)*p4d;
462
+ vec3 proj = project4Dto3D(p4d);
463
+ float pi = min(min(abs(dot(p,c1)),abs(dot(p,c2))),min(abs(dot(p,c3)),abs(dot(p,c4))));
464
+ vec3 bl = mix(p, proj, clamp(0.45+morph*0.35,0.0,1.0));
465
+ return mix(bl, bl*(1.0-pi*0.55), 0.2+morph*0.2);
466
+ }
467
+
468
+ vec3 applyCoreWarp(vec3 p, float gt) {
469
+ int core = int(floor(gt/8.0));
470
+ int gi = int(mod(gt, 8.0));
471
+ if(core==1) return warpHypersphereCore(p, gi);
472
+ if(core==2) return warpHypertetraCore(p, gi);
473
+ return p;
474
+ }
475
+
476
+ float tetraLattice(vec3 p, float gs) {
477
+ vec3 q = fract(p*gs)-0.5;
478
+ float d1=length(q),d2=length(q-vec3(0.35,0,0)),d3=length(q-vec3(0,0.35,0)),d4=length(q-vec3(0,0,0.35));
479
+ float verts = 1.0-smoothstep(0.0,0.03,min(min(d1,d2),min(d3,d4)));
480
+ float shimmer = sin(u_time*0.002)*0.02;
481
+ float edges = max(max(
482
+ 1.0-smoothstep(0.0,0.015,abs(length(q.xy)-(0.18+shimmer))),
483
+ 1.0-smoothstep(0.0,0.015,abs(length(q.yz)-(0.18+shimmer*0.8)))),
484
+ 1.0-smoothstep(0.0,0.015,abs(length(q.xz)-(0.18+shimmer*1.2))));
485
+ float interf = sin(d1*25.0+u_time*0.003)*sin(d2*22.0+u_time*0.0025)*0.1;
486
+ float vol = exp(-length(q)*3.0)*0.15;
487
+ return max(verts, edges*0.7)+interf+vol;
488
+ }
489
+
490
+ float hyperLattice(vec3 p, float gs) {
491
+ vec3 g = fract(p*gs), q = g-0.5;
492
+ vec3 e = 1.0-smoothstep(0.0,0.025,abs(q));
493
+ float wire = max(max(e.x,e.y),e.z);
494
+ float verts = 0.0;
495
+ for(int i=0;i<8;i++){
496
+ float fi=float(i);
497
+ vec3 c = vec3(mod(fi,2.0)-0.5,mod(floor(fi/2.0),2.0)-0.5,float(i/4)-0.5);
498
+ verts = max(verts, 1.0-smoothstep(0.0,0.04,length(q-c*0.4)));
499
+ }
500
+ float interf = sin(length(q)*20.0+u_time*0.002)*0.08;
501
+ float glow = exp(-length(q)*2.5)*0.12;
502
+ return wire*0.8+verts+interf+glow;
503
+ }
504
+
505
+ float sphereLattice(vec3 p, float gs) {
506
+ vec3 q = fract(p*gs)-0.5;
507
+ return 1.0-smoothstep(0.2,0.5,length(q));
508
+ }
509
+
510
+ float torusLattice(vec3 p, float gs) {
511
+ vec3 q = fract(p*gs)-0.5;
512
+ float r1 = sqrt(q.x*q.x+q.y*q.y);
513
+ float r2 = sqrt((r1-0.3)*(r1-0.3)+q.z*q.z);
514
+ return 1.0-smoothstep(0.0,0.1,r2);
515
+ }
516
+
517
+ float kleinLattice(vec3 p, float gs) {
518
+ vec3 q = fract(p*gs);
519
+ float u = q.x*6.28318, v = q.y*6.28318;
520
+ float x = cos(u)*(3.0+cos(u/2.0)*sin(v)-sin(u/2.0)*sin(2.0*v));
521
+ return 1.0-smoothstep(0.0,0.05,abs(length(vec2(x,q.z))-0.1));
522
+ }
523
+
524
+ float fractalLattice(vec3 p, float gs) {
525
+ vec3 q = p*gs;
526
+ float scale = 1.0, fract_val = 0.0;
527
+ for(int i=0;i<4;i++){
528
+ q = fract(q)-0.5;
529
+ fract_val += abs(length(q))/scale;
530
+ scale *= 2.0;
531
+ q *= 2.0;
532
+ }
533
+ return 1.0-smoothstep(0.0,1.0,fract_val);
534
+ }
535
+
536
+ float waveLattice(vec3 p, float gs) {
537
+ vec3 q = p*gs;
538
+ float wave = sin(q.x*2.0)*sin(q.y*2.0)*sin(q.z*2.0+u_time);
539
+ return smoothstep(-0.5,0.5,wave);
540
+ }
541
+
542
+ float crystalLattice(vec3 p, float gs) {
543
+ vec3 q = fract(p*gs)-0.5;
544
+ float d = max(max(abs(q.x),abs(q.y)),abs(q.z));
545
+ return 1.0-smoothstep(0.3,0.5,d);
546
+ }
547
+
548
+ float getDynamicGeometry(vec3 p, float gs, float gt) {
549
+ vec3 w = applyCoreWarp(p, gt);
550
+ int bg = int(mod(gt, 8.0));
551
+ float var = floor(gt/8.0)/4.0;
552
+ float vgs = gs*(0.5+var*1.5);
553
+ if(bg==0) return tetraLattice(w,vgs);
554
+ else if(bg==1) return hyperLattice(w,vgs);
555
+ else if(bg==2) return sphereLattice(w,vgs);
556
+ else if(bg==3) return torusLattice(w,vgs);
557
+ else if(bg==4) return kleinLattice(w,vgs);
558
+ else if(bg==5) return fractalLattice(w,vgs);
559
+ else if(bg==6) return waveLattice(w,vgs);
560
+ else return crystalLattice(w,vgs);
561
+ }
562
+
563
+ vec3 hsv2rgb(vec3 c) {
564
+ vec4 K = vec4(1.0,2.0/3.0,1.0/3.0,3.0);
565
+ vec3 p = abs(fract(c.xxx+K.xyz)*6.0-K.www);
566
+ return c.z*mix(K.xxx,clamp(p-K.xxx,0.0,1.0),c.y);
567
+ }
568
+
569
+ void main() {
570
+ vec2 uv = gl_FragCoord.xy/u_resolution.xy;
571
+ float ar = u_resolution.x/u_resolution.y;
572
+ uv.x *= ar;
573
+ uv -= 0.5;
574
+
575
+ float time = u_time*0.0004*u_speed;
576
+ vec2 moff = (u_mouse-0.5)*u_mouseIntensity*0.25;
577
+
578
+ vec4 p4d = vec4(uv+moff*0.1, sin(time*0.1)*0.15, cos(time*0.08)*0.15);
579
+ p4d = rotateXY(u_rot4dXY+time*0.1)*rotateXZ(u_rot4dXZ+time*0.12)*rotateYZ(u_rot4dYZ+time*0.08)*
580
+ rotateXW(u_rot4dXW+time*0.2+moff.y*0.5+u_bass*0.3)*
581
+ rotateYW(u_rot4dYW+time*0.15+moff.x*0.5+u_mid*0.2)*
582
+ rotateZW(u_rot4dZW+time*0.25+u_clickIntensity*0.3+u_high*0.4)*p4d;
583
+
584
+ vec3 p = project4Dto3D(p4d);
585
+ float density = u_gridDensity*(1.0+u_bass*0.5);
586
+ float morphedGeo = u_geometry+u_morphFactor*3.0+u_mid*1.5;
587
+ float lattice = getDynamicGeometry(p, density, morphedGeo);
588
+
589
+ float hue = u_hue/360.0+u_mid*0.3;
590
+ vec3 baseColor = hsv2rgb(vec3(hue, 0.8, u_intensity));
591
+ vec3 color = baseColor*(0.2+lattice*0.8);
592
+
593
+ vec3 shimmer1 = baseColor*lattice*0.5;
594
+ vec3 shimmer2 = baseColor*sin(lattice*8.0+u_time*0.001)*0.2;
595
+ color += shimmer1+shimmer2;
596
+ color += vec3(lattice*0.6)*baseColor;
597
+
598
+ float depth = 1.0-length(p)*0.3;
599
+ color *= (0.7+depth*0.3);
600
+
601
+ float moire = sin(uv.x*12.0)*sin(uv.y*14.0)*(u_chaos+u_high*0.4)*0.15;
602
+ color += vec3(moire);
603
+
604
+ float mouseDist = length(uv-(u_mouse-0.5)*vec2(ar,1.0));
605
+ float mouseGlow = exp(-mouseDist*1.2)*u_mouseIntensity*0.25;
606
+ float mouseRipple = sin(mouseDist*15.0-u_time*0.003)*exp(-mouseDist*2.0)*u_mouseIntensity*0.1;
607
+ color += vec3(mouseGlow+mouseRipple)*baseColor*0.8;
608
+
609
+ float clickPulse = u_clickIntensity*exp(-mouseDist*1.8)*0.4;
610
+ color += vec3(clickPulse, clickPulse*0.6, clickPulse*1.2);
611
+
612
+ gl_FragColor = vec4(color, 0.95);
613
+ }`;
614
+ }
615
+
616
+ /**
617
+ * Export complete standalone HTML with real VIB3+ shader
618
+ */
619
+ static exportHTML(config) {
620
+ const {
621
+ name = 'VIB3+ Visualization',
622
+ description = 'Exported VIB3+ 4D Visualization',
623
+ system = 'quantum',
624
+ geometry = 0,
625
+ parameters = {},
626
+ reactivity = {}
627
+ } = config;
628
+
629
+ // Select shader based on system
630
+ let fragmentShader;
631
+ switch(system) {
632
+ case 'faceted':
633
+ fragmentShader = this.getFacetedShader();
634
+ break;
635
+ case 'holographic':
636
+ fragmentShader = this.getHolographicShader();
637
+ break;
638
+ case 'quantum':
639
+ default:
640
+ fragmentShader = this.getQuantumShader();
641
+ }
642
+
643
+ const vertexShader = `
644
+ attribute vec2 a_position;
645
+ void main() {
646
+ gl_Position = vec4(a_position, 0.0, 1.0);
647
+ }`;
648
+
649
+ // Default parameters
650
+ const params = {
651
+ gridDensity: 15,
652
+ morphFactor: 1.0,
653
+ chaos: 0.2,
654
+ speed: 1.0,
655
+ hue: 200,
656
+ intensity: 0.7,
657
+ saturation: 0.8,
658
+ dimension: 3.5,
659
+ rot4dXY: 0,
660
+ rot4dXZ: 0,
661
+ rot4dYZ: 0,
662
+ rot4dXW: 0,
663
+ rot4dYW: 0,
664
+ rot4dZW: 0,
665
+ ...parameters
666
+ };
667
+
668
+ return `<!DOCTYPE html>
669
+ <html lang="en">
670
+ <head>
671
+ <meta charset="UTF-8">
672
+ <meta name="viewport" content="width=device-width, initial-scale=1.0">
673
+ <title>${name}</title>
674
+ <style>
675
+ * { margin: 0; padding: 0; box-sizing: border-box; }
676
+ body { background: #000; overflow: hidden; font-family: 'Segoe UI', system-ui, sans-serif; }
677
+ canvas { display: block; width: 100vw; height: 100vh; }
678
+ .info {
679
+ position: fixed;
680
+ bottom: 20px;
681
+ left: 20px;
682
+ background: rgba(0,0,0,0.8);
683
+ border: 1px solid rgba(100,255,150,0.3);
684
+ border-radius: 8px;
685
+ padding: 15px 20px;
686
+ color: #fff;
687
+ font-size: 12px;
688
+ backdrop-filter: blur(10px);
689
+ max-width: 320px;
690
+ }
691
+ .info h3 { color: #64ff96; margin-bottom: 8px; font-size: 14px; }
692
+ .info p { opacity: 0.8; line-height: 1.4; margin-bottom: 8px; }
693
+ .info .meta { font-size: 10px; opacity: 0.6; border-top: 1px solid rgba(255,255,255,0.1); padding-top: 8px; }
694
+ .audio-btn {
695
+ position: fixed;
696
+ top: 20px;
697
+ right: 20px;
698
+ background: rgba(0,0,0,0.8);
699
+ border: 1px solid rgba(100,255,150,0.3);
700
+ border-radius: 8px;
701
+ padding: 10px 15px;
702
+ color: #64ff96;
703
+ cursor: pointer;
704
+ font-size: 12px;
705
+ }
706
+ .audio-btn:hover { background: rgba(100,255,150,0.2); }
707
+ </style>
708
+ </head>
709
+ <body>
710
+ <canvas id="vib3"></canvas>
711
+ <div class="info">
712
+ <h3>${name}</h3>
713
+ <p>${description}</p>
714
+ <div class="meta">
715
+ System: ${system.toUpperCase()}<br>
716
+ Geometry: ${geometry} (${geometry < 8 ? 'Base' : geometry < 16 ? 'Hypersphere' : 'Hypertetra'})<br>
717
+ VIB3+ Export • ${new Date().toLocaleDateString()}
718
+ </div>
719
+ </div>
720
+ <button class="audio-btn" onclick="toggleAudio()">🎵 Enable Audio</button>
721
+
722
+ <script>
723
+ // VIB3+ Exported Visualization
724
+ // System: ${system}
725
+ // Generated: ${new Date().toISOString()}
726
+
727
+ const CONFIG = {
728
+ system: '${system}',
729
+ geometry: ${geometry},
730
+ params: ${JSON.stringify(params, null, 2)},
731
+ reactivity: ${JSON.stringify(reactivity, null, 2)}
732
+ };
733
+
734
+ const canvas = document.getElementById('vib3');
735
+ const gl = canvas.getContext('webgl') || canvas.getContext('experimental-webgl');
736
+
737
+ if (!gl) {
738
+ document.body.innerHTML = '<div style="color:#64ff96;padding:40px;text-align:center;"><h2>WebGL Required</h2><p>Please enable WebGL to view this visualization.</p></div>';
739
+ throw new Error('WebGL not supported');
740
+ }
741
+
742
+ // Compile shaders
743
+ function createShader(type, source) {
744
+ const shader = gl.createShader(type);
745
+ gl.shaderSource(shader, source);
746
+ gl.compileShader(shader);
747
+ if (!gl.getShaderParameter(shader, gl.COMPILE_STATUS)) {
748
+ console.error('Shader error:', gl.getShaderInfoLog(shader));
749
+ return null;
750
+ }
751
+ return shader;
752
+ }
753
+
754
+ const vs = createShader(gl.VERTEX_SHADER, \`${vertexShader}\`);
755
+ const fs = createShader(gl.FRAGMENT_SHADER, \`${fragmentShader}\`);
756
+
757
+ const program = gl.createProgram();
758
+ gl.attachShader(program, vs);
759
+ gl.attachShader(program, fs);
760
+ gl.linkProgram(program);
761
+
762
+ if (!gl.getProgramParameter(program, gl.LINK_STATUS)) {
763
+ console.error('Link error:', gl.getProgramInfoLog(program));
764
+ }
765
+
766
+ gl.useProgram(program);
767
+
768
+ // Fullscreen quad
769
+ const positions = new Float32Array([-1,-1, 1,-1, -1,1, 1,1]);
770
+ const buffer = gl.createBuffer();
771
+ gl.bindBuffer(gl.ARRAY_BUFFER, buffer);
772
+ gl.bufferData(gl.ARRAY_BUFFER, positions, gl.STATIC_DRAW);
773
+
774
+ const posLoc = gl.getAttribLocation(program, 'a_position');
775
+ gl.enableVertexAttribArray(posLoc);
776
+ gl.vertexAttribPointer(posLoc, 2, gl.FLOAT, false, 0, 0);
777
+
778
+ // Get uniform locations
779
+ const uniforms = {};
780
+ const uniformNames = [
781
+ 'u_time', 'u_resolution', 'u_mouse', 'u_geometry',
782
+ 'u_gridDensity', 'u_morphFactor', 'u_chaos', 'u_speed',
783
+ 'u_hue', 'u_intensity', 'u_saturation', 'u_dimension',
784
+ 'u_rot4dXY', 'u_rot4dXZ', 'u_rot4dYZ',
785
+ 'u_rot4dXW', 'u_rot4dYW', 'u_rot4dZW',
786
+ 'u_mouseIntensity', 'u_clickIntensity',
787
+ 'u_bass', 'u_mid', 'u_high'
788
+ ];
789
+ uniformNames.forEach(name => {
790
+ uniforms[name] = gl.getUniformLocation(program, name);
791
+ });
792
+
793
+ // State
794
+ let mouseX = 0.5, mouseY = 0.5, mouseIntensity = 0, clickIntensity = 0;
795
+ let bass = 0, mid = 0, high = 0;
796
+ let audioContext, analyser, dataArray, audioEnabled = false;
797
+ const startTime = performance.now();
798
+
799
+ // Mouse tracking
800
+ document.addEventListener('mousemove', e => {
801
+ mouseX = e.clientX / window.innerWidth;
802
+ mouseY = 1 - e.clientY / window.innerHeight;
803
+ mouseIntensity = Math.min(1, mouseIntensity + 0.1);
804
+ });
805
+ document.addEventListener('click', () => {
806
+ clickIntensity = 1;
807
+ });
808
+
809
+ // Audio setup
810
+ window.toggleAudio = async function() {
811
+ if (audioEnabled) {
812
+ audioEnabled = false;
813
+ document.querySelector('.audio-btn').textContent = '🎵 Enable Audio';
814
+ return;
815
+ }
816
+
817
+ try {
818
+ const stream = await navigator.mediaDevices.getUserMedia({ audio: true });
819
+ audioContext = new AudioContext();
820
+ analyser = audioContext.createAnalyser();
821
+ analyser.fftSize = 256;
822
+ const source = audioContext.createMediaStreamSource(stream);
823
+ source.connect(analyser);
824
+ dataArray = new Uint8Array(analyser.frequencyBinCount);
825
+ audioEnabled = true;
826
+ document.querySelector('.audio-btn').textContent = '🔊 Audio Active';
827
+ } catch (e) {
828
+ console.log('Audio not available:', e);
829
+ alert('Could not access microphone');
830
+ }
831
+ };
832
+
833
+ function updateAudio() {
834
+ if (!audioEnabled || !analyser) return;
835
+ analyser.getByteFrequencyData(dataArray);
836
+
837
+ // Bass: 0-8, Mid: 8-32, High: 32-64
838
+ let bassSum = 0, midSum = 0, highSum = 0;
839
+ for (let i = 0; i < 8; i++) bassSum += dataArray[i];
840
+ for (let i = 8; i < 32; i++) midSum += dataArray[i];
841
+ for (let i = 32; i < 64; i++) highSum += dataArray[i];
842
+
843
+ bass = (bassSum / 8 / 255) * (CONFIG.reactivity?.audio?.sensitivity || 1);
844
+ mid = (midSum / 24 / 255) * (CONFIG.reactivity?.audio?.sensitivity || 1);
845
+ high = (highSum / 32 / 255) * (CONFIG.reactivity?.audio?.sensitivity || 1);
846
+ }
847
+
848
+ // Resize
849
+ function resize() {
850
+ const dpr = Math.min(window.devicePixelRatio, 2);
851
+ canvas.width = window.innerWidth * dpr;
852
+ canvas.height = window.innerHeight * dpr;
853
+ gl.viewport(0, 0, canvas.width, canvas.height);
854
+ }
855
+ window.addEventListener('resize', resize);
856
+ resize();
857
+
858
+ // Render loop
859
+ function render() {
860
+ const time = performance.now() - startTime;
861
+
862
+ updateAudio();
863
+ mouseIntensity *= 0.95;
864
+ clickIntensity *= 0.92;
865
+
866
+ gl.uniform1f(uniforms.u_time, time);
867
+ gl.uniform2f(uniforms.u_resolution, canvas.width, canvas.height);
868
+ gl.uniform2f(uniforms.u_mouse, mouseX, mouseY);
869
+ gl.uniform1f(uniforms.u_geometry, CONFIG.geometry);
870
+ gl.uniform1f(uniforms.u_gridDensity, CONFIG.params.gridDensity);
871
+ gl.uniform1f(uniforms.u_morphFactor, CONFIG.params.morphFactor);
872
+ gl.uniform1f(uniforms.u_chaos, CONFIG.params.chaos);
873
+ gl.uniform1f(uniforms.u_speed, CONFIG.params.speed);
874
+ gl.uniform1f(uniforms.u_hue, CONFIG.params.hue);
875
+ gl.uniform1f(uniforms.u_intensity, CONFIG.params.intensity);
876
+ gl.uniform1f(uniforms.u_saturation, CONFIG.params.saturation || 0.8);
877
+ gl.uniform1f(uniforms.u_dimension, CONFIG.params.dimension || 3.5);
878
+ gl.uniform1f(uniforms.u_rot4dXY, CONFIG.params.rot4dXY || 0);
879
+ gl.uniform1f(uniforms.u_rot4dXZ, CONFIG.params.rot4dXZ || 0);
880
+ gl.uniform1f(uniforms.u_rot4dYZ, CONFIG.params.rot4dYZ || 0);
881
+ gl.uniform1f(uniforms.u_rot4dXW, CONFIG.params.rot4dXW || 0);
882
+ gl.uniform1f(uniforms.u_rot4dYW, CONFIG.params.rot4dYW || 0);
883
+ gl.uniform1f(uniforms.u_rot4dZW, CONFIG.params.rot4dZW || 0);
884
+ gl.uniform1f(uniforms.u_mouseIntensity, mouseIntensity);
885
+ gl.uniform1f(uniforms.u_clickIntensity, clickIntensity);
886
+ gl.uniform1f(uniforms.u_bass, bass);
887
+ gl.uniform1f(uniforms.u_mid, mid);
888
+ gl.uniform1f(uniforms.u_high, high);
889
+
890
+ gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4);
891
+ requestAnimationFrame(render);
892
+ }
893
+ render();
894
+
895
+ console.log('VIB3+ ${system.toUpperCase()} visualization initialized');
896
+ console.log('Config:', CONFIG);
897
+ </script>
898
+ </body>
899
+ </html>`;
900
+ }
901
+ }
902
+
903
+ export default ShaderExporter;