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,379 @@
1
+ import {
2
+ DataTexture,
3
+ FileLoader,
4
+ FloatType,
5
+ RedFormat,
6
+ MathUtils,
7
+ Loader,
8
+ UnsignedByteType,
9
+ LinearFilter,
10
+ HalfFloatType,
11
+ DataUtils
12
+ } from 'three';
13
+
14
+ /**
15
+ * A loader for the IES format.
16
+ *
17
+ * The loaded texture should be assigned to {@link IESSpotLight#map}.
18
+ *
19
+ * ```js
20
+ * const loader = new IESLoader();
21
+ * const texture = await loader.loadAsync( 'ies/007cfb11e343e2f42e3b476be4ab684e.ies' );
22
+ *
23
+ * const spotLight = new THREE.IESSpotLight( 0xff0000, 500 );
24
+ * spotLight.iesMap = texture;
25
+ * ```
26
+ *
27
+ * @augments Loader
28
+ * @three_import import { IESLoader } from 'three/addons/loaders/IESLoader.js';
29
+ */
30
+ class IESLoader extends Loader {
31
+
32
+ /**
33
+ * Constructs a new IES loader.
34
+ *
35
+ * @param {LoadingManager} [manager] - The loading manager.
36
+ */
37
+ constructor( manager ) {
38
+
39
+ super( manager );
40
+
41
+ /**
42
+ * The texture type.
43
+ *
44
+ * @type {(HalfFloatType|FloatType)}
45
+ * @default HalfFloatType
46
+ */
47
+ this.type = HalfFloatType;
48
+
49
+ }
50
+
51
+ _getIESValues( iesLamp, type ) {
52
+
53
+ const width = 360;
54
+ const height = 180;
55
+ const size = width * height;
56
+
57
+ const data = new Array( size );
58
+
59
+ function interpolateCandelaValues( phi, theta ) {
60
+
61
+ let phiIndex = 0, thetaIndex = 0;
62
+ let startTheta = 0, endTheta = 0, startPhi = 0, endPhi = 0;
63
+
64
+ for ( let i = 0; i < iesLamp.numHorAngles - 1; ++ i ) { // numHorAngles = horAngles.length-1 because of extra padding, so this wont cause an out of bounds error
65
+
66
+ if ( theta < iesLamp.horAngles[ i + 1 ] || i == iesLamp.numHorAngles - 2 ) {
67
+
68
+ thetaIndex = i;
69
+ startTheta = iesLamp.horAngles[ i ];
70
+ endTheta = iesLamp.horAngles[ i + 1 ];
71
+
72
+ break;
73
+
74
+ }
75
+
76
+ }
77
+
78
+ for ( let i = 0; i < iesLamp.numVerAngles - 1; ++ i ) {
79
+
80
+ if ( phi < iesLamp.verAngles[ i + 1 ] || i == iesLamp.numVerAngles - 2 ) {
81
+
82
+ phiIndex = i;
83
+ startPhi = iesLamp.verAngles[ i ];
84
+ endPhi = iesLamp.verAngles[ i + 1 ];
85
+
86
+ break;
87
+
88
+ }
89
+
90
+ }
91
+
92
+ const deltaTheta = endTheta - startTheta;
93
+ const deltaPhi = endPhi - startPhi;
94
+
95
+ if ( deltaPhi === 0 ) // Outside range
96
+ return 0;
97
+
98
+ const t1 = deltaTheta === 0 ? 0 : ( theta - startTheta ) / deltaTheta;
99
+ const t2 = ( phi - startPhi ) / deltaPhi;
100
+
101
+ const nextThetaIndex = deltaTheta === 0 ? thetaIndex : thetaIndex + 1;
102
+
103
+ const v1 = MathUtils.lerp( iesLamp.candelaValues[ thetaIndex ][ phiIndex ], iesLamp.candelaValues[ nextThetaIndex ][ phiIndex ], t1 );
104
+ const v2 = MathUtils.lerp( iesLamp.candelaValues[ thetaIndex ][ phiIndex + 1 ], iesLamp.candelaValues[ nextThetaIndex ][ phiIndex + 1 ], t1 );
105
+ const v = MathUtils.lerp( v1, v2, t2 );
106
+
107
+ return v;
108
+
109
+ }
110
+
111
+ const startTheta = iesLamp.horAngles[ 0 ], endTheta = iesLamp.horAngles[ iesLamp.numHorAngles - 1 ];
112
+
113
+ for ( let i = 0; i < size; ++ i ) {
114
+
115
+ let theta = i % width;
116
+ const phi = Math.floor( i / width );
117
+
118
+ if ( endTheta - startTheta !== 0 && ( theta < startTheta || theta >= endTheta ) ) { // Handle symmetry for hor angles
119
+
120
+ theta %= endTheta * 2;
121
+
122
+ if ( theta > endTheta )
123
+ theta = endTheta * 2 - theta;
124
+
125
+ }
126
+
127
+ data[ phi + theta * height ] = interpolateCandelaValues( phi, theta );
128
+
129
+ }
130
+
131
+ let result = null;
132
+
133
+ if ( type === UnsignedByteType ) result = Uint8Array.from( data.map( v => Math.min( v * 0xFF, 0xFF ) ) );
134
+ else if ( type === HalfFloatType ) result = Uint16Array.from( data.map( v => DataUtils.toHalfFloat( v ) ) );
135
+ else if ( type === FloatType ) result = Float32Array.from( data );
136
+ else console.error( 'IESLoader: Unsupported type:', type );
137
+
138
+ return result;
139
+
140
+ }
141
+
142
+ /**
143
+ * Starts loading from the given URL and passes the loaded IES texture
144
+ * to the `onLoad()` callback.
145
+ *
146
+ * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
147
+ * @param {function(DataTexture)} onLoad - Executed when the loading process has been finished.
148
+ * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
149
+ * @param {onErrorCallback} onError - Executed when errors occur.
150
+ */
151
+ load( url, onLoad, onProgress, onError ) {
152
+
153
+ const loader = new FileLoader( this.manager );
154
+ loader.setResponseType( 'text' );
155
+ loader.setCrossOrigin( this.crossOrigin );
156
+ loader.setWithCredentials( this.withCredentials );
157
+ loader.setPath( this.path );
158
+ loader.setRequestHeader( this.requestHeader );
159
+
160
+ loader.load( url, text => {
161
+
162
+ onLoad( this.parse( text ) );
163
+
164
+ }, onProgress, onError );
165
+
166
+ }
167
+
168
+ /**
169
+ * Parses the given IES data.
170
+ *
171
+ * @param {string} text - The raw IES data.
172
+ * @return {DataTexture} THE IES data as a texture.
173
+ */
174
+ parse( text ) {
175
+
176
+ const type = this.type;
177
+
178
+ const iesLamp = new IESLamp( text );
179
+ const data = this._getIESValues( iesLamp, type );
180
+
181
+ const texture = new DataTexture( data, 180, 1, RedFormat, type );
182
+ texture.minFilter = LinearFilter;
183
+ texture.magFilter = LinearFilter;
184
+ texture.needsUpdate = true;
185
+
186
+ return texture;
187
+
188
+ }
189
+
190
+ }
191
+
192
+
193
+ function IESLamp( text ) {
194
+
195
+ const _self = this;
196
+
197
+ const textArray = text.split( '\n' );
198
+
199
+ let lineNumber = 0;
200
+ let line;
201
+
202
+ _self.verAngles = [ ];
203
+ _self.horAngles = [ ];
204
+
205
+ _self.candelaValues = [ ];
206
+
207
+ _self.tiltData = { };
208
+ _self.tiltData.angles = [ ];
209
+ _self.tiltData.mulFactors = [ ];
210
+
211
+ function textToArray( text ) {
212
+
213
+ text = text.replace( /^\s+|\s+$/g, '' ); // remove leading or trailing spaces
214
+ text = text.replace( /,/g, ' ' ); // replace commas with spaces
215
+ text = text.replace( /\s\s+/g, ' ' ); // replace white space/tabs etc by single whitespace
216
+
217
+ const array = text.split( ' ' );
218
+
219
+ return array;
220
+
221
+ }
222
+
223
+ function readArray( count, array ) {
224
+
225
+ while ( true ) {
226
+
227
+ const line = textArray[ lineNumber ++ ];
228
+ const lineData = textToArray( line );
229
+
230
+ for ( let i = 0; i < lineData.length; ++ i ) {
231
+
232
+ array.push( Number( lineData[ i ] ) );
233
+
234
+ }
235
+
236
+ if ( array.length === count )
237
+ break;
238
+
239
+ }
240
+
241
+ }
242
+
243
+ function readTilt() {
244
+
245
+ let line = textArray[ lineNumber ++ ];
246
+ let lineData = textToArray( line );
247
+
248
+ _self.tiltData.lampToLumGeometry = Number( lineData[ 0 ] );
249
+
250
+ line = textArray[ lineNumber ++ ];
251
+ lineData = textToArray( line );
252
+
253
+ _self.tiltData.numAngles = Number( lineData[ 0 ] );
254
+
255
+ readArray( _self.tiltData.numAngles, _self.tiltData.angles );
256
+ readArray( _self.tiltData.numAngles, _self.tiltData.mulFactors );
257
+
258
+ }
259
+
260
+ function readLampValues() {
261
+
262
+ const values = [ ];
263
+ readArray( 10, values );
264
+
265
+ _self.count = Number( values[ 0 ] );
266
+ _self.lumens = Number( values[ 1 ] );
267
+ _self.multiplier = Number( values[ 2 ] );
268
+ _self.numVerAngles = Number( values[ 3 ] );
269
+ _self.numHorAngles = Number( values[ 4 ] );
270
+ _self.gonioType = Number( values[ 5 ] );
271
+ _self.units = Number( values[ 6 ] );
272
+ _self.width = Number( values[ 7 ] );
273
+ _self.length = Number( values[ 8 ] );
274
+ _self.height = Number( values[ 9 ] );
275
+
276
+ }
277
+
278
+ function readLampFactors() {
279
+
280
+ const values = [ ];
281
+ readArray( 3, values );
282
+
283
+ _self.ballFactor = Number( values[ 0 ] );
284
+ _self.blpFactor = Number( values[ 1 ] );
285
+ _self.inputWatts = Number( values[ 2 ] );
286
+
287
+ }
288
+
289
+ while ( true ) {
290
+
291
+ line = textArray[ lineNumber ++ ];
292
+
293
+ if ( line.includes( 'TILT' ) ) {
294
+
295
+ break;
296
+
297
+ }
298
+
299
+ }
300
+
301
+ if ( ! line.includes( 'NONE' ) ) {
302
+
303
+ if ( line.includes( 'INCLUDE' ) ) {
304
+
305
+ readTilt();
306
+
307
+ } else {
308
+
309
+ // TODO:: Read tilt data from a file
310
+
311
+ }
312
+
313
+ }
314
+
315
+ readLampValues();
316
+
317
+ readLampFactors();
318
+
319
+ // Initialize candela value array
320
+ for ( let i = 0; i < _self.numHorAngles; ++ i ) {
321
+
322
+ _self.candelaValues.push( [ ] );
323
+
324
+ }
325
+
326
+ // Parse Angles
327
+ readArray( _self.numVerAngles, _self.verAngles );
328
+ readArray( _self.numHorAngles, _self.horAngles );
329
+
330
+ // Parse Candela values
331
+ for ( let i = 0; i < _self.numHorAngles; ++ i ) {
332
+
333
+ readArray( _self.numVerAngles, _self.candelaValues[ i ] );
334
+
335
+ }
336
+
337
+ // Calculate actual candela values, and normalize.
338
+ for ( let i = 0; i < _self.numHorAngles; ++ i ) {
339
+
340
+ for ( let j = 0; j < _self.numVerAngles; ++ j ) {
341
+
342
+ _self.candelaValues[ i ][ j ] *= _self.candelaValues[ i ][ j ] * _self.multiplier
343
+ * _self.ballFactor * _self.blpFactor;
344
+
345
+ }
346
+
347
+ }
348
+
349
+ let maxVal = - 1;
350
+ for ( let i = 0; i < _self.numHorAngles; ++ i ) {
351
+
352
+ for ( let j = 0; j < _self.numVerAngles; ++ j ) {
353
+
354
+ const value = _self.candelaValues[ i ][ j ];
355
+ maxVal = maxVal < value ? value : maxVal;
356
+
357
+ }
358
+
359
+ }
360
+
361
+ const bNormalize = true;
362
+ if ( bNormalize && maxVal > 0 ) {
363
+
364
+ for ( let i = 0; i < _self.numHorAngles; ++ i ) {
365
+
366
+ for ( let j = 0; j < _self.numVerAngles; ++ j ) {
367
+
368
+ _self.candelaValues[ i ][ j ] /= maxVal;
369
+
370
+ }
371
+
372
+ }
373
+
374
+ }
375
+
376
+ }
377
+
378
+
379
+ export { IESLoader };
@@ -0,0 +1,163 @@
1
+ import {
2
+ FileLoader,
3
+ Group,
4
+ Loader,
5
+ LoadingManager
6
+ } from 'three';
7
+ import { ColladaLoader } from '../loaders/ColladaLoader.js';
8
+ import { unzipSync } from '../libs/fflate.module.js';
9
+
10
+ /**
11
+ * A loader for the KMZ format.
12
+ *
13
+ * ```js
14
+ * const loader = new KMZLoader();
15
+ * const kmz = await loader.loadAsync( './models/kmz/Box.kmz' );
16
+ *
17
+ * scene.add( kmz.scene );
18
+ * ```
19
+ *
20
+ * @augments Loader
21
+ * @three_import import { KMZLoader } from 'three/addons/loaders/KMZLoader.js';
22
+ */
23
+ class KMZLoader extends Loader {
24
+
25
+ /**
26
+ * Constructs a new KMZ loader.
27
+ *
28
+ * @param {LoadingManager} [manager] - The loading manager.
29
+ */
30
+ constructor( manager ) {
31
+
32
+ super( manager );
33
+
34
+ }
35
+
36
+ /**
37
+ * Starts loading from the given URL and passes the loaded KMZ asset
38
+ * to the `onLoad()` callback.
39
+ *
40
+ * @param {string} url - The path/URL of the file to be loaded. This can also be a data URI.
41
+ * @param {function({scene:Group})} onLoad - Executed when the loading process has been finished.
42
+ * @param {onProgressCallback} onProgress - Executed while the loading is in progress.
43
+ * @param {onErrorCallback} onError - Executed when errors occur.
44
+ */
45
+ load( url, onLoad, onProgress, onError ) {
46
+
47
+ const scope = this;
48
+
49
+ const loader = new FileLoader( scope.manager );
50
+ loader.setPath( scope.path );
51
+ loader.setResponseType( 'arraybuffer' );
52
+ loader.setRequestHeader( scope.requestHeader );
53
+ loader.setWithCredentials( scope.withCredentials );
54
+ loader.load( url, function ( text ) {
55
+
56
+ try {
57
+
58
+ onLoad( scope.parse( text ) );
59
+
60
+ } catch ( e ) {
61
+
62
+ if ( onError ) {
63
+
64
+ onError( e );
65
+
66
+ } else {
67
+
68
+ console.error( e );
69
+
70
+ }
71
+
72
+ scope.manager.itemError( url );
73
+
74
+ }
75
+
76
+ }, onProgress, onError );
77
+
78
+ }
79
+
80
+ /**
81
+ * Parses the given KMZ data and returns an object holding the scene.
82
+ *
83
+ * @param {ArrayBuffer} data - The raw KMZ data as an array buffer.
84
+ * @return {{scene:Group}} The parsed KMZ asset.
85
+ */
86
+ parse( data ) {
87
+
88
+ function findFile( url ) {
89
+
90
+ for ( const path in zip ) {
91
+
92
+ if ( path.slice( - url.length ) === url ) {
93
+
94
+ return zip[ path ];
95
+
96
+ }
97
+
98
+ }
99
+
100
+ }
101
+
102
+ const manager = new LoadingManager();
103
+ manager.setURLModifier( function ( url ) {
104
+
105
+ const image = findFile( url );
106
+
107
+ if ( image ) {
108
+
109
+ console.log( 'Loading', url );
110
+
111
+ const blob = new Blob( [ image.buffer ], { type: 'application/octet-stream' } );
112
+ return URL.createObjectURL( blob );
113
+
114
+ }
115
+
116
+ return url;
117
+
118
+ } );
119
+
120
+ //
121
+
122
+ const zip = unzipSync( new Uint8Array( data ) );
123
+
124
+ if ( zip[ 'doc.kml' ] ) {
125
+
126
+ const xml = new DOMParser().parseFromString( new TextDecoder().decode( zip[ 'doc.kml' ] ), 'application/xml' );
127
+
128
+ const model = xml.querySelector( 'Placemark Model Link href' );
129
+
130
+ if ( model ) {
131
+
132
+ const loader = new ColladaLoader( manager );
133
+ return loader.parse( new TextDecoder().decode( zip[ model.textContent ] ) );
134
+
135
+ }
136
+
137
+ } else {
138
+
139
+ console.warn( 'KMZLoader: Missing doc.kml file.' );
140
+
141
+ for ( const path in zip ) {
142
+
143
+ const extension = path.split( '.' ).pop().toLowerCase();
144
+
145
+ if ( extension === 'dae' ) {
146
+
147
+ const loader = new ColladaLoader( manager );
148
+ return loader.parse( new TextDecoder().decode( zip[ path ] ) );
149
+
150
+ }
151
+
152
+ }
153
+
154
+ }
155
+
156
+ console.error( 'KMZLoader: Couldn\'t find .dae file.' );
157
+ return { scene: new Group() };
158
+
159
+ }
160
+
161
+ }
162
+
163
+ export { KMZLoader };