sdl-mcp 0.12.2 → 0.12.3

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 (276) hide show
  1. package/README.md +10 -0
  2. package/config/sdlmcp.config.example.json +53 -8
  3. package/config/sdlmcp.config.schema.json +530 -106
  4. package/dist/.tsbuildinfo +1 -1
  5. package/dist/benchmark/external-manifest.d.ts +162 -0
  6. package/dist/benchmark/external-manifest.d.ts.map +1 -0
  7. package/dist/benchmark/external-manifest.js +336 -0
  8. package/dist/benchmark/external-manifest.js.map +1 -0
  9. package/dist/benchmark/external-runner.d.ts +100 -0
  10. package/dist/benchmark/external-runner.d.ts.map +1 -0
  11. package/dist/benchmark/external-runner.js +1171 -0
  12. package/dist/benchmark/external-runner.js.map +1 -0
  13. package/dist/benchmark/output-file.d.ts +3 -0
  14. package/dist/benchmark/output-file.d.ts.map +1 -0
  15. package/dist/benchmark/output-file.js +8 -0
  16. package/dist/benchmark/output-file.js.map +1 -0
  17. package/dist/cli/argParsing.d.ts.map +1 -1
  18. package/dist/cli/argParsing.js +6 -0
  19. package/dist/cli/argParsing.js.map +1 -1
  20. package/dist/cli/commands/benchmark.d.ts.map +1 -1
  21. package/dist/cli/commands/benchmark.js +3 -2
  22. package/dist/cli/commands/benchmark.js.map +1 -1
  23. package/dist/cli/commands/index.d.ts +1 -0
  24. package/dist/cli/commands/index.d.ts.map +1 -1
  25. package/dist/cli/commands/index.js +13 -7
  26. package/dist/cli/commands/index.js.map +1 -1
  27. package/dist/cli/commands/init.d.ts +5 -1
  28. package/dist/cli/commands/init.d.ts.map +1 -1
  29. package/dist/cli/commands/init.js +73 -3
  30. package/dist/cli/commands/init.js.map +1 -1
  31. package/dist/cli/commands/serve.d.ts.map +1 -1
  32. package/dist/cli/commands/serve.js +2 -0
  33. package/dist/cli/commands/serve.js.map +1 -1
  34. package/dist/cli/index.js +2 -0
  35. package/dist/cli/index.js.map +1 -1
  36. package/dist/cli/transport/http.d.ts +1 -35
  37. package/dist/cli/transport/http.d.ts.map +1 -1
  38. package/dist/cli/transport/http.js +151 -175
  39. package/dist/cli/transport/http.js.map +1 -1
  40. package/dist/cli/types.d.ts +1 -0
  41. package/dist/cli/types.d.ts.map +1 -1
  42. package/dist/config/constants.d.ts +30 -0
  43. package/dist/config/constants.d.ts.map +1 -1
  44. package/dist/config/constants.js +30 -0
  45. package/dist/config/constants.js.map +1 -1
  46. package/dist/config/types.d.ts +53 -1
  47. package/dist/config/types.d.ts.map +1 -1
  48. package/dist/config/types.js +62 -14
  49. package/dist/config/types.js.map +1 -1
  50. package/dist/db/ladybug-batching.d.ts +1 -0
  51. package/dist/db/ladybug-batching.d.ts.map +1 -1
  52. package/dist/db/ladybug-batching.js +1 -0
  53. package/dist/db/ladybug-batching.js.map +1 -1
  54. package/dist/db/ladybug-core.d.ts +3 -0
  55. package/dist/db/ladybug-core.d.ts.map +1 -1
  56. package/dist/db/ladybug-core.js +72 -2
  57. package/dist/db/ladybug-core.js.map +1 -1
  58. package/dist/db/ladybug-embeddings.d.ts +6 -1
  59. package/dist/db/ladybug-embeddings.d.ts.map +1 -1
  60. package/dist/db/ladybug-embeddings.js +6 -1
  61. package/dist/db/ladybug-embeddings.js.map +1 -1
  62. package/dist/db/ladybug-file-summaries.d.ts.map +1 -1
  63. package/dist/db/ladybug-file-summaries.js +23 -0
  64. package/dist/db/ladybug-file-summaries.js.map +1 -1
  65. package/dist/db/ladybug-queries.js +1 -1
  66. package/dist/db/ladybug-queries.js.map +1 -1
  67. package/dist/db/migrations/index.d.ts.map +1 -1
  68. package/dist/db/migrations/index.js +2 -0
  69. package/dist/db/migrations/index.js.map +1 -1
  70. package/dist/db/migrations/m007-copy-embeddings-to-symbol.d.ts +5 -9
  71. package/dist/db/migrations/m007-copy-embeddings-to-symbol.d.ts.map +1 -1
  72. package/dist/db/migrations/m007-copy-embeddings-to-symbol.js +24 -126
  73. package/dist/db/migrations/m007-copy-embeddings-to-symbol.js.map +1 -1
  74. package/dist/db/migrations/m021-remediate-symbol-embeddings.d.ts +5 -0
  75. package/dist/db/migrations/m021-remediate-symbol-embeddings.d.ts.map +1 -0
  76. package/dist/db/migrations/m021-remediate-symbol-embeddings.js +7 -0
  77. package/dist/db/migrations/m021-remediate-symbol-embeddings.js.map +1 -0
  78. package/dist/db/migrations/symbol-embedding-remediation.d.ts +57 -0
  79. package/dist/db/migrations/symbol-embedding-remediation.d.ts.map +1 -0
  80. package/dist/db/migrations/symbol-embedding-remediation.js +335 -0
  81. package/dist/db/migrations/symbol-embedding-remediation.js.map +1 -0
  82. package/dist/graph/layout/force-layout.d.ts +4 -0
  83. package/dist/graph/layout/force-layout.d.ts.map +1 -0
  84. package/dist/graph/layout/force-layout.js +127 -0
  85. package/dist/graph/layout/force-layout.js.map +1 -0
  86. package/dist/graph/layout/layout-service.d.ts +37 -0
  87. package/dist/graph/layout/layout-service.d.ts.map +1 -0
  88. package/dist/graph/layout/layout-service.js +172 -0
  89. package/dist/graph/layout/layout-service.js.map +1 -0
  90. package/dist/graph/layout/native-engine.d.ts +9 -0
  91. package/dist/graph/layout/native-engine.d.ts.map +1 -0
  92. package/dist/graph/layout/native-engine.js +59 -0
  93. package/dist/graph/layout/native-engine.js.map +1 -0
  94. package/dist/graph/layout/prng.d.ts +3 -0
  95. package/dist/graph/layout/prng.d.ts.map +1 -0
  96. package/dist/graph/layout/prng.js +19 -0
  97. package/dist/graph/layout/prng.js.map +1 -0
  98. package/dist/graph/layout/serializer.d.ts +3 -0
  99. package/dist/graph/layout/serializer.d.ts.map +1 -0
  100. package/dist/graph/layout/serializer.js +20 -0
  101. package/dist/graph/layout/serializer.js.map +1 -0
  102. package/dist/graph/layout/types.d.ts +30 -0
  103. package/dist/graph/layout/types.d.ts.map +1 -0
  104. package/dist/graph/layout/types.js +2 -0
  105. package/dist/graph/layout/types.js.map +1 -0
  106. package/dist/indexer/embeddings.d.ts +7 -0
  107. package/dist/indexer/embeddings.d.ts.map +1 -1
  108. package/dist/indexer/embeddings.js +44 -4
  109. package/dist/indexer/embeddings.js.map +1 -1
  110. package/dist/indexer/file-summary-embeddings.d.ts +12 -0
  111. package/dist/indexer/file-summary-embeddings.d.ts.map +1 -1
  112. package/dist/indexer/file-summary-embeddings.js +83 -21
  113. package/dist/indexer/file-summary-embeddings.js.map +1 -1
  114. package/dist/indexer/fileWalker.d.ts.map +1 -1
  115. package/dist/indexer/fileWalker.js +2 -1
  116. package/dist/indexer/fileWalker.js.map +1 -1
  117. package/dist/indexer/metrics-updater.d.ts.map +1 -1
  118. package/dist/indexer/metrics-updater.js +27 -4
  119. package/dist/indexer/metrics-updater.js.map +1 -1
  120. package/dist/indexer/watcher.d.ts.map +1 -1
  121. package/dist/indexer/watcher.js +2 -1
  122. package/dist/indexer/watcher.js.map +1 -1
  123. package/dist/mcp/context-response-projection.d.ts.map +1 -1
  124. package/dist/mcp/context-response-projection.js +49 -13
  125. package/dist/mcp/context-response-projection.js.map +1 -1
  126. package/dist/mcp/tools/search-edit/planner.d.ts.map +1 -1
  127. package/dist/mcp/tools/search-edit/planner.js +10 -3
  128. package/dist/mcp/tools/search-edit/planner.js.map +1 -1
  129. package/dist/observability/event-tap.d.ts +2 -1
  130. package/dist/observability/event-tap.d.ts.map +1 -1
  131. package/dist/observability/event-tap.js.map +1 -1
  132. package/dist/observability/service.d.ts +11 -4
  133. package/dist/observability/service.d.ts.map +1 -1
  134. package/dist/observability/service.js +83 -13
  135. package/dist/observability/service.js.map +1 -1
  136. package/dist/observability/types.d.ts +48 -2
  137. package/dist/observability/types.d.ts.map +1 -1
  138. package/dist/ui/.tsbuildinfo +1 -0
  139. package/dist/ui/vendor/fflate.js +2692 -0
  140. package/dist/ui/vendor/jsm/controls/ArcballControls.js +3543 -0
  141. package/dist/ui/vendor/jsm/controls/DragControls.js +452 -0
  142. package/dist/ui/vendor/jsm/controls/FirstPersonControls.js +488 -0
  143. package/dist/ui/vendor/jsm/controls/FlyControls.js +384 -0
  144. package/dist/ui/vendor/jsm/controls/MapControls.js +116 -0
  145. package/dist/ui/vendor/jsm/controls/OrbitControls.js +1963 -0
  146. package/dist/ui/vendor/jsm/controls/PointerLockControls.js +264 -0
  147. package/dist/ui/vendor/jsm/controls/TrackballControls.js +1001 -0
  148. package/dist/ui/vendor/jsm/controls/TransformControls.js +2003 -0
  149. package/dist/ui/vendor/jsm/loaders/3DMLoader.js +1836 -0
  150. package/dist/ui/vendor/jsm/loaders/3MFLoader.js +1621 -0
  151. package/dist/ui/vendor/jsm/loaders/AMFLoader.js +541 -0
  152. package/dist/ui/vendor/jsm/loaders/BVHLoader.js +484 -0
  153. package/dist/ui/vendor/jsm/loaders/ColladaLoader.js +153 -0
  154. package/dist/ui/vendor/jsm/loaders/DDSLoader.js +385 -0
  155. package/dist/ui/vendor/jsm/loaders/DRACOLoader.js +772 -0
  156. package/dist/ui/vendor/jsm/loaders/EXRLoader.js +3395 -0
  157. package/dist/ui/vendor/jsm/loaders/FBXLoader.js +4580 -0
  158. package/dist/ui/vendor/jsm/loaders/FontLoader.js +260 -0
  159. package/dist/ui/vendor/jsm/loaders/GCodeLoader.js +318 -0
  160. package/dist/ui/vendor/jsm/loaders/GLTFLoader.js +4860 -0
  161. package/dist/ui/vendor/jsm/loaders/HDRCubeTextureLoader.js +164 -0
  162. package/dist/ui/vendor/jsm/loaders/HDRLoader.js +463 -0
  163. package/dist/ui/vendor/jsm/loaders/IESLoader.js +379 -0
  164. package/dist/ui/vendor/jsm/loaders/KMZLoader.js +163 -0
  165. package/dist/ui/vendor/jsm/loaders/KTX2Loader.js +1276 -0
  166. package/dist/ui/vendor/jsm/loaders/KTXLoader.js +197 -0
  167. package/dist/ui/vendor/jsm/loaders/LDrawLoader.js +2510 -0
  168. package/dist/ui/vendor/jsm/loaders/LUT3dlLoader.js +205 -0
  169. package/dist/ui/vendor/jsm/loaders/LUTCubeLoader.js +190 -0
  170. package/dist/ui/vendor/jsm/loaders/LUTImageLoader.js +190 -0
  171. package/dist/ui/vendor/jsm/loaders/LWOLoader.js +1051 -0
  172. package/dist/ui/vendor/jsm/loaders/LottieLoader.js +130 -0
  173. package/dist/ui/vendor/jsm/loaders/MD2Loader.js +435 -0
  174. package/dist/ui/vendor/jsm/loaders/MDDLoader.js +147 -0
  175. package/dist/ui/vendor/jsm/loaders/MTLLoader.js +593 -0
  176. package/dist/ui/vendor/jsm/loaders/MaterialXLoader.js +1126 -0
  177. package/dist/ui/vendor/jsm/loaders/NRRDLoader.js +718 -0
  178. package/dist/ui/vendor/jsm/loaders/OBJLoader.js +955 -0
  179. package/dist/ui/vendor/jsm/loaders/PCDLoader.js +620 -0
  180. package/dist/ui/vendor/jsm/loaders/PDBLoader.js +272 -0
  181. package/dist/ui/vendor/jsm/loaders/PLYLoader.js +968 -0
  182. package/dist/ui/vendor/jsm/loaders/PVRLoader.js +270 -0
  183. package/dist/ui/vendor/jsm/loaders/RGBELoader.js +18 -0
  184. package/dist/ui/vendor/jsm/loaders/STLLoader.js +421 -0
  185. package/dist/ui/vendor/jsm/loaders/SVGLoader.js +3319 -0
  186. package/dist/ui/vendor/jsm/loaders/TDSLoader.js +1142 -0
  187. package/dist/ui/vendor/jsm/loaders/TGALoader.js +538 -0
  188. package/dist/ui/vendor/jsm/loaders/TIFFLoader.js +59 -0
  189. package/dist/ui/vendor/jsm/loaders/TTFLoader.js +261 -0
  190. package/dist/ui/vendor/jsm/loaders/USDLoader.js +303 -0
  191. package/dist/ui/vendor/jsm/loaders/USDZLoader.js +16 -0
  192. package/dist/ui/vendor/jsm/loaders/UltraHDRLoader.js +755 -0
  193. package/dist/ui/vendor/jsm/loaders/VOXLoader.js +919 -0
  194. package/dist/ui/vendor/jsm/loaders/VRMLLoader.js +3646 -0
  195. package/dist/ui/vendor/jsm/loaders/VTKLoader.js +1293 -0
  196. package/dist/ui/vendor/jsm/loaders/XYZLoader.js +143 -0
  197. package/dist/ui/vendor/jsm/loaders/collada/ColladaComposer.js +3044 -0
  198. package/dist/ui/vendor/jsm/loaders/collada/ColladaParser.js +1977 -0
  199. package/dist/ui/vendor/jsm/loaders/lwo/IFFParser.js +1217 -0
  200. package/dist/ui/vendor/jsm/loaders/lwo/LWO2Parser.js +414 -0
  201. package/dist/ui/vendor/jsm/loaders/lwo/LWO3Parser.js +373 -0
  202. package/dist/ui/vendor/jsm/loaders/usd/USDAParser.js +901 -0
  203. package/dist/ui/vendor/jsm/loaders/usd/USDCParser.js +1878 -0
  204. package/dist/ui/vendor/jsm/loaders/usd/USDComposer.js +4627 -0
  205. package/dist/ui/vendor/jsm/utils/BufferGeometryUtils.js +1501 -0
  206. package/dist/ui/vendor/jsm/utils/CameraUtils.js +82 -0
  207. package/dist/ui/vendor/jsm/utils/ColorUtils.js +76 -0
  208. package/dist/ui/vendor/jsm/utils/GeometryCompressionUtils.js +547 -0
  209. package/dist/ui/vendor/jsm/utils/GeometryUtils.js +226 -0
  210. package/dist/ui/vendor/jsm/utils/LDrawUtils.js +211 -0
  211. package/dist/ui/vendor/jsm/utils/SceneOptimizer.js +458 -0
  212. package/dist/ui/vendor/jsm/utils/SceneUtils.js +363 -0
  213. package/dist/ui/vendor/jsm/utils/ShadowMapViewer.js +244 -0
  214. package/dist/ui/vendor/jsm/utils/ShadowMapViewerGPU.js +233 -0
  215. package/dist/ui/vendor/jsm/utils/SkeletonUtils.js +496 -0
  216. package/dist/ui/vendor/jsm/utils/SortUtils.js +175 -0
  217. package/dist/ui/vendor/jsm/utils/UVsDebug.js +173 -0
  218. package/dist/ui/vendor/jsm/utils/WebGLTextureUtils.js +115 -0
  219. package/dist/ui/vendor/jsm/utils/WebGPUTextureUtils.js +81 -0
  220. package/dist/ui/vendor/jsm/utils/WorkerPool.js +167 -0
  221. package/dist/ui/vendor/three.core.min.js +6 -0
  222. package/dist/ui/vendor/three.module.min.js +6 -0
  223. package/dist/ui/viewer/ambient.js +39 -0
  224. package/dist/ui/viewer/api.js +93 -0
  225. package/dist/ui/viewer/chrome.js +36 -0
  226. package/dist/ui/viewer/edges.js +33 -0
  227. package/dist/ui/viewer/index.html +32 -0
  228. package/dist/ui/viewer/inspector.js +23 -0
  229. package/dist/ui/viewer/lenses/activity.js +24 -0
  230. package/dist/ui/viewer/lenses/community.js +5 -0
  231. package/dist/ui/viewer/lenses/edges.js +4 -0
  232. package/dist/ui/viewer/lenses/impact.js +6 -0
  233. package/dist/ui/viewer/lenses/search.js +69 -0
  234. package/dist/ui/viewer/lod.js +100 -0
  235. package/dist/ui/viewer/main.js +92 -0
  236. package/dist/ui/viewer/picking.js +45 -0
  237. package/dist/ui/viewer/scene.js +85 -0
  238. package/dist/ui/viewer/skins/default-skin.js +15 -0
  239. package/dist/ui/viewer/skins/loader.js +44 -0
  240. package/dist/ui/viewer/skins/manifest-schema.js +30 -0
  241. package/dist/ui/viewer/state.js +44 -0
  242. package/dist/ui/viewer/theme.js +23 -0
  243. package/dist/ui/viewer/universe.js +151 -0
  244. package/dist/ui/viewer/viewer.css +85 -0
  245. package/dist/util/safeRegex.d.ts.map +1 -1
  246. package/dist/util/safeRegex.js +221 -68
  247. package/dist/util/safeRegex.js.map +1 -1
  248. package/dist/viewer/legacy-graph.d.ts +40 -0
  249. package/dist/viewer/legacy-graph.d.ts.map +1 -0
  250. package/dist/viewer/legacy-graph.js +152 -0
  251. package/dist/viewer/legacy-graph.js.map +1 -0
  252. package/dist/viewer/routes.d.ts +10 -0
  253. package/dist/viewer/routes.d.ts.map +1 -0
  254. package/dist/viewer/routes.js +221 -0
  255. package/dist/viewer/routes.js.map +1 -0
  256. package/dist/viewer/service.d.ts +44 -0
  257. package/dist/viewer/service.d.ts.map +1 -0
  258. package/dist/viewer/service.js +160 -0
  259. package/dist/viewer/service.js.map +1 -0
  260. package/dist/viewer/types.d.ts +63 -0
  261. package/dist/viewer/types.d.ts.map +1 -0
  262. package/dist/viewer/types.js +2 -0
  263. package/dist/viewer/types.js.map +1 -0
  264. package/dist/viewer/viewer-config.d.ts +12 -0
  265. package/dist/viewer/viewer-config.d.ts.map +1 -0
  266. package/dist/viewer/viewer-config.js +36 -0
  267. package/dist/viewer/viewer-config.js.map +1 -0
  268. package/package.json +18 -9
  269. package/templates/SDL.md +19 -0
  270. package/templates/claude-code.json +8 -43
  271. package/dist/ui/graph.css +0 -108
  272. package/dist/ui/graph.d.ts +0 -2
  273. package/dist/ui/graph.d.ts.map +0 -1
  274. package/dist/ui/graph.html +0 -52
  275. package/dist/ui/graph.js +0 -259
  276. package/dist/ui/graph.js.map +0 -1
@@ -0,0 +1,175 @@
1
+
2
+ /**
3
+ * @module SortUtils
4
+ * @three_import import * as SortUtils from 'three/addons/utils/SortUtils.js';
5
+ */
6
+
7
+ const POWER = 3;
8
+ const BIT_MAX = 32;
9
+ const BIN_BITS = 1 << POWER;
10
+ const BIN_SIZE = 1 << BIN_BITS;
11
+ const BIN_MAX = BIN_SIZE - 1;
12
+ const ITERATIONS = BIT_MAX / BIN_BITS;
13
+
14
+ const bins = new Array( ITERATIONS );
15
+ const bins_buffer = new ArrayBuffer( ( ITERATIONS + 1 ) * BIN_SIZE * 4 );
16
+
17
+ let c = 0;
18
+ for ( let i = 0; i < ( ITERATIONS + 1 ); i ++ ) {
19
+
20
+ bins[ i ] = new Uint32Array( bins_buffer, c, BIN_SIZE );
21
+ c += BIN_SIZE * 4;
22
+
23
+ }
24
+
25
+ const defaultGet = ( el ) => el;
26
+
27
+ /**
28
+ * Hybrid radix sort from.
29
+ *
30
+ * - {@link https://gist.github.com/sciecode/93ed864dd77c5c8803c6a86698d68dab}
31
+ * - {@link https://github.com/mrdoob/three.js/pull/27202#issuecomment-1817640271}
32
+ *
33
+ * Expects unsigned 32b integer values.
34
+ *
35
+ * @function
36
+ * @param {Array<Object>} arr - The array to sort.
37
+ * @param {Object} opt - The options
38
+ */
39
+ export const radixSort = ( arr, opt ) => {
40
+
41
+ const len = arr.length;
42
+
43
+ const options = opt || {};
44
+ const aux = options.aux || new arr.constructor( len );
45
+ const get = options.get || defaultGet;
46
+
47
+ const data = [ arr, aux ];
48
+
49
+ let compare, accumulate, recurse;
50
+
51
+ if ( options.reversed ) {
52
+
53
+ compare = ( a, b ) => a < b;
54
+ accumulate = ( bin ) => {
55
+
56
+ for ( let j = BIN_SIZE - 2; j >= 0; j -- )
57
+ bin[ j ] += bin[ j + 1 ];
58
+
59
+ };
60
+
61
+ recurse = ( cache, depth, start ) => {
62
+
63
+ let prev = 0;
64
+ for ( let j = BIN_MAX; j >= 0; j -- ) {
65
+
66
+ const cur = cache[ j ], diff = cur - prev;
67
+ if ( diff != 0 ) {
68
+
69
+ if ( diff > 32 )
70
+ radixSortBlock( depth + 1, start + prev, diff );
71
+ else
72
+ insertionSortBlock( depth + 1, start + prev, diff );
73
+ prev = cur;
74
+
75
+ }
76
+
77
+ }
78
+
79
+ };
80
+
81
+ } else {
82
+
83
+ compare = ( a, b ) => a > b;
84
+ accumulate = ( bin ) => {
85
+
86
+ for ( let j = 1; j < BIN_SIZE; j ++ )
87
+ bin[ j ] += bin[ j - 1 ];
88
+
89
+ };
90
+
91
+ recurse = ( cache, depth, start ) => {
92
+
93
+ let prev = 0;
94
+ for ( let j = 0; j < BIN_SIZE; j ++ ) {
95
+
96
+ const cur = cache[ j ], diff = cur - prev;
97
+ if ( diff != 0 ) {
98
+
99
+ if ( diff > 32 )
100
+ radixSortBlock( depth + 1, start + prev, diff );
101
+ else
102
+ insertionSortBlock( depth + 1, start + prev, diff );
103
+ prev = cur;
104
+
105
+ }
106
+
107
+ }
108
+
109
+ };
110
+
111
+ }
112
+
113
+ const insertionSortBlock = ( depth, start, len ) => {
114
+
115
+ const a = data[ depth & 1 ];
116
+ const b = data[ ( depth + 1 ) & 1 ];
117
+
118
+ for ( let j = start + 1; j < start + len; j ++ ) {
119
+
120
+ const p = a[ j ], t = get( p ) >>> 0;
121
+ let i = j;
122
+ while ( i > start ) {
123
+
124
+ if ( compare( get( a[ i - 1 ] ) >>> 0, t ) )
125
+ a[ i ] = a[ -- i ];
126
+ else
127
+ break;
128
+
129
+ }
130
+
131
+ a[ i ] = p;
132
+
133
+ }
134
+
135
+ if ( ( depth & 1 ) == 1 ) {
136
+
137
+ for ( let i = start; i < start + len; i ++ )
138
+ b[ i ] = a[ i ];
139
+
140
+ }
141
+
142
+ };
143
+
144
+ const radixSortBlock = ( depth, start, len ) => {
145
+
146
+ const a = data[ depth & 1 ];
147
+ const b = data[ ( depth + 1 ) & 1 ];
148
+
149
+ const shift = ( 3 - depth ) << POWER;
150
+ const end = start + len;
151
+
152
+ const cache = bins[ depth ];
153
+ const bin = bins[ depth + 1 ];
154
+
155
+ bin.fill( 0 );
156
+
157
+ for ( let j = start; j < end; j ++ )
158
+ bin[ ( get( a[ j ] ) >>> shift ) & BIN_MAX ] ++;
159
+
160
+ accumulate( bin );
161
+
162
+ cache.set( bin );
163
+
164
+ for ( let j = end - 1; j >= start; j -- )
165
+ b[ start + -- bin[ ( get( a[ j ] ) >>> shift ) & BIN_MAX ] ] = a[ j ];
166
+
167
+ if ( depth == ITERATIONS - 1 ) return;
168
+
169
+ recurse( cache, depth, start );
170
+
171
+ };
172
+
173
+ radixSortBlock( 0, 0, len );
174
+
175
+ };
@@ -0,0 +1,173 @@
1
+ import {
2
+ Vector2
3
+ } from 'three';
4
+
5
+ /**
6
+ * @module UVsDebug
7
+ * @three_import import { UVsDebug } from 'three/addons/utils/UVsDebug.js';
8
+ */
9
+
10
+ /**
11
+ * Function for "unwrapping" and debugging three.js geometries UV mapping.
12
+ *
13
+ * ```js
14
+ * document.body.appendChild( UVsDebug( new THREE.SphereGeometry() ) );
15
+ * ```
16
+ *
17
+ * @param {BufferGeometry} geometry - The geometry whose uv coordinates should be inspected.
18
+ * @param {number} [size=1024] - The size of the debug canvas.
19
+ * @return {HTMLCanvasElement} A canvas element with visualized uv coordinates.
20
+ */
21
+ function UVsDebug( geometry, size = 1024 ) {
22
+
23
+ // handles wrapping of uv.x > 1 only
24
+
25
+ const abc = 'abc';
26
+ const a = new Vector2();
27
+ const b = new Vector2();
28
+
29
+ const uvs = [
30
+ new Vector2(),
31
+ new Vector2(),
32
+ new Vector2()
33
+ ];
34
+
35
+ const face = [];
36
+
37
+ const canvas = document.createElement( 'canvas' );
38
+ const width = size; // power of 2 required for wrapping
39
+ const height = size;
40
+ canvas.width = width;
41
+ canvas.height = height;
42
+
43
+ const ctx = canvas.getContext( '2d' );
44
+ ctx.lineWidth = 1;
45
+ ctx.strokeStyle = 'rgb( 63, 63, 63 )';
46
+ ctx.textAlign = 'center';
47
+
48
+ // paint background white
49
+
50
+ ctx.fillStyle = 'rgb( 255, 255, 255 )';
51
+ ctx.fillRect( 0, 0, width, height );
52
+
53
+ const index = geometry.index;
54
+ const uvAttribute = geometry.attributes.uv;
55
+
56
+ if ( index ) {
57
+
58
+ // indexed geometry
59
+
60
+ for ( let i = 0, il = index.count; i < il; i += 3 ) {
61
+
62
+ face[ 0 ] = index.getX( i );
63
+ face[ 1 ] = index.getX( i + 1 );
64
+ face[ 2 ] = index.getX( i + 2 );
65
+
66
+ uvs[ 0 ].fromBufferAttribute( uvAttribute, face[ 0 ] );
67
+ uvs[ 1 ].fromBufferAttribute( uvAttribute, face[ 1 ] );
68
+ uvs[ 2 ].fromBufferAttribute( uvAttribute, face[ 2 ] );
69
+
70
+ processFace( face, uvs, i / 3 );
71
+
72
+ }
73
+
74
+ } else {
75
+
76
+ // non-indexed geometry
77
+
78
+ for ( let i = 0, il = uvAttribute.count; i < il; i += 3 ) {
79
+
80
+ face[ 0 ] = i;
81
+ face[ 1 ] = i + 1;
82
+ face[ 2 ] = i + 2;
83
+
84
+ uvs[ 0 ].fromBufferAttribute( uvAttribute, face[ 0 ] );
85
+ uvs[ 1 ].fromBufferAttribute( uvAttribute, face[ 1 ] );
86
+ uvs[ 2 ].fromBufferAttribute( uvAttribute, face[ 2 ] );
87
+
88
+ processFace( face, uvs, i / 3 );
89
+
90
+ }
91
+
92
+ }
93
+
94
+ return canvas;
95
+
96
+ function processFace( face, uvs, index ) {
97
+
98
+ // draw contour of face
99
+
100
+ ctx.beginPath();
101
+
102
+ a.set( 0, 0 );
103
+
104
+ for ( let j = 0, jl = uvs.length; j < jl; j ++ ) {
105
+
106
+ const uv = uvs[ j ];
107
+
108
+ a.x += uv.x;
109
+ a.y += uv.y;
110
+
111
+ if ( j === 0 ) {
112
+
113
+ ctx.moveTo( uv.x * ( width - 2 ) + 0.5, ( 1 - uv.y ) * ( height - 2 ) + 0.5 );
114
+
115
+ } else {
116
+
117
+ ctx.lineTo( uv.x * ( width - 2 ) + 0.5, ( 1 - uv.y ) * ( height - 2 ) + 0.5 );
118
+
119
+ }
120
+
121
+ }
122
+
123
+ ctx.closePath();
124
+ ctx.stroke();
125
+
126
+ // calculate center of face
127
+
128
+ a.divideScalar( uvs.length );
129
+
130
+ // label the face number
131
+
132
+ ctx.font = '18px Arial';
133
+ ctx.fillStyle = 'rgb( 63, 63, 63 )';
134
+ ctx.fillText( index, a.x * width, ( 1 - a.y ) * height );
135
+
136
+ if ( a.x > 0.95 ) {
137
+
138
+ // wrap x // 0.95 is arbitrary
139
+
140
+ ctx.fillText( index, ( a.x % 1 ) * width, ( 1 - a.y ) * height );
141
+
142
+ }
143
+
144
+ //
145
+
146
+ ctx.font = '12px Arial';
147
+ ctx.fillStyle = 'rgb( 191, 191, 191 )';
148
+
149
+ // label uv edge orders
150
+
151
+ for ( let j = 0, jl = uvs.length; j < jl; j ++ ) {
152
+
153
+ const uv = uvs[ j ];
154
+ b.addVectors( a, uv ).divideScalar( 2 );
155
+
156
+ const vnum = face[ j ];
157
+ ctx.fillText( abc[ j ] + vnum, b.x * width, ( 1 - b.y ) * height );
158
+
159
+ if ( b.x > 0.95 ) {
160
+
161
+ // wrap x
162
+
163
+ ctx.fillText( abc[ j ] + vnum, ( b.x % 1 ) * width, ( 1 - b.y ) * height );
164
+
165
+ }
166
+
167
+ }
168
+
169
+ }
170
+
171
+ }
172
+
173
+ export { UVsDebug };
@@ -0,0 +1,115 @@
1
+ import {
2
+ PlaneGeometry,
3
+ ShaderMaterial,
4
+ Uniform,
5
+ Mesh,
6
+ PerspectiveCamera,
7
+ Scene,
8
+ WebGLRenderer,
9
+ CanvasTexture,
10
+ SRGBColorSpace
11
+ } from 'three';
12
+
13
+ /**
14
+ * @module WebGLTextureUtils
15
+ * @three_import import * as WebGLTextureUtils from 'three/addons/utils/WebGLTextureUtils.js';
16
+ */
17
+
18
+ let _renderer;
19
+ let fullscreenQuadGeometry;
20
+ let fullscreenQuadMaterial;
21
+ let fullscreenQuad;
22
+
23
+ /**
24
+ * Returns an uncompressed version of the given compressed texture.
25
+ *
26
+ * This module can only be used with {@link WebGLRenderer}. When using {@link WebGPURenderer},
27
+ * import the function from {@link WebGPUTextureUtils}.
28
+ *
29
+ * @param {CompressedTexture} texture - The compressed texture.
30
+ * @param {number} [maxTextureSize=Infinity] - The maximum size of the uncompressed texture.
31
+ * @param {?WebGLRenderer} [renderer=null] - A reference to a renderer.
32
+ * @return {CanvasTexture} The uncompressed texture.
33
+ */
34
+ export function decompress( texture, maxTextureSize = Infinity, renderer = null ) {
35
+
36
+ if ( ! fullscreenQuadGeometry ) fullscreenQuadGeometry = new PlaneGeometry( 2, 2, 1, 1 );
37
+ if ( ! fullscreenQuadMaterial ) fullscreenQuadMaterial = new ShaderMaterial( {
38
+ uniforms: { blitTexture: new Uniform( texture ) },
39
+ vertexShader: `
40
+ varying vec2 vUv;
41
+ void main(){
42
+ vUv = uv;
43
+ gl_Position = vec4(position.xy * 1.0,0.,.999999);
44
+ }`,
45
+ fragmentShader: `
46
+ uniform sampler2D blitTexture;
47
+ varying vec2 vUv;
48
+
49
+ void main(){
50
+ gl_FragColor = vec4(vUv.xy, 0, 1);
51
+
52
+ #ifdef IS_SRGB
53
+ gl_FragColor = sRGBTransferOETF( texture2D( blitTexture, vUv) );
54
+ #else
55
+ gl_FragColor = texture2D( blitTexture, vUv);
56
+ #endif
57
+ }`
58
+ } );
59
+
60
+ fullscreenQuadMaterial.uniforms.blitTexture.value = texture;
61
+ fullscreenQuadMaterial.defines.IS_SRGB = texture.colorSpace == SRGBColorSpace;
62
+ fullscreenQuadMaterial.needsUpdate = true;
63
+
64
+ if ( ! fullscreenQuad ) {
65
+
66
+ fullscreenQuad = new Mesh( fullscreenQuadGeometry, fullscreenQuadMaterial );
67
+ fullscreenQuad.frustumCulled = false;
68
+
69
+ }
70
+
71
+ const _camera = new PerspectiveCamera();
72
+ const _scene = new Scene();
73
+ _scene.add( fullscreenQuad );
74
+
75
+ if ( renderer === null ) {
76
+
77
+ renderer = _renderer = new WebGLRenderer( { antialias: false } );
78
+
79
+ }
80
+
81
+ const width = Math.min( texture.image.width, maxTextureSize );
82
+ const height = Math.min( texture.image.height, maxTextureSize );
83
+
84
+ renderer.setSize( width, height );
85
+ renderer.clear();
86
+ renderer.render( _scene, _camera );
87
+
88
+ const canvas = document.createElement( 'canvas' );
89
+ const context = canvas.getContext( '2d' );
90
+
91
+ canvas.width = width;
92
+ canvas.height = height;
93
+
94
+ context.drawImage( renderer.domElement, 0, 0, width, height );
95
+
96
+ const readableTexture = new CanvasTexture( canvas );
97
+
98
+ readableTexture.minFilter = texture.minFilter;
99
+ readableTexture.magFilter = texture.magFilter;
100
+ readableTexture.wrapS = texture.wrapS;
101
+ readableTexture.wrapT = texture.wrapT;
102
+ readableTexture.colorSpace = texture.colorSpace;
103
+ readableTexture.name = texture.name;
104
+
105
+ if ( _renderer ) {
106
+
107
+ _renderer.forceContextLoss();
108
+ _renderer.dispose();
109
+ _renderer = null;
110
+
111
+ }
112
+
113
+ return readableTexture;
114
+
115
+ }
@@ -0,0 +1,81 @@
1
+ import {
2
+ QuadMesh,
3
+ NodeMaterial,
4
+ WebGPURenderer,
5
+ CanvasTexture
6
+ } from 'three/webgpu';
7
+ import { texture, uv } from 'three/tsl';
8
+
9
+ /**
10
+ * @module WebGPUTextureUtils
11
+ * @three_import import * as WebGPUTextureUtils from 'three/addons/utils/WebGPUTextureUtils.js';
12
+ */
13
+
14
+ let _renderer;
15
+ const _quadMesh = /*@__PURE__*/ new QuadMesh();
16
+
17
+ /**
18
+ * Returns an uncompressed version of the given compressed texture.
19
+ *
20
+ * This module can only be used with {@link WebGPURenderer}. When using {@link WebGLRenderer},
21
+ * import the function from {@link WebGLTextureUtils}.
22
+ *
23
+ * @async
24
+ * @param {CompressedTexture} blitTexture - The compressed texture.
25
+ * @param {number} [maxTextureSize=Infinity] - The maximum size of the uncompressed texture.
26
+ * @param {?WebGPURenderer} [renderer=null] - A reference to a renderer.
27
+ * @return {Promise<CanvasTexture>} A Promise that resolved with the uncompressed texture.
28
+ */
29
+ export async function decompress( blitTexture, maxTextureSize = Infinity, renderer = null ) {
30
+
31
+ if ( renderer === null ) {
32
+
33
+ renderer = _renderer = new WebGPURenderer();
34
+ await renderer.init();
35
+
36
+ }
37
+
38
+ const material = new NodeMaterial();
39
+
40
+ material.fragmentNode = texture( blitTexture, uv().flipY() );
41
+
42
+ const width = Math.min( blitTexture.image.width, maxTextureSize );
43
+ const height = Math.min( blitTexture.image.height, maxTextureSize );
44
+
45
+ const currentOutputColorSpace = renderer.outputColorSpace;
46
+
47
+ renderer.setSize( width, height );
48
+ renderer.outputColorSpace = blitTexture.colorSpace;
49
+
50
+ _quadMesh.material = material;
51
+ _quadMesh.render( renderer );
52
+
53
+ renderer.outputColorSpace = currentOutputColorSpace;
54
+
55
+ const canvas = document.createElement( 'canvas' );
56
+ const context = canvas.getContext( '2d' );
57
+
58
+ canvas.width = width;
59
+ canvas.height = height;
60
+
61
+ context.drawImage( renderer.domElement, 0, 0, width, height );
62
+
63
+ const readableTexture = new CanvasTexture( canvas );
64
+
65
+ readableTexture.minFilter = blitTexture.minFilter;
66
+ readableTexture.magFilter = blitTexture.magFilter;
67
+ readableTexture.wrapS = blitTexture.wrapS;
68
+ readableTexture.wrapT = blitTexture.wrapT;
69
+ readableTexture.colorSpace = blitTexture.colorSpace;
70
+ readableTexture.name = blitTexture.name;
71
+
72
+ if ( _renderer !== null ) {
73
+
74
+ _renderer.dispose();
75
+ _renderer = null;
76
+
77
+ }
78
+
79
+ return readableTexture;
80
+
81
+ }
@@ -0,0 +1,167 @@
1
+ /**
2
+ * A simple pool for managing Web Workers.
3
+ *
4
+ * @three_import import { WorkerPool } from 'three/addons/utils/WorkerPool.js';
5
+ */
6
+ export class WorkerPool {
7
+
8
+ /**
9
+ * Constructs a new Worker pool.
10
+ *
11
+ * @param {number} [pool=4] - The size of the pool.
12
+ */
13
+ constructor( pool = 4 ) {
14
+
15
+ /**
16
+ * The size of the pool.
17
+ *
18
+ * @type {number}
19
+ * @default 4
20
+ */
21
+ this.pool = pool;
22
+
23
+ /**
24
+ * A message queue.
25
+ *
26
+ * @type {Array<Object>}
27
+ */
28
+ this.queue = [];
29
+
30
+ /**
31
+ * An array of Workers.
32
+ *
33
+ * @type {Array<Worker>}
34
+ */
35
+ this.workers = [];
36
+
37
+ /**
38
+ * An array with resolve functions for messages.
39
+ *
40
+ * @type {Array<Function>}
41
+ */
42
+ this.workersResolve = [];
43
+
44
+ /**
45
+ * The current worker status.
46
+ *
47
+ * @type {number}
48
+ */
49
+ this.workerStatus = 0;
50
+
51
+ /**
52
+ * A factory function for creating workers.
53
+ *
54
+ * @type {?Function}
55
+ */
56
+ this.workerCreator = null;
57
+
58
+ }
59
+
60
+ _initWorker( workerId ) {
61
+
62
+ if ( ! this.workers[ workerId ] ) {
63
+
64
+ const worker = this.workerCreator();
65
+ worker.addEventListener( 'message', this._onMessage.bind( this, workerId ) );
66
+ this.workers[ workerId ] = worker;
67
+
68
+ }
69
+
70
+ }
71
+
72
+ _getIdleWorker() {
73
+
74
+ for ( let i = 0; i < this.pool; i ++ )
75
+ if ( ! ( this.workerStatus & ( 1 << i ) ) ) return i;
76
+
77
+ return - 1;
78
+
79
+ }
80
+
81
+ _onMessage( workerId, msg ) {
82
+
83
+ const resolve = this.workersResolve[ workerId ];
84
+ resolve && resolve( msg );
85
+
86
+ if ( this.queue.length ) {
87
+
88
+ const { resolve, msg, transfer } = this.queue.shift();
89
+ this.workersResolve[ workerId ] = resolve;
90
+ this.workers[ workerId ].postMessage( msg, transfer );
91
+
92
+ } else {
93
+
94
+ this.workerStatus ^= 1 << workerId;
95
+
96
+ }
97
+
98
+ }
99
+
100
+ /**
101
+ * Sets a function that is responsible for creating Workers.
102
+ *
103
+ * @param {Function} workerCreator - The worker creator function.
104
+ */
105
+ setWorkerCreator( workerCreator ) {
106
+
107
+ this.workerCreator = workerCreator;
108
+
109
+ }
110
+
111
+ /**
112
+ * Sets the Worker limit
113
+ *
114
+ * @param {number} pool - The size of the pool.
115
+ */
116
+ setWorkerLimit( pool ) {
117
+
118
+ this.pool = pool;
119
+
120
+ }
121
+
122
+ /**
123
+ * Post a message to an idle Worker. If no Worker is available,
124
+ * the message is pushed into a message queue for later processing.
125
+ *
126
+ * @param {Object} msg - The message.
127
+ * @param {Array<ArrayBuffer>} transfer - An array with array buffers for data transfer.
128
+ * @return {Promise} A Promise that resolves when the message has been processed.
129
+ */
130
+ postMessage( msg, transfer ) {
131
+
132
+ return new Promise( ( resolve ) => {
133
+
134
+ const workerId = this._getIdleWorker();
135
+
136
+ if ( workerId !== - 1 ) {
137
+
138
+ this._initWorker( workerId );
139
+ this.workerStatus |= 1 << workerId;
140
+ this.workersResolve[ workerId ] = resolve;
141
+ this.workers[ workerId ].postMessage( msg, transfer );
142
+
143
+ } else {
144
+
145
+ this.queue.push( { resolve, msg, transfer } );
146
+
147
+ }
148
+
149
+ } );
150
+
151
+ }
152
+
153
+ /**
154
+ * Terminates all Workers of this pool. Call this method whenever this
155
+ * Worker pool is no longer used in your app.
156
+ */
157
+ dispose() {
158
+
159
+ this.workers.forEach( ( worker ) => worker.terminate() );
160
+ this.workersResolve.length = 0;
161
+ this.workers.length = 0;
162
+ this.queue.length = 0;
163
+ this.workerStatus = 0;
164
+
165
+ }
166
+
167
+ }