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,260 @@
1
+ import {
2
+ FileLoader,
3
+ Loader,
4
+ ShapePath
5
+ } from 'three';
6
+
7
+ /**
8
+ * A loader for loading fonts.
9
+ *
10
+ * You can convert fonts online using [facetype.js](https://gero3.github.io/facetype.js/).
11
+ *
12
+ * ```js
13
+ * const loader = new FontLoader();
14
+ * const font = await loader.loadAsync( 'fonts/helvetiker_regular.typeface.json' );
15
+ * ```
16
+ *
17
+ * @augments Loader
18
+ * @three_import import { FontLoader } from 'three/addons/loaders/FontLoader.js';
19
+ */
20
+ class FontLoader extends Loader {
21
+
22
+ /**
23
+ * Constructs a new font loader.
24
+ *
25
+ * @param {LoadingManager} [manager] - The loading manager.
26
+ */
27
+ constructor( manager ) {
28
+
29
+ super( manager );
30
+
31
+ }
32
+
33
+ /**
34
+ * Starts loading from the given URL and passes the loaded font
35
+ * to the `onLoad()` callback.
36
+ *
37
+ * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
38
+ * @param {function(Font)} onLoad - Executed when the loading process has been finished.
39
+ * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
40
+ * @param {onErrorCallback} onError - Executed when errors occur.
41
+ */
42
+ load( url, onLoad, onProgress, onError ) {
43
+
44
+ const scope = this;
45
+
46
+ const loader = new FileLoader( this.manager );
47
+ loader.setPath( this.path );
48
+ loader.setRequestHeader( this.requestHeader );
49
+ loader.setWithCredentials( this.withCredentials );
50
+ loader.load( url, function ( text ) {
51
+
52
+ const font = scope.parse( JSON.parse( text ) );
53
+
54
+ if ( onLoad ) onLoad( font );
55
+
56
+ }, onProgress, onError );
57
+
58
+ }
59
+
60
+ /**
61
+ * Parses the given font data and returns the resulting font.
62
+ *
63
+ * @param {Object} json - The raw font data as a JSON object.
64
+ * @return {Font} The font.
65
+ */
66
+ parse( json ) {
67
+
68
+ return new Font( json );
69
+
70
+ }
71
+
72
+ }
73
+
74
+ /**
75
+ * Class representing a font.
76
+ */
77
+ class Font {
78
+
79
+ /**
80
+ * Constructs a new font.
81
+ *
82
+ * @param {Object} data - The font data as JSON.
83
+ */
84
+ constructor( data ) {
85
+
86
+ /**
87
+ * This flag can be used for type testing.
88
+ *
89
+ * @type {boolean}
90
+ * @readonly
91
+ * @default true
92
+ */
93
+ this.isFont = true;
94
+
95
+ this.type = 'Font';
96
+
97
+ /**
98
+ * The font data as JSON.
99
+ *
100
+ * @type {Object}
101
+ */
102
+ this.data = data;
103
+
104
+ }
105
+
106
+ /**
107
+ * Generates geometry shapes from the given text and size. The result of this method
108
+ * should be used with {@link ShapeGeometry} to generate the actual geometry data.
109
+ *
110
+ * @param {string} text - The text.
111
+ * @param {number} [size=100] - The text size.
112
+ * @param {string} [direction='ltr'] - Char direction: ltr(left to right), rtl(right to left) & tb(top bottom).
113
+ * @return {Array<Shape>} An array of shapes representing the text.
114
+ */
115
+ generateShapes( text, size = 100, direction = 'ltr' ) {
116
+
117
+ const shapes = [];
118
+ const paths = createPaths( text, size, this.data, direction );
119
+
120
+ for ( let p = 0, pl = paths.length; p < pl; p ++ ) {
121
+
122
+ shapes.push( ...paths[ p ].toShapes() );
123
+
124
+ }
125
+
126
+ return shapes;
127
+
128
+ }
129
+
130
+ }
131
+
132
+ function createPaths( text, size, data, direction ) {
133
+
134
+ const chars = Array.from( text );
135
+ const scale = size / data.resolution;
136
+ const line_height = ( data.boundingBox.yMax - data.boundingBox.yMin + data.underlineThickness ) * scale;
137
+
138
+ const paths = [];
139
+
140
+ let offsetX = 0, offsetY = 0;
141
+
142
+ if ( direction == 'rtl' || direction == 'tb' ) {
143
+
144
+ chars.reverse();
145
+
146
+ }
147
+
148
+ for ( let i = 0; i < chars.length; i ++ ) {
149
+
150
+ const char = chars[ i ];
151
+
152
+ if ( char === '\n' ) {
153
+
154
+ offsetX = 0;
155
+ offsetY -= line_height;
156
+
157
+ } else {
158
+
159
+ const ret = createPath( char, scale, offsetX, offsetY, data );
160
+
161
+ if ( direction == 'tb' ) {
162
+
163
+ offsetX = 0;
164
+ offsetY += data.ascender * scale;
165
+
166
+ } else {
167
+
168
+ offsetX += ret.offsetX;
169
+
170
+ }
171
+
172
+ paths.push( ret.path );
173
+
174
+ }
175
+
176
+ }
177
+
178
+ return paths;
179
+
180
+ }
181
+
182
+ function createPath( char, scale, offsetX, offsetY, data ) {
183
+
184
+ const glyph = data.glyphs[ char ] || data.glyphs[ '?' ];
185
+
186
+ if ( ! glyph ) {
187
+
188
+ console.error( 'THREE.Font: character "' + char + '" does not exists in font family ' + data.familyName + '.' );
189
+
190
+ return;
191
+
192
+ }
193
+
194
+ const path = new ShapePath();
195
+
196
+ let x, y, cpx, cpy, cpx1, cpy1, cpx2, cpy2;
197
+
198
+ if ( glyph.o ) {
199
+
200
+ const outline = glyph._cachedOutline || ( glyph._cachedOutline = glyph.o.split( ' ' ) );
201
+
202
+ for ( let i = 0, l = outline.length; i < l; ) {
203
+
204
+ const action = outline[ i ++ ];
205
+
206
+ switch ( action ) {
207
+
208
+ case 'm': // moveTo
209
+
210
+ x = outline[ i ++ ] * scale + offsetX;
211
+ y = outline[ i ++ ] * scale + offsetY;
212
+
213
+ path.moveTo( x, y );
214
+
215
+ break;
216
+
217
+ case 'l': // lineTo
218
+
219
+ x = outline[ i ++ ] * scale + offsetX;
220
+ y = outline[ i ++ ] * scale + offsetY;
221
+
222
+ path.lineTo( x, y );
223
+
224
+ break;
225
+
226
+ case 'q': // quadraticCurveTo
227
+
228
+ cpx = outline[ i ++ ] * scale + offsetX;
229
+ cpy = outline[ i ++ ] * scale + offsetY;
230
+ cpx1 = outline[ i ++ ] * scale + offsetX;
231
+ cpy1 = outline[ i ++ ] * scale + offsetY;
232
+
233
+ path.quadraticCurveTo( cpx1, cpy1, cpx, cpy );
234
+
235
+ break;
236
+
237
+ case 'b': // bezierCurveTo
238
+
239
+ cpx = outline[ i ++ ] * scale + offsetX;
240
+ cpy = outline[ i ++ ] * scale + offsetY;
241
+ cpx1 = outline[ i ++ ] * scale + offsetX;
242
+ cpy1 = outline[ i ++ ] * scale + offsetY;
243
+ cpx2 = outline[ i ++ ] * scale + offsetX;
244
+ cpy2 = outline[ i ++ ] * scale + offsetY;
245
+
246
+ path.bezierCurveTo( cpx1, cpy1, cpx2, cpy2, cpx, cpy );
247
+
248
+ break;
249
+
250
+ }
251
+
252
+ }
253
+
254
+ }
255
+
256
+ return { offsetX: glyph.ha * scale, path: path };
257
+
258
+ }
259
+
260
+ export { FontLoader, Font };
@@ -0,0 +1,318 @@
1
+ import {
2
+ BufferGeometry,
3
+ FileLoader,
4
+ Float32BufferAttribute,
5
+ Group,
6
+ LineBasicMaterial,
7
+ LineSegments,
8
+ Loader
9
+ } from 'three';
10
+
11
+ /**
12
+ * A loader for the GCode format.
13
+ *
14
+ * GCode files are usually used for 3D printing or CNC applications.
15
+ *
16
+ * ```js
17
+ * const loader = new GCodeLoader();
18
+ * const object = await loader.loadAsync( 'models/gcode/benchy.gcode' );
19
+ * scene.add( object );
20
+ * ```
21
+ *
22
+ * @augments Loader
23
+ * @three_import import { GCodeLoader } from 'three/addons/loaders/GCodeLoader.js';
24
+ */
25
+ class GCodeLoader extends Loader {
26
+
27
+ /**
28
+ * Constructs a new GCode loader.
29
+ *
30
+ * @param {LoadingManager} [manager] - The loading manager.
31
+ */
32
+ constructor( manager ) {
33
+
34
+ super( manager );
35
+
36
+ /**
37
+ * Whether to split layers or not.
38
+ *
39
+ * @type {boolean}
40
+ * @default false
41
+ */
42
+ this.splitLayer = false;
43
+
44
+ }
45
+
46
+ /**
47
+ * Starts loading from the given URL and passes the loaded GCode asset
48
+ * to the `onLoad()` callback.
49
+ *
50
+ * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
51
+ * @param {function(Group)} onLoad - Executed when the loading process has been finished.
52
+ * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
53
+ * @param {onErrorCallback} onError - Executed when errors occur.
54
+ */
55
+ load( url, onLoad, onProgress, onError ) {
56
+
57
+ const scope = this;
58
+
59
+ const loader = new FileLoader( scope.manager );
60
+ loader.setPath( scope.path );
61
+ loader.setRequestHeader( scope.requestHeader );
62
+ loader.setWithCredentials( scope.withCredentials );
63
+ loader.load( url, function ( text ) {
64
+
65
+ try {
66
+
67
+ onLoad( scope.parse( text ) );
68
+
69
+ } catch ( e ) {
70
+
71
+ if ( onError ) {
72
+
73
+ onError( e );
74
+
75
+ } else {
76
+
77
+ console.error( e );
78
+
79
+ }
80
+
81
+ scope.manager.itemError( url );
82
+
83
+ }
84
+
85
+ }, onProgress, onError );
86
+
87
+ }
88
+
89
+ /**
90
+ * Parses the given GCode data and returns a group with lines.
91
+ *
92
+ * @param {string} data - The raw Gcode data as a string.
93
+ * @return {Group} The parsed GCode asset.
94
+ */
95
+ parse( data ) {
96
+
97
+ let state = { x: 0, y: 0, z: 0, e: 0, f: 0, extruding: false, relative: false, extrusionOverride: false, extrusionRelative: false };
98
+ const layers = [];
99
+
100
+ let currentLayer = undefined;
101
+
102
+ const pathMaterial = new LineBasicMaterial( { color: 0xFF0000 } );
103
+ pathMaterial.name = 'path';
104
+
105
+ const extrudingMaterial = new LineBasicMaterial( { color: 0x00FF00 } );
106
+ extrudingMaterial.name = 'extruded';
107
+
108
+ function newLayer( line ) {
109
+
110
+ currentLayer = { vertex: [], pathVertex: [], z: line.z };
111
+ layers.push( currentLayer );
112
+
113
+ }
114
+
115
+ //Create lie segment between p1 and p2
116
+ function addSegment( p1, p2 ) {
117
+
118
+ if ( currentLayer === undefined ) {
119
+
120
+ newLayer( p1 );
121
+
122
+ }
123
+
124
+ if ( state.extruding ) {
125
+
126
+ currentLayer.vertex.push( p1.x, p1.y, p1.z );
127
+ currentLayer.vertex.push( p2.x, p2.y, p2.z );
128
+
129
+ } else {
130
+
131
+ currentLayer.pathVertex.push( p1.x, p1.y, p1.z );
132
+ currentLayer.pathVertex.push( p2.x, p2.y, p2.z );
133
+
134
+ }
135
+
136
+ }
137
+
138
+ function delta( v1, v2 ) {
139
+
140
+ return state.relative ? v2 : v2 - v1;
141
+
142
+ }
143
+
144
+ function absolute( v1, v2 ) {
145
+
146
+ return state.relative ? v1 + v2 : v2;
147
+
148
+ }
149
+
150
+ function absoluteExtrusion( v1, v2 ) {
151
+
152
+ const relative = state.extrusionOverride ? state.extrusionRelative : state.relative;
153
+
154
+ return relative ? v1 + v2 : v2;
155
+
156
+ }
157
+
158
+ const lines = data.replace( /;.+/g, '' ).split( '\n' );
159
+
160
+ for ( let i = 0; i < lines.length; i ++ ) {
161
+
162
+ const tokens = lines[ i ].split( ' ' );
163
+ const cmd = tokens[ 0 ].toUpperCase();
164
+
165
+ //Arguments
166
+ const args = {};
167
+ tokens.splice( 1 ).forEach( function ( token ) {
168
+
169
+ if ( token[ 0 ] !== undefined ) {
170
+
171
+ const key = token[ 0 ].toLowerCase();
172
+ const value = parseFloat( token.substring( 1 ) );
173
+ args[ key ] = value;
174
+
175
+ }
176
+
177
+ } );
178
+
179
+ //Process commands
180
+ //G0/G1 – Linear Movement
181
+ if ( cmd === 'G0' || cmd === 'G1' ) {
182
+
183
+ const line = Object.assign( {}, state ); // clone state
184
+
185
+ if ( args.x !== undefined ) line.x = absolute( state.x, args.x );
186
+ if ( args.y !== undefined ) line.y = absolute( state.y, args.y );
187
+ if ( args.z !== undefined ) line.z = absolute( state.z, args.z );
188
+ if ( args.e !== undefined ) line.e = absoluteExtrusion( state.e, args.e );
189
+ if ( args.f !== undefined ) line.f = absolute( state.f, args.f );
190
+
191
+ //Layer change detection is or made by watching Z, it's made by watching when we extrude at a new Z position
192
+ if ( delta( state.e, line.e ) > 0 ) {
193
+
194
+ state.extruding = delta( state.e, line.e ) > 0;
195
+
196
+ if ( currentLayer == undefined || line.z != currentLayer.z ) {
197
+
198
+ newLayer( line );
199
+
200
+ }
201
+
202
+ }
203
+
204
+ addSegment( state, line );
205
+ state = line;
206
+
207
+ } else if ( cmd === 'G2' || cmd === 'G3' ) {
208
+
209
+ //G2/G3 - Arc Movement ( G2 clock wise and G3 counter clock wise )
210
+ //console.warn( 'THREE.GCodeLoader: Arc command not supported' );
211
+
212
+ } else if ( cmd === 'G90' ) {
213
+
214
+ //G90: Set to Absolute Positioning
215
+ state.relative = false;
216
+
217
+ // reset M82/M83 extrusion override
218
+ state.extrusionOverride = false;
219
+
220
+ } else if ( cmd === 'G91' ) {
221
+
222
+ //G91: Set to state.relative Positioning
223
+ state.relative = true;
224
+
225
+ // reset M82/M83 extrusion override
226
+ state.extrusionOverride = false;
227
+
228
+ } else if ( cmd === 'M82' ) {
229
+
230
+ //M82: Override G91 and put the E axis into absolute mode independent of the other axes
231
+ state.extrusionOverride = true;
232
+ state.extrusionRelative = false;
233
+
234
+ } else if ( cmd === 'M83' ) {
235
+
236
+ //M83: Overrides G90 and put the E axis into relative mode independent of the other axes
237
+ state.extrusionOverride = true;
238
+ state.extrusionRelative = true;
239
+
240
+ } else if ( cmd === 'G92' ) {
241
+
242
+ //G92: Set Position
243
+ const line = state;
244
+ line.x = args.x !== undefined ? args.x : line.x;
245
+ line.y = args.y !== undefined ? args.y : line.y;
246
+ line.z = args.z !== undefined ? args.z : line.z;
247
+ line.e = args.e !== undefined ? args.e : line.e;
248
+
249
+ } else {
250
+
251
+ //console.warn( 'THREE.GCodeLoader: Command not supported:' + cmd );
252
+
253
+ }
254
+
255
+ }
256
+
257
+ function addObject( vertex, extruding, i ) {
258
+
259
+ const geometry = new BufferGeometry();
260
+ geometry.setAttribute( 'position', new Float32BufferAttribute( vertex, 3 ) );
261
+ const segments = new LineSegments( geometry, extruding ? extrudingMaterial : pathMaterial );
262
+ segments.name = 'layer' + i;
263
+ object.add( segments );
264
+
265
+ }
266
+
267
+ const object = new Group();
268
+ object.name = 'gcode';
269
+
270
+ if ( this.splitLayer ) {
271
+
272
+ for ( let i = 0; i < layers.length; i ++ ) {
273
+
274
+ const layer = layers[ i ];
275
+ addObject( layer.vertex, true, i );
276
+ addObject( layer.pathVertex, false, i );
277
+
278
+ }
279
+
280
+ } else {
281
+
282
+ const vertex = [],
283
+ pathVertex = [];
284
+
285
+ for ( let i = 0; i < layers.length; i ++ ) {
286
+
287
+ const layer = layers[ i ];
288
+ const layerVertex = layer.vertex;
289
+ const layerPathVertex = layer.pathVertex;
290
+
291
+ for ( let j = 0; j < layerVertex.length; j ++ ) {
292
+
293
+ vertex.push( layerVertex[ j ] );
294
+
295
+ }
296
+
297
+ for ( let j = 0; j < layerPathVertex.length; j ++ ) {
298
+
299
+ pathVertex.push( layerPathVertex[ j ] );
300
+
301
+ }
302
+
303
+ }
304
+
305
+ addObject( vertex, true, layers.length );
306
+ addObject( pathVertex, false, layers.length );
307
+
308
+ }
309
+
310
+ object.rotation.set( - Math.PI / 2, 0, 0 );
311
+
312
+ return object;
313
+
314
+ }
315
+
316
+ }
317
+
318
+ export { GCodeLoader };