@vib3code/sdk 2.0.3-canary.91a95f3 → 2.0.3-canary.98b84da
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/DOCS/AGENT_HARNESS_ARCHITECTURE.md +2 -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 +2 -0
- package/DOCS/CONTROL_REFERENCE.md +2 -0
- package/DOCS/CROSS_SITE_DESIGN_PATTERNS.md +2 -0
- package/DOCS/ENV_SETUP.md +2 -0
- package/DOCS/EPIC_SCROLL_EVENTS.md +2 -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 +2 -0
- package/DOCS/HANDOFF_SDK_DEVELOPMENT.md +2 -0
- package/DOCS/LICENSING_TIERS.md +2 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +4 -2
- package/DOCS/MULTIVIZ_CHOREOGRAPHY_PATTERNS.md +3 -1
- package/DOCS/OBS_SETUP_GUIDE.md +2 -0
- package/DOCS/OPTIMIZATION_PLAN_MATH.md +119 -0
- package/DOCS/PRODUCT_STRATEGY.md +2 -0
- package/DOCS/PROJECT_SETUP.md +2 -0
- package/DOCS/README.md +5 -3
- package/DOCS/REFERENCE_SCROLL_ANALYSIS.md +2 -0
- package/DOCS/RENDERER_LIFECYCLE.md +2 -0
- package/DOCS/REPO_MANIFEST.md +2 -0
- package/DOCS/ROADMAP.md +2 -0
- package/DOCS/SCROLL_TIMELINE_v3.md +2 -0
- package/DOCS/SITE_REFACTOR_PLAN.md +2 -0
- package/DOCS/STATUS.md +2 -0
- package/DOCS/SYSTEM_INVENTORY.md +4 -2
- package/DOCS/TELEMETRY_EXPORTS.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_CLICKERSS.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_FACETAD.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_SIMONE.md +2 -0
- package/DOCS/VISUAL_ANALYSIS_TABLESIDE.md +2 -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 -34
- package/DOCS/archive/DEV_TRACK_ANALYSIS.md +1 -80
- package/DOCS/archive/DEV_TRACK_PLAN_2026-01-07.md +1 -42
- package/DOCS/archive/SESSION_014_PLAN.md +1 -195
- package/DOCS/archive/SESSION_LOG_2026-01-07.md +1 -56
- package/DOCS/archive/STRATEGIC_BLUEPRINT_2026-01-07.md +1 -72
- package/DOCS/archive/SYSTEM_AUDIT_2026-01-30.md +1 -741
- package/DOCS/archive/WEBGPU_STATUS_2026-02-15_STALE.md +1 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-01-31.md +2 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-06.md +2 -0
- package/DOCS/dev-tracks/DEV_TRACK_SESSION_2026-02-13.md +15 -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 +2 -0
- package/docs/webgpu-live.html +1 -1
- package/package.json +11 -4
- package/src/agent/index.js +1 -3
- package/src/agent/mcp/MCPServer.js +542 -188
- package/src/agent/mcp/index.js +1 -1
- package/src/agent/mcp/tools.js +132 -32
- package/src/cli/index.js +431 -47
- package/src/core/VIB3Engine.js +55 -3
- package/src/core/index.js +18 -0
- package/src/core/renderers/FacetedRendererAdapter.js +10 -9
- package/src/core/renderers/HolographicRendererAdapter.js +11 -7
- package/src/core/renderers/QuantumRendererAdapter.js +11 -7
- 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/SVGExporter.js +9 -5
- package/src/export/index.js +11 -1
- package/src/faceted/FacetedSystem.js +27 -10
- 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 +58 -89
- package/src/holograms/RealHolographicSystem.js +126 -31
- package/src/math/Mat4x4.js +372 -140
- package/src/math/Projection.js +39 -4
- package/src/math/Rotor4D.js +157 -67
- package/src/math/Vec4.js +265 -111
- package/src/math/index.js +7 -7
- package/src/quantum/QuantumVisualizer.js +24 -20
- 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 +1 -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.wgsl +19 -6
- package/src/shaders/holographic/holographic.frag.wgsl +7 -5
- package/src/shaders/quantum/quantum.frag.wgsl +7 -5
- package/src/testing/ParallelTestFramework.js +2 -2
- package/src/testing/ProjectionClass.test.js +38 -0
- 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/tools/shader-sync-verify.js +6 -4
- package/tools/update_projection.py +109 -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
|
@@ -47,6 +47,60 @@ fn hypertetrahedronCore(p: vec4<f32>, baseType: f32) -> f32 {
|
|
|
47
47
|
return max(baseGeometry(p, baseType), tf);
|
|
48
48
|
}
|
|
49
49
|
|
|
50
|
+
// ── Polytope Core Warp Functions ──
|
|
51
|
+
// Requires: rotation functions from rotation4d.wgsl and u: VIB3Uniforms
|
|
52
|
+
|
|
53
|
+
fn warpHypersphereCore_common(p: vec3<f32>, geomIdx: i32) -> vec3<f32> {
|
|
54
|
+
let radius = length(p);
|
|
55
|
+
let morphBlend = clamp(u.morphFactor * 0.6 + (u.dimension - 3.0) * 0.25, 0.0, 2.0);
|
|
56
|
+
let w = sin(radius * (1.3 + f32(geomIdx) * 0.12) + u.time * 0.0008 * u.speed)
|
|
57
|
+
* (0.4 + morphBlend * 0.45);
|
|
58
|
+
var p4d = vec4<f32>(p * (1.0 + morphBlend * 0.2), w);
|
|
59
|
+
p4d = rotateXY(u.rot4dXY) * p4d;
|
|
60
|
+
p4d = rotateXZ(u.rot4dXZ) * p4d;
|
|
61
|
+
p4d = rotateYZ(u.rot4dYZ) * p4d;
|
|
62
|
+
p4d = rotateXW(u.rot4dXW) * p4d;
|
|
63
|
+
p4d = rotateYW(u.rot4dYW) * p4d;
|
|
64
|
+
p4d = rotateZW(u.rot4dZW) * p4d;
|
|
65
|
+
let proj = project4Dto3D(p4d);
|
|
66
|
+
return mix(p, proj, clamp(0.45 + morphBlend * 0.35, 0.0, 1.0));
|
|
67
|
+
}
|
|
68
|
+
|
|
69
|
+
fn warpHypertetraCore_common(p: vec3<f32>, geomIdx: i32) -> vec3<f32> {
|
|
70
|
+
let c1 = normalize(vec3<f32>(1.0, 1.0, 1.0));
|
|
71
|
+
let c2 = normalize(vec3<f32>(-1.0, -1.0, 1.0));
|
|
72
|
+
let c3 = normalize(vec3<f32>(-1.0, 1.0, -1.0));
|
|
73
|
+
let c4 = normalize(vec3<f32>(1.0, -1.0, -1.0));
|
|
74
|
+
let morphBlend = clamp(u.morphFactor * 0.8 + (u.dimension - 3.0) * 0.2, 0.0, 2.0);
|
|
75
|
+
let basisMix = dot(p, c1) * 0.14 + dot(p, c2) * 0.1 + dot(p, c3) * 0.08;
|
|
76
|
+
let w = sin(basisMix * 5.5 + u.time * 0.0009 * u.speed)
|
|
77
|
+
* cos(dot(p, c4) * 4.2 - u.time * 0.0007 * u.speed)
|
|
78
|
+
* (0.5 + morphBlend * 0.4);
|
|
79
|
+
let offset = vec3<f32>(dot(p, c1), dot(p, c2), dot(p, c3)) * 0.1 * morphBlend;
|
|
80
|
+
var p4d = vec4<f32>(p + offset, w);
|
|
81
|
+
p4d = rotateXY(u.rot4dXY) * p4d;
|
|
82
|
+
p4d = rotateXZ(u.rot4dXZ) * p4d;
|
|
83
|
+
p4d = rotateYZ(u.rot4dYZ) * p4d;
|
|
84
|
+
p4d = rotateXW(u.rot4dXW) * p4d;
|
|
85
|
+
p4d = rotateYW(u.rot4dYW) * p4d;
|
|
86
|
+
p4d = rotateZW(u.rot4dZW) * p4d;
|
|
87
|
+
let proj = project4Dto3D(p4d);
|
|
88
|
+
let planeInf = min(min(abs(dot(p, c1)), abs(dot(p, c2))),
|
|
89
|
+
min(abs(dot(p, c3)), abs(dot(p, c4))));
|
|
90
|
+
let blended = mix(p, proj, clamp(0.45 + morphBlend * 0.35, 0.0, 1.0));
|
|
91
|
+
return mix(blended, blended * (1.0 - planeInf * 0.55), 0.2 + morphBlend * 0.2);
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
fn applyCoreWarp_common(p: vec3<f32>, geomType: f32) -> vec3<f32> {
|
|
95
|
+
let coreFloat = floor(geomType / 8.0);
|
|
96
|
+
let coreIndex = i32(clamp(coreFloat, 0.0, 2.0));
|
|
97
|
+
let baseFloat = geomType - floor(geomType / 8.0) * 8.0;
|
|
98
|
+
let geomIdx = i32(clamp(floor(baseFloat + 0.5), 0.0, 7.0));
|
|
99
|
+
if (coreIndex == 1) { return warpHypersphereCore_common(p, geomIdx); }
|
|
100
|
+
if (coreIndex == 2) { return warpHypertetraCore_common(p, geomIdx); }
|
|
101
|
+
return p;
|
|
102
|
+
}
|
|
103
|
+
|
|
50
104
|
fn geometry(p: vec4<f32>, t: f32) -> f32 {
|
|
51
105
|
if (t < 8.0) { return baseGeometry(p, t); }
|
|
52
106
|
else if (t < 16.0) { return hypersphereCore(p, t - 8.0); }
|
|
@@ -16,9 +16,9 @@ fn rotateXZ(angle: f32) -> mat4x4<f32> {
|
|
|
16
16
|
let c = cos(angle);
|
|
17
17
|
let s = sin(angle);
|
|
18
18
|
return mat4x4<f32>(
|
|
19
|
-
vec4<f32>(c, 0.0,
|
|
19
|
+
vec4<f32>( c, 0.0, s, 0.0),
|
|
20
20
|
vec4<f32>(0.0, 1.0, 0.0, 0.0),
|
|
21
|
-
vec4<f32>(s, 0.0,
|
|
21
|
+
vec4<f32>(-s, 0.0, c, 0.0),
|
|
22
22
|
vec4<f32>(0.0, 0.0, 0.0, 1.0)
|
|
23
23
|
);
|
|
24
24
|
}
|
|
@@ -1,16 +1,19 @@
|
|
|
1
1
|
// VIB3+ Common Uniform Struct (WGSL)
|
|
2
2
|
// Shared across all visualization systems
|
|
3
|
+
// Canonical layout — must match packVIB3Uniforms() in UnifiedRenderBridge.js
|
|
4
|
+
// All fields are f32 (except resolution vec2) to avoid alignment surprises.
|
|
5
|
+
// Total: 33 floats (132 bytes), buffer padded to 256 bytes.
|
|
3
6
|
|
|
4
7
|
struct VIB3Uniforms {
|
|
5
|
-
// Time and resolution
|
|
8
|
+
// Time and resolution (indices 0-3)
|
|
6
9
|
time: f32,
|
|
7
10
|
_pad0: f32,
|
|
8
11
|
resolution: vec2<f32>,
|
|
9
12
|
|
|
10
|
-
// Geometry selection
|
|
13
|
+
// Geometry selection 0-23 (index 4)
|
|
11
14
|
geometry: f32,
|
|
12
15
|
|
|
13
|
-
// 6D Rotation (
|
|
16
|
+
// 6D Rotation in radians (indices 5-10)
|
|
14
17
|
rot4dXY: f32,
|
|
15
18
|
rot4dXZ: f32,
|
|
16
19
|
rot4dYZ: f32,
|
|
@@ -18,7 +21,7 @@ struct VIB3Uniforms {
|
|
|
18
21
|
rot4dYW: f32,
|
|
19
22
|
rot4dZW: f32,
|
|
20
23
|
|
|
21
|
-
// Visual parameters
|
|
24
|
+
// Visual parameters (indices 11-18)
|
|
22
25
|
dimension: f32,
|
|
23
26
|
gridDensity: f32,
|
|
24
27
|
morphFactor: f32,
|
|
@@ -28,21 +31,25 @@ struct VIB3Uniforms {
|
|
|
28
31
|
intensity: f32,
|
|
29
32
|
saturation: f32,
|
|
30
33
|
|
|
31
|
-
// Reactivity
|
|
34
|
+
// Reactivity (indices 19-23)
|
|
32
35
|
mouseIntensity: f32,
|
|
33
36
|
clickIntensity: f32,
|
|
34
37
|
bass: f32,
|
|
35
38
|
mid: f32,
|
|
36
39
|
high: f32,
|
|
37
40
|
|
|
38
|
-
// Layer parameters (
|
|
41
|
+
// Layer parameters (indices 24-31)
|
|
39
42
|
layerScale: f32,
|
|
40
43
|
layerOpacity: f32,
|
|
41
44
|
_pad1: f32,
|
|
42
|
-
|
|
45
|
+
layerColorR: f32,
|
|
46
|
+
layerColorG: f32,
|
|
47
|
+
layerColorB: f32,
|
|
43
48
|
densityMult: f32,
|
|
44
49
|
speedMult: f32,
|
|
45
|
-
|
|
50
|
+
|
|
51
|
+
// Vitality (index 32)
|
|
52
|
+
breath: f32,
|
|
46
53
|
};
|
|
47
54
|
|
|
48
55
|
@group(0) @binding(0) var<uniform> u: VIB3Uniforms;
|
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
|
|
5
5
|
struct VIB3Uniforms {
|
|
6
6
|
time: f32,
|
|
7
|
-
|
|
7
|
+
_pad0: f32,
|
|
8
8
|
resolution: vec2<f32>,
|
|
9
9
|
geometry: f32,
|
|
10
10
|
rot4dXY: f32,
|
|
@@ -17,18 +17,24 @@ struct VIB3Uniforms {
|
|
|
17
17
|
gridDensity: f32,
|
|
18
18
|
morphFactor: f32,
|
|
19
19
|
chaos: f32,
|
|
20
|
+
speed: f32,
|
|
20
21
|
hue: f32,
|
|
21
22
|
intensity: f32,
|
|
22
23
|
saturation: f32,
|
|
23
24
|
mouseIntensity: f32,
|
|
24
25
|
clickIntensity: f32,
|
|
25
|
-
roleIntensity: f32,
|
|
26
26
|
bass: f32,
|
|
27
27
|
mid: f32,
|
|
28
28
|
high: f32,
|
|
29
|
+
layerScale: f32,
|
|
30
|
+
layerOpacity: f32,
|
|
31
|
+
_pad1: f32,
|
|
32
|
+
layerColorR: f32,
|
|
33
|
+
layerColorG: f32,
|
|
34
|
+
layerColorB: f32,
|
|
35
|
+
densityMult: f32,
|
|
36
|
+
speedMult: f32,
|
|
29
37
|
breath: f32,
|
|
30
|
-
mouse: vec2<f32>,
|
|
31
|
-
_pad1: vec2<f32>,
|
|
32
38
|
};
|
|
33
39
|
|
|
34
40
|
@group(0) @binding(0) var<uniform> u: VIB3Uniforms;
|
|
@@ -131,8 +137,15 @@ fn geometryFunction_w(p: vec4<f32>) -> f32 {
|
|
|
131
137
|
let gt = i32(clamp(floor(baseFloat + 0.5), 0.0, 7.0));
|
|
132
138
|
let d = u.gridDensity * 0.08;
|
|
133
139
|
if (gt == 0) {
|
|
134
|
-
|
|
135
|
-
|
|
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;
|
|
136
149
|
} else if (gt == 1) {
|
|
137
150
|
let pos = fract(p * d); let dist = min(pos, 1.0 - pos);
|
|
138
151
|
return min(min(dist.x, dist.y), min(dist.z, dist.w)) * u.morphFactor;
|
|
@@ -28,11 +28,13 @@ struct VIB3Uniforms {
|
|
|
28
28
|
high: f32,
|
|
29
29
|
layerScale: f32,
|
|
30
30
|
layerOpacity: f32,
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
_pad1: f32,
|
|
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);
|
|
@@ -28,11 +28,13 @@ struct VIB3Uniforms {
|
|
|
28
28
|
high: f32,
|
|
29
29
|
layerScale: f32,
|
|
30
30
|
layerOpacity: f32,
|
|
31
|
-
|
|
32
|
-
|
|
31
|
+
_pad1: f32,
|
|
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');
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import { describe, expect, it } from 'vitest';
|
|
2
|
+
import Projection from '../math/Projection.js';
|
|
3
|
+
import Vec4 from '../math/Vec4.js';
|
|
4
|
+
|
|
5
|
+
describe('Projection Class', () => {
|
|
6
|
+
it('should project using perspective', () => {
|
|
7
|
+
const v = new Vec4(1, 1, 1, 0);
|
|
8
|
+
const p = Projection.perspective(v, 2);
|
|
9
|
+
expect(p.x).toBeCloseTo(0.5);
|
|
10
|
+
expect(p.y).toBeCloseTo(0.5);
|
|
11
|
+
expect(p.z).toBeCloseTo(0.5);
|
|
12
|
+
expect(p.w).toBe(0);
|
|
13
|
+
});
|
|
14
|
+
|
|
15
|
+
it('should support target vector in perspective', () => {
|
|
16
|
+
const v = new Vec4(1, 1, 1, 0);
|
|
17
|
+
const target = new Vec4();
|
|
18
|
+
const result = Projection.perspective(v, 2, {}, target);
|
|
19
|
+
expect(result).toBe(target);
|
|
20
|
+
expect(target.x).toBeCloseTo(0.5);
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it('should project array using perspectiveArray', () => {
|
|
24
|
+
const vectors = [new Vec4(1, 1, 1, 0), new Vec4(2, 2, 2, 0)];
|
|
25
|
+
const result = Projection.perspectiveArray(vectors, 2);
|
|
26
|
+
expect(result.length).toBe(2);
|
|
27
|
+
expect(result[0].x).toBeCloseTo(0.5);
|
|
28
|
+
expect(result[1].x).toBeCloseTo(1.0);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it('should reuse target array in perspectiveArray', () => {
|
|
32
|
+
const vectors = [new Vec4(1, 1, 1, 0)];
|
|
33
|
+
const targetArray = [new Vec4()];
|
|
34
|
+
const result = Projection.perspectiveArray(vectors, 2, {}, targetArray);
|
|
35
|
+
expect(result).toBe(targetArray);
|
|
36
|
+
expect(targetArray[0].x).toBeCloseTo(0.5);
|
|
37
|
+
});
|
|
38
|
+
});
|
|
@@ -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
|
*/
|
|
@@ -185,14 +185,14 @@ export class ViewerPortal extends EventEmitter {
|
|
|
185
185
|
|
|
186
186
|
captureFrame(format = 'png', quality = 0.92) {
|
|
187
187
|
if (!this.canvas) return null;
|
|
188
|
-
return this.canvas.toDataURL(
|
|
188
|
+
return this.canvas.toDataURL(`image/${format}`, quality);
|
|
189
189
|
}
|
|
190
190
|
|
|
191
191
|
downloadFrame(filename = 'vib3-capture', format = 'png') {
|
|
192
192
|
const dataUrl = this.captureFrame(format);
|
|
193
193
|
if (!dataUrl) return;
|
|
194
194
|
const link = document.createElement('a');
|
|
195
|
-
link.download =
|
|
195
|
+
link.download = `${filename}.${format}`;
|
|
196
196
|
link.href = dataUrl;
|
|
197
197
|
link.click();
|
|
198
198
|
}
|
|
@@ -602,6 +602,7 @@ const FACETED_GLSL_FRAGMENT = `
|
|
|
602
602
|
precision highp float;
|
|
603
603
|
uniform float u_time;
|
|
604
604
|
uniform vec2 u_resolution;
|
|
605
|
+
uniform vec2 u_mouse;
|
|
605
606
|
uniform float u_geometry;
|
|
606
607
|
uniform float u_rot4dXY;
|
|
607
608
|
uniform float u_rot4dXZ;
|
|
@@ -619,6 +620,7 @@ uniform float u_saturation;
|
|
|
619
620
|
uniform float u_speed;
|
|
620
621
|
uniform float u_mouseIntensity;
|
|
621
622
|
uniform float u_clickIntensity;
|
|
623
|
+
uniform float u_roleIntensity;
|
|
622
624
|
uniform float u_bass;
|
|
623
625
|
uniform float u_mid;
|
|
624
626
|
uniform float u_high;
|
|
@@ -667,7 +669,8 @@ struct VIB3Uniforms {
|
|
|
667
669
|
|
|
668
670
|
/**
|
|
669
671
|
* Holographic system GLSL fragment shader uniforms (from HolographicVisualizer.js).
|
|
670
|
-
*
|
|
672
|
+
* Uses standard names (u_gridDensity, u_morphFactor, u_geometry) plus many
|
|
673
|
+
* system-specific uniforms for audio/touch/scroll reactivity.
|
|
671
674
|
*/
|
|
672
675
|
const HOLOGRAPHIC_GLSL_FRAGMENT = `
|
|
673
676
|
precision highp float;
|
|
@@ -675,7 +678,7 @@ uniform vec2 u_resolution;
|
|
|
675
678
|
uniform float u_time;
|
|
676
679
|
uniform vec2 u_mouse;
|
|
677
680
|
uniform float u_geometry;
|
|
678
|
-
uniform float
|
|
681
|
+
uniform float u_gridDensity;
|
|
679
682
|
uniform float u_speed;
|
|
680
683
|
uniform vec3 u_color;
|
|
681
684
|
uniform float u_intensity;
|
|
@@ -686,9 +689,8 @@ uniform float u_chaosIntensity;
|
|
|
686
689
|
uniform float u_mouseIntensity;
|
|
687
690
|
uniform float u_clickIntensity;
|
|
688
691
|
uniform float u_densityVariation;
|
|
689
|
-
uniform float u_geometryType;
|
|
690
692
|
uniform float u_chaos;
|
|
691
|
-
uniform float
|
|
693
|
+
uniform float u_morphFactor;
|
|
692
694
|
uniform float u_touchMorph;
|
|
693
695
|
uniform float u_touchChaos;
|
|
694
696
|
uniform float u_scrollParallax;
|
|
@@ -0,0 +1,109 @@
|
|
|
1
|
+
import re
|
|
2
|
+
|
|
3
|
+
file_path = 'src/math/Projection.js'
|
|
4
|
+
|
|
5
|
+
with open(file_path, 'r') as f:
|
|
6
|
+
content = f.read()
|
|
7
|
+
|
|
8
|
+
# Replace perspective JSDoc and Implementation
|
|
9
|
+
perspective_old = r""" * @param {Vec4} v - 4D point
|
|
10
|
+
* @param {number} d - Distance parameter (typically 1.5-5)
|
|
11
|
+
* @returns {Vec4} Projected point (w=0)
|
|
12
|
+
*/
|
|
13
|
+
static perspective(v, d = 2, options = {}) {
|
|
14
|
+
if (typeof d === 'object') {
|
|
15
|
+
options = d;
|
|
16
|
+
d = options.d ?? 2;
|
|
17
|
+
}
|
|
18
|
+
const epsilon = options.epsilon ?? DEFAULT_EPSILON;
|
|
19
|
+
const denom = clampDenominator(d - v.w, epsilon);
|
|
20
|
+
const scale = 1 / denom;
|
|
21
|
+
return new Vec4(v.x * scale, v.y * scale, v.z * scale, 0);
|
|
22
|
+
}"""
|
|
23
|
+
|
|
24
|
+
perspective_new = r""" * @param {Vec4} v - 4D point
|
|
25
|
+
* @param {number} d - Distance parameter (typically 1.5-5)
|
|
26
|
+
* @param {object} [options] - Projection options
|
|
27
|
+
* @param {Vec4} [target] - Optional target vector to write result to
|
|
28
|
+
* @returns {Vec4} Projected point (w=0)
|
|
29
|
+
*/
|
|
30
|
+
static perspective(v, d = 2, options = {}, target = null) {
|
|
31
|
+
if (typeof d === 'object') {
|
|
32
|
+
options = d;
|
|
33
|
+
d = options.d ?? 2;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
// Handle options overload or direct target argument
|
|
37
|
+
if (!target && options && options.target) {
|
|
38
|
+
target = options.target;
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
const epsilon = (options && options.epsilon) ?? DEFAULT_EPSILON;
|
|
42
|
+
const denom = clampDenominator(d - v.w, epsilon);
|
|
43
|
+
const scale = 1 / denom;
|
|
44
|
+
|
|
45
|
+
if (target) {
|
|
46
|
+
return target.set(v.x * scale, v.y * scale, v.z * scale, 0);
|
|
47
|
+
}
|
|
48
|
+
return new Vec4(v.x * scale, v.y * scale, v.z * scale, 0);
|
|
49
|
+
}"""
|
|
50
|
+
|
|
51
|
+
if perspective_old in content:
|
|
52
|
+
content = content.replace(perspective_old, perspective_new)
|
|
53
|
+
else:
|
|
54
|
+
print("Could not find perspective implementation to replace.")
|
|
55
|
+
# Attempt more robust search if exact match fails? No, simpler is safer for now.
|
|
56
|
+
|
|
57
|
+
# Replace perspectiveArray JSDoc and Implementation
|
|
58
|
+
perspective_array_old = r""" /**
|
|
59
|
+
* Project array of Vec4s using perspective projection
|
|
60
|
+
* @param {Vec4[]} vectors
|
|
61
|
+
* @param {number} d
|
|
62
|
+
* @returns {Vec4[]}
|
|
63
|
+
*/
|
|
64
|
+
static perspectiveArray(vectors, d = 2, options = {}) {
|
|
65
|
+
return vectors.map(v => Projection.perspective(v, d, options));
|
|
66
|
+
}"""
|
|
67
|
+
|
|
68
|
+
perspective_array_new = r""" /**
|
|
69
|
+
* Project array of Vec4s using perspective projection
|
|
70
|
+
* @param {Vec4[]} vectors
|
|
71
|
+
* @param {number} d
|
|
72
|
+
* @param {object} [options]
|
|
73
|
+
* @param {Vec4[]} [target] - Optional target array to write results to
|
|
74
|
+
* @returns {Vec4[]}
|
|
75
|
+
*/
|
|
76
|
+
static perspectiveArray(vectors, d = 2, options = {}, target = null) {
|
|
77
|
+
// Handle options overload for 'd'
|
|
78
|
+
if (typeof d === 'object') {
|
|
79
|
+
options = d;
|
|
80
|
+
d = options.d ?? 2;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
if (!target) {
|
|
84
|
+
return vectors.map(v => Projection.perspective(v, d, options));
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
const count = vectors.length;
|
|
88
|
+
// Iterate and reuse
|
|
89
|
+
for (let i = 0; i < count; i++) {
|
|
90
|
+
const out = target[i];
|
|
91
|
+
if (out) {
|
|
92
|
+
Projection.perspective(vectors[i], d, options, out);
|
|
93
|
+
} else {
|
|
94
|
+
target[i] = Projection.perspective(vectors[i], d, options);
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
return target;
|
|
99
|
+
}"""
|
|
100
|
+
|
|
101
|
+
if perspective_array_old in content:
|
|
102
|
+
content = content.replace(perspective_array_old, perspective_array_new)
|
|
103
|
+
else:
|
|
104
|
+
print("Could not find perspectiveArray implementation to replace.")
|
|
105
|
+
|
|
106
|
+
with open(file_path, 'w') as f:
|
|
107
|
+
f.write(content)
|
|
108
|
+
|
|
109
|
+
print("Updated Projection.js")
|