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,593 @@
1
+ import {
2
+ Color,
3
+ ColorManagement,
4
+ DefaultLoadingManager,
5
+ FileLoader,
6
+ FrontSide,
7
+ Loader,
8
+ LoaderUtils,
9
+ MeshPhongMaterial,
10
+ RepeatWrapping,
11
+ TextureLoader,
12
+ Vector2,
13
+ SRGBColorSpace
14
+ } from 'three';
15
+
16
+ /**
17
+ * A loader for the MTL format.
18
+ *
19
+ * The Material Template Library format (MTL) or .MTL File Format is a companion file format
20
+ * to OBJ that describes surface shading (material) properties of objects within one or more
21
+ * OBJ files.
22
+ *
23
+ * ```js
24
+ * const loader = new MTLLoader();
25
+ * const materials = await loader.loadAsync( 'models/obj/male02/male02.mtl' );
26
+ *
27
+ * const objLoader = new OBJLoader();
28
+ * objLoader.setMaterials( materials );
29
+ * ```
30
+ *
31
+ * @augments Loader
32
+ * @three_import import { MTLLoader } from 'three/addons/loaders/MTLLoader.js';
33
+ */
34
+ class MTLLoader extends Loader {
35
+
36
+ constructor( manager ) {
37
+
38
+ super( manager );
39
+
40
+ }
41
+
42
+ /**
43
+ * Starts loading from the given URL and passes the loaded MTL asset
44
+ * to the `onLoad()` callback.
45
+ *
46
+ * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
47
+ * @param {function(MaterialCreator)} onLoad - Executed when the loading process has been finished.
48
+ * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
49
+ * @param {onErrorCallback} onError - Executed when errors occur.
50
+ */
51
+ load( url, onLoad, onProgress, onError ) {
52
+
53
+ const scope = this;
54
+
55
+ const path = ( this.path === '' ) ? LoaderUtils.extractUrlBase( url ) : this.path;
56
+
57
+ const loader = new FileLoader( this.manager );
58
+ loader.setPath( this.path );
59
+ loader.setRequestHeader( this.requestHeader );
60
+ loader.setWithCredentials( this.withCredentials );
61
+ loader.load( url, function ( text ) {
62
+
63
+ try {
64
+
65
+ onLoad( scope.parse( text, path ) );
66
+
67
+ } catch ( e ) {
68
+
69
+ if ( onError ) {
70
+
71
+ onError( e );
72
+
73
+ } else {
74
+
75
+ console.error( e );
76
+
77
+ }
78
+
79
+ scope.manager.itemError( url );
80
+
81
+ }
82
+
83
+ }, onProgress, onError );
84
+
85
+ }
86
+
87
+ /**
88
+ * Sets the material options.
89
+ *
90
+ * @param {MTLLoader~MaterialOptions} value - The material options.
91
+ * @return {MTLLoader} A reference to this loader.
92
+ */
93
+ setMaterialOptions( value ) {
94
+
95
+ this.materialOptions = value;
96
+ return this;
97
+
98
+ }
99
+
100
+ /**
101
+ * Parses the given MTL data and returns the resulting material creator.
102
+ *
103
+ * @param {string} text - The raw MTL data as a string.
104
+ * @param {string} path - The URL base path.
105
+ * @return {MaterialCreator} The material creator.
106
+ */
107
+ parse( text, path ) {
108
+
109
+ const lines = text.split( '\n' );
110
+ let info = {};
111
+ const delimiter_pattern = /\s+/;
112
+ const materialsInfo = {};
113
+
114
+ for ( let i = 0; i < lines.length; i ++ ) {
115
+
116
+ let line = lines[ i ];
117
+ line = line.trim();
118
+
119
+ if ( line.length === 0 || line.charAt( 0 ) === '#' ) {
120
+
121
+ // Blank line or comment ignore
122
+ continue;
123
+
124
+ }
125
+
126
+ const pos = line.indexOf( ' ' );
127
+
128
+ let key = ( pos >= 0 ) ? line.substring( 0, pos ) : line;
129
+ key = key.toLowerCase();
130
+
131
+ let value = ( pos >= 0 ) ? line.substring( pos + 1 ) : '';
132
+ value = value.trim();
133
+
134
+ if ( key === 'newmtl' ) {
135
+
136
+ // New material
137
+
138
+ info = { name: value };
139
+ materialsInfo[ value ] = info;
140
+
141
+ } else {
142
+
143
+ if ( key === 'ka' || key === 'kd' || key === 'ks' || key === 'ke' ) {
144
+
145
+ const ss = value.split( delimiter_pattern, 3 );
146
+ info[ key ] = [ parseFloat( ss[ 0 ] ), parseFloat( ss[ 1 ] ), parseFloat( ss[ 2 ] ) ];
147
+
148
+ } else {
149
+
150
+ info[ key ] = value;
151
+
152
+ }
153
+
154
+ }
155
+
156
+ }
157
+
158
+ const materialCreator = new MaterialCreator( this.resourcePath || path, this.materialOptions );
159
+ materialCreator.setCrossOrigin( this.crossOrigin );
160
+ materialCreator.setManager( this.manager );
161
+ materialCreator.setMaterials( materialsInfo );
162
+ return materialCreator;
163
+
164
+ }
165
+
166
+ }
167
+
168
+ /**
169
+ * Material options of `MTLLoader`.
170
+ *
171
+ * @typedef {Object} MTLLoader~MaterialOptions
172
+ * @property {(FrontSide|BackSide|DoubleSide)} [side=FrontSide] - Which side to apply the material.
173
+ * @property {(RepeatWrapping|ClampToEdgeWrapping|MirroredRepeatWrapping)} [wrap=RepeatWrapping] - What type of wrapping to apply for textures.
174
+ * @property {boolean} [normalizeRGB=false] - Whether RGB colors should be normalized to `0-1` from `0-255`.
175
+ * @property {boolean} [ignoreZeroRGBs=false] - Ignore values of RGBs (Ka,Kd,Ks) that are all 0's.
176
+ */
177
+
178
+ class MaterialCreator {
179
+
180
+ constructor( baseUrl = '', options = {} ) {
181
+
182
+ this.baseUrl = baseUrl;
183
+ this.options = options;
184
+ this.materialsInfo = {};
185
+ this.materials = {};
186
+ this.materialsArray = [];
187
+ this.nameLookup = {};
188
+
189
+ this.crossOrigin = 'anonymous';
190
+
191
+ this.side = ( this.options.side !== undefined ) ? this.options.side : FrontSide;
192
+ this.wrap = ( this.options.wrap !== undefined ) ? this.options.wrap : RepeatWrapping;
193
+
194
+ }
195
+
196
+ setCrossOrigin( value ) {
197
+
198
+ this.crossOrigin = value;
199
+ return this;
200
+
201
+ }
202
+
203
+ setManager( value ) {
204
+
205
+ this.manager = value;
206
+
207
+ }
208
+
209
+ setMaterials( materialsInfo ) {
210
+
211
+ this.materialsInfo = this.convert( materialsInfo );
212
+ this.materials = {};
213
+ this.materialsArray = [];
214
+ this.nameLookup = {};
215
+
216
+ }
217
+
218
+ convert( materialsInfo ) {
219
+
220
+ if ( ! this.options ) return materialsInfo;
221
+
222
+ const converted = {};
223
+
224
+ for ( const mn in materialsInfo ) {
225
+
226
+ // Convert materials info into normalized form based on options
227
+
228
+ const mat = materialsInfo[ mn ];
229
+
230
+ const covmat = {};
231
+
232
+ converted[ mn ] = covmat;
233
+
234
+ for ( const prop in mat ) {
235
+
236
+ let save = true;
237
+ let value = mat[ prop ];
238
+ const lprop = prop.toLowerCase();
239
+
240
+ switch ( lprop ) {
241
+
242
+ case 'kd':
243
+ case 'ka':
244
+ case 'ks':
245
+
246
+ // Diffuse color (color under white light) using RGB values
247
+
248
+ if ( this.options && this.options.normalizeRGB ) {
249
+
250
+ value = [ value[ 0 ] / 255, value[ 1 ] / 255, value[ 2 ] / 255 ];
251
+
252
+ }
253
+
254
+ if ( this.options && this.options.ignoreZeroRGBs ) {
255
+
256
+ if ( value[ 0 ] === 0 && value[ 1 ] === 0 && value[ 2 ] === 0 ) {
257
+
258
+ // ignore
259
+
260
+ save = false;
261
+
262
+ }
263
+
264
+ }
265
+
266
+ break;
267
+
268
+ default:
269
+
270
+ break;
271
+
272
+ }
273
+
274
+ if ( save ) {
275
+
276
+ covmat[ lprop ] = value;
277
+
278
+ }
279
+
280
+ }
281
+
282
+ }
283
+
284
+ return converted;
285
+
286
+ }
287
+
288
+ preload() {
289
+
290
+ for ( const mn in this.materialsInfo ) {
291
+
292
+ this.create( mn );
293
+
294
+ }
295
+
296
+ }
297
+
298
+ getIndex( materialName ) {
299
+
300
+ return this.nameLookup[ materialName ];
301
+
302
+ }
303
+
304
+ getAsArray() {
305
+
306
+ let index = 0;
307
+
308
+ for ( const mn in this.materialsInfo ) {
309
+
310
+ this.materialsArray[ index ] = this.create( mn );
311
+ this.nameLookup[ mn ] = index;
312
+ index ++;
313
+
314
+ }
315
+
316
+ return this.materialsArray;
317
+
318
+ }
319
+
320
+ create( materialName ) {
321
+
322
+ if ( this.materials[ materialName ] === undefined ) {
323
+
324
+ this.createMaterial_( materialName );
325
+
326
+ }
327
+
328
+ return this.materials[ materialName ];
329
+
330
+ }
331
+
332
+ createMaterial_( materialName ) {
333
+
334
+ // Create material
335
+
336
+ const scope = this;
337
+ const mat = this.materialsInfo[ materialName ];
338
+ const params = {
339
+
340
+ name: materialName,
341
+ side: this.side
342
+
343
+ };
344
+
345
+ function resolveURL( baseUrl, url ) {
346
+
347
+ if ( typeof url !== 'string' || url === '' )
348
+ return '';
349
+
350
+ // Absolute URL
351
+ if ( /^https?:\/\//i.test( url ) ) return url;
352
+
353
+ return baseUrl + url;
354
+
355
+ }
356
+
357
+ function setMapForType( mapType, value ) {
358
+
359
+ if ( params[ mapType ] ) return; // Keep the first encountered texture
360
+
361
+ const texParams = scope.getTextureParams( value, params );
362
+ const map = scope.loadTexture( resolveURL( scope.baseUrl, texParams.url ) );
363
+
364
+ map.repeat.copy( texParams.scale );
365
+ map.offset.copy( texParams.offset );
366
+
367
+ map.wrapS = scope.wrap;
368
+ map.wrapT = scope.wrap;
369
+
370
+ if ( mapType === 'map' || mapType === 'emissiveMap' ) {
371
+
372
+ map.colorSpace = SRGBColorSpace;
373
+
374
+ }
375
+
376
+ params[ mapType ] = map;
377
+
378
+ }
379
+
380
+ for ( const prop in mat ) {
381
+
382
+ const value = mat[ prop ];
383
+ let n;
384
+
385
+ if ( value === '' ) continue;
386
+
387
+ switch ( prop.toLowerCase() ) {
388
+
389
+ // Ns is material specular exponent
390
+
391
+ case 'kd':
392
+
393
+ // Diffuse color (color under white light) using RGB values
394
+
395
+ params.color = ColorManagement.colorSpaceToWorking( new Color().fromArray( value ), SRGBColorSpace );
396
+
397
+ break;
398
+
399
+ case 'ks':
400
+
401
+ // Specular color (color when light is reflected from shiny surface) using RGB values
402
+ params.specular = ColorManagement.colorSpaceToWorking( new Color().fromArray( value ), SRGBColorSpace );
403
+
404
+ break;
405
+
406
+ case 'ke':
407
+
408
+ // Emissive using RGB values
409
+ params.emissive = ColorManagement.colorSpaceToWorking( new Color().fromArray( value ), SRGBColorSpace );
410
+
411
+ break;
412
+
413
+ case 'map_kd':
414
+
415
+ // Diffuse texture map
416
+
417
+ setMapForType( 'map', value );
418
+
419
+ break;
420
+
421
+ case 'map_ks':
422
+
423
+ // Specular map
424
+
425
+ setMapForType( 'specularMap', value );
426
+
427
+ break;
428
+
429
+ case 'map_ke':
430
+
431
+ // Emissive map
432
+
433
+ setMapForType( 'emissiveMap', value );
434
+
435
+ break;
436
+
437
+ case 'norm':
438
+
439
+ setMapForType( 'normalMap', value );
440
+
441
+ break;
442
+
443
+ case 'map_bump':
444
+ case 'bump':
445
+
446
+ // Bump texture map
447
+
448
+ setMapForType( 'bumpMap', value );
449
+
450
+ break;
451
+
452
+ case 'disp':
453
+
454
+ // Displacement texture map
455
+
456
+ setMapForType( 'displacementMap', value );
457
+
458
+ break;
459
+
460
+ case 'map_d':
461
+
462
+ // Alpha map
463
+
464
+ setMapForType( 'alphaMap', value );
465
+ params.transparent = true;
466
+
467
+ break;
468
+
469
+ case 'ns':
470
+
471
+ // The specular exponent (defines the focus of the specular highlight)
472
+ // A high exponent results in a tight, concentrated highlight. Ns values normally range from 0 to 1000.
473
+
474
+ params.shininess = parseFloat( value );
475
+
476
+ break;
477
+
478
+ case 'd':
479
+ n = parseFloat( value );
480
+
481
+ if ( n < 1 ) {
482
+
483
+ params.opacity = n;
484
+ params.transparent = true;
485
+
486
+ }
487
+
488
+ break;
489
+
490
+ case 'tr':
491
+ n = parseFloat( value );
492
+
493
+ if ( this.options && this.options.invertTrProperty ) n = 1 - n;
494
+
495
+ if ( n > 0 ) {
496
+
497
+ params.opacity = 1 - n;
498
+ params.transparent = true;
499
+
500
+ }
501
+
502
+ break;
503
+
504
+ default:
505
+ break;
506
+
507
+ }
508
+
509
+ }
510
+
511
+ this.materials[ materialName ] = new MeshPhongMaterial( params );
512
+ return this.materials[ materialName ];
513
+
514
+ }
515
+
516
+ getTextureParams( value, matParams ) {
517
+
518
+ const texParams = {
519
+
520
+ scale: new Vector2( 1, 1 ),
521
+ offset: new Vector2( 0, 0 )
522
+
523
+ };
524
+
525
+ const items = value.split( /\s+/ );
526
+ let pos;
527
+
528
+ pos = items.indexOf( '-bm' );
529
+
530
+ if ( pos >= 0 ) {
531
+
532
+ matParams.bumpScale = parseFloat( items[ pos + 1 ] );
533
+ items.splice( pos, 2 );
534
+
535
+ }
536
+
537
+ pos = items.indexOf( '-mm' );
538
+
539
+ if ( pos >= 0 ) {
540
+
541
+ matParams.displacementBias = parseFloat( items[ pos + 1 ] );
542
+ matParams.displacementScale = parseFloat( items[ pos + 2 ] );
543
+ items.splice( pos, 3 );
544
+
545
+ }
546
+
547
+ pos = items.indexOf( '-s' );
548
+
549
+ if ( pos >= 0 ) {
550
+
551
+ texParams.scale.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) );
552
+ items.splice( pos, 4 ); // we expect 3 parameters here!
553
+
554
+ }
555
+
556
+ pos = items.indexOf( '-o' );
557
+
558
+ if ( pos >= 0 ) {
559
+
560
+ texParams.offset.set( parseFloat( items[ pos + 1 ] ), parseFloat( items[ pos + 2 ] ) );
561
+ items.splice( pos, 4 ); // we expect 3 parameters here!
562
+
563
+ }
564
+
565
+ texParams.url = items.join( ' ' ).trim();
566
+ return texParams;
567
+
568
+ }
569
+
570
+ loadTexture( url, mapping, onLoad, onProgress, onError ) {
571
+
572
+ const manager = ( this.manager !== undefined ) ? this.manager : DefaultLoadingManager;
573
+ let loader = manager.getHandler( url );
574
+
575
+ if ( loader === null ) {
576
+
577
+ loader = new TextureLoader( manager );
578
+
579
+ }
580
+
581
+ if ( loader.setCrossOrigin ) loader.setCrossOrigin( this.crossOrigin );
582
+
583
+ const texture = loader.load( url, onLoad, onProgress, onError );
584
+
585
+ if ( mapping !== undefined ) texture.mapping = mapping;
586
+
587
+ return texture;
588
+
589
+ }
590
+
591
+ }
592
+
593
+ export { MTLLoader };