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.
- package/README.md +10 -0
- package/config/sdlmcp.config.example.json +53 -8
- package/config/sdlmcp.config.schema.json +530 -106
- package/dist/.tsbuildinfo +1 -1
- package/dist/benchmark/external-manifest.d.ts +162 -0
- package/dist/benchmark/external-manifest.d.ts.map +1 -0
- package/dist/benchmark/external-manifest.js +336 -0
- package/dist/benchmark/external-manifest.js.map +1 -0
- package/dist/benchmark/external-runner.d.ts +100 -0
- package/dist/benchmark/external-runner.d.ts.map +1 -0
- package/dist/benchmark/external-runner.js +1171 -0
- package/dist/benchmark/external-runner.js.map +1 -0
- package/dist/benchmark/output-file.d.ts +3 -0
- package/dist/benchmark/output-file.d.ts.map +1 -0
- package/dist/benchmark/output-file.js +8 -0
- package/dist/benchmark/output-file.js.map +1 -0
- package/dist/cli/argParsing.d.ts.map +1 -1
- package/dist/cli/argParsing.js +6 -0
- package/dist/cli/argParsing.js.map +1 -1
- package/dist/cli/commands/benchmark.d.ts.map +1 -1
- package/dist/cli/commands/benchmark.js +3 -2
- package/dist/cli/commands/benchmark.js.map +1 -1
- package/dist/cli/commands/index.d.ts +1 -0
- package/dist/cli/commands/index.d.ts.map +1 -1
- package/dist/cli/commands/index.js +13 -7
- package/dist/cli/commands/index.js.map +1 -1
- package/dist/cli/commands/init.d.ts +5 -1
- package/dist/cli/commands/init.d.ts.map +1 -1
- package/dist/cli/commands/init.js +73 -3
- package/dist/cli/commands/init.js.map +1 -1
- package/dist/cli/commands/serve.d.ts.map +1 -1
- package/dist/cli/commands/serve.js +2 -0
- package/dist/cli/commands/serve.js.map +1 -1
- package/dist/cli/index.js +2 -0
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/transport/http.d.ts +1 -35
- package/dist/cli/transport/http.d.ts.map +1 -1
- package/dist/cli/transport/http.js +151 -175
- package/dist/cli/transport/http.js.map +1 -1
- package/dist/cli/types.d.ts +1 -0
- package/dist/cli/types.d.ts.map +1 -1
- package/dist/config/constants.d.ts +30 -0
- package/dist/config/constants.d.ts.map +1 -1
- package/dist/config/constants.js +30 -0
- package/dist/config/constants.js.map +1 -1
- package/dist/config/types.d.ts +53 -1
- package/dist/config/types.d.ts.map +1 -1
- package/dist/config/types.js +62 -14
- package/dist/config/types.js.map +1 -1
- package/dist/db/ladybug-batching.d.ts +1 -0
- package/dist/db/ladybug-batching.d.ts.map +1 -1
- package/dist/db/ladybug-batching.js +1 -0
- package/dist/db/ladybug-batching.js.map +1 -1
- package/dist/db/ladybug-core.d.ts +3 -0
- package/dist/db/ladybug-core.d.ts.map +1 -1
- package/dist/db/ladybug-core.js +72 -2
- package/dist/db/ladybug-core.js.map +1 -1
- package/dist/db/ladybug-embeddings.d.ts +6 -1
- package/dist/db/ladybug-embeddings.d.ts.map +1 -1
- package/dist/db/ladybug-embeddings.js +6 -1
- package/dist/db/ladybug-embeddings.js.map +1 -1
- package/dist/db/ladybug-file-summaries.d.ts.map +1 -1
- package/dist/db/ladybug-file-summaries.js +23 -0
- package/dist/db/ladybug-file-summaries.js.map +1 -1
- package/dist/db/ladybug-queries.js +1 -1
- package/dist/db/ladybug-queries.js.map +1 -1
- package/dist/db/migrations/index.d.ts.map +1 -1
- package/dist/db/migrations/index.js +2 -0
- package/dist/db/migrations/index.js.map +1 -1
- package/dist/db/migrations/m007-copy-embeddings-to-symbol.d.ts +5 -9
- package/dist/db/migrations/m007-copy-embeddings-to-symbol.d.ts.map +1 -1
- package/dist/db/migrations/m007-copy-embeddings-to-symbol.js +24 -126
- package/dist/db/migrations/m007-copy-embeddings-to-symbol.js.map +1 -1
- package/dist/db/migrations/m021-remediate-symbol-embeddings.d.ts +5 -0
- package/dist/db/migrations/m021-remediate-symbol-embeddings.d.ts.map +1 -0
- package/dist/db/migrations/m021-remediate-symbol-embeddings.js +7 -0
- package/dist/db/migrations/m021-remediate-symbol-embeddings.js.map +1 -0
- package/dist/db/migrations/symbol-embedding-remediation.d.ts +57 -0
- package/dist/db/migrations/symbol-embedding-remediation.d.ts.map +1 -0
- package/dist/db/migrations/symbol-embedding-remediation.js +335 -0
- package/dist/db/migrations/symbol-embedding-remediation.js.map +1 -0
- package/dist/graph/layout/force-layout.d.ts +4 -0
- package/dist/graph/layout/force-layout.d.ts.map +1 -0
- package/dist/graph/layout/force-layout.js +127 -0
- package/dist/graph/layout/force-layout.js.map +1 -0
- package/dist/graph/layout/layout-service.d.ts +37 -0
- package/dist/graph/layout/layout-service.d.ts.map +1 -0
- package/dist/graph/layout/layout-service.js +172 -0
- package/dist/graph/layout/layout-service.js.map +1 -0
- package/dist/graph/layout/native-engine.d.ts +9 -0
- package/dist/graph/layout/native-engine.d.ts.map +1 -0
- package/dist/graph/layout/native-engine.js +59 -0
- package/dist/graph/layout/native-engine.js.map +1 -0
- package/dist/graph/layout/prng.d.ts +3 -0
- package/dist/graph/layout/prng.d.ts.map +1 -0
- package/dist/graph/layout/prng.js +19 -0
- package/dist/graph/layout/prng.js.map +1 -0
- package/dist/graph/layout/serializer.d.ts +3 -0
- package/dist/graph/layout/serializer.d.ts.map +1 -0
- package/dist/graph/layout/serializer.js +20 -0
- package/dist/graph/layout/serializer.js.map +1 -0
- package/dist/graph/layout/types.d.ts +30 -0
- package/dist/graph/layout/types.d.ts.map +1 -0
- package/dist/graph/layout/types.js +2 -0
- package/dist/graph/layout/types.js.map +1 -0
- package/dist/indexer/embeddings.d.ts +7 -0
- package/dist/indexer/embeddings.d.ts.map +1 -1
- package/dist/indexer/embeddings.js +44 -4
- package/dist/indexer/embeddings.js.map +1 -1
- package/dist/indexer/file-summary-embeddings.d.ts +12 -0
- package/dist/indexer/file-summary-embeddings.d.ts.map +1 -1
- package/dist/indexer/file-summary-embeddings.js +83 -21
- package/dist/indexer/file-summary-embeddings.js.map +1 -1
- package/dist/indexer/fileWalker.d.ts.map +1 -1
- package/dist/indexer/fileWalker.js +2 -1
- package/dist/indexer/fileWalker.js.map +1 -1
- package/dist/indexer/metrics-updater.d.ts.map +1 -1
- package/dist/indexer/metrics-updater.js +27 -4
- package/dist/indexer/metrics-updater.js.map +1 -1
- package/dist/indexer/watcher.d.ts.map +1 -1
- package/dist/indexer/watcher.js +2 -1
- package/dist/indexer/watcher.js.map +1 -1
- package/dist/mcp/context-response-projection.d.ts.map +1 -1
- package/dist/mcp/context-response-projection.js +49 -13
- package/dist/mcp/context-response-projection.js.map +1 -1
- package/dist/mcp/tools/search-edit/planner.d.ts.map +1 -1
- package/dist/mcp/tools/search-edit/planner.js +10 -3
- package/dist/mcp/tools/search-edit/planner.js.map +1 -1
- package/dist/observability/event-tap.d.ts +2 -1
- package/dist/observability/event-tap.d.ts.map +1 -1
- package/dist/observability/event-tap.js.map +1 -1
- package/dist/observability/service.d.ts +11 -4
- package/dist/observability/service.d.ts.map +1 -1
- package/dist/observability/service.js +83 -13
- package/dist/observability/service.js.map +1 -1
- package/dist/observability/types.d.ts +48 -2
- package/dist/observability/types.d.ts.map +1 -1
- package/dist/ui/.tsbuildinfo +1 -0
- package/dist/ui/vendor/fflate.js +2692 -0
- package/dist/ui/vendor/jsm/controls/ArcballControls.js +3543 -0
- package/dist/ui/vendor/jsm/controls/DragControls.js +452 -0
- package/dist/ui/vendor/jsm/controls/FirstPersonControls.js +488 -0
- package/dist/ui/vendor/jsm/controls/FlyControls.js +384 -0
- package/dist/ui/vendor/jsm/controls/MapControls.js +116 -0
- package/dist/ui/vendor/jsm/controls/OrbitControls.js +1963 -0
- package/dist/ui/vendor/jsm/controls/PointerLockControls.js +264 -0
- package/dist/ui/vendor/jsm/controls/TrackballControls.js +1001 -0
- package/dist/ui/vendor/jsm/controls/TransformControls.js +2003 -0
- package/dist/ui/vendor/jsm/loaders/3DMLoader.js +1836 -0
- package/dist/ui/vendor/jsm/loaders/3MFLoader.js +1621 -0
- package/dist/ui/vendor/jsm/loaders/AMFLoader.js +541 -0
- package/dist/ui/vendor/jsm/loaders/BVHLoader.js +484 -0
- package/dist/ui/vendor/jsm/loaders/ColladaLoader.js +153 -0
- package/dist/ui/vendor/jsm/loaders/DDSLoader.js +385 -0
- package/dist/ui/vendor/jsm/loaders/DRACOLoader.js +772 -0
- package/dist/ui/vendor/jsm/loaders/EXRLoader.js +3395 -0
- package/dist/ui/vendor/jsm/loaders/FBXLoader.js +4580 -0
- package/dist/ui/vendor/jsm/loaders/FontLoader.js +260 -0
- package/dist/ui/vendor/jsm/loaders/GCodeLoader.js +318 -0
- package/dist/ui/vendor/jsm/loaders/GLTFLoader.js +4860 -0
- package/dist/ui/vendor/jsm/loaders/HDRCubeTextureLoader.js +164 -0
- package/dist/ui/vendor/jsm/loaders/HDRLoader.js +463 -0
- package/dist/ui/vendor/jsm/loaders/IESLoader.js +379 -0
- package/dist/ui/vendor/jsm/loaders/KMZLoader.js +163 -0
- package/dist/ui/vendor/jsm/loaders/KTX2Loader.js +1276 -0
- package/dist/ui/vendor/jsm/loaders/KTXLoader.js +197 -0
- package/dist/ui/vendor/jsm/loaders/LDrawLoader.js +2510 -0
- package/dist/ui/vendor/jsm/loaders/LUT3dlLoader.js +205 -0
- package/dist/ui/vendor/jsm/loaders/LUTCubeLoader.js +190 -0
- package/dist/ui/vendor/jsm/loaders/LUTImageLoader.js +190 -0
- package/dist/ui/vendor/jsm/loaders/LWOLoader.js +1051 -0
- package/dist/ui/vendor/jsm/loaders/LottieLoader.js +130 -0
- package/dist/ui/vendor/jsm/loaders/MD2Loader.js +435 -0
- package/dist/ui/vendor/jsm/loaders/MDDLoader.js +147 -0
- package/dist/ui/vendor/jsm/loaders/MTLLoader.js +593 -0
- package/dist/ui/vendor/jsm/loaders/MaterialXLoader.js +1126 -0
- package/dist/ui/vendor/jsm/loaders/NRRDLoader.js +718 -0
- package/dist/ui/vendor/jsm/loaders/OBJLoader.js +955 -0
- package/dist/ui/vendor/jsm/loaders/PCDLoader.js +620 -0
- package/dist/ui/vendor/jsm/loaders/PDBLoader.js +272 -0
- package/dist/ui/vendor/jsm/loaders/PLYLoader.js +968 -0
- package/dist/ui/vendor/jsm/loaders/PVRLoader.js +270 -0
- package/dist/ui/vendor/jsm/loaders/RGBELoader.js +18 -0
- package/dist/ui/vendor/jsm/loaders/STLLoader.js +421 -0
- package/dist/ui/vendor/jsm/loaders/SVGLoader.js +3319 -0
- package/dist/ui/vendor/jsm/loaders/TDSLoader.js +1142 -0
- package/dist/ui/vendor/jsm/loaders/TGALoader.js +538 -0
- package/dist/ui/vendor/jsm/loaders/TIFFLoader.js +59 -0
- package/dist/ui/vendor/jsm/loaders/TTFLoader.js +261 -0
- package/dist/ui/vendor/jsm/loaders/USDLoader.js +303 -0
- package/dist/ui/vendor/jsm/loaders/USDZLoader.js +16 -0
- package/dist/ui/vendor/jsm/loaders/UltraHDRLoader.js +755 -0
- package/dist/ui/vendor/jsm/loaders/VOXLoader.js +919 -0
- package/dist/ui/vendor/jsm/loaders/VRMLLoader.js +3646 -0
- package/dist/ui/vendor/jsm/loaders/VTKLoader.js +1293 -0
- package/dist/ui/vendor/jsm/loaders/XYZLoader.js +143 -0
- package/dist/ui/vendor/jsm/loaders/collada/ColladaComposer.js +3044 -0
- package/dist/ui/vendor/jsm/loaders/collada/ColladaParser.js +1977 -0
- package/dist/ui/vendor/jsm/loaders/lwo/IFFParser.js +1217 -0
- package/dist/ui/vendor/jsm/loaders/lwo/LWO2Parser.js +414 -0
- package/dist/ui/vendor/jsm/loaders/lwo/LWO3Parser.js +373 -0
- package/dist/ui/vendor/jsm/loaders/usd/USDAParser.js +901 -0
- package/dist/ui/vendor/jsm/loaders/usd/USDCParser.js +1878 -0
- package/dist/ui/vendor/jsm/loaders/usd/USDComposer.js +4627 -0
- package/dist/ui/vendor/jsm/utils/BufferGeometryUtils.js +1501 -0
- package/dist/ui/vendor/jsm/utils/CameraUtils.js +82 -0
- package/dist/ui/vendor/jsm/utils/ColorUtils.js +76 -0
- package/dist/ui/vendor/jsm/utils/GeometryCompressionUtils.js +547 -0
- package/dist/ui/vendor/jsm/utils/GeometryUtils.js +226 -0
- package/dist/ui/vendor/jsm/utils/LDrawUtils.js +211 -0
- package/dist/ui/vendor/jsm/utils/SceneOptimizer.js +458 -0
- package/dist/ui/vendor/jsm/utils/SceneUtils.js +363 -0
- package/dist/ui/vendor/jsm/utils/ShadowMapViewer.js +244 -0
- package/dist/ui/vendor/jsm/utils/ShadowMapViewerGPU.js +233 -0
- package/dist/ui/vendor/jsm/utils/SkeletonUtils.js +496 -0
- package/dist/ui/vendor/jsm/utils/SortUtils.js +175 -0
- package/dist/ui/vendor/jsm/utils/UVsDebug.js +173 -0
- package/dist/ui/vendor/jsm/utils/WebGLTextureUtils.js +115 -0
- package/dist/ui/vendor/jsm/utils/WebGPUTextureUtils.js +81 -0
- package/dist/ui/vendor/jsm/utils/WorkerPool.js +167 -0
- package/dist/ui/vendor/three.core.min.js +6 -0
- package/dist/ui/vendor/three.module.min.js +6 -0
- package/dist/ui/viewer/ambient.js +39 -0
- package/dist/ui/viewer/api.js +93 -0
- package/dist/ui/viewer/chrome.js +36 -0
- package/dist/ui/viewer/edges.js +33 -0
- package/dist/ui/viewer/index.html +32 -0
- package/dist/ui/viewer/inspector.js +23 -0
- package/dist/ui/viewer/lenses/activity.js +24 -0
- package/dist/ui/viewer/lenses/community.js +5 -0
- package/dist/ui/viewer/lenses/edges.js +4 -0
- package/dist/ui/viewer/lenses/impact.js +6 -0
- package/dist/ui/viewer/lenses/search.js +69 -0
- package/dist/ui/viewer/lod.js +100 -0
- package/dist/ui/viewer/main.js +92 -0
- package/dist/ui/viewer/picking.js +45 -0
- package/dist/ui/viewer/scene.js +85 -0
- package/dist/ui/viewer/skins/default-skin.js +15 -0
- package/dist/ui/viewer/skins/loader.js +44 -0
- package/dist/ui/viewer/skins/manifest-schema.js +30 -0
- package/dist/ui/viewer/state.js +44 -0
- package/dist/ui/viewer/theme.js +23 -0
- package/dist/ui/viewer/universe.js +151 -0
- package/dist/ui/viewer/viewer.css +85 -0
- package/dist/util/safeRegex.d.ts.map +1 -1
- package/dist/util/safeRegex.js +221 -68
- package/dist/util/safeRegex.js.map +1 -1
- package/dist/viewer/legacy-graph.d.ts +40 -0
- package/dist/viewer/legacy-graph.d.ts.map +1 -0
- package/dist/viewer/legacy-graph.js +152 -0
- package/dist/viewer/legacy-graph.js.map +1 -0
- package/dist/viewer/routes.d.ts +10 -0
- package/dist/viewer/routes.d.ts.map +1 -0
- package/dist/viewer/routes.js +221 -0
- package/dist/viewer/routes.js.map +1 -0
- package/dist/viewer/service.d.ts +44 -0
- package/dist/viewer/service.d.ts.map +1 -0
- package/dist/viewer/service.js +160 -0
- package/dist/viewer/service.js.map +1 -0
- package/dist/viewer/types.d.ts +63 -0
- package/dist/viewer/types.d.ts.map +1 -0
- package/dist/viewer/types.js +2 -0
- package/dist/viewer/types.js.map +1 -0
- package/dist/viewer/viewer-config.d.ts +12 -0
- package/dist/viewer/viewer-config.d.ts.map +1 -0
- package/dist/viewer/viewer-config.js +36 -0
- package/dist/viewer/viewer-config.js.map +1 -0
- package/package.json +18 -9
- package/templates/SDL.md +19 -0
- package/templates/claude-code.json +8 -43
- package/dist/ui/graph.css +0 -108
- package/dist/ui/graph.d.ts +0 -2
- package/dist/ui/graph.d.ts.map +0 -1
- package/dist/ui/graph.html +0 -52
- package/dist/ui/graph.js +0 -259
- 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
|
+
}
|