@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.
- package/CHANGELOG.md +36 -0
- package/DOCS/AGENT_HARNESS_ARCHITECTURE.md +245 -0
- package/DOCS/ANDROID_DEPLOYMENT.md +59 -0
- package/DOCS/ARCHITECTURE.md +1 -0
- package/DOCS/CI_TESTING.md +2 -0
- package/DOCS/CLI_ONBOARDING.md +3 -1
- package/DOCS/CONTROL_REFERENCE.md +2 -0
- package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +119 -0
- package/DOCS/ENV_SETUP.md +2 -0
- package/DOCS/EPIC_SCROLL_EVENTS.md +775 -0
- package/DOCS/EXPANSION_DESIGN.md +979 -0
- package/DOCS/EXPANSION_DESIGN_ULTRA.md +389 -0
- package/DOCS/EXPORT_FORMATS.md +2 -0
- package/DOCS/GPU_DISPOSAL_GUIDE.md +2 -0
- package/DOCS/HANDOFF_LANDING_PAGE.md +156 -0
- package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +495 -0
- package/DOCS/LICENSING_TIERS.md +2 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +4 -2
- package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +939 -0
- package/DOCS/OBS_SETUP_GUIDE.md +2 -0
- package/DOCS/OPTIMIZATION_PLAN_MATH.md +119 -0
- package/DOCS/PRODUCT_STRATEGY.md +65 -0
- package/DOCS/PROJECT_SETUP.md +2 -0
- package/DOCS/README.md +105 -0
- package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +99 -0
- package/DOCS/RENDERER_LIFECYCLE.md +2 -0
- package/DOCS/REPO_MANIFEST.md +2 -0
- package/DOCS/ROADMAP.md +113 -0
- package/DOCS/SCROLL_TIMELINE_v3.md +271 -0
- package/DOCS/SITE_REFACTOR_PLAN.md +102 -0
- package/DOCS/STATUS.md +26 -0
- package/DOCS/SYSTEM_INVENTORY.md +37 -32
- package/DOCS/TELEMETRY_EXPORTS.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +87 -0
- package/DOCS/VISUAL_ANALYSIS_FACETAD.md +135 -0
- package/DOCS/VISUAL_ANALYSIS_SIMONE.md +97 -0
- package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +88 -0
- package/DOCS/WEBGPU_STATUS.md +121 -38
- package/DOCS/XR_BENCHMARKS.md +2 -0
- package/DOCS/archive/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +1 -0
- package/DOCS/archive/DEV_TRACK_ANALYSIS.md +1 -0
- package/DOCS/archive/DEV_TRACK_PLAN_2026-01-07.md +1 -0
- package/DOCS/archive/SESSION_014_PLAN.md +1 -0
- package/DOCS/archive/SESSION_LOG_2026-01-07.md +1 -0
- package/DOCS/archive/STRATEGIC_BLUEPRINT_2026-01-07.md +1 -0
- package/DOCS/archive/SYSTEM_AUDIT_2026-01-30.md +1 -0
- package/DOCS/archive/WEBGPU_STATUS_2026-02-15_STALE.md +1 -0
- package/DOCS/{DEV_TRACK_SESSION_2026-01-31.md → dev-tracks/DEV_TRACK_SESSION_2026-01-31.md} +3 -1
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +233 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +129 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-15.md +144 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-16.md +110 -0
- package/DOCS/dev-tracks/PERF_UPGRADE_2026-02-16.md +310 -0
- package/DOCS/dev-tracks/README.md +12 -0
- package/README.md +26 -13
- package/cpp/CMakeLists.txt +236 -0
- package/cpp/bindings/embind.cpp +269 -0
- package/cpp/build.sh +129 -0
- package/cpp/geometry/Crystal.cpp +103 -0
- package/cpp/geometry/Fractal.cpp +136 -0
- package/cpp/geometry/GeometryGenerator.cpp +262 -0
- package/cpp/geometry/KleinBottle.cpp +71 -0
- package/cpp/geometry/Sphere.cpp +134 -0
- package/cpp/geometry/Tesseract.cpp +94 -0
- package/cpp/geometry/Tetrahedron.cpp +83 -0
- package/cpp/geometry/Torus.cpp +65 -0
- package/cpp/geometry/WarpFunctions.cpp +238 -0
- package/cpp/geometry/Wave.cpp +85 -0
- package/cpp/include/vib3_ffi.h +238 -0
- package/cpp/math/Mat4x4.cpp +409 -0
- package/cpp/math/Mat4x4.hpp +209 -0
- package/cpp/math/Projection.cpp +142 -0
- package/cpp/math/Projection.hpp +148 -0
- package/cpp/math/Rotor4D.cpp +322 -0
- package/cpp/math/Rotor4D.hpp +204 -0
- package/cpp/math/Vec4.cpp +303 -0
- package/cpp/math/Vec4.hpp +225 -0
- package/cpp/src/vib3_ffi.cpp +607 -0
- package/cpp/tests/Geometry_test.cpp +213 -0
- package/cpp/tests/Mat4x4_test.cpp +494 -0
- package/cpp/tests/Projection_test.cpp +298 -0
- package/cpp/tests/Rotor4D_test.cpp +423 -0
- package/cpp/tests/Vec4_test.cpp +489 -0
- package/docs/webgpu-live.html +1 -1
- package/package.json +41 -30
- package/src/agent/index.js +1 -3
- package/src/agent/mcp/MCPServer.js +1220 -144
- package/src/agent/mcp/index.js +1 -1
- package/src/agent/mcp/stdio-server.js +264 -0
- package/src/agent/mcp/tools.js +498 -31
- package/src/cli/index.js +431 -47
- package/src/core/CanvasManager.js +97 -204
- package/src/core/ErrorReporter.js +1 -1
- package/src/core/Parameters.js +1 -1
- package/src/core/VIB3Engine.js +93 -4
- package/src/core/VitalitySystem.js +53 -0
- package/src/core/index.js +18 -0
- package/src/core/renderers/FacetedRendererAdapter.js +10 -9
- package/src/core/renderers/HolographicRendererAdapter.js +13 -9
- package/src/core/renderers/QuantumRendererAdapter.js +11 -7
- package/src/creative/AestheticMapper.js +628 -0
- package/src/creative/ChoreographyPlayer.js +481 -0
- package/src/creative/index.js +11 -0
- package/src/experimental/GameLoop.js +72 -0
- package/src/experimental/LatticePhysics.js +100 -0
- package/src/experimental/LiveDirector.js +143 -0
- package/src/experimental/PlayerController4D.js +154 -0
- package/src/experimental/VIB3Actor.js +138 -0
- package/src/experimental/VIB3Compositor.js +117 -0
- package/src/experimental/VIB3Link.js +122 -0
- package/src/experimental/VIB3Orchestrator.js +146 -0
- package/src/experimental/VIB3Universe.js +109 -0
- package/src/experimental/demos/CrystalLabyrinth.js +202 -0
- package/src/export/TradingCardManager.js +3 -4
- package/src/export/index.js +11 -1
- package/src/faceted/FacetedSystem.js +260 -394
- package/src/games/glyph-war/GlyphWarVisualizer.js +641 -0
- package/src/geometry/generators/Crystal.js +2 -2
- package/src/geometry/warp/HypersphereCore.js +53 -24
- package/src/holograms/HolographicVisualizer.js +84 -98
- package/src/holograms/RealHolographicSystem.js +194 -43
- package/src/math/Mat4x4.js +308 -105
- package/src/math/Rotor4D.js +124 -40
- package/src/math/Vec4.js +200 -103
- package/src/math/index.js +7 -7
- package/src/polychora/PolychoraSystem.js +77 -0
- package/src/quantum/QuantumEngine.js +103 -66
- package/src/quantum/QuantumVisualizer.js +31 -22
- package/src/reactivity/index.js +3 -5
- package/src/render/LayerPresetManager.js +372 -0
- package/src/render/LayerReactivityBridge.js +344 -0
- package/src/render/LayerRelationshipGraph.js +610 -0
- package/src/render/MultiCanvasBridge.js +148 -25
- package/src/render/ShaderLoader.js +38 -0
- package/src/render/ShaderProgram.js +4 -4
- package/src/render/UnifiedRenderBridge.js +4 -1
- package/src/render/backends/WebGPUBackend.js +8 -4
- package/src/render/index.js +27 -2
- package/src/scene/Node4D.js +74 -24
- package/src/scene/index.js +4 -4
- package/src/shaders/common/geometry24.glsl +65 -0
- package/src/shaders/common/geometry24.wgsl +54 -0
- package/src/shaders/common/rotation4d.glsl +4 -4
- package/src/shaders/common/rotation4d.wgsl +2 -2
- package/src/shaders/common/uniforms.wgsl +15 -8
- package/src/shaders/faceted/faceted.frag.glsl +220 -80
- package/src/shaders/faceted/faceted.frag.wgsl +144 -90
- package/src/shaders/holographic/holographic.frag.glsl +28 -9
- package/src/shaders/holographic/holographic.frag.wgsl +112 -41
- package/src/shaders/quantum/quantum.frag.glsl +1 -0
- package/src/shaders/quantum/quantum.frag.wgsl +6 -4
- package/src/testing/ParallelTestFramework.js +2 -2
- package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +2 -2
- package/src/viewer/GalleryUI.js +17 -0
- package/src/viewer/ViewerPortal.js +2 -2
- package/src/viewer/index.js +1 -1
- package/tools/headless-renderer.js +258 -0
- package/tools/shader-sync-verify.js +14 -8
- package/tools/site-analysis/all-reports.json +32 -0
- package/tools/site-analysis/combined-analysis.md +50 -0
- package/tools/site-analyzer.mjs +779 -0
- package/tools/visual-catalog/capture.js +276 -0
- package/tools/visual-catalog/composite.js +138 -0
- package/types/adaptive-sdk.d.ts +204 -5
- package/types/agent/cli.d.ts +78 -0
- package/types/agent/index.d.ts +18 -0
- package/types/agent/mcp.d.ts +87 -0
- package/types/agent/telemetry.d.ts +190 -0
- package/types/core/VIB3Engine.d.ts +26 -0
- package/types/core/index.d.ts +261 -0
- package/types/creative/AestheticMapper.d.ts +72 -0
- package/types/creative/ChoreographyPlayer.d.ts +96 -0
- package/types/creative/index.d.ts +17 -0
- package/types/export/index.d.ts +243 -0
- package/types/geometry/index.d.ts +164 -0
- package/types/math/index.d.ts +214 -0
- package/types/render/LayerPresetManager.d.ts +78 -0
- package/types/render/LayerReactivityBridge.d.ts +85 -0
- package/types/render/LayerRelationshipGraph.d.ts +174 -0
- package/types/render/index.d.ts +3 -0
- package/types/scene/index.d.ts +204 -0
- package/types/systems/index.d.ts +244 -0
- package/types/variations/index.d.ts +62 -0
- package/types/viewer/index.d.ts +225 -0
- package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +0 -34
- package/DOCS/DEV_TRACK_ANALYSIS.md +0 -77
- package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +0 -42
- package/DOCS/SESSION_014_PLAN.md +0 -195
- package/DOCS/SESSION_LOG_2026-01-07.md +0 -56
- package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +0 -72
- package/DOCS/SYSTEM_AUDIT_2026-01-30.md +0 -738
- /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
|
-
|
|
32
|
+
layerColorR: f32,
|
|
33
|
+
layerColorG: f32,
|
|
34
|
+
layerColorB: f32,
|
|
33
35
|
densityMult: f32,
|
|
34
36
|
speedMult: f32,
|
|
35
|
-
|
|
37
|
+
breath: f32,
|
|
36
38
|
};
|
|
37
39
|
|
|
38
40
|
@group(0) @binding(0) var<uniform> u: VIB3Uniforms;
|
|
39
41
|
|
|
40
|
-
|
|
41
|
-
|
|
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
|
|
53
|
-
let c = cos(
|
|
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,
|
|
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
|
|
59
|
-
let c = cos(
|
|
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
|
|
65
|
-
let c = cos(
|
|
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
|
|
71
|
-
let c = cos(
|
|
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
|
|
77
|
-
let c = cos(
|
|
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
|
|
84
|
-
|
|
85
|
-
|
|
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
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
|
|
107
|
-
|
|
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
|
|
121
|
-
|
|
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
|
|
125
|
-
let
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
return
|
|
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
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
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
|
-
|
|
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
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
var pos = vec4<f32>(uv2, sin(
|
|
147
|
-
pos =
|
|
148
|
-
|
|
149
|
-
pos
|
|
150
|
-
|
|
151
|
-
|
|
152
|
-
|
|
153
|
-
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
let
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
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
|
-
|
|
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
|
|
231
|
-
float
|
|
232
|
-
float
|
|
233
|
-
float klein = length(vec2(
|
|
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
|
-
|
|
349
|
-
|
|
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
|
-
|
|
32
|
+
layerColorR: f32,
|
|
33
|
+
layerColorG: f32,
|
|
34
|
+
layerColorB: f32,
|
|
33
35
|
densityMult: f32,
|
|
34
36
|
speedMult: f32,
|
|
35
|
-
|
|
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,
|
|
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
|
-
// ==========
|
|
95
|
-
fn
|
|
96
|
-
|
|
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 (
|
|
100
|
-
let q = abs(p) -
|
|
101
|
-
return length(max(q,
|
|
102
|
-
} else if (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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 (
|
|
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(
|
|
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
|
-
|
|
166
|
-
|
|
167
|
-
|
|
168
|
-
|
|
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
|
|
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
|
-
|
|
32
|
+
layerColorR: f32,
|
|
33
|
+
layerColorG: f32,
|
|
34
|
+
layerColorB: f32,
|
|
33
35
|
densityMult: f32,
|
|
34
36
|
speedMult: f32,
|
|
35
|
-
|
|
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,
|
|
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 {
|
|
155
|
-
testSystem = new
|
|
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,
|
|
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
|
}
|
package/src/viewer/GalleryUI.js
CHANGED
|
@@ -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
|
*/
|