@vib3code/sdk 2.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +118 -0
- package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
- package/DOCS/CI_TESTING.md +38 -0
- package/DOCS/CLI_ONBOARDING.md +75 -0
- package/DOCS/CONTROL_REFERENCE.md +64 -0
- package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
- package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
- package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
- package/DOCS/ENV_SETUP.md +189 -0
- package/DOCS/EXPORT_FORMATS.md +417 -0
- package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
- package/DOCS/LICENSING_TIERS.md +275 -0
- package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
- package/DOCS/OBS_SETUP_GUIDE.md +98 -0
- package/DOCS/PROJECT_SETUP.md +66 -0
- package/DOCS/RENDERER_LIFECYCLE.md +40 -0
- package/DOCS/REPO_MANIFEST.md +121 -0
- package/DOCS/SESSION_014_PLAN.md +195 -0
- package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
- package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
- package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
- package/DOCS/SYSTEM_INVENTORY.md +520 -0
- package/DOCS/TELEMETRY_EXPORTS.md +34 -0
- package/DOCS/WEBGPU_STATUS.md +38 -0
- package/DOCS/XR_BENCHMARKS.md +608 -0
- package/LICENSE +21 -0
- package/README.md +426 -0
- package/docs/.nojekyll +0 -0
- package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/02-hyperspatial_ego_death.html +346 -0
- package/docs/03-post_cartesian_sublime.html +346 -0
- package/docs/04-crystalline_void_meditation.html +346 -0
- package/docs/05-quantum_decoherence_ballet.html +346 -0
- package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/07-hyperspatial_ego_death.html +346 -0
- package/docs/08-post_cartesian_sublime.html +346 -0
- package/docs/09-crystalline_void_meditation.html +346 -0
- package/docs/10-quantum_decoherence_ballet.html +346 -0
- package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
- package/docs/12-hyperspatial_ego_death.html +346 -0
- package/docs/13-post_cartesian_sublime.html +346 -0
- package/docs/index.html +794 -0
- package/docs/test-hub.html +441 -0
- package/docs/url-state.js +102 -0
- package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
- package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
- package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
- package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
- package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
- package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
- package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
- package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
- package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
- package/docs/vib3-exports/index.html +238 -0
- package/docs/webgpu-live.html +702 -0
- package/package.json +367 -0
- package/src/advanced/AIPresetGenerator.js +777 -0
- package/src/advanced/MIDIController.js +703 -0
- package/src/advanced/OffscreenWorker.js +1051 -0
- package/src/advanced/WebGPUCompute.js +1051 -0
- package/src/advanced/WebXRRenderer.js +680 -0
- package/src/agent/cli/AgentCLI.js +615 -0
- package/src/agent/cli/index.js +14 -0
- package/src/agent/index.js +73 -0
- package/src/agent/mcp/MCPServer.js +950 -0
- package/src/agent/mcp/index.js +9 -0
- package/src/agent/mcp/tools.js +548 -0
- package/src/agent/telemetry/EventStream.js +669 -0
- package/src/agent/telemetry/Instrumentation.js +618 -0
- package/src/agent/telemetry/TelemetryExporters.js +427 -0
- package/src/agent/telemetry/TelemetryService.js +464 -0
- package/src/agent/telemetry/index.js +52 -0
- package/src/benchmarks/BenchmarkRunner.js +381 -0
- package/src/benchmarks/MetricsCollector.js +299 -0
- package/src/benchmarks/index.js +9 -0
- package/src/benchmarks/scenes.js +259 -0
- package/src/cli/index.js +675 -0
- package/src/config/ApiConfig.js +88 -0
- package/src/core/CanvasManager.js +217 -0
- package/src/core/ErrorReporter.js +117 -0
- package/src/core/ParameterMapper.js +333 -0
- package/src/core/Parameters.js +396 -0
- package/src/core/RendererContracts.js +200 -0
- package/src/core/UnifiedResourceManager.js +370 -0
- package/src/core/VIB3Engine.js +636 -0
- package/src/core/renderers/FacetedRendererAdapter.js +32 -0
- package/src/core/renderers/HolographicRendererAdapter.js +29 -0
- package/src/core/renderers/QuantumRendererAdapter.js +29 -0
- package/src/core/renderers/RendererLifecycleManager.js +63 -0
- package/src/creative/ColorPresetsSystem.js +980 -0
- package/src/creative/ParameterTimeline.js +1061 -0
- package/src/creative/PostProcessingPipeline.js +1113 -0
- package/src/creative/TransitionAnimator.js +683 -0
- package/src/export/CSSExporter.js +226 -0
- package/src/export/CardGeneratorBase.js +279 -0
- package/src/export/ExportManager.js +580 -0
- package/src/export/FacetedCardGenerator.js +279 -0
- package/src/export/HolographicCardGenerator.js +543 -0
- package/src/export/LottieExporter.js +552 -0
- package/src/export/QuantumCardGenerator.js +315 -0
- package/src/export/SVGExporter.js +519 -0
- package/src/export/ShaderExporter.js +903 -0
- package/src/export/TradingCardGenerator.js +3055 -0
- package/src/export/TradingCardManager.js +181 -0
- package/src/export/VIB3PackageExporter.js +559 -0
- package/src/export/index.js +14 -0
- package/src/export/systems/TradingCardSystemFaceted.js +494 -0
- package/src/export/systems/TradingCardSystemHolographic.js +452 -0
- package/src/export/systems/TradingCardSystemQuantum.js +411 -0
- package/src/faceted/FacetedSystem.js +963 -0
- package/src/features/CollectionManager.js +433 -0
- package/src/gallery/CollectionManager.js +240 -0
- package/src/gallery/GallerySystem.js +485 -0
- package/src/geometry/GeometryFactory.js +314 -0
- package/src/geometry/GeometryLibrary.js +72 -0
- package/src/geometry/buffers/BufferBuilder.js +338 -0
- package/src/geometry/buffers/index.js +18 -0
- package/src/geometry/generators/Crystal.js +420 -0
- package/src/geometry/generators/Fractal.js +298 -0
- package/src/geometry/generators/KleinBottle.js +197 -0
- package/src/geometry/generators/Sphere.js +192 -0
- package/src/geometry/generators/Tesseract.js +160 -0
- package/src/geometry/generators/Tetrahedron.js +225 -0
- package/src/geometry/generators/Torus.js +304 -0
- package/src/geometry/generators/Wave.js +341 -0
- package/src/geometry/index.js +142 -0
- package/src/geometry/warp/HypersphereCore.js +211 -0
- package/src/geometry/warp/HypertetraCore.js +386 -0
- package/src/geometry/warp/index.js +57 -0
- package/src/holograms/HolographicVisualizer.js +1073 -0
- package/src/holograms/RealHolographicSystem.js +966 -0
- package/src/holograms/variantRegistry.js +69 -0
- package/src/integrations/FigmaPlugin.js +854 -0
- package/src/integrations/OBSMode.js +754 -0
- package/src/integrations/ThreeJsPackage.js +660 -0
- package/src/integrations/TouchDesignerExport.js +552 -0
- package/src/integrations/frameworks/Vib3React.js +591 -0
- package/src/integrations/frameworks/Vib3Svelte.js +654 -0
- package/src/integrations/frameworks/Vib3Vue.js +628 -0
- package/src/llm/LLMParameterInterface.js +240 -0
- package/src/llm/LLMParameterUI.js +577 -0
- package/src/math/Mat4x4.js +708 -0
- package/src/math/Projection.js +341 -0
- package/src/math/Rotor4D.js +637 -0
- package/src/math/Vec4.js +476 -0
- package/src/math/constants.js +164 -0
- package/src/math/index.js +68 -0
- package/src/math/projections.js +54 -0
- package/src/math/rotations.js +196 -0
- package/src/quantum/QuantumEngine.js +906 -0
- package/src/quantum/QuantumVisualizer.js +1103 -0
- package/src/reactivity/ReactivityConfig.js +499 -0
- package/src/reactivity/ReactivityManager.js +586 -0
- package/src/reactivity/SpatialInputSystem.js +1783 -0
- package/src/reactivity/index.js +93 -0
- package/src/render/CommandBuffer.js +465 -0
- package/src/render/MultiCanvasBridge.js +340 -0
- package/src/render/RenderCommand.js +514 -0
- package/src/render/RenderResourceRegistry.js +523 -0
- package/src/render/RenderState.js +552 -0
- package/src/render/RenderTarget.js +512 -0
- package/src/render/ShaderLoader.js +253 -0
- package/src/render/ShaderProgram.js +599 -0
- package/src/render/UnifiedRenderBridge.js +496 -0
- package/src/render/backends/WebGLBackend.js +1108 -0
- package/src/render/backends/WebGPUBackend.js +1409 -0
- package/src/render/commands/CommandBufferExecutor.js +607 -0
- package/src/render/commands/RenderCommandBuffer.js +661 -0
- package/src/render/commands/index.js +17 -0
- package/src/render/index.js +367 -0
- package/src/scene/Disposable.js +498 -0
- package/src/scene/MemoryPool.js +618 -0
- package/src/scene/Node4D.js +697 -0
- package/src/scene/ResourceManager.js +599 -0
- package/src/scene/Scene4D.js +540 -0
- package/src/scene/index.js +98 -0
- package/src/schemas/error.schema.json +84 -0
- package/src/schemas/extension.schema.json +88 -0
- package/src/schemas/index.js +214 -0
- package/src/schemas/parameters.schema.json +142 -0
- package/src/schemas/tool-pack.schema.json +44 -0
- package/src/schemas/tool-response.schema.json +127 -0
- package/src/shaders/common/fullscreen.vert.glsl +5 -0
- package/src/shaders/common/fullscreen.vert.wgsl +17 -0
- package/src/shaders/common/geometry24.glsl +65 -0
- package/src/shaders/common/geometry24.wgsl +54 -0
- package/src/shaders/common/rotation4d.glsl +85 -0
- package/src/shaders/common/rotation4d.wgsl +86 -0
- package/src/shaders/common/uniforms.glsl +44 -0
- package/src/shaders/common/uniforms.wgsl +48 -0
- package/src/shaders/faceted/faceted.frag.glsl +129 -0
- package/src/shaders/faceted/faceted.frag.wgsl +164 -0
- package/src/shaders/holographic/holographic.frag.glsl +406 -0
- package/src/shaders/holographic/holographic.frag.wgsl +185 -0
- package/src/shaders/quantum/quantum.frag.glsl +513 -0
- package/src/shaders/quantum/quantum.frag.wgsl +361 -0
- package/src/testing/ParallelTestFramework.js +519 -0
- package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
- package/src/testing/exportFormats.test.js +8 -0
- package/src/testing/projections.test.js +14 -0
- package/src/testing/rotations.test.js +37 -0
- package/src/ui/InteractivityMenu.js +516 -0
- package/src/ui/StatusManager.js +96 -0
- package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
- package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
- package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
- package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
- package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
- package/src/variations/VariationManager.js +431 -0
- package/src/viewer/AudioReactivity.js +505 -0
- package/src/viewer/CardBending.js +481 -0
- package/src/viewer/GalleryUI.js +832 -0
- package/src/viewer/ReactivityManager.js +590 -0
- package/src/viewer/TradingCardExporter.js +600 -0
- package/src/viewer/ViewerPortal.js +374 -0
- package/src/viewer/index.js +12 -0
- package/src/wasm/WasmLoader.js +296 -0
- package/src/wasm/index.js +132 -0
- package/tools/agentic/mcpTools.js +88 -0
- package/tools/cli/agent-cli.js +92 -0
- package/tools/export/formats.js +24 -0
- package/tools/math/rotation-baseline.mjs +64 -0
- package/tools/shader-sync-verify.js +937 -0
- package/tools/telemetry/manifestPipeline.js +141 -0
- package/tools/telemetry/telemetryEvents.js +35 -0
- package/types/adaptive-sdk.d.ts +185 -0
- package/types/advanced/AIPresetGenerator.d.ts +81 -0
- package/types/advanced/MIDIController.d.ts +100 -0
- package/types/advanced/OffscreenWorker.d.ts +82 -0
- package/types/advanced/WebGPUCompute.d.ts +52 -0
- package/types/advanced/WebXRRenderer.d.ts +77 -0
- package/types/advanced/index.d.ts +46 -0
- package/types/core/ErrorReporter.d.ts +50 -0
- package/types/core/VIB3Engine.d.ts +204 -0
- package/types/creative/ColorPresetsSystem.d.ts +91 -0
- package/types/creative/ParameterTimeline.d.ts +74 -0
- package/types/creative/PostProcessingPipeline.d.ts +109 -0
- package/types/creative/TransitionAnimator.d.ts +71 -0
- package/types/creative/index.d.ts +35 -0
- package/types/integrations/FigmaPlugin.d.ts +46 -0
- package/types/integrations/OBSMode.d.ts +74 -0
- package/types/integrations/ThreeJsPackage.d.ts +62 -0
- package/types/integrations/TouchDesignerExport.d.ts +36 -0
- package/types/integrations/Vib3React.d.ts +74 -0
- package/types/integrations/Vib3Svelte.d.ts +63 -0
- package/types/integrations/Vib3Vue.d.ts +55 -0
- package/types/integrations/index.d.ts +52 -0
- package/types/reactivity/SpatialInputSystem.d.ts +173 -0
- package/types/reactivity/index.d.ts +394 -0
- package/types/render/CommandBuffer.d.ts +169 -0
- package/types/render/RenderCommand.d.ts +312 -0
- package/types/render/RenderState.d.ts +279 -0
- package/types/render/RenderTarget.d.ts +254 -0
- package/types/render/ShaderProgram.d.ts +277 -0
- package/types/render/UnifiedRenderBridge.d.ts +143 -0
- package/types/render/WebGLBackend.d.ts +168 -0
- package/types/render/WebGPUBackend.d.ts +186 -0
- package/types/render/index.d.ts +141 -0
|
@@ -0,0 +1,341 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Wave Geometry Generator
|
|
3
|
+
*
|
|
4
|
+
* Generates sinusoidal interference patterns in 4D space.
|
|
5
|
+
* Models wave phenomena, standing waves, and interference patterns.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import { Vec4 } from '../../math/Vec4.js';
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* Generate 4D standing wave pattern
|
|
12
|
+
* @param {number} amplitude - Wave amplitude
|
|
13
|
+
* @param {number} frequency - Wave frequency
|
|
14
|
+
* @param {number} segments - Resolution per axis
|
|
15
|
+
* @returns {Vec4[]} Vertices
|
|
16
|
+
*/
|
|
17
|
+
export function generateStandingWave4D(amplitude = 0.5, frequency = 2, segments = 16) {
|
|
18
|
+
const vertices = [];
|
|
19
|
+
const step = (2 * Math.PI) / segments;
|
|
20
|
+
|
|
21
|
+
for (let i = 0; i <= segments; i++) {
|
|
22
|
+
const u = i * step;
|
|
23
|
+
for (let j = 0; j <= segments; j++) {
|
|
24
|
+
const v = j * step;
|
|
25
|
+
for (let k = 0; k <= Math.floor(segments / 2); k++) {
|
|
26
|
+
const t = (k / (segments / 2)) * Math.PI;
|
|
27
|
+
|
|
28
|
+
// Standing wave in 4D
|
|
29
|
+
const x = Math.cos(u);
|
|
30
|
+
const y = Math.sin(u) * Math.cos(v);
|
|
31
|
+
const z = Math.sin(u) * Math.sin(v) * Math.cos(t);
|
|
32
|
+
const w = amplitude * Math.sin(frequency * u) *
|
|
33
|
+
Math.sin(frequency * v) *
|
|
34
|
+
Math.cos(frequency * t);
|
|
35
|
+
|
|
36
|
+
vertices.push(new Vec4(x, y, z, w));
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
|
|
41
|
+
return vertices;
|
|
42
|
+
}
|
|
43
|
+
|
|
44
|
+
/**
|
|
45
|
+
* Generate interference pattern from two 4D wave sources
|
|
46
|
+
* @param {Vec4} source1 - First wave source position
|
|
47
|
+
* @param {Vec4} source2 - Second wave source position
|
|
48
|
+
* @param {number} wavelength - Wave wavelength
|
|
49
|
+
* @param {number} gridSize - Sampling grid size
|
|
50
|
+
* @param {number} segments - Resolution
|
|
51
|
+
* @returns {Vec4[]} Vertices with W as amplitude
|
|
52
|
+
*/
|
|
53
|
+
export function generateInterferencePattern(
|
|
54
|
+
source1 = new Vec4(-1, 0, 0, 0),
|
|
55
|
+
source2 = new Vec4(1, 0, 0, 0),
|
|
56
|
+
wavelength = 0.5,
|
|
57
|
+
gridSize = 2,
|
|
58
|
+
segments = 20
|
|
59
|
+
) {
|
|
60
|
+
const vertices = [];
|
|
61
|
+
const k = (2 * Math.PI) / wavelength;
|
|
62
|
+
const step = (2 * gridSize) / segments;
|
|
63
|
+
|
|
64
|
+
for (let i = 0; i <= segments; i++) {
|
|
65
|
+
const x = -gridSize + i * step;
|
|
66
|
+
for (let j = 0; j <= segments; j++) {
|
|
67
|
+
const y = -gridSize + j * step;
|
|
68
|
+
for (let l = 0; l <= Math.floor(segments / 2); l++) {
|
|
69
|
+
const z = -gridSize / 2 + l * step;
|
|
70
|
+
|
|
71
|
+
// Distance from each source
|
|
72
|
+
const pos = new Vec4(x, y, z, 0);
|
|
73
|
+
const d1 = pos.distanceTo(source1);
|
|
74
|
+
const d2 = pos.distanceTo(source2);
|
|
75
|
+
|
|
76
|
+
// Superposition of waves
|
|
77
|
+
const wave1 = Math.sin(k * d1) / Math.max(d1, 0.1);
|
|
78
|
+
const wave2 = Math.sin(k * d2) / Math.max(d2, 0.1);
|
|
79
|
+
const amplitude = (wave1 + wave2) * 0.5;
|
|
80
|
+
|
|
81
|
+
vertices.push(new Vec4(x, y, z, amplitude));
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return vertices;
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
/**
|
|
90
|
+
* Generate 4D ripple surface
|
|
91
|
+
* @param {number} radius - Surface radius
|
|
92
|
+
* @param {number} frequency - Ripple frequency
|
|
93
|
+
* @param {number} decay - Amplitude decay rate
|
|
94
|
+
* @param {number} segments - Resolution
|
|
95
|
+
* @returns {Vec4[]} Vertices
|
|
96
|
+
*/
|
|
97
|
+
export function generateRippleSurface(radius = 2, frequency = 4, decay = 0.5, segments = 32) {
|
|
98
|
+
const vertices = [];
|
|
99
|
+
|
|
100
|
+
for (let i = 0; i <= segments; i++) {
|
|
101
|
+
const u = (i / segments) * Math.PI * 2;
|
|
102
|
+
for (let j = 0; j <= segments; j++) {
|
|
103
|
+
const r = (j / segments) * radius;
|
|
104
|
+
|
|
105
|
+
const x = r * Math.cos(u);
|
|
106
|
+
const y = r * Math.sin(u);
|
|
107
|
+
|
|
108
|
+
// Ripple in Z and W dimensions
|
|
109
|
+
const ripple = Math.sin(frequency * r) * Math.exp(-decay * r);
|
|
110
|
+
const z = ripple * 0.5;
|
|
111
|
+
const w = ripple * Math.cos(u * 2) * 0.3;
|
|
112
|
+
|
|
113
|
+
vertices.push(new Vec4(x, y, z, w));
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
return vertices;
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Generate sinusoidal helix in 4D
|
|
122
|
+
* @param {number} radius - Helix radius
|
|
123
|
+
* @param {number} pitch - Helix pitch
|
|
124
|
+
* @param {number} turns - Number of turns
|
|
125
|
+
* @param {number} segments - Resolution
|
|
126
|
+
* @returns {Vec4[]} Vertices
|
|
127
|
+
*/
|
|
128
|
+
export function generateWaveHelix4D(radius = 1, pitch = 0.5, turns = 3, segments = 100) {
|
|
129
|
+
const vertices = [];
|
|
130
|
+
const totalAngle = turns * 2 * Math.PI;
|
|
131
|
+
|
|
132
|
+
for (let i = 0; i <= segments; i++) {
|
|
133
|
+
const t = (i / segments) * totalAngle;
|
|
134
|
+
|
|
135
|
+
const x = radius * Math.cos(t);
|
|
136
|
+
const y = radius * Math.sin(t);
|
|
137
|
+
const z = pitch * t / (2 * Math.PI);
|
|
138
|
+
// W oscillates creating a 4D wave pattern
|
|
139
|
+
const w = 0.3 * Math.sin(t * 3);
|
|
140
|
+
|
|
141
|
+
vertices.push(new Vec4(x, y, z, w));
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
return vertices;
|
|
145
|
+
}
|
|
146
|
+
|
|
147
|
+
/**
|
|
148
|
+
* Generate plane wave in 4D
|
|
149
|
+
* @param {Vec4} direction - Wave propagation direction (normalized)
|
|
150
|
+
* @param {number} wavelength - Wavelength
|
|
151
|
+
* @param {number} amplitude - Wave amplitude
|
|
152
|
+
* @param {number} gridSize - Sampling region size
|
|
153
|
+
* @param {number} segments - Resolution
|
|
154
|
+
* @returns {Vec4[]} Vertices
|
|
155
|
+
*/
|
|
156
|
+
export function generatePlaneWave4D(
|
|
157
|
+
direction = new Vec4(1, 0, 0, 0).normalize(),
|
|
158
|
+
wavelength = 1,
|
|
159
|
+
amplitude = 0.5,
|
|
160
|
+
gridSize = 2,
|
|
161
|
+
segments = 16
|
|
162
|
+
) {
|
|
163
|
+
const vertices = [];
|
|
164
|
+
const k = (2 * Math.PI) / wavelength;
|
|
165
|
+
const step = (2 * gridSize) / segments;
|
|
166
|
+
|
|
167
|
+
for (let i = 0; i <= segments; i++) {
|
|
168
|
+
const x = -gridSize + i * step;
|
|
169
|
+
for (let j = 0; j <= segments; j++) {
|
|
170
|
+
const y = -gridSize + j * step;
|
|
171
|
+
for (let l = 0; l <= segments; l++) {
|
|
172
|
+
const z = -gridSize + l * step;
|
|
173
|
+
|
|
174
|
+
// Phase based on dot product with direction
|
|
175
|
+
const pos = new Vec4(x, y, z, 0);
|
|
176
|
+
const phase = k * pos.dot(direction);
|
|
177
|
+
const w = amplitude * Math.sin(phase);
|
|
178
|
+
|
|
179
|
+
vertices.push(new Vec4(x, y, z, w));
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
return vertices;
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
/**
|
|
188
|
+
* Generate spherical wave emanating from origin in 4D
|
|
189
|
+
* @param {number} maxRadius - Maximum radius
|
|
190
|
+
* @param {number} frequency - Wave frequency
|
|
191
|
+
* @param {number} segments - Resolution
|
|
192
|
+
* @returns {Vec4[]} Vertices
|
|
193
|
+
*/
|
|
194
|
+
export function generateSphericalWave4D(maxRadius = 2, frequency = 3, segments = 24) {
|
|
195
|
+
const vertices = [];
|
|
196
|
+
|
|
197
|
+
// Use 4D spherical coordinates
|
|
198
|
+
for (let i = 0; i <= segments; i++) {
|
|
199
|
+
const phi1 = (i / segments) * Math.PI;
|
|
200
|
+
for (let j = 0; j <= segments; j++) {
|
|
201
|
+
const phi2 = (j / segments) * Math.PI;
|
|
202
|
+
for (let k = 0; k <= segments * 2; k++) {
|
|
203
|
+
const phi3 = (k / (segments * 2)) * Math.PI * 2;
|
|
204
|
+
|
|
205
|
+
// Radius varies with wave
|
|
206
|
+
const baseR = (i / segments) * maxRadius;
|
|
207
|
+
const wave = 0.1 * Math.sin(frequency * baseR);
|
|
208
|
+
const r = baseR + wave;
|
|
209
|
+
|
|
210
|
+
// 4D hyperspherical coordinates
|
|
211
|
+
const x = r * Math.sin(phi1) * Math.sin(phi2) * Math.cos(phi3);
|
|
212
|
+
const y = r * Math.sin(phi1) * Math.sin(phi2) * Math.sin(phi3);
|
|
213
|
+
const z = r * Math.sin(phi1) * Math.cos(phi2);
|
|
214
|
+
const w = r * Math.cos(phi1);
|
|
215
|
+
|
|
216
|
+
vertices.push(new Vec4(x, y, z, w));
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
return vertices;
|
|
222
|
+
}
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Generate wave edges (connect sequential points)
|
|
226
|
+
* @param {Vec4[]} vertices
|
|
227
|
+
* @param {number} stride - Connection stride
|
|
228
|
+
* @returns {number[][]} Edge pairs
|
|
229
|
+
*/
|
|
230
|
+
export function generateWaveEdges(vertices, stride = 1) {
|
|
231
|
+
const edges = [];
|
|
232
|
+
|
|
233
|
+
for (let i = 0; i < vertices.length - stride; i += stride) {
|
|
234
|
+
edges.push([i, i + stride]);
|
|
235
|
+
}
|
|
236
|
+
|
|
237
|
+
return edges;
|
|
238
|
+
}
|
|
239
|
+
|
|
240
|
+
/**
|
|
241
|
+
* Generate grid edges for wave surface
|
|
242
|
+
* @param {number} uSegments
|
|
243
|
+
* @param {number} vSegments
|
|
244
|
+
* @returns {number[][]} Edge pairs
|
|
245
|
+
*/
|
|
246
|
+
export function generateWaveGridEdges(uSegments, vSegments) {
|
|
247
|
+
const edges = [];
|
|
248
|
+
|
|
249
|
+
for (let i = 0; i < uSegments; i++) {
|
|
250
|
+
for (let j = 0; j < vSegments; j++) {
|
|
251
|
+
const idx = i * (vSegments + 1) + j;
|
|
252
|
+
const nextU = (i + 1) * (vSegments + 1) + j;
|
|
253
|
+
const nextV = i * (vSegments + 1) + j + 1;
|
|
254
|
+
|
|
255
|
+
if (i < uSegments - 1) edges.push([idx, nextU]);
|
|
256
|
+
if (j < vSegments) edges.push([idx, nextV]);
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
return edges;
|
|
261
|
+
}
|
|
262
|
+
|
|
263
|
+
/**
|
|
264
|
+
* Generate complete wave geometry
|
|
265
|
+
* @param {string} type - 'standing', 'interference', 'ripple', 'helix', 'plane', 'spherical'
|
|
266
|
+
* @param {object} params - Type-specific parameters
|
|
267
|
+
* @returns {object} Geometry
|
|
268
|
+
*/
|
|
269
|
+
export function generateWave(type = 'standing', params = {}) {
|
|
270
|
+
const {
|
|
271
|
+
amplitude = 0.5,
|
|
272
|
+
frequency = 2,
|
|
273
|
+
segments = 16,
|
|
274
|
+
radius = 1
|
|
275
|
+
} = params;
|
|
276
|
+
|
|
277
|
+
let vertices, edges;
|
|
278
|
+
|
|
279
|
+
switch (type) {
|
|
280
|
+
case 'standing':
|
|
281
|
+
vertices = generateStandingWave4D(amplitude, frequency, segments);
|
|
282
|
+
edges = generateWaveEdges(vertices);
|
|
283
|
+
break;
|
|
284
|
+
|
|
285
|
+
case 'interference':
|
|
286
|
+
vertices = generateInterferencePattern(
|
|
287
|
+
params.source1,
|
|
288
|
+
params.source2,
|
|
289
|
+
params.wavelength || 0.5,
|
|
290
|
+
params.gridSize || 2,
|
|
291
|
+
segments
|
|
292
|
+
);
|
|
293
|
+
edges = generateWaveEdges(vertices);
|
|
294
|
+
break;
|
|
295
|
+
|
|
296
|
+
case 'ripple':
|
|
297
|
+
vertices = generateRippleSurface(radius, frequency, params.decay || 0.5, segments);
|
|
298
|
+
edges = generateWaveGridEdges(segments, segments);
|
|
299
|
+
break;
|
|
300
|
+
|
|
301
|
+
case 'helix':
|
|
302
|
+
vertices = generateWaveHelix4D(radius, params.pitch || 0.5, params.turns || 3, segments * 6);
|
|
303
|
+
edges = generateWaveEdges(vertices);
|
|
304
|
+
break;
|
|
305
|
+
|
|
306
|
+
case 'plane':
|
|
307
|
+
vertices = generatePlaneWave4D(
|
|
308
|
+
params.direction,
|
|
309
|
+
params.wavelength || 1,
|
|
310
|
+
amplitude,
|
|
311
|
+
params.gridSize || 2,
|
|
312
|
+
segments
|
|
313
|
+
);
|
|
314
|
+
edges = [];
|
|
315
|
+
break;
|
|
316
|
+
|
|
317
|
+
case 'spherical':
|
|
318
|
+
vertices = generateSphericalWave4D(radius, frequency, Math.floor(segments / 2));
|
|
319
|
+
edges = [];
|
|
320
|
+
break;
|
|
321
|
+
|
|
322
|
+
default:
|
|
323
|
+
vertices = generateStandingWave4D(amplitude, frequency, segments);
|
|
324
|
+
edges = generateWaveEdges(vertices);
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
return {
|
|
328
|
+
name: `wave_${type}`,
|
|
329
|
+
vertices,
|
|
330
|
+
edges,
|
|
331
|
+
faces: [],
|
|
332
|
+
vertexCount: vertices.length,
|
|
333
|
+
edgeCount: edges.length,
|
|
334
|
+
faceCount: 0,
|
|
335
|
+
waveType: type,
|
|
336
|
+
frequency,
|
|
337
|
+
amplitude
|
|
338
|
+
};
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
export default generateWave;
|
|
@@ -0,0 +1,142 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Geometry Module
|
|
3
|
+
*
|
|
4
|
+
* Complete 4D geometry generation system with 24 variants.
|
|
5
|
+
*
|
|
6
|
+
* Encoding: geometry = coreIndex * 8 + baseIndex
|
|
7
|
+
*
|
|
8
|
+
* Base Geometries (0-7):
|
|
9
|
+
* 0: Tetrahedron - 5-cell (pentatope)
|
|
10
|
+
* 1: Hypercube - Tesseract
|
|
11
|
+
* 2: Sphere - 4D hypersphere
|
|
12
|
+
* 3: Torus - Clifford torus
|
|
13
|
+
* 4: Klein Bottle - Non-orientable 4D surface
|
|
14
|
+
* 5: Fractal - Recursive 4D structures
|
|
15
|
+
* 6: Wave - Sinusoidal 4D patterns
|
|
16
|
+
* 7: Crystal - Crystalline lattices
|
|
17
|
+
*
|
|
18
|
+
* Core Types:
|
|
19
|
+
* 0: Base (0-7) - Pure geometry
|
|
20
|
+
* 1: Hypersphere (8-15) - Wrapped in 4D sphere
|
|
21
|
+
* 2: Hypertetrahedron (16-23) - Wrapped in 5-cell
|
|
22
|
+
*/
|
|
23
|
+
|
|
24
|
+
// Main factory
|
|
25
|
+
export {
|
|
26
|
+
GeometryFactory,
|
|
27
|
+
defaultFactory,
|
|
28
|
+
generateGeometry,
|
|
29
|
+
generateBaseGeometry,
|
|
30
|
+
applyWarp,
|
|
31
|
+
decodeGeometry,
|
|
32
|
+
encodeGeometry,
|
|
33
|
+
getGeometryName,
|
|
34
|
+
getAllGeometryNames,
|
|
35
|
+
BASE_GEOMETRIES,
|
|
36
|
+
CORE_TYPES
|
|
37
|
+
} from './GeometryFactory.js';
|
|
38
|
+
|
|
39
|
+
// Base generators
|
|
40
|
+
export { default as generateTesseract } from './generators/Tesseract.js';
|
|
41
|
+
export {
|
|
42
|
+
generateTesseractVertices,
|
|
43
|
+
generateTesseractEdges,
|
|
44
|
+
generateTesseractFaces
|
|
45
|
+
} from './generators/Tesseract.js';
|
|
46
|
+
|
|
47
|
+
export {
|
|
48
|
+
generate5Cell,
|
|
49
|
+
generate5CellVertices,
|
|
50
|
+
generate5CellEdges,
|
|
51
|
+
generateTetrahedronLattice
|
|
52
|
+
} from './generators/Tetrahedron.js';
|
|
53
|
+
|
|
54
|
+
export {
|
|
55
|
+
default as generateHypersphere,
|
|
56
|
+
generateHypersphereVertices,
|
|
57
|
+
generateHypersphereFibonacci,
|
|
58
|
+
generateHypersphereLatitudes
|
|
59
|
+
} from './generators/Sphere.js';
|
|
60
|
+
|
|
61
|
+
export {
|
|
62
|
+
generateCliffordTorus,
|
|
63
|
+
generate4DTorus,
|
|
64
|
+
generateTorusEdges
|
|
65
|
+
} from './generators/Torus.js';
|
|
66
|
+
|
|
67
|
+
export {
|
|
68
|
+
default as generateKleinBottle,
|
|
69
|
+
generateKleinBottleVertices,
|
|
70
|
+
generateKleinBottleBottle,
|
|
71
|
+
generateKleinBottleEdges,
|
|
72
|
+
generateMobiusStrip
|
|
73
|
+
} from './generators/KleinBottle.js';
|
|
74
|
+
|
|
75
|
+
export {
|
|
76
|
+
default as generateFractal,
|
|
77
|
+
generateSierpinskiPentatope,
|
|
78
|
+
generateMengerHypersponge,
|
|
79
|
+
generateFractalTree4D,
|
|
80
|
+
generateCantorDust4D
|
|
81
|
+
} from './generators/Fractal.js';
|
|
82
|
+
|
|
83
|
+
export {
|
|
84
|
+
default as generateWave,
|
|
85
|
+
generateStandingWave4D,
|
|
86
|
+
generateInterferencePattern,
|
|
87
|
+
generateRippleSurface,
|
|
88
|
+
generateWaveHelix4D,
|
|
89
|
+
generatePlaneWave4D,
|
|
90
|
+
generateSphericalWave4D
|
|
91
|
+
} from './generators/Wave.js';
|
|
92
|
+
|
|
93
|
+
export {
|
|
94
|
+
default as generateCrystal,
|
|
95
|
+
generate16CellVertices,
|
|
96
|
+
generate16CellEdges,
|
|
97
|
+
generate24CellVertices,
|
|
98
|
+
generate24CellEdges,
|
|
99
|
+
generateCubicLattice4D,
|
|
100
|
+
generateFCCLattice4D,
|
|
101
|
+
generateDiamondCrystal4D,
|
|
102
|
+
generateQuasicrystal4D,
|
|
103
|
+
generateUnitCell4D
|
|
104
|
+
} from './generators/Crystal.js';
|
|
105
|
+
|
|
106
|
+
// Warp functions
|
|
107
|
+
export {
|
|
108
|
+
warpHypersphereCore,
|
|
109
|
+
projectToHypersphere,
|
|
110
|
+
stereographicToHypersphere,
|
|
111
|
+
hopfFibration,
|
|
112
|
+
warpRadial,
|
|
113
|
+
warpStereographic,
|
|
114
|
+
warpHopf,
|
|
115
|
+
generateHypersphereSurface
|
|
116
|
+
} from './warp/HypersphereCore.js';
|
|
117
|
+
|
|
118
|
+
export {
|
|
119
|
+
warpHypertetraCore,
|
|
120
|
+
getPentatopeVertices,
|
|
121
|
+
getPentatopeEdges,
|
|
122
|
+
getPentatopeFaces,
|
|
123
|
+
getPentatopeCells,
|
|
124
|
+
warpTetrahedral,
|
|
125
|
+
warpToEdges,
|
|
126
|
+
warpToCells,
|
|
127
|
+
generatePentatope
|
|
128
|
+
} from './warp/HypertetraCore.js';
|
|
129
|
+
|
|
130
|
+
export { CORE_TYPES as WARP_CORE_TYPES, getCoreTypeName } from './warp/index.js';
|
|
131
|
+
|
|
132
|
+
// Buffer utilities
|
|
133
|
+
export {
|
|
134
|
+
buildVertexBuffer,
|
|
135
|
+
buildEdgeIndexBuffer,
|
|
136
|
+
buildFaceIndexBuffer,
|
|
137
|
+
buildInterleavedBuffer,
|
|
138
|
+
buildNormalBuffer,
|
|
139
|
+
generateWDepthColors,
|
|
140
|
+
generateRainbowColors,
|
|
141
|
+
buildGeometryBuffers
|
|
142
|
+
} from './buffers/BufferBuilder.js';
|
|
@@ -0,0 +1,211 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Hypersphere Core Warp
|
|
3
|
+
*
|
|
4
|
+
* Warps base geometry onto a 4D hypersphere surface.
|
|
5
|
+
* Creates geometries 8-15 in the 24-variant encoding system.
|
|
6
|
+
*
|
|
7
|
+
* The warp projects points onto the 3-sphere (S³), which is the
|
|
8
|
+
* set of all unit vectors in 4D space.
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import { Vec4 } from '../../math/Vec4.js';
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* Project a point onto the 3-sphere (hypersphere surface)
|
|
15
|
+
* @param {Vec4} point - Input point
|
|
16
|
+
* @param {number} radius - Hypersphere radius
|
|
17
|
+
* @returns {Vec4} Point on hypersphere
|
|
18
|
+
*/
|
|
19
|
+
export function projectToHypersphere(point, radius = 1) {
|
|
20
|
+
const len = point.length();
|
|
21
|
+
if (len < 0.0001) {
|
|
22
|
+
// Handle origin - project to north pole
|
|
23
|
+
return new Vec4(0, 0, 0, radius);
|
|
24
|
+
}
|
|
25
|
+
return point.scale(radius / len);
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Inverse stereographic projection from R³ to S³
|
|
30
|
+
* Maps all of 3D space onto the 4D hypersphere
|
|
31
|
+
* @param {Vec4} point - Input point (uses x, y, z)
|
|
32
|
+
* @param {number} radius - Hypersphere radius
|
|
33
|
+
* @returns {Vec4} Point on hypersphere
|
|
34
|
+
*/
|
|
35
|
+
export function stereographicToHypersphere(point, radius = 1) {
|
|
36
|
+
const x = point.x;
|
|
37
|
+
const y = point.y;
|
|
38
|
+
const z = point.z;
|
|
39
|
+
|
|
40
|
+
const sumSq = x * x + y * y + z * z;
|
|
41
|
+
const denom = sumSq + 1;
|
|
42
|
+
|
|
43
|
+
return new Vec4(
|
|
44
|
+
(2 * x) / denom * radius,
|
|
45
|
+
(2 * y) / denom * radius,
|
|
46
|
+
(2 * z) / denom * radius,
|
|
47
|
+
(sumSq - 1) / denom * radius
|
|
48
|
+
);
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Hopf fibration mapping
|
|
53
|
+
* Maps points on S² × [0, 2π] to S³
|
|
54
|
+
* Creates beautiful toroidal structures on the hypersphere
|
|
55
|
+
* @param {number} theta - Angle on base S² (0 to π)
|
|
56
|
+
* @param {number} phi - Azimuth on base S² (0 to 2π)
|
|
57
|
+
* @param {number} psi - Fiber angle (0 to 2π)
|
|
58
|
+
* @param {number} radius - Hypersphere radius
|
|
59
|
+
* @returns {Vec4} Point on hypersphere
|
|
60
|
+
*/
|
|
61
|
+
export function hopfFibration(theta, phi, psi, radius = 1) {
|
|
62
|
+
const cosTheta2 = Math.cos(theta / 2);
|
|
63
|
+
const sinTheta2 = Math.sin(theta / 2);
|
|
64
|
+
|
|
65
|
+
return new Vec4(
|
|
66
|
+
cosTheta2 * Math.cos((phi + psi) / 2) * radius,
|
|
67
|
+
cosTheta2 * Math.sin((phi + psi) / 2) * radius,
|
|
68
|
+
sinTheta2 * Math.cos((phi - psi) / 2) * radius,
|
|
69
|
+
sinTheta2 * Math.sin((phi - psi) / 2) * radius
|
|
70
|
+
);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Warp a geometry onto the hypersphere using radial projection
|
|
75
|
+
* @param {Vec4[]} vertices - Input vertices
|
|
76
|
+
* @param {number} radius - Hypersphere radius
|
|
77
|
+
* @param {number} blendFactor - How much to blend (0=original, 1=full sphere)
|
|
78
|
+
* @returns {Vec4[]} Warped vertices
|
|
79
|
+
*/
|
|
80
|
+
export function warpRadial(vertices, radius = 1, blendFactor = 1) {
|
|
81
|
+
return vertices.map(v => {
|
|
82
|
+
const onSphere = projectToHypersphere(v, radius);
|
|
83
|
+
return v.lerp(onSphere, blendFactor);
|
|
84
|
+
});
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
/**
|
|
88
|
+
* Warp geometry using stereographic projection
|
|
89
|
+
* Maps the entire geometry onto the hypersphere
|
|
90
|
+
* @param {Vec4[]} vertices - Input vertices
|
|
91
|
+
* @param {number} radius - Hypersphere radius
|
|
92
|
+
* @param {number} scale - Pre-scale factor before projection
|
|
93
|
+
* @returns {Vec4[]} Warped vertices
|
|
94
|
+
*/
|
|
95
|
+
export function warpStereographic(vertices, radius = 1, scale = 1) {
|
|
96
|
+
return vertices.map(v => {
|
|
97
|
+
const scaled = v.scale(scale);
|
|
98
|
+
return stereographicToHypersphere(scaled, radius);
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
/**
|
|
103
|
+
* Warp geometry along Hopf fibers
|
|
104
|
+
* Creates twisted, fibered structures
|
|
105
|
+
* @param {Vec4[]} vertices - Input vertices
|
|
106
|
+
* @param {number} radius - Hypersphere radius
|
|
107
|
+
* @param {number} twist - Twist factor along fiber
|
|
108
|
+
* @returns {Vec4[]} Warped vertices
|
|
109
|
+
*/
|
|
110
|
+
export function warpHopf(vertices, radius = 1, twist = 1) {
|
|
111
|
+
return vertices.map(v => {
|
|
112
|
+
// Convert to spherical-like coordinates
|
|
113
|
+
const r = v.length();
|
|
114
|
+
if (r < 0.0001) {
|
|
115
|
+
return new Vec4(0, 0, 0, radius);
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
// Use original angles but apply to Hopf structure
|
|
119
|
+
const theta = Math.acos(v.z / r);
|
|
120
|
+
const phi = Math.atan2(v.y, v.x);
|
|
121
|
+
const psi = v.w * twist + phi * 0.5;
|
|
122
|
+
|
|
123
|
+
return hopfFibration(theta, phi, psi, radius);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Main hypersphere core warp function
|
|
129
|
+
* Wraps base geometry in a 4D hypersphere structure
|
|
130
|
+
*
|
|
131
|
+
* @param {object} geometry - Base geometry with vertices and edges
|
|
132
|
+
* @param {object} options - Warp options
|
|
133
|
+
* @param {string} options.method - 'radial', 'stereographic', 'hopf'
|
|
134
|
+
* @param {number} options.radius - Hypersphere radius (default 1)
|
|
135
|
+
* @param {number} options.blend - Blend factor (default 1)
|
|
136
|
+
* @param {number} options.scale - Pre-scale factor (default 1)
|
|
137
|
+
* @param {number} options.twist - Hopf twist factor (default 1)
|
|
138
|
+
* @returns {object} Warped geometry
|
|
139
|
+
*/
|
|
140
|
+
export function warpHypersphereCore(geometry, options = {}) {
|
|
141
|
+
const {
|
|
142
|
+
method = 'radial',
|
|
143
|
+
radius = 1,
|
|
144
|
+
blend = 1,
|
|
145
|
+
scale = 1,
|
|
146
|
+
twist = 1
|
|
147
|
+
} = options;
|
|
148
|
+
|
|
149
|
+
let warpedVertices;
|
|
150
|
+
|
|
151
|
+
// Pre-scale vertices
|
|
152
|
+
const scaledVertices = geometry.vertices.map(v => v.scale(scale));
|
|
153
|
+
|
|
154
|
+
switch (method) {
|
|
155
|
+
case 'stereographic':
|
|
156
|
+
warpedVertices = warpStereographic(scaledVertices, radius, 1);
|
|
157
|
+
break;
|
|
158
|
+
|
|
159
|
+
case 'hopf':
|
|
160
|
+
warpedVertices = warpHopf(scaledVertices, radius, twist);
|
|
161
|
+
break;
|
|
162
|
+
|
|
163
|
+
case 'radial':
|
|
164
|
+
default:
|
|
165
|
+
warpedVertices = warpRadial(scaledVertices, radius, blend);
|
|
166
|
+
break;
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return {
|
|
170
|
+
...geometry,
|
|
171
|
+
name: `${geometry.name}_hypersphere`,
|
|
172
|
+
vertices: warpedVertices,
|
|
173
|
+
vertexCount: warpedVertices.length,
|
|
174
|
+
coreType: 'hypersphere',
|
|
175
|
+
warpMethod: method,
|
|
176
|
+
warpRadius: radius
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* Generate pure hypersphere surface (for reference)
|
|
182
|
+
* @param {number} radius - Hypersphere radius
|
|
183
|
+
* @param {number} segments - Resolution per angle
|
|
184
|
+
* @returns {Vec4[]} Vertices on hypersphere
|
|
185
|
+
*/
|
|
186
|
+
export function generateHypersphereSurface(radius = 1, segments = 16) {
|
|
187
|
+
const vertices = [];
|
|
188
|
+
|
|
189
|
+
// Use 3 angular parameters for S³
|
|
190
|
+
for (let i = 0; i <= segments; i++) {
|
|
191
|
+
const psi = (i / segments) * Math.PI;
|
|
192
|
+
for (let j = 0; j <= segments; j++) {
|
|
193
|
+
const theta = (j / segments) * Math.PI;
|
|
194
|
+
for (let k = 0; k <= segments * 2; k++) {
|
|
195
|
+
const phi = (k / (segments * 2)) * Math.PI * 2;
|
|
196
|
+
|
|
197
|
+
// Hyperspherical coordinates
|
|
198
|
+
const x = radius * Math.sin(psi) * Math.sin(theta) * Math.cos(phi);
|
|
199
|
+
const y = radius * Math.sin(psi) * Math.sin(theta) * Math.sin(phi);
|
|
200
|
+
const z = radius * Math.sin(psi) * Math.cos(theta);
|
|
201
|
+
const w = radius * Math.cos(psi);
|
|
202
|
+
|
|
203
|
+
vertices.push(new Vec4(x, y, z, w));
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
return vertices;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
export default warpHypersphereCore;
|