@vib3code/sdk 2.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (258) hide show
  1. package/CHANGELOG.md +118 -0
  2. package/DOCS/BLUEPRINT_EXECUTION_PLAN_2026-01-07.md +34 -0
  3. package/DOCS/CI_TESTING.md +38 -0
  4. package/DOCS/CLI_ONBOARDING.md +75 -0
  5. package/DOCS/CONTROL_REFERENCE.md +64 -0
  6. package/DOCS/DEV_TRACK_ANALYSIS.md +77 -0
  7. package/DOCS/DEV_TRACK_PLAN_2026-01-07.md +42 -0
  8. package/DOCS/DEV_TRACK_SESSION_2026-01-31.md +220 -0
  9. package/DOCS/ENV_SETUP.md +189 -0
  10. package/DOCS/EXPORT_FORMATS.md +417 -0
  11. package/DOCS/GPU_DISPOSAL_GUIDE.md +21 -0
  12. package/DOCS/LICENSING_TIERS.md +275 -0
  13. package/DOCS/MASTER_PLAN_2026-01-31.md +570 -0
  14. package/DOCS/OBS_SETUP_GUIDE.md +98 -0
  15. package/DOCS/PROJECT_SETUP.md +66 -0
  16. package/DOCS/RENDERER_LIFECYCLE.md +40 -0
  17. package/DOCS/REPO_MANIFEST.md +121 -0
  18. package/DOCS/SESSION_014_PLAN.md +195 -0
  19. package/DOCS/SESSION_LOG_2026-01-07.md +56 -0
  20. package/DOCS/STRATEGIC_BLUEPRINT_2026-01-07.md +72 -0
  21. package/DOCS/SYSTEM_AUDIT_2026-01-30.md +738 -0
  22. package/DOCS/SYSTEM_INVENTORY.md +520 -0
  23. package/DOCS/TELEMETRY_EXPORTS.md +34 -0
  24. package/DOCS/WEBGPU_STATUS.md +38 -0
  25. package/DOCS/XR_BENCHMARKS.md +608 -0
  26. package/LICENSE +21 -0
  27. package/README.md +426 -0
  28. package/docs/.nojekyll +0 -0
  29. package/docs/01-dissolution_of_euclidean_hegemony.html +346 -0
  30. package/docs/02-hyperspatial_ego_death.html +346 -0
  31. package/docs/03-post_cartesian_sublime.html +346 -0
  32. package/docs/04-crystalline_void_meditation.html +346 -0
  33. package/docs/05-quantum_decoherence_ballet.html +346 -0
  34. package/docs/06-dissolution_of_euclidean_hegemony.html +346 -0
  35. package/docs/07-hyperspatial_ego_death.html +346 -0
  36. package/docs/08-post_cartesian_sublime.html +346 -0
  37. package/docs/09-crystalline_void_meditation.html +346 -0
  38. package/docs/10-quantum_decoherence_ballet.html +346 -0
  39. package/docs/11-dissolution_of_euclidean_hegemony.html +346 -0
  40. package/docs/12-hyperspatial_ego_death.html +346 -0
  41. package/docs/13-post_cartesian_sublime.html +346 -0
  42. package/docs/index.html +794 -0
  43. package/docs/test-hub.html +441 -0
  44. package/docs/url-state.js +102 -0
  45. package/docs/vib3-exports/01-quantum-quantum-tetrahedron-lattice.html +489 -0
  46. package/docs/vib3-exports/02-quantum-quantum-hypersphere-matrix.html +489 -0
  47. package/docs/vib3-exports/03-quantum-quantum-hypertetra-fractal.html +489 -0
  48. package/docs/vib3-exports/04-faceted-faceted-crystal-structure.html +407 -0
  49. package/docs/vib3-exports/05-faceted-faceted-klein-bottle.html +407 -0
  50. package/docs/vib3-exports/06-faceted-faceted-hypertetra-torus.html +407 -0
  51. package/docs/vib3-exports/07-holographic-holographic-wave-field.html +457 -0
  52. package/docs/vib3-exports/08-holographic-holographic-hypersphere-sphere.html +457 -0
  53. package/docs/vib3-exports/09-holographic-holographic-hypertetra-crystal.html +457 -0
  54. package/docs/vib3-exports/index.html +238 -0
  55. package/docs/webgpu-live.html +702 -0
  56. package/package.json +367 -0
  57. package/src/advanced/AIPresetGenerator.js +777 -0
  58. package/src/advanced/MIDIController.js +703 -0
  59. package/src/advanced/OffscreenWorker.js +1051 -0
  60. package/src/advanced/WebGPUCompute.js +1051 -0
  61. package/src/advanced/WebXRRenderer.js +680 -0
  62. package/src/agent/cli/AgentCLI.js +615 -0
  63. package/src/agent/cli/index.js +14 -0
  64. package/src/agent/index.js +73 -0
  65. package/src/agent/mcp/MCPServer.js +950 -0
  66. package/src/agent/mcp/index.js +9 -0
  67. package/src/agent/mcp/tools.js +548 -0
  68. package/src/agent/telemetry/EventStream.js +669 -0
  69. package/src/agent/telemetry/Instrumentation.js +618 -0
  70. package/src/agent/telemetry/TelemetryExporters.js +427 -0
  71. package/src/agent/telemetry/TelemetryService.js +464 -0
  72. package/src/agent/telemetry/index.js +52 -0
  73. package/src/benchmarks/BenchmarkRunner.js +381 -0
  74. package/src/benchmarks/MetricsCollector.js +299 -0
  75. package/src/benchmarks/index.js +9 -0
  76. package/src/benchmarks/scenes.js +259 -0
  77. package/src/cli/index.js +675 -0
  78. package/src/config/ApiConfig.js +88 -0
  79. package/src/core/CanvasManager.js +217 -0
  80. package/src/core/ErrorReporter.js +117 -0
  81. package/src/core/ParameterMapper.js +333 -0
  82. package/src/core/Parameters.js +396 -0
  83. package/src/core/RendererContracts.js +200 -0
  84. package/src/core/UnifiedResourceManager.js +370 -0
  85. package/src/core/VIB3Engine.js +636 -0
  86. package/src/core/renderers/FacetedRendererAdapter.js +32 -0
  87. package/src/core/renderers/HolographicRendererAdapter.js +29 -0
  88. package/src/core/renderers/QuantumRendererAdapter.js +29 -0
  89. package/src/core/renderers/RendererLifecycleManager.js +63 -0
  90. package/src/creative/ColorPresetsSystem.js +980 -0
  91. package/src/creative/ParameterTimeline.js +1061 -0
  92. package/src/creative/PostProcessingPipeline.js +1113 -0
  93. package/src/creative/TransitionAnimator.js +683 -0
  94. package/src/export/CSSExporter.js +226 -0
  95. package/src/export/CardGeneratorBase.js +279 -0
  96. package/src/export/ExportManager.js +580 -0
  97. package/src/export/FacetedCardGenerator.js +279 -0
  98. package/src/export/HolographicCardGenerator.js +543 -0
  99. package/src/export/LottieExporter.js +552 -0
  100. package/src/export/QuantumCardGenerator.js +315 -0
  101. package/src/export/SVGExporter.js +519 -0
  102. package/src/export/ShaderExporter.js +903 -0
  103. package/src/export/TradingCardGenerator.js +3055 -0
  104. package/src/export/TradingCardManager.js +181 -0
  105. package/src/export/VIB3PackageExporter.js +559 -0
  106. package/src/export/index.js +14 -0
  107. package/src/export/systems/TradingCardSystemFaceted.js +494 -0
  108. package/src/export/systems/TradingCardSystemHolographic.js +452 -0
  109. package/src/export/systems/TradingCardSystemQuantum.js +411 -0
  110. package/src/faceted/FacetedSystem.js +963 -0
  111. package/src/features/CollectionManager.js +433 -0
  112. package/src/gallery/CollectionManager.js +240 -0
  113. package/src/gallery/GallerySystem.js +485 -0
  114. package/src/geometry/GeometryFactory.js +314 -0
  115. package/src/geometry/GeometryLibrary.js +72 -0
  116. package/src/geometry/buffers/BufferBuilder.js +338 -0
  117. package/src/geometry/buffers/index.js +18 -0
  118. package/src/geometry/generators/Crystal.js +420 -0
  119. package/src/geometry/generators/Fractal.js +298 -0
  120. package/src/geometry/generators/KleinBottle.js +197 -0
  121. package/src/geometry/generators/Sphere.js +192 -0
  122. package/src/geometry/generators/Tesseract.js +160 -0
  123. package/src/geometry/generators/Tetrahedron.js +225 -0
  124. package/src/geometry/generators/Torus.js +304 -0
  125. package/src/geometry/generators/Wave.js +341 -0
  126. package/src/geometry/index.js +142 -0
  127. package/src/geometry/warp/HypersphereCore.js +211 -0
  128. package/src/geometry/warp/HypertetraCore.js +386 -0
  129. package/src/geometry/warp/index.js +57 -0
  130. package/src/holograms/HolographicVisualizer.js +1073 -0
  131. package/src/holograms/RealHolographicSystem.js +966 -0
  132. package/src/holograms/variantRegistry.js +69 -0
  133. package/src/integrations/FigmaPlugin.js +854 -0
  134. package/src/integrations/OBSMode.js +754 -0
  135. package/src/integrations/ThreeJsPackage.js +660 -0
  136. package/src/integrations/TouchDesignerExport.js +552 -0
  137. package/src/integrations/frameworks/Vib3React.js +591 -0
  138. package/src/integrations/frameworks/Vib3Svelte.js +654 -0
  139. package/src/integrations/frameworks/Vib3Vue.js +628 -0
  140. package/src/llm/LLMParameterInterface.js +240 -0
  141. package/src/llm/LLMParameterUI.js +577 -0
  142. package/src/math/Mat4x4.js +708 -0
  143. package/src/math/Projection.js +341 -0
  144. package/src/math/Rotor4D.js +637 -0
  145. package/src/math/Vec4.js +476 -0
  146. package/src/math/constants.js +164 -0
  147. package/src/math/index.js +68 -0
  148. package/src/math/projections.js +54 -0
  149. package/src/math/rotations.js +196 -0
  150. package/src/quantum/QuantumEngine.js +906 -0
  151. package/src/quantum/QuantumVisualizer.js +1103 -0
  152. package/src/reactivity/ReactivityConfig.js +499 -0
  153. package/src/reactivity/ReactivityManager.js +586 -0
  154. package/src/reactivity/SpatialInputSystem.js +1783 -0
  155. package/src/reactivity/index.js +93 -0
  156. package/src/render/CommandBuffer.js +465 -0
  157. package/src/render/MultiCanvasBridge.js +340 -0
  158. package/src/render/RenderCommand.js +514 -0
  159. package/src/render/RenderResourceRegistry.js +523 -0
  160. package/src/render/RenderState.js +552 -0
  161. package/src/render/RenderTarget.js +512 -0
  162. package/src/render/ShaderLoader.js +253 -0
  163. package/src/render/ShaderProgram.js +599 -0
  164. package/src/render/UnifiedRenderBridge.js +496 -0
  165. package/src/render/backends/WebGLBackend.js +1108 -0
  166. package/src/render/backends/WebGPUBackend.js +1409 -0
  167. package/src/render/commands/CommandBufferExecutor.js +607 -0
  168. package/src/render/commands/RenderCommandBuffer.js +661 -0
  169. package/src/render/commands/index.js +17 -0
  170. package/src/render/index.js +367 -0
  171. package/src/scene/Disposable.js +498 -0
  172. package/src/scene/MemoryPool.js +618 -0
  173. package/src/scene/Node4D.js +697 -0
  174. package/src/scene/ResourceManager.js +599 -0
  175. package/src/scene/Scene4D.js +540 -0
  176. package/src/scene/index.js +98 -0
  177. package/src/schemas/error.schema.json +84 -0
  178. package/src/schemas/extension.schema.json +88 -0
  179. package/src/schemas/index.js +214 -0
  180. package/src/schemas/parameters.schema.json +142 -0
  181. package/src/schemas/tool-pack.schema.json +44 -0
  182. package/src/schemas/tool-response.schema.json +127 -0
  183. package/src/shaders/common/fullscreen.vert.glsl +5 -0
  184. package/src/shaders/common/fullscreen.vert.wgsl +17 -0
  185. package/src/shaders/common/geometry24.glsl +65 -0
  186. package/src/shaders/common/geometry24.wgsl +54 -0
  187. package/src/shaders/common/rotation4d.glsl +85 -0
  188. package/src/shaders/common/rotation4d.wgsl +86 -0
  189. package/src/shaders/common/uniforms.glsl +44 -0
  190. package/src/shaders/common/uniforms.wgsl +48 -0
  191. package/src/shaders/faceted/faceted.frag.glsl +129 -0
  192. package/src/shaders/faceted/faceted.frag.wgsl +164 -0
  193. package/src/shaders/holographic/holographic.frag.glsl +406 -0
  194. package/src/shaders/holographic/holographic.frag.wgsl +185 -0
  195. package/src/shaders/quantum/quantum.frag.glsl +513 -0
  196. package/src/shaders/quantum/quantum.frag.wgsl +361 -0
  197. package/src/testing/ParallelTestFramework.js +519 -0
  198. package/src/testing/__snapshots__/exportFormats.test.js.snap +24 -0
  199. package/src/testing/exportFormats.test.js +8 -0
  200. package/src/testing/projections.test.js +14 -0
  201. package/src/testing/rotations.test.js +37 -0
  202. package/src/ui/InteractivityMenu.js +516 -0
  203. package/src/ui/StatusManager.js +96 -0
  204. package/src/ui/adaptive/renderers/webgpu/BufferLayout.ts +252 -0
  205. package/src/ui/adaptive/renderers/webgpu/PolytopeInstanceBuffer.ts +144 -0
  206. package/src/ui/adaptive/renderers/webgpu/TripleBufferedUniform.ts +170 -0
  207. package/src/ui/adaptive/renderers/webgpu/WebGPURenderer.ts +735 -0
  208. package/src/ui/adaptive/renderers/webgpu/index.ts +112 -0
  209. package/src/variations/VariationManager.js +431 -0
  210. package/src/viewer/AudioReactivity.js +505 -0
  211. package/src/viewer/CardBending.js +481 -0
  212. package/src/viewer/GalleryUI.js +832 -0
  213. package/src/viewer/ReactivityManager.js +590 -0
  214. package/src/viewer/TradingCardExporter.js +600 -0
  215. package/src/viewer/ViewerPortal.js +374 -0
  216. package/src/viewer/index.js +12 -0
  217. package/src/wasm/WasmLoader.js +296 -0
  218. package/src/wasm/index.js +132 -0
  219. package/tools/agentic/mcpTools.js +88 -0
  220. package/tools/cli/agent-cli.js +92 -0
  221. package/tools/export/formats.js +24 -0
  222. package/tools/math/rotation-baseline.mjs +64 -0
  223. package/tools/shader-sync-verify.js +937 -0
  224. package/tools/telemetry/manifestPipeline.js +141 -0
  225. package/tools/telemetry/telemetryEvents.js +35 -0
  226. package/types/adaptive-sdk.d.ts +185 -0
  227. package/types/advanced/AIPresetGenerator.d.ts +81 -0
  228. package/types/advanced/MIDIController.d.ts +100 -0
  229. package/types/advanced/OffscreenWorker.d.ts +82 -0
  230. package/types/advanced/WebGPUCompute.d.ts +52 -0
  231. package/types/advanced/WebXRRenderer.d.ts +77 -0
  232. package/types/advanced/index.d.ts +46 -0
  233. package/types/core/ErrorReporter.d.ts +50 -0
  234. package/types/core/VIB3Engine.d.ts +204 -0
  235. package/types/creative/ColorPresetsSystem.d.ts +91 -0
  236. package/types/creative/ParameterTimeline.d.ts +74 -0
  237. package/types/creative/PostProcessingPipeline.d.ts +109 -0
  238. package/types/creative/TransitionAnimator.d.ts +71 -0
  239. package/types/creative/index.d.ts +35 -0
  240. package/types/integrations/FigmaPlugin.d.ts +46 -0
  241. package/types/integrations/OBSMode.d.ts +74 -0
  242. package/types/integrations/ThreeJsPackage.d.ts +62 -0
  243. package/types/integrations/TouchDesignerExport.d.ts +36 -0
  244. package/types/integrations/Vib3React.d.ts +74 -0
  245. package/types/integrations/Vib3Svelte.d.ts +63 -0
  246. package/types/integrations/Vib3Vue.d.ts +55 -0
  247. package/types/integrations/index.d.ts +52 -0
  248. package/types/reactivity/SpatialInputSystem.d.ts +173 -0
  249. package/types/reactivity/index.d.ts +394 -0
  250. package/types/render/CommandBuffer.d.ts +169 -0
  251. package/types/render/RenderCommand.d.ts +312 -0
  252. package/types/render/RenderState.d.ts +279 -0
  253. package/types/render/RenderTarget.d.ts +254 -0
  254. package/types/render/ShaderProgram.d.ts +277 -0
  255. package/types/render/UnifiedRenderBridge.d.ts +143 -0
  256. package/types/render/WebGLBackend.d.ts +168 -0
  257. package/types/render/WebGPUBackend.d.ts +186 -0
  258. package/types/render/index.d.ts +141 -0
@@ -0,0 +1,420 @@
1
+ /**
2
+ * Crystal Geometry Generator
3
+ *
4
+ * Generates crystalline structures in 4D space.
5
+ * Includes octahedral, cubic, and higher-dimensional lattice structures.
6
+ */
7
+
8
+ import { Vec4 } from '../../math/Vec4.js';
9
+
10
+ /**
11
+ * Generate 4D octahedral cross-polytope (16-cell)
12
+ * The 4D analog of an octahedron
13
+ * @param {number} size - Scale factor
14
+ * @returns {Vec4[]} 8 vertices
15
+ */
16
+ export function generate16CellVertices(size = 1) {
17
+ return [
18
+ new Vec4(size, 0, 0, 0),
19
+ new Vec4(-size, 0, 0, 0),
20
+ new Vec4(0, size, 0, 0),
21
+ new Vec4(0, -size, 0, 0),
22
+ new Vec4(0, 0, size, 0),
23
+ new Vec4(0, 0, -size, 0),
24
+ new Vec4(0, 0, 0, size),
25
+ new Vec4(0, 0, 0, -size)
26
+ ];
27
+ }
28
+
29
+ /**
30
+ * Generate 16-cell edges
31
+ * Each vertex connects to all others except its opposite
32
+ * @returns {number[][]} 24 edges
33
+ */
34
+ export function generate16CellEdges() {
35
+ const edges = [];
36
+ // Pairs: (0,1), (2,3), (4,5), (6,7) are opposite vertices
37
+ for (let i = 0; i < 8; i++) {
38
+ for (let j = i + 1; j < 8; j++) {
39
+ // Skip opposite vertices (differ by 1 and i is even)
40
+ if (j === i + 1 && i % 2 === 0) continue;
41
+ edges.push([i, j]);
42
+ }
43
+ }
44
+ return edges;
45
+ }
46
+
47
+ /**
48
+ * Generate 24-cell vertices (self-dual 4D polytope)
49
+ * @param {number} size - Scale factor
50
+ * @returns {Vec4[]} 24 vertices
51
+ */
52
+ export function generate24CellVertices(size = 1) {
53
+ const vertices = [];
54
+ const s = size / Math.sqrt(2);
55
+
56
+ // 16 vertices from tesseract edges
57
+ for (let i = 0; i < 4; i++) {
58
+ for (let j = i + 1; j < 4; j++) {
59
+ const signs = [
60
+ [1, 1], [1, -1], [-1, 1], [-1, -1]
61
+ ];
62
+ for (const [s1, s2] of signs) {
63
+ const v = new Vec4(0, 0, 0, 0);
64
+ v.data[i] = s1 * s;
65
+ v.data[j] = s2 * s;
66
+ vertices.push(v);
67
+ }
68
+ }
69
+ }
70
+
71
+ return vertices;
72
+ }
73
+
74
+ /**
75
+ * Generate 24-cell edges
76
+ * @returns {number[][]} 96 edges
77
+ */
78
+ export function generate24CellEdges() {
79
+ const vertices = generate24CellVertices(1);
80
+ const edges = [];
81
+ const edgeLength = 1; // Normalized edge length
82
+
83
+ for (let i = 0; i < vertices.length; i++) {
84
+ for (let j = i + 1; j < vertices.length; j++) {
85
+ const dist = vertices[i].distanceTo(vertices[j]);
86
+ if (Math.abs(dist - edgeLength) < 0.01) {
87
+ edges.push([i, j]);
88
+ }
89
+ }
90
+ }
91
+
92
+ return edges;
93
+ }
94
+
95
+ /**
96
+ * Generate cubic lattice in 4D
97
+ * @param {number} size - Lattice extent
98
+ * @param {number} spacing - Point spacing
99
+ * @returns {Vec4[]} Lattice points
100
+ */
101
+ export function generateCubicLattice4D(size = 2, spacing = 0.5) {
102
+ const vertices = [];
103
+ const n = Math.floor(size / spacing);
104
+
105
+ for (let x = -n; x <= n; x++) {
106
+ for (let y = -n; y <= n; y++) {
107
+ for (let z = -n; z <= n; z++) {
108
+ for (let w = -n; w <= n; w++) {
109
+ vertices.push(new Vec4(
110
+ x * spacing,
111
+ y * spacing,
112
+ z * spacing,
113
+ w * spacing
114
+ ));
115
+ }
116
+ }
117
+ }
118
+ }
119
+
120
+ return vertices;
121
+ }
122
+
123
+ /**
124
+ * Generate FCC (face-centered cubic) lattice extended to 4D
125
+ * @param {number} size - Lattice extent
126
+ * @param {number} spacing - Base spacing
127
+ * @returns {Vec4[]} Lattice points
128
+ */
129
+ export function generateFCCLattice4D(size = 1.5, spacing = 1) {
130
+ const vertices = [];
131
+ const n = Math.floor(size / spacing);
132
+ const half = spacing / 2;
133
+
134
+ for (let x = -n; x <= n; x++) {
135
+ for (let y = -n; y <= n; y++) {
136
+ for (let z = -n; z <= n; z++) {
137
+ for (let w = -n; w <= n; w++) {
138
+ // Corner positions
139
+ vertices.push(new Vec4(
140
+ x * spacing,
141
+ y * spacing,
142
+ z * spacing,
143
+ w * spacing
144
+ ));
145
+
146
+ // Face centers (4D has 6 2-faces meeting at each vertex)
147
+ if (x < n && y < n) {
148
+ vertices.push(new Vec4(
149
+ x * spacing + half,
150
+ y * spacing + half,
151
+ z * spacing,
152
+ w * spacing
153
+ ));
154
+ }
155
+ if (x < n && z < n) {
156
+ vertices.push(new Vec4(
157
+ x * spacing + half,
158
+ y * spacing,
159
+ z * spacing + half,
160
+ w * spacing
161
+ ));
162
+ }
163
+ if (x < n && w < n) {
164
+ vertices.push(new Vec4(
165
+ x * spacing + half,
166
+ y * spacing,
167
+ z * spacing,
168
+ w * spacing + half
169
+ ));
170
+ }
171
+ }
172
+ }
173
+ }
174
+ }
175
+
176
+ return vertices;
177
+ }
178
+
179
+ /**
180
+ * Generate diamond crystal structure in 4D
181
+ * @param {number} size - Crystal size
182
+ * @param {number} spacing - Lattice spacing
183
+ * @returns {object} Vertices and edges
184
+ */
185
+ export function generateDiamondCrystal4D(size = 1.5, spacing = 1) {
186
+ const vertices = [];
187
+ const edges = [];
188
+ const n = Math.floor(size / spacing);
189
+ const offset = spacing / 4;
190
+
191
+ // Base FCC lattice
192
+ const fcc = generateFCCLattice4D(size, spacing);
193
+
194
+ // Add offset positions (diamond has two interpenetrating FCC lattices)
195
+ for (const v of fcc) {
196
+ vertices.push(v);
197
+ vertices.push(new Vec4(
198
+ v.x + offset,
199
+ v.y + offset,
200
+ v.z + offset,
201
+ v.w + offset
202
+ ));
203
+ }
204
+
205
+ // Connect nearest neighbors
206
+ const bondLength = spacing * Math.sqrt(3) / 4 * 1.1; // With tolerance
207
+
208
+ for (let i = 0; i < vertices.length; i++) {
209
+ for (let j = i + 1; j < vertices.length; j++) {
210
+ const dist = vertices[i].distanceTo(vertices[j]);
211
+ if (dist < bondLength && dist > 0.01) {
212
+ edges.push([i, j]);
213
+ }
214
+ }
215
+ }
216
+
217
+ return { vertices, edges };
218
+ }
219
+
220
+ /**
221
+ * Generate quasicrystal pattern in 4D (Penrose-like)
222
+ * Uses projection from higher-dimensional lattice
223
+ * @param {number} size - Pattern size
224
+ * @param {number} density - Point density
225
+ * @returns {Vec4[]} Vertices
226
+ */
227
+ export function generateQuasicrystal4D(size = 2, density = 10) {
228
+ const vertices = [];
229
+ const n = density;
230
+
231
+ // Golden ratio for quasicrystal symmetry
232
+ const phi = (1 + Math.sqrt(5)) / 2;
233
+
234
+ // Generate points using icosahedral projection
235
+ for (let i = -n; i <= n; i++) {
236
+ for (let j = -n; j <= n; j++) {
237
+ for (let k = -n; k <= n; k++) {
238
+ // Project from 6D to 4D using golden ratio
239
+ const x = (i + phi * j) / n * size;
240
+ const y = (j + phi * k) / n * size;
241
+ const z = (k + phi * i) / n * size;
242
+ const w = (i - j + k) / (n * 2) * size;
243
+
244
+ // Keep points within bounds
245
+ const len = Math.sqrt(x * x + y * y + z * z + w * w);
246
+ if (len <= size * 1.5) {
247
+ vertices.push(new Vec4(x, y, z, w));
248
+ }
249
+ }
250
+ }
251
+ }
252
+
253
+ return vertices;
254
+ }
255
+
256
+ /**
257
+ * Generate crystal unit cell with specified symmetry
258
+ * @param {string} type - 'cubic', 'tetragonal', 'orthorhombic', 'hexagonal'
259
+ * @param {number} size - Cell size
260
+ * @returns {object} Vertices and edges
261
+ */
262
+ export function generateUnitCell4D(type = 'cubic', size = 1) {
263
+ const vertices = [];
264
+ const edges = [];
265
+
266
+ switch (type) {
267
+ case 'cubic':
268
+ // Regular 4D hypercube unit cell
269
+ for (let x = 0; x <= 1; x++) {
270
+ for (let y = 0; y <= 1; y++) {
271
+ for (let z = 0; z <= 1; z++) {
272
+ for (let w = 0; w <= 1; w++) {
273
+ vertices.push(new Vec4(
274
+ x * size, y * size, z * size, w * size
275
+ ));
276
+ }
277
+ }
278
+ }
279
+ }
280
+ break;
281
+
282
+ case 'tetragonal':
283
+ // Stretched in W direction
284
+ for (let x = 0; x <= 1; x++) {
285
+ for (let y = 0; y <= 1; y++) {
286
+ for (let z = 0; z <= 1; z++) {
287
+ for (let w = 0; w <= 1; w++) {
288
+ vertices.push(new Vec4(
289
+ x * size, y * size, z * size, w * size * 1.5
290
+ ));
291
+ }
292
+ }
293
+ }
294
+ }
295
+ break;
296
+
297
+ case 'hexagonal':
298
+ // Hexagonal base with W extension
299
+ const angles = [0, Math.PI / 3, 2 * Math.PI / 3,
300
+ Math.PI, 4 * Math.PI / 3, 5 * Math.PI / 3];
301
+ for (const angle of angles) {
302
+ for (let z = 0; z <= 1; z++) {
303
+ for (let w = 0; w <= 1; w++) {
304
+ vertices.push(new Vec4(
305
+ Math.cos(angle) * size,
306
+ Math.sin(angle) * size,
307
+ z * size,
308
+ w * size
309
+ ));
310
+ }
311
+ }
312
+ }
313
+ // Center vertices
314
+ for (let z = 0; z <= 1; z++) {
315
+ for (let w = 0; w <= 1; w++) {
316
+ vertices.push(new Vec4(0, 0, z * size, w * size));
317
+ }
318
+ }
319
+ break;
320
+
321
+ default:
322
+ // Default to cubic
323
+ return generateUnitCell4D('cubic', size);
324
+ }
325
+
326
+ // Generate edges for unit cell (connect nearest neighbors)
327
+ const maxEdge = size * 1.1;
328
+ for (let i = 0; i < vertices.length; i++) {
329
+ for (let j = i + 1; j < vertices.length; j++) {
330
+ const dist = vertices[i].distanceTo(vertices[j]);
331
+ if (dist <= maxEdge && dist > 0.01) {
332
+ edges.push([i, j]);
333
+ }
334
+ }
335
+ }
336
+
337
+ return { vertices, edges };
338
+ }
339
+
340
+ /**
341
+ * Generate crystal edges based on nearest neighbors
342
+ * @param {Vec4[]} vertices
343
+ * @param {number} bondLength - Maximum bond length
344
+ * @returns {number[][]} Edge pairs
345
+ */
346
+ export function generateCrystalEdges(vertices, bondLength = 0.6) {
347
+ const edges = [];
348
+
349
+ for (let i = 0; i < vertices.length; i++) {
350
+ for (let j = i + 1; j < vertices.length; j++) {
351
+ const dist = vertices[i].distanceTo(vertices[j]);
352
+ if (dist <= bondLength && dist > 0.001) {
353
+ edges.push([i, j]);
354
+ }
355
+ }
356
+ }
357
+
358
+ return edges;
359
+ }
360
+
361
+ /**
362
+ * Generate complete crystal geometry
363
+ * @param {string} type - '16cell', '24cell', 'cubic', 'fcc', 'diamond', 'quasicrystal'
364
+ * @param {number} scale - Overall scale
365
+ * @param {object} params - Additional parameters
366
+ * @returns {object} Geometry
367
+ */
368
+ export function generateCrystal(type = '16cell', scale = 1, params = {}) {
369
+ let vertices, edges;
370
+
371
+ switch (type) {
372
+ case '16cell':
373
+ vertices = generate16CellVertices(scale);
374
+ edges = generate16CellEdges();
375
+ break;
376
+
377
+ case '24cell':
378
+ vertices = generate24CellVertices(scale);
379
+ edges = generate24CellEdges();
380
+ break;
381
+
382
+ case 'cubic':
383
+ vertices = generateCubicLattice4D(scale, params.spacing || 0.5);
384
+ edges = generateCrystalEdges(vertices, (params.spacing || 0.5) * 1.1);
385
+ break;
386
+
387
+ case 'fcc':
388
+ vertices = generateFCCLattice4D(scale, params.spacing || 1);
389
+ edges = generateCrystalEdges(vertices, (params.spacing || 1) * 0.8);
390
+ break;
391
+
392
+ case 'diamond':
393
+ const diamond = generateDiamondCrystal4D(scale, params.spacing || 1);
394
+ vertices = diamond.vertices;
395
+ edges = diamond.edges;
396
+ break;
397
+
398
+ case 'quasicrystal':
399
+ vertices = generateQuasicrystal4D(scale, params.density || 10);
400
+ edges = generateCrystalEdges(vertices, scale * 0.3);
401
+ break;
402
+
403
+ default:
404
+ vertices = generate16CellVertices(scale);
405
+ edges = generate16CellEdges();
406
+ }
407
+
408
+ return {
409
+ name: `crystal_${type}`,
410
+ vertices,
411
+ edges,
412
+ faces: [],
413
+ vertexCount: vertices.length,
414
+ edgeCount: edges.length,
415
+ faceCount: 0,
416
+ crystalType: type
417
+ };
418
+ }
419
+
420
+ export default generateCrystal;
@@ -0,0 +1,298 @@
1
+ /**
2
+ * Fractal Geometry Generator
3
+ *
4
+ * Generates recursive fractal structures in 4D space.
5
+ * Uses Menger sponge and Sierpinski-like constructions extended to 4D.
6
+ */
7
+
8
+ import { Vec4 } from '../../math/Vec4.js';
9
+
10
+ /**
11
+ * Generate 4D Sierpinski simplex (pentatope fractal)
12
+ * @param {number} depth - Recursion depth (0-4 recommended)
13
+ * @param {number} scale - Overall scale
14
+ * @returns {Vec4[]} Vertices
15
+ */
16
+ export function generateSierpinskiPentatope(depth = 2, scale = 1) {
17
+ // Base pentatope vertices (5-cell)
18
+ const baseVertices = [
19
+ new Vec4(1, 1, 1, -1 / Math.sqrt(5)).scale(scale),
20
+ new Vec4(1, -1, -1, -1 / Math.sqrt(5)).scale(scale),
21
+ new Vec4(-1, 1, -1, -1 / Math.sqrt(5)).scale(scale),
22
+ new Vec4(-1, -1, 1, -1 / Math.sqrt(5)).scale(scale),
23
+ new Vec4(0, 0, 0, Math.sqrt(5) - 1 / Math.sqrt(5)).scale(scale)
24
+ ];
25
+
26
+ if (depth === 0) {
27
+ return baseVertices;
28
+ }
29
+
30
+ const vertices = [];
31
+
32
+ // Recursive subdivision
33
+ function subdivide(verts, d) {
34
+ if (d === 0) {
35
+ vertices.push(...verts);
36
+ return;
37
+ }
38
+
39
+ // Find midpoints and create 5 smaller pentatopes
40
+ const midpoints = [];
41
+ for (let i = 0; i < 5; i++) {
42
+ for (let j = i + 1; j < 5; j++) {
43
+ midpoints.push(verts[i].lerp(verts[j], 0.5));
44
+ }
45
+ }
46
+
47
+ // Create 5 sub-pentatopes at each vertex
48
+ for (let i = 0; i < 5; i++) {
49
+ const subVerts = [verts[i]];
50
+ // Find midpoints connected to vertex i
51
+ let idx = 0;
52
+ for (let j = 0; j < 5; j++) {
53
+ for (let k = j + 1; k < 5; k++) {
54
+ if (j === i || k === i) {
55
+ subVerts.push(midpoints[idx]);
56
+ }
57
+ idx++;
58
+ }
59
+ }
60
+ if (subVerts.length >= 5) {
61
+ subdivide(subVerts.slice(0, 5), d - 1);
62
+ }
63
+ }
64
+ }
65
+
66
+ subdivide(baseVertices, depth);
67
+ return vertices;
68
+ }
69
+
70
+ /**
71
+ * Generate 4D Menger sponge analog
72
+ * @param {number} depth - Recursion depth (0-3 recommended)
73
+ * @param {number} scale - Overall scale
74
+ * @returns {Vec4[]} Vertices
75
+ */
76
+ export function generateMengerHypersponge(depth = 1, scale = 1) {
77
+ const vertices = [];
78
+
79
+ function addCube(center, size, d) {
80
+ if (d === 0) {
81
+ // Add 16 vertices of this hypercube
82
+ for (let x = -1; x <= 1; x += 2) {
83
+ for (let y = -1; y <= 1; y += 2) {
84
+ for (let z = -1; z <= 1; z += 2) {
85
+ for (let w = -1; w <= 1; w += 2) {
86
+ vertices.push(new Vec4(
87
+ center.x + x * size,
88
+ center.y + y * size,
89
+ center.z + z * size,
90
+ center.w + w * size
91
+ ));
92
+ }
93
+ }
94
+ }
95
+ }
96
+ return;
97
+ }
98
+
99
+ // Subdivide into 3x3x3x3 = 81 sub-cubes
100
+ // Remove center and face-adjacent cubes (Menger rule extended to 4D)
101
+ const subSize = size / 3;
102
+
103
+ for (let x = -1; x <= 1; x++) {
104
+ for (let y = -1; y <= 1; y++) {
105
+ for (let z = -1; z <= 1; z++) {
106
+ for (let w = -1; w <= 1; w++) {
107
+ // Count how many coordinates are 0 (center)
108
+ const zeros = (x === 0 ? 1 : 0) +
109
+ (y === 0 ? 1 : 0) +
110
+ (z === 0 ? 1 : 0) +
111
+ (w === 0 ? 1 : 0);
112
+
113
+ // Skip if 2 or more coordinates are 0 (hollow center)
114
+ if (zeros >= 2) continue;
115
+
116
+ const subCenter = new Vec4(
117
+ center.x + x * subSize * 2,
118
+ center.y + y * subSize * 2,
119
+ center.z + z * subSize * 2,
120
+ center.w + w * subSize * 2
121
+ );
122
+
123
+ addCube(subCenter, subSize, d - 1);
124
+ }
125
+ }
126
+ }
127
+ }
128
+ }
129
+
130
+ addCube(Vec4.zero(), scale, depth);
131
+ return vertices;
132
+ }
133
+
134
+ /**
135
+ * Generate fractal tree in 4D
136
+ * @param {number} depth - Recursion depth
137
+ * @param {number} length - Initial branch length
138
+ * @param {number} angle - Branch angle
139
+ * @returns {object} Vertices and edges
140
+ */
141
+ export function generateFractalTree4D(depth = 4, length = 1, angle = Math.PI / 6) {
142
+ const vertices = [Vec4.zero()];
143
+ const edges = [];
144
+
145
+ function branch(startIdx, dir, len, d) {
146
+ if (d === 0 || len < 0.01) return;
147
+
148
+ const startVert = vertices[startIdx];
149
+ const endVert = startVert.add(dir.scale(len));
150
+ const endIdx = vertices.length;
151
+ vertices.push(endVert);
152
+ edges.push([startIdx, endIdx]);
153
+
154
+ // Branch in all 4D rotation planes
155
+ const planes = [
156
+ { cos: Math.cos(angle), sin: Math.sin(angle), axes: ['x', 'y'] },
157
+ { cos: Math.cos(angle), sin: Math.sin(angle), axes: ['x', 'z'] },
158
+ { cos: Math.cos(angle), sin: Math.sin(angle), axes: ['x', 'w'] },
159
+ { cos: Math.cos(-angle), sin: Math.sin(-angle), axes: ['y', 'z'] }
160
+ ];
161
+
162
+ const decay = 0.7;
163
+
164
+ for (const plane of planes) {
165
+ const newDir = rotateVector(dir, plane);
166
+ branch(endIdx, newDir, len * decay, d - 1);
167
+ }
168
+ }
169
+
170
+ function rotateVector(v, plane) {
171
+ const result = v.clone();
172
+ const a1 = plane.axes[0];
173
+ const a2 = plane.axes[1];
174
+ const v1 = v[a1];
175
+ const v2 = v[a2];
176
+ result[a1] = v1 * plane.cos - v2 * plane.sin;
177
+ result[a2] = v1 * plane.sin + v2 * plane.cos;
178
+ return result;
179
+ }
180
+
181
+ // Start branches in positive W direction
182
+ branch(0, new Vec4(0, 1, 0, 0.5).normalize(), length, depth);
183
+
184
+ return { vertices, edges };
185
+ }
186
+
187
+ /**
188
+ * Generate Cantor dust in 4D (hypercube subdivision)
189
+ * @param {number} depth - Recursion depth
190
+ * @param {number} scale - Overall scale
191
+ * @returns {Vec4[]} Point cloud
192
+ */
193
+ export function generateCantorDust4D(depth = 3, scale = 1) {
194
+ const points = [];
195
+
196
+ function subdivide(center, size, d) {
197
+ if (d === 0) {
198
+ points.push(center);
199
+ return;
200
+ }
201
+
202
+ const subSize = size / 3;
203
+
204
+ // Only keep corners (Cantor rule: remove middle third)
205
+ for (let x = -1; x <= 1; x += 2) {
206
+ for (let y = -1; y <= 1; y += 2) {
207
+ for (let z = -1; z <= 1; z += 2) {
208
+ for (let w = -1; w <= 1; w += 2) {
209
+ const subCenter = new Vec4(
210
+ center.x + x * subSize * 2,
211
+ center.y + y * subSize * 2,
212
+ center.z + z * subSize * 2,
213
+ center.w + w * subSize * 2
214
+ );
215
+ subdivide(subCenter, subSize, d - 1);
216
+ }
217
+ }
218
+ }
219
+ }
220
+ }
221
+
222
+ subdivide(Vec4.zero(), scale, depth);
223
+ return points;
224
+ }
225
+
226
+ /**
227
+ * Generate fractal edges for a vertex set
228
+ * @param {Vec4[]} vertices
229
+ * @param {number} maxDistance - Maximum edge distance
230
+ * @returns {number[][]} Edge pairs
231
+ */
232
+ export function generateFractalEdges(vertices, maxDistance = 0.5) {
233
+ const edges = [];
234
+ const n = vertices.length;
235
+
236
+ for (let i = 0; i < n; i++) {
237
+ for (let j = i + 1; j < n; j++) {
238
+ const dist = vertices[i].distanceTo(vertices[j]);
239
+ if (dist < maxDistance && dist > 0.001) {
240
+ edges.push([i, j]);
241
+ }
242
+ }
243
+ }
244
+
245
+ return edges;
246
+ }
247
+
248
+ /**
249
+ * Generate complete fractal geometry
250
+ * @param {string} type - 'sierpinski', 'menger', 'tree', 'cantor'
251
+ * @param {number} depth - Recursion depth
252
+ * @param {number} scale - Overall scale
253
+ * @returns {object} Geometry
254
+ */
255
+ export function generateFractal(type = 'sierpinski', depth = 2, scale = 1) {
256
+ let vertices, edges;
257
+
258
+ switch (type) {
259
+ case 'sierpinski':
260
+ vertices = generateSierpinskiPentatope(depth, scale);
261
+ edges = generateFractalEdges(vertices, scale * 0.8);
262
+ break;
263
+
264
+ case 'menger':
265
+ vertices = generateMengerHypersponge(depth, scale);
266
+ edges = generateFractalEdges(vertices, scale * 0.4 / Math.pow(3, depth));
267
+ break;
268
+
269
+ case 'tree':
270
+ const tree = generateFractalTree4D(depth, scale);
271
+ vertices = tree.vertices;
272
+ edges = tree.edges;
273
+ break;
274
+
275
+ case 'cantor':
276
+ vertices = generateCantorDust4D(depth, scale);
277
+ edges = generateFractalEdges(vertices, scale * 0.3);
278
+ break;
279
+
280
+ default:
281
+ vertices = generateSierpinskiPentatope(depth, scale);
282
+ edges = generateFractalEdges(vertices, scale * 0.8);
283
+ }
284
+
285
+ return {
286
+ name: `fractal_${type}`,
287
+ vertices,
288
+ edges,
289
+ faces: [],
290
+ vertexCount: vertices.length,
291
+ edgeCount: edges.length,
292
+ faceCount: 0,
293
+ fractalDepth: depth,
294
+ fractalType: type
295
+ };
296
+ }
297
+
298
+ export default generateFractal;