@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,618 @@
1
+ /**
2
+ * MemoryPool - Efficient memory allocation for frequently created/destroyed objects
3
+ *
4
+ * Provides object pooling to reduce GC pressure and improve performance.
5
+ * Supports both fixed-size and dynamic pools.
6
+ */
7
+
8
+ /**
9
+ * Generic object pool
10
+ * @template T
11
+ */
12
+ export class ObjectPool {
13
+ /**
14
+ * @param {function(): T} factory - Function to create new objects
15
+ * @param {function(T): void} [reset] - Function to reset objects before reuse
16
+ * @param {object} [options] - Pool options
17
+ */
18
+ constructor(factory, reset = null, options = {}) {
19
+ /** @type {function(): T} */
20
+ this._factory = factory;
21
+
22
+ /** @type {function(T): void} */
23
+ this._reset = reset;
24
+
25
+ /** @type {T[]} Available objects */
26
+ this._available = [];
27
+
28
+ /** @type {Set<T>} Objects currently in use */
29
+ this._inUse = new Set();
30
+
31
+ /** @type {number} Maximum pool size (0 = unlimited) */
32
+ this.maxSize = options.maxSize || 0;
33
+
34
+ /** @type {number} Initial pool size */
35
+ this.initialSize = options.initialSize || 0;
36
+
37
+ /** @type {boolean} Whether to pre-warm the pool */
38
+ this.preWarm = options.preWarm !== false;
39
+
40
+ /** @type {number} Total allocations */
41
+ this._totalAllocations = 0;
42
+
43
+ /** @type {number} Pool hits (reused) */
44
+ this._hits = 0;
45
+
46
+ /** @type {number} Pool misses (created new) */
47
+ this._misses = 0;
48
+
49
+ // Pre-warm pool
50
+ if (this.preWarm && this.initialSize > 0) {
51
+ for (let i = 0; i < this.initialSize; i++) {
52
+ this._available.push(this._factory());
53
+ }
54
+ }
55
+ }
56
+
57
+ /**
58
+ * Acquire an object from the pool
59
+ * @returns {T}
60
+ */
61
+ acquire() {
62
+ this._totalAllocations++;
63
+
64
+ if (this._available.length > 0) {
65
+ this._hits++;
66
+ const obj = this._available.pop();
67
+ this._inUse.add(obj);
68
+ return obj;
69
+ }
70
+
71
+ this._misses++;
72
+ const obj = this._factory();
73
+ this._inUse.add(obj);
74
+ return obj;
75
+ }
76
+
77
+ /**
78
+ * Release an object back to the pool
79
+ * @param {T} obj
80
+ * @returns {boolean} True if returned to pool
81
+ */
82
+ release(obj) {
83
+ if (!this._inUse.has(obj)) {
84
+ return false;
85
+ }
86
+
87
+ this._inUse.delete(obj);
88
+
89
+ // Check pool size limit
90
+ if (this.maxSize > 0 && this._available.length >= this.maxSize) {
91
+ return false;
92
+ }
93
+
94
+ // Reset object before returning to pool
95
+ if (this._reset) {
96
+ this._reset(obj);
97
+ }
98
+
99
+ this._available.push(obj);
100
+ return true;
101
+ }
102
+
103
+ /**
104
+ * Release all in-use objects
105
+ */
106
+ releaseAll() {
107
+ for (const obj of this._inUse) {
108
+ if (this._reset) {
109
+ this._reset(obj);
110
+ }
111
+ if (this.maxSize === 0 || this._available.length < this.maxSize) {
112
+ this._available.push(obj);
113
+ }
114
+ }
115
+ this._inUse.clear();
116
+ }
117
+
118
+ /**
119
+ * Clear the pool
120
+ */
121
+ clear() {
122
+ this._available = [];
123
+ this._inUse.clear();
124
+ }
125
+
126
+ /**
127
+ * Get pool statistics
128
+ * @returns {object}
129
+ */
130
+ getStats() {
131
+ return {
132
+ available: this._available.length,
133
+ inUse: this._inUse.size,
134
+ totalAllocations: this._totalAllocations,
135
+ hits: this._hits,
136
+ misses: this._misses,
137
+ hitRate: this._totalAllocations > 0
138
+ ? this._hits / this._totalAllocations
139
+ : 0
140
+ };
141
+ }
142
+
143
+ /**
144
+ * Get number of available objects
145
+ * @returns {number}
146
+ */
147
+ get available() {
148
+ return this._available.length;
149
+ }
150
+
151
+ /**
152
+ * Get number of objects in use
153
+ * @returns {number}
154
+ */
155
+ get inUse() {
156
+ return this._inUse.size;
157
+ }
158
+ }
159
+
160
+ /**
161
+ * Typed array pool for efficient buffer management
162
+ */
163
+ export class TypedArrayPool {
164
+ constructor() {
165
+ /** @type {Map<string, Float32Array[]>} */
166
+ this._float32Pools = new Map();
167
+
168
+ /** @type {Map<string, Uint16Array[]>} */
169
+ this._uint16Pools = new Map();
170
+
171
+ /** @type {Map<string, Uint32Array[]>} */
172
+ this._uint32Pools = new Map();
173
+
174
+ /** @type {number} */
175
+ this._totalAllocations = 0;
176
+
177
+ /** @type {number} */
178
+ this._hits = 0;
179
+ }
180
+
181
+ /**
182
+ * Get size bucket key
183
+ * @private
184
+ */
185
+ _getBucket(size) {
186
+ // Round up to power of 2 for bucketing
187
+ const bucket = Math.pow(2, Math.ceil(Math.log2(Math.max(size, 16))));
188
+ return String(bucket);
189
+ }
190
+
191
+ /**
192
+ * Acquire a Float32Array
193
+ * @param {number} size - Minimum size needed
194
+ * @returns {Float32Array}
195
+ */
196
+ acquireFloat32(size) {
197
+ this._totalAllocations++;
198
+ const bucket = this._getBucket(size);
199
+
200
+ if (!this._float32Pools.has(bucket)) {
201
+ this._float32Pools.set(bucket, []);
202
+ }
203
+
204
+ const pool = this._float32Pools.get(bucket);
205
+ if (pool.length > 0) {
206
+ this._hits++;
207
+ return pool.pop();
208
+ }
209
+
210
+ return new Float32Array(parseInt(bucket));
211
+ }
212
+
213
+ /**
214
+ * Release a Float32Array
215
+ * @param {Float32Array} arr
216
+ */
217
+ releaseFloat32(arr) {
218
+ const bucket = String(arr.length);
219
+ if (!this._float32Pools.has(bucket)) {
220
+ this._float32Pools.set(bucket, []);
221
+ }
222
+
223
+ const pool = this._float32Pools.get(bucket);
224
+ if (pool.length < 32) { // Limit pool size per bucket
225
+ arr.fill(0); // Clear data
226
+ pool.push(arr);
227
+ }
228
+ }
229
+
230
+ /**
231
+ * Acquire a Uint16Array
232
+ * @param {number} size
233
+ * @returns {Uint16Array}
234
+ */
235
+ acquireUint16(size) {
236
+ this._totalAllocations++;
237
+ const bucket = this._getBucket(size);
238
+
239
+ if (!this._uint16Pools.has(bucket)) {
240
+ this._uint16Pools.set(bucket, []);
241
+ }
242
+
243
+ const pool = this._uint16Pools.get(bucket);
244
+ if (pool.length > 0) {
245
+ this._hits++;
246
+ return pool.pop();
247
+ }
248
+
249
+ return new Uint16Array(parseInt(bucket));
250
+ }
251
+
252
+ /**
253
+ * Release a Uint16Array
254
+ * @param {Uint16Array} arr
255
+ */
256
+ releaseUint16(arr) {
257
+ const bucket = String(arr.length);
258
+ if (!this._uint16Pools.has(bucket)) {
259
+ this._uint16Pools.set(bucket, []);
260
+ }
261
+
262
+ const pool = this._uint16Pools.get(bucket);
263
+ if (pool.length < 32) {
264
+ arr.fill(0);
265
+ pool.push(arr);
266
+ }
267
+ }
268
+
269
+ /**
270
+ * Acquire a Uint32Array
271
+ * @param {number} size
272
+ * @returns {Uint32Array}
273
+ */
274
+ acquireUint32(size) {
275
+ this._totalAllocations++;
276
+ const bucket = this._getBucket(size);
277
+
278
+ if (!this._uint32Pools.has(bucket)) {
279
+ this._uint32Pools.set(bucket, []);
280
+ }
281
+
282
+ const pool = this._uint32Pools.get(bucket);
283
+ if (pool.length > 0) {
284
+ this._hits++;
285
+ return pool.pop();
286
+ }
287
+
288
+ return new Uint32Array(parseInt(bucket));
289
+ }
290
+
291
+ /**
292
+ * Release a Uint32Array
293
+ * @param {Uint32Array} arr
294
+ */
295
+ releaseUint32(arr) {
296
+ const bucket = String(arr.length);
297
+ if (!this._uint32Pools.has(bucket)) {
298
+ this._uint32Pools.set(bucket, []);
299
+ }
300
+
301
+ const pool = this._uint32Pools.get(bucket);
302
+ if (pool.length < 32) {
303
+ arr.fill(0);
304
+ pool.push(arr);
305
+ }
306
+ }
307
+
308
+ /**
309
+ * Clear all pools
310
+ */
311
+ clear() {
312
+ this._float32Pools.clear();
313
+ this._uint16Pools.clear();
314
+ this._uint32Pools.clear();
315
+ }
316
+
317
+ /**
318
+ * Get statistics
319
+ * @returns {object}
320
+ */
321
+ getStats() {
322
+ let float32Total = 0;
323
+ let uint16Total = 0;
324
+ let uint32Total = 0;
325
+
326
+ for (const pool of this._float32Pools.values()) {
327
+ float32Total += pool.length;
328
+ }
329
+ for (const pool of this._uint16Pools.values()) {
330
+ uint16Total += pool.length;
331
+ }
332
+ for (const pool of this._uint32Pools.values()) {
333
+ uint32Total += pool.length;
334
+ }
335
+
336
+ return {
337
+ float32Pooled: float32Total,
338
+ uint16Pooled: uint16Total,
339
+ uint32Pooled: uint32Total,
340
+ totalAllocations: this._totalAllocations,
341
+ hits: this._hits,
342
+ hitRate: this._totalAllocations > 0
343
+ ? this._hits / this._totalAllocations
344
+ : 0
345
+ };
346
+ }
347
+ }
348
+
349
+ /**
350
+ * Vec4 pool for efficient vector operations
351
+ */
352
+ export class Vec4Pool {
353
+ /**
354
+ * @param {number} [initialSize=100]
355
+ */
356
+ constructor(initialSize = 100) {
357
+ // Import Vec4 dynamically to avoid circular dependencies
358
+ this._Vec4 = null;
359
+ this._pool = [];
360
+ this._inUse = new Set();
361
+ this._initialSize = initialSize;
362
+ this._initialized = false;
363
+ }
364
+
365
+ /**
366
+ * Initialize the pool (call after Vec4 is available)
367
+ * @param {typeof Vec4} Vec4Class
368
+ */
369
+ init(Vec4Class) {
370
+ this._Vec4 = Vec4Class;
371
+ for (let i = 0; i < this._initialSize; i++) {
372
+ this._pool.push(new Vec4Class(0, 0, 0, 0));
373
+ }
374
+ this._initialized = true;
375
+ }
376
+
377
+ /**
378
+ * Acquire a Vec4
379
+ * @param {number} [x=0]
380
+ * @param {number} [y=0]
381
+ * @param {number} [z=0]
382
+ * @param {number} [w=0]
383
+ * @returns {Vec4}
384
+ */
385
+ acquire(x = 0, y = 0, z = 0, w = 0) {
386
+ if (!this._initialized) {
387
+ throw new Error('Vec4Pool not initialized. Call init() first.');
388
+ }
389
+
390
+ let vec;
391
+ if (this._pool.length > 0) {
392
+ vec = this._pool.pop();
393
+ vec.x = x;
394
+ vec.y = y;
395
+ vec.z = z;
396
+ vec.w = w;
397
+ } else {
398
+ vec = new this._Vec4(x, y, z, w);
399
+ }
400
+
401
+ this._inUse.add(vec);
402
+ return vec;
403
+ }
404
+
405
+ /**
406
+ * Release a Vec4
407
+ * @param {Vec4} vec
408
+ */
409
+ release(vec) {
410
+ if (!this._inUse.has(vec)) return;
411
+
412
+ this._inUse.delete(vec);
413
+ vec.x = 0;
414
+ vec.y = 0;
415
+ vec.z = 0;
416
+ vec.w = 0;
417
+ this._pool.push(vec);
418
+ }
419
+
420
+ /**
421
+ * Release all vectors
422
+ */
423
+ releaseAll() {
424
+ for (const vec of this._inUse) {
425
+ vec.x = 0;
426
+ vec.y = 0;
427
+ vec.z = 0;
428
+ vec.w = 0;
429
+ this._pool.push(vec);
430
+ }
431
+ this._inUse.clear();
432
+ }
433
+
434
+ /**
435
+ * Get pool statistics
436
+ * @returns {object}
437
+ */
438
+ getStats() {
439
+ return {
440
+ available: this._pool.length,
441
+ inUse: this._inUse.size
442
+ };
443
+ }
444
+ }
445
+
446
+ /**
447
+ * Matrix pool for efficient matrix operations
448
+ */
449
+ export class Mat4x4Pool {
450
+ /**
451
+ * @param {number} [initialSize=50]
452
+ */
453
+ constructor(initialSize = 50) {
454
+ this._Mat4x4 = null;
455
+ this._pool = [];
456
+ this._inUse = new Set();
457
+ this._initialSize = initialSize;
458
+ this._initialized = false;
459
+ }
460
+
461
+ /**
462
+ * Initialize the pool
463
+ * @param {typeof Mat4x4} Mat4x4Class
464
+ */
465
+ init(Mat4x4Class) {
466
+ this._Mat4x4 = Mat4x4Class;
467
+ for (let i = 0; i < this._initialSize; i++) {
468
+ this._pool.push(Mat4x4Class.identity());
469
+ }
470
+ this._initialized = true;
471
+ }
472
+
473
+ /**
474
+ * Acquire an identity matrix
475
+ * @returns {Mat4x4}
476
+ */
477
+ acquireIdentity() {
478
+ if (!this._initialized) {
479
+ throw new Error('Mat4x4Pool not initialized. Call init() first.');
480
+ }
481
+
482
+ let mat;
483
+ if (this._pool.length > 0) {
484
+ mat = this._pool.pop();
485
+ // Reset to identity
486
+ mat.data.fill(0);
487
+ mat.data[0] = 1;
488
+ mat.data[5] = 1;
489
+ mat.data[10] = 1;
490
+ mat.data[15] = 1;
491
+ } else {
492
+ mat = this._Mat4x4.identity();
493
+ }
494
+
495
+ this._inUse.add(mat);
496
+ return mat;
497
+ }
498
+
499
+ /**
500
+ * Release a matrix
501
+ * @param {Mat4x4} mat
502
+ */
503
+ release(mat) {
504
+ if (!this._inUse.has(mat)) return;
505
+ this._inUse.delete(mat);
506
+ this._pool.push(mat);
507
+ }
508
+
509
+ /**
510
+ * Release all matrices
511
+ */
512
+ releaseAll() {
513
+ for (const mat of this._inUse) {
514
+ this._pool.push(mat);
515
+ }
516
+ this._inUse.clear();
517
+ }
518
+
519
+ /**
520
+ * Get pool statistics
521
+ * @returns {object}
522
+ */
523
+ getStats() {
524
+ return {
525
+ available: this._pool.length,
526
+ inUse: this._inUse.size
527
+ };
528
+ }
529
+ }
530
+
531
+ /**
532
+ * Global pool manager
533
+ */
534
+ export class PoolManager {
535
+ constructor() {
536
+ /** @type {Map<string, ObjectPool>} */
537
+ this._objectPools = new Map();
538
+
539
+ /** @type {TypedArrayPool} */
540
+ this.typedArrays = new TypedArrayPool();
541
+
542
+ /** @type {Vec4Pool} */
543
+ this.vec4 = new Vec4Pool();
544
+
545
+ /** @type {Mat4x4Pool} */
546
+ this.mat4x4 = new Mat4x4Pool();
547
+ }
548
+
549
+ /**
550
+ * Initialize math pools
551
+ * @param {typeof Vec4} Vec4Class
552
+ * @param {typeof Mat4x4} Mat4x4Class
553
+ */
554
+ initMathPools(Vec4Class, Mat4x4Class) {
555
+ this.vec4.init(Vec4Class);
556
+ this.mat4x4.init(Mat4x4Class);
557
+ }
558
+
559
+ /**
560
+ * Register a custom object pool
561
+ * @param {string} name
562
+ * @param {function} factory
563
+ * @param {function} [reset]
564
+ * @param {object} [options]
565
+ * @returns {ObjectPool}
566
+ */
567
+ registerPool(name, factory, reset = null, options = {}) {
568
+ const pool = new ObjectPool(factory, reset, options);
569
+ this._objectPools.set(name, pool);
570
+ return pool;
571
+ }
572
+
573
+ /**
574
+ * Get a registered pool
575
+ * @param {string} name
576
+ * @returns {ObjectPool|undefined}
577
+ */
578
+ getPool(name) {
579
+ return this._objectPools.get(name);
580
+ }
581
+
582
+ /**
583
+ * Clear all pools
584
+ */
585
+ clearAll() {
586
+ for (const pool of this._objectPools.values()) {
587
+ pool.clear();
588
+ }
589
+ this.typedArrays.clear();
590
+ this.vec4.releaseAll();
591
+ this.mat4x4.releaseAll();
592
+ }
593
+
594
+ /**
595
+ * Get combined statistics
596
+ * @returns {object}
597
+ */
598
+ getStats() {
599
+ const objectPoolStats = {};
600
+ for (const [name, pool] of this._objectPools) {
601
+ objectPoolStats[name] = pool.getStats();
602
+ }
603
+
604
+ return {
605
+ objectPools: objectPoolStats,
606
+ typedArrays: this.typedArrays.getStats(),
607
+ vec4: this.vec4.getStats(),
608
+ mat4x4: this.mat4x4.getStats()
609
+ };
610
+ }
611
+ }
612
+
613
+ /**
614
+ * Default global pool manager instance
615
+ */
616
+ export const pools = new PoolManager();
617
+
618
+ export default PoolManager;