@vib3code/sdk 2.0.1 → 2.0.3-canary.0a63e71

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 (192) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/DOCS/AGENT_HARNESS_ARCHITECTURE.md +245 -0
  3. package/DOCS/ANDROID_DEPLOYMENT.md +59 -0
  4. package/DOCS/ARCHITECTURE.md +1 -0
  5. package/DOCS/CI_TESTING.md +2 -0
  6. package/DOCS/CLI_ONBOARDING.md +3 -1
  7. package/DOCS/CONTROL_REFERENCE.md +2 -0
  8. package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +119 -0
  9. package/DOCS/ENV_SETUP.md +2 -0
  10. package/DOCS/EPIC_SCROLL_EVENTS.md +775 -0
  11. package/DOCS/EXPANSION_DESIGN.md +979 -0
  12. package/DOCS/EXPANSION_DESIGN_ULTRA.md +389 -0
  13. package/DOCS/EXPORT_FORMATS.md +2 -0
  14. package/DOCS/GPU_DISPOSAL_GUIDE.md +2 -0
  15. package/DOCS/HANDOFF_LANDING_PAGE.md +156 -0
  16. package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +495 -0
  17. package/DOCS/LICENSING_TIERS.md +2 -0
  18. package/DOCS/MASTER_PLAN_2026-01-31.md +4 -2
  19. package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +939 -0
  20. package/DOCS/OBS_SETUP_GUIDE.md +2 -0
  21. package/DOCS/OPTIMIZATION_PLAN_MATH.md +119 -0
  22. package/DOCS/PRODUCT_STRATEGY.md +65 -0
  23. package/DOCS/PROJECT_SETUP.md +2 -0
  24. package/DOCS/README.md +105 -0
  25. package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +99 -0
  26. package/DOCS/RENDERER_LIFECYCLE.md +2 -0
  27. package/DOCS/REPO_MANIFEST.md +2 -0
  28. package/DOCS/ROADMAP.md +113 -0
  29. package/DOCS/SCROLL_TIMELINE_v3.md +271 -0
  30. package/DOCS/SITE_REFACTOR_PLAN.md +102 -0
  31. package/DOCS/STATUS.md +26 -0
  32. package/DOCS/SYSTEM_INVENTORY.md +37 -32
  33. package/DOCS/TELEMETRY_EXPORTS.md +2 -0
  34. package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +87 -0
  35. package/DOCS/VISUAL_ANALYSIS_FACETAD.md +135 -0
  36. package/DOCS/VISUAL_ANALYSIS_SIMONE.md +97 -0
  37. package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +88 -0
  38. package/DOCS/WEBGPU_STATUS.md +121 -38
  39. package/DOCS/XR_BENCHMARKS.md +2 -0
  40. package/DOCS/archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +1 -0
  41. package/DOCS/archive/DEV_TRACK_ANALYSIS.md +1 -0
  42. package/DOCS/archive/DEV_TRACK_PLAN_2026-01-07.md +1 -0
  43. package/DOCS/archive/SESSION_014_PLAN.md +1 -0
  44. package/DOCS/archive/SESSION_LOG_2026-01-07.md +1 -0
  45. package/DOCS/archive/STRATEGIC_BLUEPRINT_2026-01-07.md +1 -0
  46. package/DOCS/archive/SYSTEM_AUDIT_2026-01-30.md +1 -0
  47. package/DOCS/archive/WEBGPU_STATUS_2026-02-15_STALE.md +1 -0
  48. package/DOCS/{DEV_TRACK_SESSION_2026-01-31.md → dev-tracks/DEV_TRACK_SESSION_2026-01-31.md} +3 -1
  49. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +233 -0
  50. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +129 -0
  51. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +144 -0
  52. package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-16.md +110 -0
  53. package/DOCS/dev-tracks/PERF_UPGRADE_2026-02-16.md +310 -0
  54. package/DOCS/dev-tracks/README.md +12 -0
  55. package/README.md +26 -13
  56. package/cpp/CMakeLists.txt +236 -0
  57. package/cpp/bindings/embind.cpp +269 -0
  58. package/cpp/build.sh +129 -0
  59. package/cpp/geometry/Crystal.cpp +103 -0
  60. package/cpp/geometry/Fractal.cpp +136 -0
  61. package/cpp/geometry/GeometryGenerator.cpp +262 -0
  62. package/cpp/geometry/KleinBottle.cpp +71 -0
  63. package/cpp/geometry/Sphere.cpp +134 -0
  64. package/cpp/geometry/Tesseract.cpp +94 -0
  65. package/cpp/geometry/Tetrahedron.cpp +83 -0
  66. package/cpp/geometry/Torus.cpp +65 -0
  67. package/cpp/geometry/WarpFunctions.cpp +238 -0
  68. package/cpp/geometry/Wave.cpp +85 -0
  69. package/cpp/include/vib3_ffi.h +238 -0
  70. package/cpp/math/Mat4x4.cpp +409 -0
  71. package/cpp/math/Mat4x4.hpp +209 -0
  72. package/cpp/math/Projection.cpp +142 -0
  73. package/cpp/math/Projection.hpp +148 -0
  74. package/cpp/math/Rotor4D.cpp +322 -0
  75. package/cpp/math/Rotor4D.hpp +204 -0
  76. package/cpp/math/Vec4.cpp +303 -0
  77. package/cpp/math/Vec4.hpp +225 -0
  78. package/cpp/src/vib3_ffi.cpp +607 -0
  79. package/cpp/tests/Geometry_test.cpp +213 -0
  80. package/cpp/tests/Mat4x4_test.cpp +494 -0
  81. package/cpp/tests/Projection_test.cpp +298 -0
  82. package/cpp/tests/Rotor4D_test.cpp +423 -0
  83. package/cpp/tests/Vec4_test.cpp +489 -0
  84. package/docs/webgpu-live.html +1 -1
  85. package/package.json +41 -30
  86. package/src/agent/index.js +1 -3
  87. package/src/agent/mcp/MCPServer.js +1220 -144
  88. package/src/agent/mcp/index.js +1 -1
  89. package/src/agent/mcp/stdio-server.js +264 -0
  90. package/src/agent/mcp/tools.js +498 -31
  91. package/src/cli/index.js +431 -47
  92. package/src/core/CanvasManager.js +97 -204
  93. package/src/core/ErrorReporter.js +1 -1
  94. package/src/core/Parameters.js +1 -1
  95. package/src/core/VIB3Engine.js +93 -4
  96. package/src/core/VitalitySystem.js +53 -0
  97. package/src/core/index.js +18 -0
  98. package/src/core/renderers/FacetedRendererAdapter.js +10 -9
  99. package/src/core/renderers/HolographicRendererAdapter.js +13 -9
  100. package/src/core/renderers/QuantumRendererAdapter.js +11 -7
  101. package/src/creative/AestheticMapper.js +628 -0
  102. package/src/creative/ChoreographyPlayer.js +481 -0
  103. package/src/creative/index.js +11 -0
  104. package/src/experimental/GameLoop.js +72 -0
  105. package/src/experimental/LatticePhysics.js +100 -0
  106. package/src/experimental/LiveDirector.js +143 -0
  107. package/src/experimental/PlayerController4D.js +154 -0
  108. package/src/experimental/VIB3Actor.js +138 -0
  109. package/src/experimental/VIB3Compositor.js +117 -0
  110. package/src/experimental/VIB3Link.js +122 -0
  111. package/src/experimental/VIB3Orchestrator.js +146 -0
  112. package/src/experimental/VIB3Universe.js +109 -0
  113. package/src/experimental/demos/CrystalLabyrinth.js +202 -0
  114. package/src/export/TradingCardManager.js +3 -4
  115. package/src/export/index.js +11 -1
  116. package/src/faceted/FacetedSystem.js +260 -394
  117. package/src/games/glyph-war/GlyphWarVisualizer.js +641 -0
  118. package/src/geometry/generators/Crystal.js +2 -2
  119. package/src/geometry/warp/HypersphereCore.js +53 -24
  120. package/src/holograms/HolographicVisualizer.js +84 -98
  121. package/src/holograms/RealHolographicSystem.js +194 -43
  122. package/src/math/Mat4x4.js +308 -105
  123. package/src/math/Rotor4D.js +124 -40
  124. package/src/math/Vec4.js +200 -103
  125. package/src/math/index.js +7 -7
  126. package/src/polychora/PolychoraSystem.js +77 -0
  127. package/src/quantum/QuantumEngine.js +103 -66
  128. package/src/quantum/QuantumVisualizer.js +31 -22
  129. package/src/reactivity/index.js +3 -5
  130. package/src/render/LayerPresetManager.js +372 -0
  131. package/src/render/LayerReactivityBridge.js +344 -0
  132. package/src/render/LayerRelationshipGraph.js +610 -0
  133. package/src/render/MultiCanvasBridge.js +148 -25
  134. package/src/render/ShaderLoader.js +38 -0
  135. package/src/render/ShaderProgram.js +4 -4
  136. package/src/render/UnifiedRenderBridge.js +4 -1
  137. package/src/render/backends/WebGPUBackend.js +8 -4
  138. package/src/render/index.js +27 -2
  139. package/src/scene/Node4D.js +74 -24
  140. package/src/scene/index.js +4 -4
  141. package/src/shaders/common/geometry24.glsl +65 -0
  142. package/src/shaders/common/geometry24.wgsl +54 -0
  143. package/src/shaders/common/rotation4d.glsl +4 -4
  144. package/src/shaders/common/rotation4d.wgsl +2 -2
  145. package/src/shaders/common/uniforms.wgsl +15 -8
  146. package/src/shaders/faceted/faceted.frag.glsl +220 -80
  147. package/src/shaders/faceted/faceted.frag.wgsl +144 -90
  148. package/src/shaders/holographic/holographic.frag.glsl +28 -9
  149. package/src/shaders/holographic/holographic.frag.wgsl +112 -41
  150. package/src/shaders/quantum/quantum.frag.glsl +1 -0
  151. package/src/shaders/quantum/quantum.frag.wgsl +6 -4
  152. package/src/testing/ParallelTestFramework.js +2 -2
  153. package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +2 -2
  154. package/src/viewer/GalleryUI.js +17 -0
  155. package/src/viewer/ViewerPortal.js +2 -2
  156. package/src/viewer/index.js +1 -1
  157. package/tools/headless-renderer.js +258 -0
  158. package/tools/shader-sync-verify.js +14 -8
  159. package/tools/site-analysis/all-reports.json +32 -0
  160. package/tools/site-analysis/combined-analysis.md +50 -0
  161. package/tools/site-analyzer.mjs +779 -0
  162. package/tools/visual-catalog/capture.js +276 -0
  163. package/tools/visual-catalog/composite.js +138 -0
  164. package/types/adaptive-sdk.d.ts +204 -5
  165. package/types/agent/cli.d.ts +78 -0
  166. package/types/agent/index.d.ts +18 -0
  167. package/types/agent/mcp.d.ts +87 -0
  168. package/types/agent/telemetry.d.ts +190 -0
  169. package/types/core/VIB3Engine.d.ts +26 -0
  170. package/types/core/index.d.ts +261 -0
  171. package/types/creative/AestheticMapper.d.ts +72 -0
  172. package/types/creative/ChoreographyPlayer.d.ts +96 -0
  173. package/types/creative/index.d.ts +17 -0
  174. package/types/export/index.d.ts +243 -0
  175. package/types/geometry/index.d.ts +164 -0
  176. package/types/math/index.d.ts +214 -0
  177. package/types/render/LayerPresetManager.d.ts +78 -0
  178. package/types/render/LayerReactivityBridge.d.ts +85 -0
  179. package/types/render/LayerRelationshipGraph.d.ts +174 -0
  180. package/types/render/index.d.ts +3 -0
  181. package/types/scene/index.d.ts +204 -0
  182. package/types/systems/index.d.ts +244 -0
  183. package/types/variations/index.d.ts +62 -0
  184. package/types/viewer/index.d.ts +225 -0
  185. package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +0 -34
  186. package/DOCS/DEV_TRACK_ANALYSIS.md +0 -77
  187. package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +0 -42
  188. package/DOCS/SESSION_014_PLAN.md +0 -195
  189. package/DOCS/SESSION_LOG_2026-01-07.md +0 -56
  190. package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +0 -72
  191. package/DOCS/SYSTEM_AUDIT_2026-01-30.md +0 -738
  192. /package/src/viewer/{ReactivityManager.js → ViewerInputHandler.js} +0 -0
@@ -29,136 +29,190 @@ struct VIB3Uniforms {
29
29
  layerScale: f32,
30
30
  layerOpacity: f32,
31
31
  _pad1: f32,
32
- layerColor: vec3<f32>,
32
+ layerColorR: f32,
33
+ layerColorG: f32,
34
+ layerColorB: f32,
33
35
  densityMult: f32,
34
36
  speedMult: f32,
35
- _pad2: vec3<f32>,
37
+ breath: f32,
36
38
  };
37
39
 
38
40
  @group(0) @binding(0) var<uniform> u: VIB3Uniforms;
39
41
 
40
- struct VertexOutput {
41
- @builtin(position) position: vec4<f32>,
42
- @location(0) uv: vec2<f32>,
43
- };
44
-
45
- // ========== 6D Rotation ==========
46
- fn rotateXY(angle: f32) -> mat4x4<f32> {
47
- let c = cos(angle); let s = sin(angle);
42
+ fn rotateXY_w(theta: f32) -> mat4x4<f32> {
43
+ let c = cos(theta); let s = sin(theta);
48
44
  return mat4x4<f32>(
49
45
  vec4<f32>(c, -s, 0.0, 0.0), vec4<f32>(s, c, 0.0, 0.0),
50
46
  vec4<f32>(0.0, 0.0, 1.0, 0.0), vec4<f32>(0.0, 0.0, 0.0, 1.0));
51
47
  }
52
- fn rotateXZ(angle: f32) -> mat4x4<f32> {
53
- let c = cos(angle); let s = sin(angle);
48
+ fn rotateXZ_w(theta: f32) -> mat4x4<f32> {
49
+ let c = cos(theta); let s = sin(theta);
54
50
  return mat4x4<f32>(
55
- vec4<f32>(c, 0.0, -s, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0),
56
- vec4<f32>(s, 0.0, c, 0.0), vec4<f32>(0.0, 0.0, 0.0, 1.0));
51
+ vec4<f32>(c, 0.0, s, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0),
52
+ vec4<f32>(-s, 0.0, c, 0.0), vec4<f32>(0.0, 0.0, 0.0, 1.0));
57
53
  }
58
- fn rotateYZ(angle: f32) -> mat4x4<f32> {
59
- let c = cos(angle); let s = sin(angle);
54
+ fn rotateYZ_w(theta: f32) -> mat4x4<f32> {
55
+ let c = cos(theta); let s = sin(theta);
60
56
  return mat4x4<f32>(
61
57
  vec4<f32>(1.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, c, -s, 0.0),
62
58
  vec4<f32>(0.0, s, c, 0.0), vec4<f32>(0.0, 0.0, 0.0, 1.0));
63
59
  }
64
- fn rotateXW(angle: f32) -> mat4x4<f32> {
65
- let c = cos(angle); let s = sin(angle);
60
+ fn rotateXW_w(theta: f32) -> mat4x4<f32> {
61
+ let c = cos(theta); let s = sin(theta);
66
62
  return mat4x4<f32>(
67
63
  vec4<f32>(c, 0.0, 0.0, -s), vec4<f32>(0.0, 1.0, 0.0, 0.0),
68
64
  vec4<f32>(0.0, 0.0, 1.0, 0.0), vec4<f32>(s, 0.0, 0.0, c));
69
65
  }
70
- fn rotateYW(angle: f32) -> mat4x4<f32> {
71
- let c = cos(angle); let s = sin(angle);
66
+ fn rotateYW_w(theta: f32) -> mat4x4<f32> {
67
+ let c = cos(theta); let s = sin(theta);
72
68
  return mat4x4<f32>(
73
69
  vec4<f32>(1.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, c, 0.0, -s),
74
70
  vec4<f32>(0.0, 0.0, 1.0, 0.0), vec4<f32>(0.0, s, 0.0, c));
75
71
  }
76
- fn rotateZW(angle: f32) -> mat4x4<f32> {
77
- let c = cos(angle); let s = sin(angle);
72
+ fn rotateZW_w(theta: f32) -> mat4x4<f32> {
73
+ let c = cos(theta); let s = sin(theta);
78
74
  return mat4x4<f32>(
79
75
  vec4<f32>(1.0, 0.0, 0.0, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0),
80
76
  vec4<f32>(0.0, 0.0, c, -s), vec4<f32>(0.0, 0.0, s, c));
81
77
  }
82
78
 
83
- fn apply6DRot(pos: vec4<f32>) -> vec4<f32> {
84
- var p = pos;
85
- p = rotateXY(u.rot4dXY + u.time * 0.05) * p;
86
- p = rotateXZ(u.rot4dXZ + u.time * 0.06) * p;
87
- p = rotateYZ(u.rot4dYZ + u.time * 0.04) * p;
88
- p = rotateXW(u.rot4dXW + u.time * 0.07) * p;
89
- p = rotateYW(u.rot4dYW + u.time * 0.08) * p;
90
- p = rotateZW(u.rot4dZW + u.time * 0.09) * p;
91
- return p;
79
+ fn project4Dto3D_w(p: vec4<f32>) -> vec3<f32> {
80
+ let w = 2.5 / (2.5 + p.w);
81
+ return vec3<f32>(p.x * w, p.y * w, p.z * w);
92
82
  }
93
83
 
94
- // ========== 24 Geometry SDFs ==========
95
- fn baseGeom(p: vec4<f32>, t: f32) -> f32 {
96
- if (t < 0.5) {
97
- return max(max(max(abs(p.x + p.y) - p.z, abs(p.x - p.y) - p.z),
98
- abs(p.x + p.y) + p.z), abs(p.x - p.y) + p.z) / sqrt(3.0);
99
- } else if (t < 1.5) {
100
- let q = abs(p) - vec4<f32>(0.8);
101
- return length(max(q, vec4<f32>(0.0))) + min(max(max(max(q.x, q.y), q.z), q.w), 0.0);
102
- } else if (t < 2.5) {
103
- return length(p) - 1.0;
104
- } else if (t < 3.5) {
105
- let t2 = vec2<f32>(length(p.xy) - 0.8, p.z);
106
- return length(t2) - 0.3;
107
- } else if (t < 4.5) {
108
- let r = length(p.xy);
109
- return abs(r - 0.7) - 0.2 + sin(atan2(p.y, p.x) * 3.0 + p.z * 5.0) * 0.1;
110
- } else if (t < 5.5) {
111
- return length(p) - 0.8 + sin(p.x * 5.0) * sin(p.y * 5.0) * sin(p.z * 5.0) * 0.2;
112
- } else if (t < 6.5) {
113
- return abs(p.z - sin(p.x * 5.0 + u.time) * cos(p.y * 5.0 + u.time) * 0.3) - 0.1;
114
- } else {
115
- let q = abs(p);
116
- return max(max(max(q.x, q.y), q.z), q.w) - 0.8;
117
- }
84
+ fn warpHypersphereCore_w(p: vec3<f32>, geomIdx: i32) -> vec3<f32> {
85
+ let radius = length(p);
86
+ let morphBlend = clamp(u.morphFactor * 0.6 + (u.dimension - 3.0) * 0.25, 0.0, 2.0);
87
+ let w = sin(radius * (1.3 + f32(geomIdx) * 0.12) + u.time * 0.0008 * u.speed)
88
+ * (0.4 + morphBlend * 0.45);
89
+ var p4d = vec4<f32>(p * (1.0 + morphBlend * 0.2), w);
90
+ p4d = rotateXY_w(u.rot4dXY) * p4d;
91
+ p4d = rotateXZ_w(u.rot4dXZ) * p4d;
92
+ p4d = rotateYZ_w(u.rot4dYZ) * p4d;
93
+ p4d = rotateXW_w(u.rot4dXW) * p4d;
94
+ p4d = rotateYW_w(u.rot4dYW) * p4d;
95
+ p4d = rotateZW_w(u.rot4dZW) * p4d;
96
+ let proj = project4Dto3D_w(p4d);
97
+ return mix(p, proj, clamp(0.45 + morphBlend * 0.35, 0.0, 1.0));
118
98
  }
119
99
 
120
- fn hypersphereCore(p: vec4<f32>, bt: f32) -> f32 {
121
- return max(baseGeom(p, bt), length(p) - 1.2);
100
+ fn warpHypertetraCore_w(p: vec3<f32>, geomIdx: i32) -> vec3<f32> {
101
+ let c1 = normalize(vec3<f32>(1.0, 1.0, 1.0));
102
+ let c2 = normalize(vec3<f32>(-1.0, -1.0, 1.0));
103
+ let c3 = normalize(vec3<f32>(-1.0, 1.0, -1.0));
104
+ let c4 = normalize(vec3<f32>(1.0, -1.0, -1.0));
105
+ let morphBlend = clamp(u.morphFactor * 0.8 + (u.dimension - 3.0) * 0.2, 0.0, 2.0);
106
+ let basisMix = dot(p, c1) * 0.14 + dot(p, c2) * 0.1 + dot(p, c3) * 0.08;
107
+ let w = sin(basisMix * 5.5 + u.time * 0.0009 * u.speed)
108
+ * cos(dot(p, c4) * 4.2 - u.time * 0.0007 * u.speed)
109
+ * (0.5 + morphBlend * 0.4);
110
+ let offset = vec3<f32>(dot(p, c1), dot(p, c2), dot(p, c3)) * 0.1 * morphBlend;
111
+ var p4d = vec4<f32>(p + offset, w);
112
+ p4d = rotateXY_w(u.rot4dXY) * p4d;
113
+ p4d = rotateXZ_w(u.rot4dXZ) * p4d;
114
+ p4d = rotateYZ_w(u.rot4dYZ) * p4d;
115
+ p4d = rotateXW_w(u.rot4dXW) * p4d;
116
+ p4d = rotateYW_w(u.rot4dYW) * p4d;
117
+ p4d = rotateZW_w(u.rot4dZW) * p4d;
118
+ let proj = project4Dto3D_w(p4d);
119
+ let planeInf = min(min(abs(dot(p, c1)), abs(dot(p, c2))),
120
+ min(abs(dot(p, c3)), abs(dot(p, c4))));
121
+ let blended = mix(p, proj, clamp(0.45 + morphBlend * 0.35, 0.0, 1.0));
122
+ return mix(blended, blended * (1.0 - planeInf * 0.55), 0.2 + morphBlend * 0.2);
122
123
  }
123
124
 
124
- fn hypertetraCore(p: vec4<f32>, bt: f32) -> f32 {
125
- let tf = max(max(max(
126
- abs(p.x + p.y) - p.z - p.w,
127
- abs(p.x - p.y) - p.z + p.w),
128
- abs(p.x + p.y) + p.z - p.w),
129
- abs(p.x - p.y) + p.z + p.w) / sqrt(4.0);
130
- return max(baseGeom(p, bt), tf);
125
+ fn applyCoreWarp_w(p: vec3<f32>, geomType: f32, mouseDelta: vec2<f32>) -> vec3<f32> {
126
+ let coreFloat = floor(geomType / 8.0);
127
+ let coreIndex = i32(clamp(coreFloat, 0.0, 2.0));
128
+ let baseFloat = geomType - floor(geomType / 8.0) * 8.0;
129
+ let geomIdx = i32(clamp(floor(baseFloat + 0.5), 0.0, 7.0));
130
+ if (coreIndex == 1) { return warpHypersphereCore_w(p, geomIdx); }
131
+ if (coreIndex == 2) { return warpHypertetraCore_w(p, geomIdx); }
132
+ return p;
131
133
  }
132
134
 
133
- fn geom(p: vec4<f32>, t: f32) -> f32 {
134
- if (t < 8.0) { return baseGeom(p, t); }
135
- else if (t < 16.0) { return hypersphereCore(p, t - 8.0); }
136
- else { return hypertetraCore(p, t - 16.0); }
135
+ fn geometryFunction_w(p: vec4<f32>) -> f32 {
136
+ let baseFloat = u.geometry - floor(u.geometry / 8.0) * 8.0;
137
+ let gt = i32(clamp(floor(baseFloat + 0.5), 0.0, 7.0));
138
+ let d = u.gridDensity * 0.08;
139
+ if (gt == 0) {
140
+ // Tetrahedron — tetrahedral symmetry planes
141
+ let c1 = normalize(vec3<f32>(1.0, 1.0, 1.0));
142
+ let c2 = normalize(vec3<f32>(-1.0, -1.0, 1.0));
143
+ let c3 = normalize(vec3<f32>(-1.0, 1.0, -1.0));
144
+ let c4 = normalize(vec3<f32>(1.0, -1.0, -1.0));
145
+ let q = fract(p.xyz * d + 0.5) - 0.5;
146
+ let minPlane = min(min(abs(dot(q, c1)), abs(dot(q, c2))),
147
+ min(abs(dot(q, c3)), abs(dot(q, c4))));
148
+ return (1.0 - smoothstep(0.0, 0.05, minPlane)) * u.morphFactor;
149
+ } else if (gt == 1) {
150
+ let pos = fract(p * d); let dist = min(pos, 1.0 - pos);
151
+ return min(min(dist.x, dist.y), min(dist.z, dist.w)) * u.morphFactor;
152
+ } else if (gt == 2) {
153
+ let r = length(p); let sph = abs(fract(r * d) - 0.5) * 2.0;
154
+ let harm = sin(atan2(p.y, p.x) * 3.0) * 0.2;
155
+ return (sph + harm) * u.morphFactor;
156
+ } else if (gt == 3) {
157
+ let r1 = length(p.xy) - 2.0; let tor = length(vec2<f32>(r1, p.z)) - 0.8;
158
+ let lat = sin(p.x * d) * sin(p.y * d);
159
+ return (tor + lat * 0.3) * u.morphFactor;
160
+ } else if (gt == 4) {
161
+ let ua = atan2(p.y, p.x); let va = atan2(p.w, p.z);
162
+ let dist = length(p) - 2.0; let lat = sin(ua * d) * sin(va * d);
163
+ return (dist + lat * 0.4) * u.morphFactor;
164
+ } else if (gt == 5) {
165
+ var pos = fract(p * d); pos = abs(pos * 2.0 - 1.0);
166
+ return length(max(abs(pos) - 1.0, vec4<f32>(0.0))) * u.morphFactor;
167
+ } else if (gt == 6) {
168
+ let t = u.time * 0.001 * u.speed;
169
+ return sin(p.x * d + t) * sin(p.y * d + t * 1.3) * sin(p.z * d * 0.8 + t * 0.7) * u.morphFactor;
170
+ } else {
171
+ let pos = fract(p * d) - 0.5;
172
+ return max(max(abs(pos.x), abs(pos.y)), max(abs(pos.z), abs(pos.w))) * u.morphFactor;
173
+ }
137
174
  }
138
175
 
139
- // ========== Main Fragment ==========
176
+ struct VertexOutput {
177
+ @builtin(position) position: vec4<f32>,
178
+ @location(0) uv: vec2<f32>,
179
+ };
180
+
140
181
  @fragment
141
182
  fn main(input: VertexOutput) -> @location(0) vec4<f32> {
142
183
  let fragCoord = input.position.xy;
143
- var uv2 = (fragCoord - 0.5 * u.resolution) / min(u.resolution.x, u.resolution.y);
144
- uv2 *= 2.0 / u.gridDensity;
145
-
146
- var pos = vec4<f32>(uv2, sin(u.time * 0.3) * 0.5, cos(u.time * 0.2) * 0.5);
147
- pos = apply6DRot(pos);
148
- pos *= u.morphFactor;
149
- pos += vec4<f32>(sin(u.time * 0.1), cos(u.time * 0.15), sin(u.time * 0.12), cos(u.time * 0.18)) * u.chaos;
150
-
151
- let dist = geom(pos, u.geometry);
152
- let edge = smoothstep(0.02, 0.0, abs(dist));
153
- let fill = smoothstep(0.1, 0.0, dist) * 0.3;
154
-
155
- let hueVal = u.hue / 360.0 + dist * 0.2 + u.time * 0.05;
156
- let color = vec3<f32>(
157
- 0.5 + 0.5 * cos(hueVal * 6.28),
158
- 0.5 + 0.5 * cos((hueVal + 0.33) * 6.28),
159
- 0.5 + 0.5 * cos((hueVal + 0.67) * 6.28)
160
- );
161
-
162
- let alpha = (edge + fill) * u.intensity;
163
- return vec4<f32>(color * alpha, alpha);
184
+ let uv2 = (fragCoord - u.resolution * 0.5) / min(u.resolution.x, u.resolution.y);
185
+ let timeSpeed = u.time * 0.0001 * u.speed;
186
+
187
+ var pos = vec4<f32>(uv2 * 3.0, sin(timeSpeed * 3.0), cos(timeSpeed * 2.0));
188
+ pos = vec4<f32>(pos.xy + (vec2<f32>(0.5, 0.5) - 0.5) * u.mouseIntensity * 2.0, pos.z, pos.w);
189
+
190
+ pos = rotateXY_w(u.rot4dXY) * pos;
191
+ pos = rotateXZ_w(u.rot4dXZ) * pos;
192
+ pos = rotateYZ_w(u.rot4dYZ) * pos;
193
+ pos = rotateXW_w(u.rot4dXW) * pos;
194
+ pos = rotateYW_w(u.rot4dYW) * pos;
195
+ pos = rotateZW_w(u.rot4dZW) * pos;
196
+
197
+ let basePoint = project4Dto3D_w(pos);
198
+ let warpedPoint = applyCoreWarp_w(basePoint, u.geometry, vec2<f32>(0.0, 0.0));
199
+ let warpedPos = vec4<f32>(warpedPoint, pos.w);
200
+ var value = geometryFunction_w(warpedPos);
201
+
202
+ let noise = sin(pos.x * 7.0) * cos(pos.y * 11.0) * sin(pos.z * 13.0);
203
+ value += noise * u.chaos;
204
+
205
+ var geomIntensity = 1.0 - clamp(abs(value), 0.0, 1.0);
206
+ geomIntensity += u.clickIntensity * 0.3;
207
+ let finalIntensity = geomIntensity * u.intensity;
208
+
209
+ let hueVal = u.hue / 360.0 + value * 0.1 + u.high * 0.08;
210
+ let baseColor = vec3<f32>(
211
+ sin(hueVal * 6.28318 + 0.0) * 0.5 + 0.5,
212
+ sin(hueVal * 6.28318 + 2.0943) * 0.5 + 0.5,
213
+ sin(hueVal * 6.28318 + 4.1887) * 0.5 + 0.5);
214
+ let gray = (baseColor.r + baseColor.g + baseColor.b) / 3.0;
215
+ let color = mix(vec3<f32>(gray), baseColor, u.saturation) * finalIntensity;
216
+
217
+ return vec4<f32>(color, finalIntensity);
164
218
  }
@@ -9,7 +9,8 @@ uniform vec2 u_resolution;
9
9
  uniform float u_time;
10
10
  uniform vec2 u_mouse;
11
11
  uniform float u_geometry;
12
- uniform float u_density;
12
+ uniform float u_density; // Used by inline visualizer (scaled 0.3-2.5)
13
+ uniform float u_gridDensity; // Used by bridge/external (raw 5-100)
13
14
  uniform float u_speed;
14
15
  uniform vec3 u_color;
15
16
  uniform float u_intensity;
@@ -40,6 +41,9 @@ uniform float u_rot4dXW;
40
41
  uniform float u_rot4dYW;
41
42
  uniform float u_rot4dZW;
42
43
 
44
+ // EXHALE FEATURE: Breathing uniform
45
+ uniform float u_breath;
46
+
43
47
  // 6D rotation matrices - 3D space rotations (XY, XZ, YZ)
44
48
  mat4 rotateXY(float theta) {
45
49
  float c = cos(theta);
@@ -78,9 +82,12 @@ mat4 rotateZW(float theta) {
78
82
  return mat4(1, 0, 0, 0, 0, 1, 0, 0, 0, 0, c, -s, 0, 0, s, c);
79
83
  }
80
84
 
81
- // 4D to 3D projection
85
+ // 4D to 3D projection - BREATHING EFFECT
82
86
  vec3 project4Dto3D(vec4 p) {
83
- float w = 2.5 / (2.5 + p.w);
87
+ // Modulate projection distance with breath for "exhale" effect (expansion/contraction)
88
+ float baseDim = 2.5;
89
+ float dim = baseDim + u_breath * 0.5; // Expands on exhale
90
+ float w = dim / (dim + p.w);
84
91
  return vec3(p.x * w, p.y * w, p.z * w);
85
92
  }
86
93
 
@@ -227,10 +234,10 @@ float torusLattice(vec3 p, float gridSize) {
227
234
 
228
235
  float kleinLattice(vec3 p, float gridSize) {
229
236
  vec3 q = fract(p * gridSize);
230
- float ku = q.x * 2.0 * 3.14159;
231
- float kv = q.y * 2.0 * 3.14159;
232
- float kx = cos(ku) * (3.0 + cos(ku/2.0) * sin(kv) - sin(ku/2.0) * sin(2.0*kv));
233
- float klein = length(vec2(kx, q.z)) - 0.1;
237
+ float u = q.x * 2.0 * 3.14159;
238
+ float v = q.y * 2.0 * 3.14159;
239
+ float x = cos(u) * (3.0 + cos(u/2.0) * sin(v) - sin(u/2.0) * sin(2.0*v));
240
+ float klein = length(vec2(x, q.z)) - 0.1;
234
241
  return 1.0 - smoothstep(0.0, 0.05, abs(klein));
235
242
  }
236
243
 
@@ -345,8 +352,17 @@ void main() {
345
352
 
346
353
  float scrollDensityMod = 1.0 + u_gridDensityShift * 0.3;
347
354
  float audioDensityMod = 1.0 + u_audioDensityBoost * 0.5;
348
- // Controlled density calculation
349
- float baseDensity = u_density * u_roleDensity;
355
+
356
+ // SCALE FIX: Support raw gridDensity (5-100) or pre-scaled density (0.3-2.5)
357
+ float effectiveDensity = u_density;
358
+ if (u_gridDensity > 0.1) {
359
+ // Convert 5-100 to 0.3-2.5
360
+ effectiveDensity = 0.3 + (u_gridDensity - 5.0) / 95.0 * 2.2;
361
+ }
362
+
363
+ float breathDensityMod = 1.0 + u_breath * 0.1;
364
+ float baseDensity = effectiveDensity * u_roleDensity * breathDensityMod;
365
+
350
366
  float densityVariations = (u_densityVariation * 0.3 + (scrollDensityMod - 1.0) * 0.4 + (audioDensityMod - 1.0) * 0.2);
351
367
  float roleDensity = baseDensity + densityVariations;
352
368
 
@@ -357,6 +373,9 @@ void main() {
357
373
  vec3 baseColor = u_color;
358
374
  float latticeIntensity = lattice * u_intensity;
359
375
 
376
+ // Breathing glow effect
377
+ latticeIntensity *= (1.0 + u_breath * 0.2);
378
+
360
379
  // Multi-layer color composition for higher fidelity
361
380
  vec3 color = baseColor * (0.2 + latticeIntensity * 0.8);
362
381
 
@@ -1,6 +1,6 @@
1
1
  // VIB3+ Holographic System Fragment Shader (WGSL)
2
2
  // 5-layer glassmorphic audio-reactive effects
3
- // Port of the GLSL HolographicVisualizer shader
3
+ // Port of the GLSL HolographicVisualizer shader with Exhale feature
4
4
 
5
5
  struct VIB3Uniforms {
6
6
  time: f32,
@@ -29,10 +29,12 @@ struct VIB3Uniforms {
29
29
  layerScale: f32,
30
30
  layerOpacity: f32,
31
31
  _pad1: f32,
32
- layerColor: vec3<f32>,
32
+ layerColorR: f32,
33
+ layerColorG: f32,
34
+ layerColorB: f32,
33
35
  densityMult: f32,
34
36
  speedMult: f32,
35
- _pad2: vec3<f32>,
37
+ breath: f32,
36
38
  };
37
39
 
38
40
  @group(0) @binding(0) var<uniform> u: VIB3Uniforms;
@@ -52,8 +54,8 @@ fn rotateXY(angle: f32) -> mat4x4<f32> {
52
54
  fn rotateXZ(angle: f32) -> mat4x4<f32> {
53
55
  let c = cos(angle); let s = sin(angle);
54
56
  return mat4x4<f32>(
55
- vec4<f32>(c, 0.0, -s, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0),
56
- vec4<f32>(s, 0.0, c, 0.0), vec4<f32>(0.0, 0.0, 0.0, 1.0));
57
+ vec4<f32>(c, 0.0, s, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0),
58
+ vec4<f32>(-s, 0.0, c, 0.0), vec4<f32>(0.0, 0.0, 0.0, 1.0));
57
59
  }
58
60
  fn rotateYZ(angle: f32) -> mat4x4<f32> {
59
61
  let c = cos(angle); let s = sin(angle);
@@ -91,42 +93,91 @@ fn apply6DRot(pos: vec4<f32>) -> vec4<f32> {
91
93
  return p;
92
94
  }
93
95
 
94
- // ========== 24 Geometry SDFs ==========
95
- fn baseGeometry(p: vec4<f32>, t: f32) -> f32 {
96
- if (t < 0.5) {
96
+ // ========== 4D to 3D Projection (Breathing) ==========
97
+ fn project4Dto3D_w(p: vec4<f32>) -> vec3<f32> {
98
+ // Modulate projection with breath
99
+ let baseDim = 2.5;
100
+ let dim = baseDim + u.breath * 0.5;
101
+ let w = dim / (dim + p.w);
102
+ return vec3<f32>(p.x * w, p.y * w, p.z * w);
103
+ }
104
+
105
+ // ========== Polytope Core Warp Functions ==========
106
+ fn warpHypersphereCore_w(p: vec3<f32>, geomIdx: i32) -> vec3<f32> {
107
+ let radius = length(p);
108
+ let morphBlend = clamp(u.morphFactor * 0.6 + 0.3, 0.0, 2.0);
109
+ let w = sin(radius * (1.3 + f32(geomIdx) * 0.12) + u.time * 0.0008 * u.speed)
110
+ * (0.4 + morphBlend * 0.45);
111
+
112
+ var p4d = vec4<f32>(p * (1.0 + morphBlend * 0.2), w);
113
+ p4d = apply6DRot(p4d); // Reuse rotation helper
114
+
115
+ let proj = project4Dto3D_w(p4d);
116
+ return mix(p, proj, clamp(0.45 + morphBlend * 0.35, 0.0, 1.0));
117
+ }
118
+
119
+ fn warpHypertetraCore_w(p: vec3<f32>, geomIdx: i32) -> vec3<f32> {
120
+ let c1 = normalize(vec3<f32>(1.0, 1.0, 1.0));
121
+ let c2 = normalize(vec3<f32>(-1.0, -1.0, 1.0));
122
+ let c3 = normalize(vec3<f32>(-1.0, 1.0, -1.0));
123
+ let c4 = normalize(vec3<f32>(1.0, -1.0, -1.0));
124
+
125
+ let morphBlend = clamp(u.morphFactor * 0.8 + 0.2, 0.0, 2.0);
126
+ let basisMix = dot(p, c1) * 0.14 + dot(p, c2) * 0.1 + dot(p, c3) * 0.08;
127
+ let w = sin(basisMix * 5.5 + u.time * 0.0009 * u.speed)
128
+ * cos(dot(p, c4) * 4.2 - u.time * 0.0007 * u.speed)
129
+ * (0.5 + morphBlend * 0.4);
130
+
131
+ let offset = vec3<f32>(dot(p, c1), dot(p, c2), dot(p, c3)) * 0.1 * morphBlend;
132
+ var p4d = vec4<f32>(p + offset, w);
133
+ p4d = apply6DRot(p4d);
134
+
135
+ let proj = project4Dto3D_w(p4d);
136
+
137
+ let planeInf = min(min(abs(dot(p, c1)), abs(dot(p, c2))),
138
+ min(abs(dot(p, c3)), abs(dot(p, c4))));
139
+ let blended = mix(p, proj, clamp(0.45 + morphBlend * 0.35, 0.0, 1.0));
140
+ return mix(blended, blended * (1.0 - planeInf * 0.55), 0.2 + morphBlend * 0.2);
141
+ }
142
+
143
+ fn applyCoreWarp_w(p: vec3<f32>, geomType: f32) -> vec3<f32> {
144
+ let totalBase = 8.0;
145
+ let coreFloat = floor(geomType / totalBase);
146
+ let coreIndex = i32(clamp(coreFloat, 0.0, 2.0));
147
+ let baseFloat = geomType - floor(geomType / totalBase) * totalBase;
148
+ let geomIdx = i32(clamp(floor(baseFloat + 0.5), 0.0, totalBase - 1.0));
149
+
150
+ if (coreIndex == 1) { return warpHypersphereCore_w(p, geomIdx); }
151
+ if (coreIndex == 2) { return warpHypertetraCore_w(p, geomIdx); }
152
+ return p;
153
+ }
154
+
155
+ // ========== 24 Geometry SDFs (Base 8) ==========
156
+ fn baseGeometry(p: vec3<f32>, t: f32) -> f32 {
157
+ let totalBase = 8.0;
158
+ let baseFloat = t - floor(t / totalBase) * totalBase;
159
+ // We use integer comparison here since WGSL doesn't like float switches
160
+ if (baseFloat < 0.5) { // Tetrahedron
97
161
  return max(max(max(abs(p.x + p.y) - p.z, abs(p.x - p.y) - p.z),
98
162
  abs(p.x + p.y) + p.z), abs(p.x - p.y) + p.z) / sqrt(3.0);
99
- } else if (t < 1.5) {
100
- let q = abs(p) - vec4<f32>(0.8);
101
- return length(max(q, vec4<f32>(0.0))) + min(max(max(max(q.x, q.y), q.z), q.w), 0.0);
102
- } else if (t < 2.5) {
163
+ } else if (baseFloat < 1.5) { // Hypercube (projected)
164
+ let q = abs(p) - vec3<f32>(0.8);
165
+ return length(max(q, vec3<f32>(0.0))) + min(max(max(q.x, q.y), q.z), 0.0);
166
+ } else if (baseFloat < 2.5) { // Sphere
103
167
  return length(p) - 1.0;
104
- } else if (t < 3.5) {
168
+ } else if (baseFloat < 3.5) { // Torus
105
169
  let t2 = vec2<f32>(length(p.xy) - 0.8, p.z);
106
170
  return length(t2) - 0.3;
107
- } else if (t < 4.5) {
171
+ } else if (baseFloat < 4.5) { // Klein
108
172
  let r = length(p.xy);
109
173
  return abs(r - 0.7) - 0.2 + sin(atan2(p.y, p.x) * 3.0 + p.z * 5.0) * 0.1;
110
- } else if (t < 5.5) {
174
+ } else if (baseFloat < 5.5) { // Fractal
111
175
  return length(p) - 0.8 + sin(p.x * 5.0) * sin(p.y * 5.0) * sin(p.z * 5.0) * 0.2;
112
- } else if (t < 6.5) {
176
+ } else if (baseFloat < 6.5) { // Wave
113
177
  return abs(p.z - sin(p.x * 5.0 + u.time) * cos(p.y * 5.0 + u.time) * 0.3) - 0.1;
114
- } else {
178
+ } else { // Crystal
115
179
  let q = abs(p);
116
- return max(max(max(q.x, q.y), q.z), q.w) - 0.8;
117
- }
118
- }
119
-
120
- fn geom(p: vec4<f32>, t: f32) -> f32 {
121
- if (t < 8.0) { return baseGeometry(p, t); }
122
- else if (t < 16.0) { return max(baseGeometry(p, t - 8.0), length(p) - 1.2); }
123
- else {
124
- let tf = max(max(max(
125
- abs(p.x + p.y) - p.z - p.w,
126
- abs(p.x - p.y) - p.z + p.w),
127
- abs(p.x + p.y) + p.z - p.w),
128
- abs(p.x - p.y) + p.z + p.w) / sqrt(4.0);
129
- return max(baseGeometry(p, t - 16.0), tf);
180
+ return max(max(q.x, q.y), q.z) - 0.8;
130
181
  }
131
182
  }
132
183
 
@@ -161,25 +212,45 @@ fn main(input: VertexOutput) -> @location(0) vec4<f32> {
161
212
  let density = u.densityMult;
162
213
  let spd = u.speedMult;
163
214
 
164
- // Create 4D point
165
- var pos = vec4<f32>(uv * 2.0 * density, sin(u.time * 0.3 * spd) * 0.5, cos(u.time * 0.2 * spd) * 0.5);
166
- pos = apply6DRot(pos);
167
- pos *= u.morphFactor;
168
- pos += vec4<f32>(sin(u.time * 0.1), cos(u.time * 0.15), sin(u.time * 0.12), cos(u.time * 0.18)) * u.chaos;
215
+ // Create 4D point (simplified to 3D base + W)
216
+ // SCALE FIX: Apply gridDensity scaling if densityMult is weak?
217
+ // WGSL density logic usually relies on densityMult passed by bridge.
218
+ // But let's apply the same scaling logic just in case:
219
+ var effectiveDensity = density;
220
+ if (u.gridDensity > 0.1 && density < 0.5) {
221
+ effectiveDensity = 0.3 + (u.gridDensity - 5.0) / 95.0 * 2.2;
222
+ }
223
+
224
+ var pos4d = vec4<f32>(uv * 2.0 * effectiveDensity, sin(u.time * 0.3 * spd) * 0.5, cos(u.time * 0.2 * spd) * 0.5);
225
+
226
+ // Rotate
227
+ pos4d = apply6DRot(pos4d);
228
+
229
+ // Project to 3D (with breath)
230
+ let pos3d = project4Dto3D_w(pos4d);
231
+
232
+ // Warp (Polytope logic)
233
+ var warpedPos = applyCoreWarp_w(pos3d, u.geometry);
234
+
235
+ // Apply morph/chaos to warped point
236
+ warpedPos *= u.morphFactor;
237
+ warpedPos += vec3<f32>(sin(u.time * 0.1), cos(u.time * 0.15), sin(u.time * 0.12)) * u.chaos;
238
+
239
+ // Geometry evaluation on warped 3D point
240
+ let dist = baseGeometry(warpedPos, u.geometry);
169
241
 
170
- // Geometry evaluation
171
- let dist = geom(pos, u.geometry);
172
242
  let edge = smoothstep(0.02, 0.0, abs(dist));
173
243
  let fill = smoothstep(0.1, 0.0, dist) * 0.3;
174
244
 
175
245
  // Color from HSL
176
- // colorShift is baked into layerColor; use hue directly
177
246
  let hueVal = u.hue / 360.0;
178
247
  let sat = clamp(u.saturation, 0.0, 1.0);
179
248
  let lightness = clamp(u.intensity, 0.2, 0.8);
180
249
  let color = hslToRgb(hueVal, sat, lightness);
181
250
 
182
- // Final alpha
183
- let alpha = (edge + fill) * u.intensity * u.layerOpacity;
251
+ // Final alpha - modulate with breath
252
+ let breathAlpha = 1.0 + u.breath * 0.2;
253
+ let alpha = (edge + fill) * u.intensity * u.layerOpacity * breathAlpha;
254
+
184
255
  return vec4<f32>(color * alpha, alpha);
185
256
  }
@@ -30,6 +30,7 @@ uniform float u_rot4dZW;
30
30
  uniform float u_mouseIntensity;
31
31
  uniform float u_clickIntensity;
32
32
  uniform float u_roleIntensity;
33
+ uniform float u_breath; // Vitality System exhale (0.0 - 1.0)
33
34
 
34
35
  // 6D rotation matrices - 3D space rotations (XY, XZ, YZ)
35
36
  mat4 rotateXY(float theta) {
@@ -29,10 +29,12 @@ struct VIB3Uniforms {
29
29
  layerScale: f32,
30
30
  layerOpacity: f32,
31
31
  _pad1: f32,
32
- layerColor: vec3<f32>,
32
+ layerColorR: f32,
33
+ layerColorG: f32,
34
+ layerColorB: f32,
33
35
  densityMult: f32,
34
36
  speedMult: f32,
35
- _pad2: vec3<f32>,
37
+ breath: f32,
36
38
  };
37
39
 
38
40
  @group(0) @binding(0) var<uniform> u: VIB3Uniforms;
@@ -52,8 +54,8 @@ fn rotateXY(angle: f32) -> mat4x4<f32> {
52
54
  fn rotateXZ(angle: f32) -> mat4x4<f32> {
53
55
  let c = cos(angle); let s = sin(angle);
54
56
  return mat4x4<f32>(
55
- vec4<f32>(c, 0.0, -s, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0),
56
- vec4<f32>(s, 0.0, c, 0.0), vec4<f32>(0.0, 0.0, 0.0, 1.0));
57
+ vec4<f32>(c, 0.0, s, 0.0), vec4<f32>(0.0, 1.0, 0.0, 0.0),
58
+ vec4<f32>(-s, 0.0, c, 0.0), vec4<f32>(0.0, 0.0, 0.0, 1.0));
57
59
  }
58
60
  fn rotateYZ(angle: f32) -> mat4x4<f32> {
59
61
  let c = cos(angle); let s = sin(angle);
@@ -151,8 +151,8 @@ export class ParallelTestFramework {
151
151
  // Create system instance based on type
152
152
  switch (testSpec.system) {
153
153
  case 'faceted':
154
- const { VIB34DIntegratedEngine } = await import('../core/Engine.js');
155
- testSystem = new VIB34DIntegratedEngine();
154
+ const { VIB3Engine } = await import('../core/VIB3Engine.js');
155
+ testSystem = new VIB3Engine();
156
156
  break;
157
157
  case 'quantum':
158
158
  const { QuantumEngine } = await import('../quantum/QuantumEngine.js');
@@ -546,9 +546,9 @@ fn rotateXZ(angle: f32) -> mat4x4<f32> {
546
546
  let c = cos(angle);
547
547
  let s = sin(angle);
548
548
  return mat4x4<f32>(
549
- vec4<f32>(c, 0.0, -s, 0.0),
549
+ vec4<f32>( c, 0.0, s, 0.0),
550
550
  vec4<f32>(0.0, 1.0, 0.0, 0.0),
551
- vec4<f32>(s, 0.0, c, 0.0),
551
+ vec4<f32>(-s, 0.0, c, 0.0),
552
552
  vec4<f32>(0.0, 0.0, 0.0, 1.0)
553
553
  );
554
554
  }
@@ -749,6 +749,23 @@ export class GalleryUI extends EventEmitter {
749
749
  this.render();
750
750
  }
751
751
 
752
+ /**
753
+ * Handle search input
754
+ */
755
+ _onSearch(event) {
756
+ this.searchQuery = event.target.value;
757
+ this._applyFilters();
758
+ this.render();
759
+ }
760
+
761
+ /**
762
+ * Handle page change
763
+ */
764
+ _onPageChange(page) {
765
+ this.currentPage = page;
766
+ this.render();
767
+ }
768
+
752
769
  /**
753
770
  * Handle variation hover
754
771
  */