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,270 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CompressedTextureLoader,
|
|
3
|
+
RGBA_PVRTC_2BPPV1_Format,
|
|
4
|
+
RGBA_PVRTC_4BPPV1_Format,
|
|
5
|
+
RGB_PVRTC_2BPPV1_Format,
|
|
6
|
+
RGB_PVRTC_4BPPV1_Format
|
|
7
|
+
} from 'three';
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* A loader for the PVRTC texture compression format.
|
|
11
|
+
*
|
|
12
|
+
* ```js
|
|
13
|
+
* const loader = new PVRLoader();
|
|
14
|
+
*
|
|
15
|
+
* const map = loader.load( 'textures/compressed/disturb_4bpp_rgb.pvr' );
|
|
16
|
+
* map.colorSpace = THREE.SRGBColorSpace; // only for color textures
|
|
17
|
+
* ```
|
|
18
|
+
*
|
|
19
|
+
* @augments CompressedTextureLoader
|
|
20
|
+
* @three_import import { PVRLoader } from 'three/addons/loaders/PVRLoader.js';
|
|
21
|
+
*/
|
|
22
|
+
class PVRLoader extends CompressedTextureLoader {
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Constructs a new PVR loader.
|
|
26
|
+
*
|
|
27
|
+
* @param {LoadingManager} [manager] - The loading manager.
|
|
28
|
+
*/
|
|
29
|
+
constructor( manager ) {
|
|
30
|
+
|
|
31
|
+
super( manager );
|
|
32
|
+
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Parses the given PVRTC texture data.
|
|
37
|
+
*
|
|
38
|
+
* @param {ArrayBuffer} buffer - The raw texture data.
|
|
39
|
+
* @param {boolean} loadMipmaps - Whether to load mipmaps or not. This option is not yet supported by the loader.
|
|
40
|
+
* @return {CompressedTextureLoader~TexData} An object representing the parsed texture data.
|
|
41
|
+
*/
|
|
42
|
+
parse( buffer, loadMipmaps ) {
|
|
43
|
+
|
|
44
|
+
const headerLengthInt = 13;
|
|
45
|
+
const header = new Uint32Array( buffer, 0, headerLengthInt );
|
|
46
|
+
|
|
47
|
+
const pvrDatas = {
|
|
48
|
+
buffer: buffer,
|
|
49
|
+
header: header,
|
|
50
|
+
loadMipmaps: loadMipmaps
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
if ( header[ 0 ] === 0x03525650 ) {
|
|
54
|
+
|
|
55
|
+
// PVR v3
|
|
56
|
+
|
|
57
|
+
return _parseV3( pvrDatas );
|
|
58
|
+
|
|
59
|
+
} else if ( header[ 11 ] === 0x21525650 ) {
|
|
60
|
+
|
|
61
|
+
// PVR v2
|
|
62
|
+
|
|
63
|
+
return _parseV2( pvrDatas );
|
|
64
|
+
|
|
65
|
+
} else {
|
|
66
|
+
|
|
67
|
+
console.error( 'THREE.PVRLoader: Unknown PVR format.' );
|
|
68
|
+
|
|
69
|
+
}
|
|
70
|
+
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
function _parseV3( pvrDatas ) {
|
|
76
|
+
|
|
77
|
+
const header = pvrDatas.header;
|
|
78
|
+
let bpp, format;
|
|
79
|
+
|
|
80
|
+
|
|
81
|
+
const metaLen = header[ 12 ],
|
|
82
|
+
pixelFormat = header[ 2 ],
|
|
83
|
+
height = header[ 6 ],
|
|
84
|
+
width = header[ 7 ],
|
|
85
|
+
// numSurfs = header[ 9 ],
|
|
86
|
+
numFaces = header[ 10 ],
|
|
87
|
+
numMipmaps = header[ 11 ];
|
|
88
|
+
|
|
89
|
+
switch ( pixelFormat ) {
|
|
90
|
+
|
|
91
|
+
case 0 : // PVRTC 2bpp RGB
|
|
92
|
+
bpp = 2;
|
|
93
|
+
format = RGB_PVRTC_2BPPV1_Format;
|
|
94
|
+
break;
|
|
95
|
+
|
|
96
|
+
case 1 : // PVRTC 2bpp RGBA
|
|
97
|
+
bpp = 2;
|
|
98
|
+
format = RGBA_PVRTC_2BPPV1_Format;
|
|
99
|
+
break;
|
|
100
|
+
|
|
101
|
+
case 2 : // PVRTC 4bpp RGB
|
|
102
|
+
bpp = 4;
|
|
103
|
+
format = RGB_PVRTC_4BPPV1_Format;
|
|
104
|
+
break;
|
|
105
|
+
|
|
106
|
+
case 3 : // PVRTC 4bpp RGBA
|
|
107
|
+
bpp = 4;
|
|
108
|
+
format = RGBA_PVRTC_4BPPV1_Format;
|
|
109
|
+
break;
|
|
110
|
+
|
|
111
|
+
default :
|
|
112
|
+
console.error( 'THREE.PVRLoader: Unsupported PVR format:', pixelFormat );
|
|
113
|
+
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
pvrDatas.dataPtr = 52 + metaLen;
|
|
117
|
+
pvrDatas.bpp = bpp;
|
|
118
|
+
pvrDatas.format = format;
|
|
119
|
+
pvrDatas.width = width;
|
|
120
|
+
pvrDatas.height = height;
|
|
121
|
+
pvrDatas.numSurfaces = numFaces;
|
|
122
|
+
pvrDatas.numMipmaps = numMipmaps;
|
|
123
|
+
pvrDatas.isCubemap = ( numFaces === 6 );
|
|
124
|
+
|
|
125
|
+
return _extract( pvrDatas );
|
|
126
|
+
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
function _parseV2( pvrDatas ) {
|
|
130
|
+
|
|
131
|
+
const header = pvrDatas.header;
|
|
132
|
+
|
|
133
|
+
const headerLength = header[ 0 ],
|
|
134
|
+
height = header[ 1 ],
|
|
135
|
+
width = header[ 2 ],
|
|
136
|
+
numMipmaps = header[ 3 ],
|
|
137
|
+
flags = header[ 4 ],
|
|
138
|
+
// dataLength = header[ 5 ],
|
|
139
|
+
// bpp = header[ 6 ],
|
|
140
|
+
// bitmaskRed = header[ 7 ],
|
|
141
|
+
// bitmaskGreen = header[ 8 ],
|
|
142
|
+
// bitmaskBlue = header[ 9 ],
|
|
143
|
+
bitmaskAlpha = header[ 10 ],
|
|
144
|
+
// pvrTag = header[ 11 ],
|
|
145
|
+
numSurfs = header[ 12 ];
|
|
146
|
+
|
|
147
|
+
|
|
148
|
+
const TYPE_MASK = 0xff;
|
|
149
|
+
const PVRTC_2 = 24,
|
|
150
|
+
PVRTC_4 = 25;
|
|
151
|
+
|
|
152
|
+
const formatFlags = flags & TYPE_MASK;
|
|
153
|
+
|
|
154
|
+
let bpp, format;
|
|
155
|
+
const _hasAlpha = bitmaskAlpha > 0;
|
|
156
|
+
|
|
157
|
+
if ( formatFlags === PVRTC_4 ) {
|
|
158
|
+
|
|
159
|
+
format = _hasAlpha ? RGBA_PVRTC_4BPPV1_Format : RGB_PVRTC_4BPPV1_Format;
|
|
160
|
+
bpp = 4;
|
|
161
|
+
|
|
162
|
+
} else if ( formatFlags === PVRTC_2 ) {
|
|
163
|
+
|
|
164
|
+
format = _hasAlpha ? RGBA_PVRTC_2BPPV1_Format : RGB_PVRTC_2BPPV1_Format;
|
|
165
|
+
bpp = 2;
|
|
166
|
+
|
|
167
|
+
} else {
|
|
168
|
+
|
|
169
|
+
console.error( 'THREE.PVRLoader: Unknown PVR format:', formatFlags );
|
|
170
|
+
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
pvrDatas.dataPtr = headerLength;
|
|
174
|
+
pvrDatas.bpp = bpp;
|
|
175
|
+
pvrDatas.format = format;
|
|
176
|
+
pvrDatas.width = width;
|
|
177
|
+
pvrDatas.height = height;
|
|
178
|
+
pvrDatas.numSurfaces = numSurfs;
|
|
179
|
+
pvrDatas.numMipmaps = numMipmaps + 1;
|
|
180
|
+
|
|
181
|
+
// guess cubemap type seems tricky in v2
|
|
182
|
+
// it's just a pvr containing 6 surface (no explicit cubemap type)
|
|
183
|
+
pvrDatas.isCubemap = ( numSurfs === 6 );
|
|
184
|
+
|
|
185
|
+
return _extract( pvrDatas );
|
|
186
|
+
|
|
187
|
+
}
|
|
188
|
+
|
|
189
|
+
|
|
190
|
+
function _extract( pvrDatas ) {
|
|
191
|
+
|
|
192
|
+
const pvr = {
|
|
193
|
+
mipmaps: [],
|
|
194
|
+
width: pvrDatas.width,
|
|
195
|
+
height: pvrDatas.height,
|
|
196
|
+
format: pvrDatas.format,
|
|
197
|
+
mipmapCount: pvrDatas.numMipmaps,
|
|
198
|
+
isCubemap: pvrDatas.isCubemap
|
|
199
|
+
};
|
|
200
|
+
|
|
201
|
+
const buffer = pvrDatas.buffer;
|
|
202
|
+
|
|
203
|
+
let dataOffset = pvrDatas.dataPtr,
|
|
204
|
+
dataSize = 0,
|
|
205
|
+
blockSize = 0,
|
|
206
|
+
blockWidth = 0,
|
|
207
|
+
blockHeight = 0,
|
|
208
|
+
widthBlocks = 0,
|
|
209
|
+
heightBlocks = 0;
|
|
210
|
+
|
|
211
|
+
const bpp = pvrDatas.bpp,
|
|
212
|
+
numSurfs = pvrDatas.numSurfaces;
|
|
213
|
+
|
|
214
|
+
if ( bpp === 2 ) {
|
|
215
|
+
|
|
216
|
+
blockWidth = 8;
|
|
217
|
+
blockHeight = 4;
|
|
218
|
+
|
|
219
|
+
} else {
|
|
220
|
+
|
|
221
|
+
blockWidth = 4;
|
|
222
|
+
blockHeight = 4;
|
|
223
|
+
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
blockSize = ( blockWidth * blockHeight ) * bpp / 8;
|
|
227
|
+
|
|
228
|
+
pvr.mipmaps.length = pvrDatas.numMipmaps * numSurfs;
|
|
229
|
+
|
|
230
|
+
let mipLevel = 0;
|
|
231
|
+
|
|
232
|
+
while ( mipLevel < pvrDatas.numMipmaps ) {
|
|
233
|
+
|
|
234
|
+
const sWidth = pvrDatas.width >> mipLevel,
|
|
235
|
+
sHeight = pvrDatas.height >> mipLevel;
|
|
236
|
+
|
|
237
|
+
widthBlocks = sWidth / blockWidth;
|
|
238
|
+
heightBlocks = sHeight / blockHeight;
|
|
239
|
+
|
|
240
|
+
// Clamp to minimum number of blocks
|
|
241
|
+
if ( widthBlocks < 2 ) widthBlocks = 2;
|
|
242
|
+
if ( heightBlocks < 2 ) heightBlocks = 2;
|
|
243
|
+
|
|
244
|
+
dataSize = widthBlocks * heightBlocks * blockSize;
|
|
245
|
+
|
|
246
|
+
for ( let surfIndex = 0; surfIndex < numSurfs; surfIndex ++ ) {
|
|
247
|
+
|
|
248
|
+
const byteArray = new Uint8Array( buffer, dataOffset, dataSize );
|
|
249
|
+
|
|
250
|
+
const mipmap = {
|
|
251
|
+
data: byteArray,
|
|
252
|
+
width: sWidth,
|
|
253
|
+
height: sHeight
|
|
254
|
+
};
|
|
255
|
+
|
|
256
|
+
pvr.mipmaps[ surfIndex * pvrDatas.numMipmaps + mipLevel ] = mipmap;
|
|
257
|
+
|
|
258
|
+
dataOffset += dataSize;
|
|
259
|
+
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
mipLevel ++;
|
|
263
|
+
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
return pvr;
|
|
267
|
+
|
|
268
|
+
}
|
|
269
|
+
|
|
270
|
+
export { PVRLoader };
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { HDRLoader } from './HDRLoader.js';
|
|
2
|
+
|
|
3
|
+
// @deprecated, r180
|
|
4
|
+
|
|
5
|
+
class RGBELoader extends HDRLoader {
|
|
6
|
+
|
|
7
|
+
constructor( manager ) {
|
|
8
|
+
|
|
9
|
+
console.warn( 'RGBELoader has been deprecated. Please use HDRLoader instead.' );
|
|
10
|
+
super( manager );
|
|
11
|
+
|
|
12
|
+
}
|
|
13
|
+
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export { RGBELoader };
|
|
17
|
+
|
|
18
|
+
|
|
@@ -0,0 +1,421 @@
|
|
|
1
|
+
import {
|
|
2
|
+
BufferAttribute,
|
|
3
|
+
BufferGeometry,
|
|
4
|
+
Color,
|
|
5
|
+
FileLoader,
|
|
6
|
+
Float32BufferAttribute,
|
|
7
|
+
Loader,
|
|
8
|
+
Vector3,
|
|
9
|
+
SRGBColorSpace
|
|
10
|
+
} from 'three';
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* A loader for the STL format, as created by Solidworks and other CAD programs.
|
|
14
|
+
*
|
|
15
|
+
* Supports both binary and ASCII encoded files. The loader returns a non-indexed buffer geometry.
|
|
16
|
+
*
|
|
17
|
+
* Limitations:
|
|
18
|
+
* - Binary decoding supports "Magics" color format (http://en.wikipedia.org/wiki/STL_(file_format)#Color_in_binary_STL).
|
|
19
|
+
* - There is perhaps some question as to how valid it is to always assume little-endian-ness.
|
|
20
|
+
* - ASCII decoding assumes file is UTF-8.
|
|
21
|
+
*
|
|
22
|
+
* ```js
|
|
23
|
+
* const loader = new STLLoader();
|
|
24
|
+
* const geometry = await loader.loadAsync( './models/stl/slotted_disk.stl' )
|
|
25
|
+
* scene.add( new THREE.Mesh( geometry ) );
|
|
26
|
+
* ```
|
|
27
|
+
* For binary STLs geometry might contain colors for vertices. To use it:
|
|
28
|
+
* ```js
|
|
29
|
+
* // use the same code to load STL as above
|
|
30
|
+
* if ( geometry.hasColors ) {
|
|
31
|
+
* material = new THREE.MeshPhongMaterial( { opacity: geometry.alpha, vertexColors: true } );
|
|
32
|
+
* }
|
|
33
|
+
* const mesh = new THREE.Mesh( geometry, material );
|
|
34
|
+
* ```
|
|
35
|
+
* For ASCII STLs containing multiple solids, each solid is assigned to a different group.
|
|
36
|
+
* Groups can be used to assign a different color by defining an array of materials with the same length of
|
|
37
|
+
* geometry.groups and passing it to the Mesh constructor:
|
|
38
|
+
*
|
|
39
|
+
* ```js
|
|
40
|
+
* const materials = [];
|
|
41
|
+
* const nGeometryGroups = geometry.groups.length;
|
|
42
|
+
*
|
|
43
|
+
* for ( let i = 0; i < nGeometryGroups; i ++ ) {
|
|
44
|
+
* const material = new THREE.MeshPhongMaterial( { color: colorMap[ i ], wireframe: false } );
|
|
45
|
+
* materials.push( material );
|
|
46
|
+
* }
|
|
47
|
+
*
|
|
48
|
+
* const mesh = new THREE.Mesh(geometry, materials);
|
|
49
|
+
* ```
|
|
50
|
+
*
|
|
51
|
+
* @augments Loader
|
|
52
|
+
* @three_import import { STLLoader } from 'three/addons/loaders/STLLoader.js';
|
|
53
|
+
*/
|
|
54
|
+
class STLLoader extends Loader {
|
|
55
|
+
|
|
56
|
+
/**
|
|
57
|
+
* Constructs a new STL loader.
|
|
58
|
+
*
|
|
59
|
+
* @param {LoadingManager} [manager] - The loading manager.
|
|
60
|
+
*/
|
|
61
|
+
constructor( manager ) {
|
|
62
|
+
|
|
63
|
+
super( manager );
|
|
64
|
+
|
|
65
|
+
}
|
|
66
|
+
|
|
67
|
+
/**
|
|
68
|
+
* Starts loading from the given URL and passes the loaded STL asset
|
|
69
|
+
* to the `onLoad()` callback.
|
|
70
|
+
*
|
|
71
|
+
* @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
|
|
72
|
+
* @param {function(BufferGeometry)} onLoad - Executed when the loading process has been finished.
|
|
73
|
+
* @param {onProgressCallback} onProgress - Executed while the loading is in progress.
|
|
74
|
+
* @param {onErrorCallback} onError - Executed when errors occur.
|
|
75
|
+
*/
|
|
76
|
+
load( url, onLoad, onProgress, onError ) {
|
|
77
|
+
|
|
78
|
+
const scope = this;
|
|
79
|
+
|
|
80
|
+
const loader = new FileLoader( this.manager );
|
|
81
|
+
loader.setPath( this.path );
|
|
82
|
+
loader.setResponseType( 'arraybuffer' );
|
|
83
|
+
loader.setRequestHeader( this.requestHeader );
|
|
84
|
+
loader.setWithCredentials( this.withCredentials );
|
|
85
|
+
|
|
86
|
+
loader.load( url, function ( text ) {
|
|
87
|
+
|
|
88
|
+
try {
|
|
89
|
+
|
|
90
|
+
onLoad( scope.parse( text ) );
|
|
91
|
+
|
|
92
|
+
} catch ( e ) {
|
|
93
|
+
|
|
94
|
+
if ( onError ) {
|
|
95
|
+
|
|
96
|
+
onError( e );
|
|
97
|
+
|
|
98
|
+
} else {
|
|
99
|
+
|
|
100
|
+
console.error( e );
|
|
101
|
+
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
scope.manager.itemError( url );
|
|
105
|
+
|
|
106
|
+
}
|
|
107
|
+
|
|
108
|
+
}, onProgress, onError );
|
|
109
|
+
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
/**
|
|
113
|
+
* Parses the given STL data and returns the resulting geometry.
|
|
114
|
+
*
|
|
115
|
+
* @param {ArrayBuffer} data - The raw STL data as an array buffer.
|
|
116
|
+
* @return {BufferGeometry} The parsed geometry.
|
|
117
|
+
*/
|
|
118
|
+
parse( data ) {
|
|
119
|
+
|
|
120
|
+
function isBinary( data ) {
|
|
121
|
+
|
|
122
|
+
const reader = new DataView( data );
|
|
123
|
+
const face_size = ( 32 / 8 * 3 ) + ( ( 32 / 8 * 3 ) * 3 ) + ( 16 / 8 );
|
|
124
|
+
const n_faces = reader.getUint32( 80, true );
|
|
125
|
+
const expect = 80 + ( 32 / 8 ) + ( n_faces * face_size );
|
|
126
|
+
|
|
127
|
+
if ( expect === reader.byteLength ) {
|
|
128
|
+
|
|
129
|
+
return true;
|
|
130
|
+
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
// An ASCII STL data must begin with 'solid ' as the first six bytes.
|
|
134
|
+
// However, ASCII STLs lacking the SPACE after the 'd' are known to be
|
|
135
|
+
// plentiful. So, check the first 5 bytes for 'solid'.
|
|
136
|
+
|
|
137
|
+
// Several encodings, such as UTF-8, precede the text with up to 5 bytes:
|
|
138
|
+
// https://en.wikipedia.org/wiki/Byte_order_mark#Byte_order_marks_by_encoding
|
|
139
|
+
// Search for "solid" to start anywhere after those prefixes.
|
|
140
|
+
|
|
141
|
+
// US-ASCII ordinal values for 's', 'o', 'l', 'i', 'd'
|
|
142
|
+
|
|
143
|
+
const solid = [ 115, 111, 108, 105, 100 ];
|
|
144
|
+
|
|
145
|
+
for ( let off = 0; off < 5; off ++ ) {
|
|
146
|
+
|
|
147
|
+
// If "solid" text is matched to the current offset, declare it to be an ASCII STL.
|
|
148
|
+
|
|
149
|
+
if ( matchDataViewAt( solid, reader, off ) ) return false;
|
|
150
|
+
|
|
151
|
+
}
|
|
152
|
+
|
|
153
|
+
// Couldn't find "solid" text at the beginning; it is binary STL.
|
|
154
|
+
|
|
155
|
+
return true;
|
|
156
|
+
|
|
157
|
+
}
|
|
158
|
+
|
|
159
|
+
function matchDataViewAt( query, reader, offset ) {
|
|
160
|
+
|
|
161
|
+
// Check if each byte in query matches the corresponding byte from the current offset
|
|
162
|
+
|
|
163
|
+
for ( let i = 0, il = query.length; i < il; i ++ ) {
|
|
164
|
+
|
|
165
|
+
if ( query[ i ] !== reader.getUint8( offset + i ) ) return false;
|
|
166
|
+
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
return true;
|
|
170
|
+
|
|
171
|
+
}
|
|
172
|
+
|
|
173
|
+
function parseBinary( data ) {
|
|
174
|
+
|
|
175
|
+
const reader = new DataView( data );
|
|
176
|
+
const faces = reader.getUint32( 80, true );
|
|
177
|
+
|
|
178
|
+
let r, g, b, hasColors = false, colors;
|
|
179
|
+
let defaultR, defaultG, defaultB, alpha;
|
|
180
|
+
|
|
181
|
+
// process STL header
|
|
182
|
+
// check for default color in header ("COLOR=rgba" sequence).
|
|
183
|
+
|
|
184
|
+
for ( let index = 0; index < 80 - 10; index ++ ) {
|
|
185
|
+
|
|
186
|
+
if ( ( reader.getUint32( index, false ) == 0x434F4C4F /*COLO*/ ) &&
|
|
187
|
+
( reader.getUint8( index + 4 ) == 0x52 /*'R'*/ ) &&
|
|
188
|
+
( reader.getUint8( index + 5 ) == 0x3D /*'='*/ ) ) {
|
|
189
|
+
|
|
190
|
+
hasColors = true;
|
|
191
|
+
colors = new Float32Array( faces * 3 * 3 );
|
|
192
|
+
|
|
193
|
+
defaultR = reader.getUint8( index + 6 ) / 255;
|
|
194
|
+
defaultG = reader.getUint8( index + 7 ) / 255;
|
|
195
|
+
defaultB = reader.getUint8( index + 8 ) / 255;
|
|
196
|
+
alpha = reader.getUint8( index + 9 ) / 255;
|
|
197
|
+
|
|
198
|
+
}
|
|
199
|
+
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
const dataOffset = 84;
|
|
203
|
+
const faceLength = 12 * 4 + 2;
|
|
204
|
+
|
|
205
|
+
const geometry = new BufferGeometry();
|
|
206
|
+
|
|
207
|
+
const vertices = new Float32Array( faces * 3 * 3 );
|
|
208
|
+
const normals = new Float32Array( faces * 3 * 3 );
|
|
209
|
+
|
|
210
|
+
const color = new Color();
|
|
211
|
+
|
|
212
|
+
for ( let face = 0; face < faces; face ++ ) {
|
|
213
|
+
|
|
214
|
+
const start = dataOffset + face * faceLength;
|
|
215
|
+
const normalX = reader.getFloat32( start, true );
|
|
216
|
+
const normalY = reader.getFloat32( start + 4, true );
|
|
217
|
+
const normalZ = reader.getFloat32( start + 8, true );
|
|
218
|
+
|
|
219
|
+
if ( hasColors ) {
|
|
220
|
+
|
|
221
|
+
const packedColor = reader.getUint16( start + 48, true );
|
|
222
|
+
|
|
223
|
+
if ( ( packedColor & 0x8000 ) === 0 ) {
|
|
224
|
+
|
|
225
|
+
// facet has its own unique color
|
|
226
|
+
|
|
227
|
+
r = ( packedColor & 0x1F ) / 31;
|
|
228
|
+
g = ( ( packedColor >> 5 ) & 0x1F ) / 31;
|
|
229
|
+
b = ( ( packedColor >> 10 ) & 0x1F ) / 31;
|
|
230
|
+
|
|
231
|
+
} else {
|
|
232
|
+
|
|
233
|
+
r = defaultR;
|
|
234
|
+
g = defaultG;
|
|
235
|
+
b = defaultB;
|
|
236
|
+
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
for ( let i = 1; i <= 3; i ++ ) {
|
|
242
|
+
|
|
243
|
+
const vertexstart = start + i * 12;
|
|
244
|
+
const componentIdx = ( face * 3 * 3 ) + ( ( i - 1 ) * 3 );
|
|
245
|
+
|
|
246
|
+
vertices[ componentIdx ] = reader.getFloat32( vertexstart, true );
|
|
247
|
+
vertices[ componentIdx + 1 ] = reader.getFloat32( vertexstart + 4, true );
|
|
248
|
+
vertices[ componentIdx + 2 ] = reader.getFloat32( vertexstart + 8, true );
|
|
249
|
+
|
|
250
|
+
normals[ componentIdx ] = normalX;
|
|
251
|
+
normals[ componentIdx + 1 ] = normalY;
|
|
252
|
+
normals[ componentIdx + 2 ] = normalZ;
|
|
253
|
+
|
|
254
|
+
if ( hasColors ) {
|
|
255
|
+
|
|
256
|
+
color.setRGB( r, g, b, SRGBColorSpace );
|
|
257
|
+
|
|
258
|
+
colors[ componentIdx ] = color.r;
|
|
259
|
+
colors[ componentIdx + 1 ] = color.g;
|
|
260
|
+
colors[ componentIdx + 2 ] = color.b;
|
|
261
|
+
|
|
262
|
+
}
|
|
263
|
+
|
|
264
|
+
}
|
|
265
|
+
|
|
266
|
+
}
|
|
267
|
+
|
|
268
|
+
geometry.setAttribute( 'position', new BufferAttribute( vertices, 3 ) );
|
|
269
|
+
geometry.setAttribute( 'normal', new BufferAttribute( normals, 3 ) );
|
|
270
|
+
|
|
271
|
+
if ( hasColors ) {
|
|
272
|
+
|
|
273
|
+
geometry.setAttribute( 'color', new BufferAttribute( colors, 3 ) );
|
|
274
|
+
geometry.hasColors = true;
|
|
275
|
+
geometry.alpha = alpha;
|
|
276
|
+
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
return geometry;
|
|
280
|
+
|
|
281
|
+
}
|
|
282
|
+
|
|
283
|
+
function parseASCII( data ) {
|
|
284
|
+
|
|
285
|
+
const geometry = new BufferGeometry();
|
|
286
|
+
const patternSolid = /solid([\s\S]*?)endsolid/g;
|
|
287
|
+
const patternFace = /facet([\s\S]*?)endfacet/g;
|
|
288
|
+
const patternName = /solid\s(.+)/;
|
|
289
|
+
let faceCounter = 0;
|
|
290
|
+
|
|
291
|
+
const patternFloat = /[\s]+([+-]?(?:\d*)(?:\.\d*)?(?:[eE][+-]?\d+)?)/.source;
|
|
292
|
+
const patternVertex = new RegExp( 'vertex' + patternFloat + patternFloat + patternFloat, 'g' );
|
|
293
|
+
const patternNormal = new RegExp( 'normal' + patternFloat + patternFloat + patternFloat, 'g' );
|
|
294
|
+
|
|
295
|
+
const vertices = [];
|
|
296
|
+
const normals = [];
|
|
297
|
+
const groupNames = [];
|
|
298
|
+
|
|
299
|
+
const normal = new Vector3();
|
|
300
|
+
|
|
301
|
+
let result;
|
|
302
|
+
|
|
303
|
+
let groupCount = 0;
|
|
304
|
+
let startVertex = 0;
|
|
305
|
+
let endVertex = 0;
|
|
306
|
+
|
|
307
|
+
while ( ( result = patternSolid.exec( data ) ) !== null ) {
|
|
308
|
+
|
|
309
|
+
startVertex = endVertex;
|
|
310
|
+
|
|
311
|
+
const solid = result[ 0 ];
|
|
312
|
+
|
|
313
|
+
const name = ( result = patternName.exec( solid ) ) !== null ? result[ 1 ] : '';
|
|
314
|
+
groupNames.push( name );
|
|
315
|
+
|
|
316
|
+
while ( ( result = patternFace.exec( solid ) ) !== null ) {
|
|
317
|
+
|
|
318
|
+
let vertexCountPerFace = 0;
|
|
319
|
+
let normalCountPerFace = 0;
|
|
320
|
+
|
|
321
|
+
const text = result[ 0 ];
|
|
322
|
+
|
|
323
|
+
while ( ( result = patternNormal.exec( text ) ) !== null ) {
|
|
324
|
+
|
|
325
|
+
normal.x = parseFloat( result[ 1 ] );
|
|
326
|
+
normal.y = parseFloat( result[ 2 ] );
|
|
327
|
+
normal.z = parseFloat( result[ 3 ] );
|
|
328
|
+
normalCountPerFace ++;
|
|
329
|
+
|
|
330
|
+
}
|
|
331
|
+
|
|
332
|
+
while ( ( result = patternVertex.exec( text ) ) !== null ) {
|
|
333
|
+
|
|
334
|
+
vertices.push( parseFloat( result[ 1 ] ), parseFloat( result[ 2 ] ), parseFloat( result[ 3 ] ) );
|
|
335
|
+
normals.push( normal.x, normal.y, normal.z );
|
|
336
|
+
vertexCountPerFace ++;
|
|
337
|
+
endVertex ++;
|
|
338
|
+
|
|
339
|
+
}
|
|
340
|
+
|
|
341
|
+
// every face have to own ONE valid normal
|
|
342
|
+
|
|
343
|
+
if ( normalCountPerFace !== 1 ) {
|
|
344
|
+
|
|
345
|
+
console.error( 'THREE.STLLoader: Something isn\'t right with the normal of face number ' + faceCounter );
|
|
346
|
+
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
// each face have to own THREE valid vertices
|
|
350
|
+
|
|
351
|
+
if ( vertexCountPerFace !== 3 ) {
|
|
352
|
+
|
|
353
|
+
console.error( 'THREE.STLLoader: Something isn\'t right with the vertices of face number ' + faceCounter );
|
|
354
|
+
|
|
355
|
+
}
|
|
356
|
+
|
|
357
|
+
faceCounter ++;
|
|
358
|
+
|
|
359
|
+
}
|
|
360
|
+
|
|
361
|
+
const start = startVertex;
|
|
362
|
+
const count = endVertex - startVertex;
|
|
363
|
+
|
|
364
|
+
geometry.userData.groupNames = groupNames;
|
|
365
|
+
|
|
366
|
+
geometry.addGroup( start, count, groupCount );
|
|
367
|
+
groupCount ++;
|
|
368
|
+
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
geometry.setAttribute( 'position', new Float32BufferAttribute( vertices, 3 ) );
|
|
372
|
+
geometry.setAttribute( 'normal', new Float32BufferAttribute( normals, 3 ) );
|
|
373
|
+
|
|
374
|
+
return geometry;
|
|
375
|
+
|
|
376
|
+
}
|
|
377
|
+
|
|
378
|
+
function ensureString( buffer ) {
|
|
379
|
+
|
|
380
|
+
if ( typeof buffer !== 'string' ) {
|
|
381
|
+
|
|
382
|
+
return new TextDecoder().decode( buffer );
|
|
383
|
+
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
return buffer;
|
|
387
|
+
|
|
388
|
+
}
|
|
389
|
+
|
|
390
|
+
function ensureBinary( buffer ) {
|
|
391
|
+
|
|
392
|
+
if ( typeof buffer === 'string' ) {
|
|
393
|
+
|
|
394
|
+
const array_buffer = new Uint8Array( buffer.length );
|
|
395
|
+
for ( let i = 0; i < buffer.length; i ++ ) {
|
|
396
|
+
|
|
397
|
+
array_buffer[ i ] = buffer.charCodeAt( i ) & 0xff; // implicitly assumes little-endian
|
|
398
|
+
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
return array_buffer.buffer || array_buffer;
|
|
402
|
+
|
|
403
|
+
} else {
|
|
404
|
+
|
|
405
|
+
return buffer;
|
|
406
|
+
|
|
407
|
+
}
|
|
408
|
+
|
|
409
|
+
}
|
|
410
|
+
|
|
411
|
+
// start
|
|
412
|
+
|
|
413
|
+
const binData = ensureBinary( data );
|
|
414
|
+
|
|
415
|
+
return isBinary( binData ) ? parseBinary( binData ) : parseASCII( ensureString( data ) );
|
|
416
|
+
|
|
417
|
+
}
|
|
418
|
+
|
|
419
|
+
}
|
|
420
|
+
|
|
421
|
+
export { STLLoader };
|