@iweather-js/iweather-gl 0.0.1

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 (270) hide show
  1. package/README.md +15 -0
  2. package/dist/config/colorPalette.d.ts +115 -0
  3. package/dist/config/colorPalette.d.ts.map +1 -0
  4. package/dist/config/map.d.ts +15 -0
  5. package/dist/config/map.d.ts.map +1 -0
  6. package/dist/config/product.d.ts +42 -0
  7. package/dist/config/product.d.ts.map +1 -0
  8. package/dist/core/dataFindMgr.d.ts +24 -0
  9. package/dist/core/dataFindMgr.d.ts.map +1 -0
  10. package/dist/core/dataLoaderMgr.d.ts +19 -0
  11. package/dist/core/dataLoaderMgr.d.ts.map +1 -0
  12. package/dist/core/hub.layerMgr.d.ts +11 -0
  13. package/dist/core/hub.layerMgr.d.ts.map +1 -0
  14. package/dist/core/hub.timeMgr.d.ts +12 -0
  15. package/dist/core/hub.timeMgr.d.ts.map +1 -0
  16. package/dist/core/layerMgr.d.ts +69 -0
  17. package/dist/core/layerMgr.d.ts.map +1 -0
  18. package/dist/core/product.d.ts +56 -0
  19. package/dist/core/product.d.ts.map +1 -0
  20. package/dist/fns/createColorPalette.d.ts +8 -0
  21. package/dist/fns/createColorPalette.d.ts.map +1 -0
  22. package/dist/fns/createGridMesh.d.ts +14 -0
  23. package/dist/fns/createGridMesh.d.ts.map +1 -0
  24. package/dist/fns/geojson/getChina.d.ts +15 -0
  25. package/dist/fns/geojson/getChina.d.ts.map +1 -0
  26. package/dist/fns/geojson/getCity.d.ts +15 -0
  27. package/dist/fns/geojson/getCity.d.ts.map +1 -0
  28. package/dist/fns/geojson/getCounty.d.ts +9 -0
  29. package/dist/fns/geojson/getCounty.d.ts.map +1 -0
  30. package/dist/fns/geojson/getLand.d.ts +3 -0
  31. package/dist/fns/geojson/getLand.d.ts.map +1 -0
  32. package/dist/fns/geojson/getProvince.d.ts +16 -0
  33. package/dist/fns/geojson/getProvince.d.ts.map +1 -0
  34. package/dist/fns/geojson/getProvinceNames.d.ts +8 -0
  35. package/dist/fns/geojson/getProvinceNames.d.ts.map +1 -0
  36. package/dist/fns/geojson/toAdcodeInfoVo.d.ts +13 -0
  37. package/dist/fns/geojson/toAdcodeInfoVo.d.ts.map +1 -0
  38. package/dist/fns/geojson/types.d.ts +14 -0
  39. package/dist/fns/geojson/types.d.ts.map +1 -0
  40. package/dist/fns/getVisibleWraps.d.ts +3 -0
  41. package/dist/fns/getVisibleWraps.d.ts.map +1 -0
  42. package/dist/fns/glsl/contourFns.d.ts +2 -0
  43. package/dist/fns/glsl/contourFns.d.ts.map +1 -0
  44. package/dist/fns/glsl/defComputeFs.d.ts +2 -0
  45. package/dist/fns/glsl/defComputeFs.d.ts.map +1 -0
  46. package/dist/fns/glsl/mercatorFuns.d.ts +2 -0
  47. package/dist/fns/glsl/mercatorFuns.d.ts.map +1 -0
  48. package/dist/fns/glsl/normalizeTo.d.ts +2 -0
  49. package/dist/fns/glsl/normalizeTo.d.ts.map +1 -0
  50. package/dist/fns/glsl/positionInFuns.d.ts +2 -0
  51. package/dist/fns/glsl/positionInFuns.d.ts.map +1 -0
  52. package/dist/fns/glsl/texture_bicubic.d.ts +2 -0
  53. package/dist/fns/glsl/texture_bicubic.d.ts.map +1 -0
  54. package/dist/fns/index.d.ts +17 -0
  55. package/dist/fns/index.d.ts.map +1 -0
  56. package/dist/fns/outdated/getMeshInfo.d.ts +19 -0
  57. package/dist/fns/outdated/getMeshInfo.d.ts.map +1 -0
  58. package/dist/fns/outdated/getWorldOffsets.d.ts +3 -0
  59. package/dist/fns/outdated/getWorldOffsets.d.ts.map +1 -0
  60. package/dist/fns/outdated/readImagBitmap.d.ts +2 -0
  61. package/dist/fns/outdated/readImagBitmap.d.ts.map +1 -0
  62. package/dist/fns/outdated/readImageWithExif/worker-load.d.ts +1 -0
  63. package/dist/fns/outdated/readImageWithExif/worker-load.d.ts.map +1 -0
  64. package/dist/fns/readImageWithExif/index.d.ts +25 -0
  65. package/dist/fns/readImageWithExif/index.d.ts.map +1 -0
  66. package/dist/fns/readImageWithExif/parseExif.d.ts +40 -0
  67. package/dist/fns/readImageWithExif/parseExif.d.ts.map +1 -0
  68. package/dist/fns/readImageWithExif/readExif.d.ts +12 -0
  69. package/dist/fns/readImageWithExif/readExif.d.ts.map +1 -0
  70. package/dist/fns/readImageWithExif/readImagWithExif.d.ts +9 -0
  71. package/dist/fns/readImageWithExif/readImagWithExif.d.ts.map +1 -0
  72. package/dist/fns/scaleColorPaletteConfig.d.ts +3 -0
  73. package/dist/fns/scaleColorPaletteConfig.d.ts.map +1 -0
  74. package/dist/fns/toColorPaletteFns.d.ts +9 -0
  75. package/dist/fns/toColorPaletteFns.d.ts.map +1 -0
  76. package/dist/fns/toGlColor.d.ts +2 -0
  77. package/dist/fns/toGlColor.d.ts.map +1 -0
  78. package/dist/fns/wrapBounds.d.ts +14 -0
  79. package/dist/fns/wrapBounds.d.ts.map +1 -0
  80. package/dist/index.d.ts +37 -0
  81. package/dist/index.d.ts.map +1 -0
  82. package/dist/index.js +1986 -0
  83. package/dist/index.js.map +131 -0
  84. package/dist/interfaces/ICityConfig.d.ts +28 -0
  85. package/dist/interfaces/ICityConfig.d.ts.map +1 -0
  86. package/dist/interfaces/IDataFetchConfig.d.ts +10 -0
  87. package/dist/interfaces/IDataFetchConfig.d.ts.map +1 -0
  88. package/dist/interfaces/IDataReqOptionsConfig.d.ts +16 -0
  89. package/dist/interfaces/IDataReqOptionsConfig.d.ts.map +1 -0
  90. package/dist/interfaces/ILayerMgrConfig.d.ts +13 -0
  91. package/dist/interfaces/ILayerMgrConfig.d.ts.map +1 -0
  92. package/dist/interfaces/IProductConfig.d.ts +16 -0
  93. package/dist/interfaces/IProductConfig.d.ts.map +1 -0
  94. package/dist/interfaces/index.d.ts +7 -0
  95. package/dist/interfaces/index.d.ts.map +1 -0
  96. package/dist/layers/base/ExCustomLayer.d.ts +40 -0
  97. package/dist/layers/base/ExCustomLayer.d.ts.map +1 -0
  98. package/dist/layers/base/ExTimingLayer.d.ts +30 -0
  99. package/dist/layers/base/ExTimingLayer.d.ts.map +1 -0
  100. package/dist/layers/index.d.ts +18 -0
  101. package/dist/layers/index.d.ts.map +1 -0
  102. package/dist/layers/maplibre-3dProfile/Maplibre3DProfileLayer.d.ts +43 -0
  103. package/dist/layers/maplibre-3dProfile/Maplibre3DProfileLayer.d.ts.map +1 -0
  104. package/dist/layers/maplibre-3dProfile/box.vs.d.ts +7 -0
  105. package/dist/layers/maplibre-3dProfile/box.vs.d.ts.map +1 -0
  106. package/dist/layers/maplibre-3dProfile/lib/getMatrix.d.ts +11 -0
  107. package/dist/layers/maplibre-3dProfile/lib/getMatrix.d.ts.map +1 -0
  108. package/dist/layers/maplibre-3dProfile/line.fs.d.ts +6 -0
  109. package/dist/layers/maplibre-3dProfile/line.fs.d.ts.map +1 -0
  110. package/dist/layers/maplibre-3dProfile/slice.fs copy.d.ts +7 -0
  111. package/dist/layers/maplibre-3dProfile/slice.fs copy.d.ts.map +1 -0
  112. package/dist/layers/maplibre-3dProfile/slice.fs.d.ts +7 -0
  113. package/dist/layers/maplibre-3dProfile/slice.fs.d.ts.map +1 -0
  114. package/dist/layers/maplibre-3dProfile/volume.fs.d.ts +7 -0
  115. package/dist/layers/maplibre-3dProfile/volume.fs.d.ts.map +1 -0
  116. package/dist/layers/maplibre-3dProfile-v0/Maplibre3DProfileLayerV0.d.ts +37 -0
  117. package/dist/layers/maplibre-3dProfile-v0/Maplibre3DProfileLayerV0.d.ts.map +1 -0
  118. package/dist/layers/maplibre-3dProfile-v0/common.vs.d.ts +7 -0
  119. package/dist/layers/maplibre-3dProfile-v0/common.vs.d.ts.map +1 -0
  120. package/dist/layers/maplibre-3dProfile-v0/lib/getMatrix.d.ts +11 -0
  121. package/dist/layers/maplibre-3dProfile-v0/lib/getMatrix.d.ts.map +1 -0
  122. package/dist/layers/maplibre-3dProfile-v0/line.fs.d.ts +6 -0
  123. package/dist/layers/maplibre-3dProfile-v0/line.fs.d.ts.map +1 -0
  124. package/dist/layers/maplibre-3dProfile-v0/slice.fs.d.ts +7 -0
  125. package/dist/layers/maplibre-3dProfile-v0/slice.fs.d.ts.map +1 -0
  126. package/dist/layers/maplibre-3dProfile-v0/volume.fs.d.ts +7 -0
  127. package/dist/layers/maplibre-3dProfile-v0/volume.fs.d.ts.map +1 -0
  128. package/dist/layers/maplibre-3dProfile-v3/Maplibre3DProfileLayerV3.d.ts +44 -0
  129. package/dist/layers/maplibre-3dProfile-v3/Maplibre3DProfileLayerV3.d.ts.map +1 -0
  130. package/dist/layers/maplibre-3dProfile-v3/common.vs.d.ts +7 -0
  131. package/dist/layers/maplibre-3dProfile-v3/common.vs.d.ts.map +1 -0
  132. package/dist/layers/maplibre-3dProfile-v3/lib/calculateLightPositions.d.ts +12 -0
  133. package/dist/layers/maplibre-3dProfile-v3/lib/calculateLightPositions.d.ts.map +1 -0
  134. package/dist/layers/maplibre-3dProfile-v3/lib/calculateSubdivisions.d.ts +10 -0
  135. package/dist/layers/maplibre-3dProfile-v3/lib/calculateSubdivisions.d.ts.map +1 -0
  136. package/dist/layers/maplibre-3dProfile-v3/lib/createCubeGeometry.d.ts +11 -0
  137. package/dist/layers/maplibre-3dProfile-v3/lib/createCubeGeometry.d.ts.map +1 -0
  138. package/dist/layers/maplibre-3dProfile-v3/lib/prepareLightUniforms.d.ts +12 -0
  139. package/dist/layers/maplibre-3dProfile-v3/lib/prepareLightUniforms.d.ts.map +1 -0
  140. package/dist/layers/maplibre-3dProfile-v3/lib/prepareProjectionUniforms.d.ts +7 -0
  141. package/dist/layers/maplibre-3dProfile-v3/lib/prepareProjectionUniforms.d.ts.map +1 -0
  142. package/dist/layers/maplibre-3dProfile-v3/lib/validateGeometry.d.ts +11 -0
  143. package/dist/layers/maplibre-3dProfile-v3/lib/validateGeometry.d.ts.map +1 -0
  144. package/dist/layers/maplibre-3dProfile-v3/volume.fs.d.ts +7 -0
  145. package/dist/layers/maplibre-3dProfile-v3/volume.fs.d.ts.map +1 -0
  146. package/dist/layers/maplibre-color/ColorLayer.d.ts +23 -0
  147. package/dist/layers/maplibre-color/ColorLayer.d.ts.map +1 -0
  148. package/dist/layers/maplibre-color/CommonColorLayer.d.ts +12 -0
  149. package/dist/layers/maplibre-color/CommonColorLayer.d.ts.map +1 -0
  150. package/dist/layers/maplibre-color/WindColorLayer.d.ts +10 -0
  151. package/dist/layers/maplibre-color/WindColorLayer.d.ts.map +1 -0
  152. package/dist/layers/maplibre-color/getTiles.d.ts +10 -0
  153. package/dist/layers/maplibre-color/getTiles.d.ts.map +1 -0
  154. package/dist/layers/maplibre-color/globe-image-test/ColorLayer2.d.ts +24 -0
  155. package/dist/layers/maplibre-color/globe-image-test/ColorLayer2.d.ts.map +1 -0
  156. package/dist/layers/maplibre-color/globe-image-test/CommonColorLayer2.d.ts +12 -0
  157. package/dist/layers/maplibre-color/globe-image-test/CommonColorLayer2.d.ts.map +1 -0
  158. package/dist/layers/maplibre-contour/ContourLayer.d.ts +20 -0
  159. package/dist/layers/maplibre-contour/ContourLayer.d.ts.map +1 -0
  160. package/dist/layers/maplibre-contour/ContourLayerByValue.d.ts +20 -0
  161. package/dist/layers/maplibre-contour/ContourLayerByValue.d.ts.map +1 -0
  162. package/dist/layers/maplibre-contour/ContourValueLayer.d.ts +26 -0
  163. package/dist/layers/maplibre-contour/ContourValueLayer.d.ts.map +1 -0
  164. package/dist/layers/maplibre-contour/lib.d.ts +38 -0
  165. package/dist/layers/maplibre-contour/lib.d.ts.map +1 -0
  166. package/dist/layers/maplibre-gridValue/BaseGridValueLayer.d.ts +28 -0
  167. package/dist/layers/maplibre-gridValue/BaseGridValueLayer.d.ts.map +1 -0
  168. package/dist/layers/maplibre-gridValue/GridValueLayer.d.ts +7 -0
  169. package/dist/layers/maplibre-gridValue/GridValueLayer.d.ts.map +1 -0
  170. package/dist/layers/maplibre-gridValue/GridWindValueLayer.d.ts +7 -0
  171. package/dist/layers/maplibre-gridValue/GridWindValueLayer.d.ts.map +1 -0
  172. package/dist/layers/maplibre-gridValue/computeVsByColor.d.ts +2 -0
  173. package/dist/layers/maplibre-gridValue/computeVsByColor.d.ts.map +1 -0
  174. package/dist/layers/maplibre-gridValue/computeVsByWind.d.ts +2 -0
  175. package/dist/layers/maplibre-gridValue/computeVsByWind.d.ts.map +1 -0
  176. package/dist/layers/maplibre-gridValue/drawFs.d.ts +3 -0
  177. package/dist/layers/maplibre-gridValue/drawFs.d.ts.map +1 -0
  178. package/dist/layers/maplibre-gridValue/drawVs.d.ts +3 -0
  179. package/dist/layers/maplibre-gridValue/drawVs.d.ts.map +1 -0
  180. package/dist/layers/maplibre-gridValue/lib/createNumberTextureInfo.d.ts +20 -0
  181. package/dist/layers/maplibre-gridValue/lib/createNumberTextureInfo.d.ts.map +1 -0
  182. package/dist/layers/maplibre-gridWind/GridWindLayer.d.ts +25 -0
  183. package/dist/layers/maplibre-gridWind/GridWindLayer.d.ts.map +1 -0
  184. package/dist/layers/maplibre-gridWind/computeVs.d.ts +2 -0
  185. package/dist/layers/maplibre-gridWind/computeVs.d.ts.map +1 -0
  186. package/dist/layers/maplibre-gridWind/drawFs.d.ts +3 -0
  187. package/dist/layers/maplibre-gridWind/drawFs.d.ts.map +1 -0
  188. package/dist/layers/maplibre-gridWind/drawVs.d.ts +3 -0
  189. package/dist/layers/maplibre-gridWind/drawVs.d.ts.map +1 -0
  190. package/dist/layers/maplibre-gridWind/utils/calculateGridInfo.d.ts +7 -0
  191. package/dist/layers/maplibre-gridWind/utils/calculateGridInfo.d.ts.map +1 -0
  192. package/dist/layers/maplibre-gridWind/utils/calculateViewportGridUv.d.ts +9 -0
  193. package/dist/layers/maplibre-gridWind/utils/calculateViewportGridUv.d.ts.map +1 -0
  194. package/dist/layers/maplibre-gridWind/utils/toBoundsCoords.d.ts +3 -0
  195. package/dist/layers/maplibre-gridWind/utils/toBoundsCoords.d.ts.map +1 -0
  196. package/dist/layers/maplibre-gridWind/utils/toWebGlSizeByPixel.d.ts +3 -0
  197. package/dist/layers/maplibre-gridWind/utils/toWebGlSizeByPixel.d.ts.map +1 -0
  198. package/dist/layers/maplibre-wind-particle/MapLibreWindParticleLayer.d.ts +48 -0
  199. package/dist/layers/maplibre-wind-particle/MapLibreWindParticleLayer.d.ts.map +1 -0
  200. package/dist/layers/maplibre-wind-particle/computeVs.d.ts +3 -0
  201. package/dist/layers/maplibre-wind-particle/computeVs.d.ts.map +1 -0
  202. package/dist/layers/maplibre-wind-particle/drawFs.d.ts +3 -0
  203. package/dist/layers/maplibre-wind-particle/drawFs.d.ts.map +1 -0
  204. package/dist/layers/maplibre-wind-particle/drawVs.d.ts +3 -0
  205. package/dist/layers/maplibre-wind-particle/drawVs.d.ts.map +1 -0
  206. package/dist/layers/maplibre-wind-particle/utils/bounds.d.ts +3 -0
  207. package/dist/layers/maplibre-wind-particle/utils/bounds.d.ts.map +1 -0
  208. package/dist/layers/mask/fns/calculateRenderBounds.d.ts +6 -0
  209. package/dist/layers/mask/fns/calculateRenderBounds.d.ts.map +1 -0
  210. package/dist/layers/mask/fns/createProjectionMatrix.d.ts +5 -0
  211. package/dist/layers/mask/fns/createProjectionMatrix.d.ts.map +1 -0
  212. package/dist/layers/mask/fns/hasViewportChanged.d.ts +13 -0
  213. package/dist/layers/mask/fns/hasViewportChanged.d.ts.map +1 -0
  214. package/dist/layers/mask/fns/lngLatToMercator.d.ts +3 -0
  215. package/dist/layers/mask/fns/lngLatToMercator.d.ts.map +1 -0
  216. package/dist/layers/mask/fns/processGeoJSON.d.ts +10 -0
  217. package/dist/layers/mask/fns/processGeoJSON.d.ts.map +1 -0
  218. package/dist/layers/mask/mask-layer.d.ts +36 -0
  219. package/dist/layers/mask/mask-layer.d.ts.map +1 -0
  220. package/dist/layers/mask/masked-data-layer.d.ts +22 -0
  221. package/dist/layers/mask/masked-data-layer.d.ts.map +1 -0
  222. package/dist/map/getMapState.d.ts +3 -0
  223. package/dist/map/getMapState.d.ts.map +1 -0
  224. package/dist/map/mapAction.d.ts +34 -0
  225. package/dist/map/mapAction.d.ts.map +1 -0
  226. package/dist/map/mapAutoRotation.d.ts +3 -0
  227. package/dist/map/mapAutoRotation.d.ts.map +1 -0
  228. package/dist/map/mapCreate.d.ts +4 -0
  229. package/dist/map/mapCreate.d.ts.map +1 -0
  230. package/dist/map/mapEvent.d.ts +16 -0
  231. package/dist/map/mapEvent.d.ts.map +1 -0
  232. package/dist/map/mapInitState.d.ts +4 -0
  233. package/dist/map/mapInitState.d.ts.map +1 -0
  234. package/dist/map/mapScreenshotHandler.d.ts +8 -0
  235. package/dist/map/mapScreenshotHandler.d.ts.map +1 -0
  236. package/dist/map/mapSyncMoveHandler.d.ts +8 -0
  237. package/dist/map/mapSyncMoveHandler.d.ts.map +1 -0
  238. package/dist/map/mapSyncTimeHandler.d.ts +8 -0
  239. package/dist/map/mapSyncTimeHandler.d.ts.map +1 -0
  240. package/dist/map/markerHover.d.ts +13 -0
  241. package/dist/map/markerHover.d.ts.map +1 -0
  242. package/dist/map/markerMgr.d.ts +15 -0
  243. package/dist/map/markerMgr.d.ts.map +1 -0
  244. package/dist/map/syncMapStateToStoreHandler.d.ts +8 -0
  245. package/dist/map/syncMapStateToStoreHandler.d.ts.map +1 -0
  246. package/dist/map/syncStoreStateToMapHandler.d.ts +8 -0
  247. package/dist/map/syncStoreStateToMapHandler.d.ts.map +1 -0
  248. package/dist/store/configStore.d.ts +24 -0
  249. package/dist/store/configStore.d.ts.map +1 -0
  250. package/dist/store/defValue.d.ts +14 -0
  251. package/dist/store/defValue.d.ts.map +1 -0
  252. package/dist/store/gisStore.d.ts +158 -0
  253. package/dist/store/gisStore.d.ts.map +1 -0
  254. package/dist/store/multiMapStatusStore.d.ts +35 -0
  255. package/dist/store/multiMapStatusStore.d.ts.map +1 -0
  256. package/dist/store/toGisValue.d.ts +4 -0
  257. package/dist/store/toGisValue.d.ts.map +1 -0
  258. package/dist/types/colorPalette.d.ts +19 -0
  259. package/dist/types/colorPalette.d.ts.map +1 -0
  260. package/dist/types/ctx.d.ts +13 -0
  261. package/dist/types/ctx.d.ts.map +1 -0
  262. package/dist/types/gl.d.ts +40 -0
  263. package/dist/types/gl.d.ts.map +1 -0
  264. package/dist/types/layerOptions.d.ts +124 -0
  265. package/dist/types/layerOptions.d.ts.map +1 -0
  266. package/dist/types/map.d.ts +19 -0
  267. package/dist/types/map.d.ts.map +1 -0
  268. package/dist/types/product.d.ts +27 -0
  269. package/dist/types/product.d.ts.map +1 -0
  270. package/package.json +50 -0
@@ -0,0 +1,131 @@
1
+ {
2
+ "version": 3,
3
+ "sources": ["../src/store/gisStore.ts", "../src/store/defValue.ts", "../src/config/map.ts", "../src/types/gl.ts", "../src/types/layerOptions.ts", "../src/config/product.ts", "../src/store/toGisValue.ts", "../src/store/configStore.ts", "../src/store/multiMapStatusStore.ts", "../../../node_modules/@ctrl/tinycolor/dist/module/util.js", "../../../node_modules/@ctrl/tinycolor/dist/module/conversion.js", "../../../node_modules/@ctrl/tinycolor/dist/module/css-color-names.js", "../../../node_modules/@ctrl/tinycolor/dist/module/format-input.js", "../../../node_modules/@ctrl/tinycolor/dist/module/index.js", "../../iweather-lib/dist/index.js", "../src/config/colorPalette.ts", "../src/types/product.ts", "../src/types/map.ts", "../src/fns/createColorPalette.ts", "../src/fns/readImageWithExif/parseExif.ts", "../src/fns/readImageWithExif/readExif.ts", "../src/fns/readImageWithExif/readImagWithExif.ts", "../src/fns/readImageWithExif/index.ts", "../src/fns/wrapBounds.ts", "../src/fns/toColorPaletteFns.ts", "../src/fns/getVisibleWraps.ts", "../src/fns/createGridMesh.ts", "../src/fns/scaleColorPaletteConfig.ts", "../src/fns/geojson/getChina.ts", "../src/fns/geojson/getProvince.ts", "../src/fns/geojson/getCity.ts", "../src/fns/geojson/getCounty.ts", "../src/fns/geojson/getLand.ts", "../src/fns/geojson/getProvinceNames.ts", "../src/fns/geojson/toAdcodeInfoVo.ts", "../src/layers/base/ExCustomLayer.ts", "../src/layers/mask/mask-layer.ts", "../src/layers/mask/fns/calculateRenderBounds.ts", "../src/layers/mask/fns/createProjectionMatrix.ts", "../src/layers/mask/fns/hasViewportChanged.ts", "../src/layers/mask/fns/lngLatToMercator.ts", "../src/layers/mask/fns/processGeoJSON.ts", "../src/layers/base/ExTimingLayer.ts", "../src/layers/maplibre-color/ColorLayer.ts", "../src/fns/glsl/texture_bicubic.ts", "../src/layers/maplibre-color/CommonColorLayer.ts", "../src/layers/maplibre-color/WindColorLayer.ts", "../src/layers/maplibre-contour/ContourLayer.ts", "../src/fns/glsl/contourFns.ts", "../src/fns/toGlColor.ts", "../src/layers/maplibre-contour/ContourValueLayer.ts", "../src/layers/maplibre-contour/lib.ts", "../src/layers/maplibre-contour/ContourLayerByValue.ts", "../src/layers/maplibre-gridWind/GridWindLayer.ts", "../src/fns/glsl/defComputeFs.ts", "../src/layers/maplibre-gridWind/computeVs.ts", "../src/layers/maplibre-gridWind/drawFs.ts", "../src/layers/maplibre-gridWind/drawVs.ts", "../src/layers/maplibre-gridWind/utils/calculateGridInfo.ts", "../src/layers/maplibre-gridWind/utils/calculateViewportGridUv.ts", "../src/layers/maplibre-gridWind/utils/toBoundsCoords.ts", "../src/layers/maplibre-gridWind/utils/toWebGlSizeByPixel.ts", "../src/layers/maplibre-wind-particle/MapLibreWindParticleLayer.ts", "../src/fns/glsl/mercatorFuns.ts", "../src/layers/maplibre-wind-particle/computeVs.ts", "../src/layers/maplibre-wind-particle/drawFs.ts", "../src/layers/maplibre-wind-particle/drawVs.ts", "../src/layers/maplibre-wind-particle/utils/bounds.ts", "../../../node_modules/gl-matrix/esm/common.js", "../../../node_modules/gl-matrix/esm/mat4.js", "../../../node_modules/gl-matrix/esm/vec3.js", "../src/layers/maplibre-3dProfile/Maplibre3DProfileLayer.ts", "../src/layers/maplibre-3dProfile/box.vs.ts", "../src/layers/maplibre-3dProfile/lib/getMatrix.ts", "../src/layers/maplibre-3dProfile/line.fs.ts", "../src/layers/maplibre-3dProfile/slice.fs.ts", "../src/layers/maplibre-3dProfile/volume.fs.ts", "../src/layers/maplibre-3dProfile-v0/Maplibre3DProfileLayerV0.ts", "../src/layers/maplibre-3dProfile-v0/common.vs.ts", "../src/layers/maplibre-3dProfile-v0/lib/getMatrix.ts", "../src/layers/maplibre-3dProfile-v0/line.fs.ts", "../src/layers/maplibre-3dProfile-v0/slice.fs.ts", "../src/layers/maplibre-3dProfile-v0/volume.fs.ts", "../src/layers/maplibre-3dProfile-v3/Maplibre3DProfileLayerV3.ts", "../src/layers/maplibre-3dProfile-v3/common.vs.ts", "../src/layers/maplibre-3dProfile-v3/lib/calculateSubdivisions.ts", "../src/layers/maplibre-3dProfile-v3/lib/createCubeGeometry.ts", "../src/layers/maplibre-3dProfile-v3/lib/prepareProjectionUniforms.ts", "../src/layers/maplibre-3dProfile-v3/volume.fs.ts", "../src/layers/maplibre-gridValue/BaseGridValueLayer.ts", "../src/layers/maplibre-gridValue/drawFs.ts", "../src/layers/maplibre-gridValue/drawVs.ts", "../src/layers/maplibre-gridValue/lib/createNumberTextureInfo.ts", "../src/layers/maplibre-gridValue/computeVsByColor.ts", "../src/layers/maplibre-gridValue/GridValueLayer.ts", "../src/layers/maplibre-gridValue/computeVsByWind.ts", "../src/layers/maplibre-gridValue/GridWindValueLayer.ts", "../src/layers/mask/masked-data-layer.ts", "../src/interfaces/IDataFetchConfig.ts", "../src/interfaces/IDataReqOptionsConfig.ts", "../src/interfaces/ILayerMgrConfig.ts", "../src/interfaces/IProductConfig.ts", "../src/interfaces/ICityConfig.ts", "../src/core/hub.layerMgr.ts", "../src/core/hub.timeMgr.ts", "../src/core/dataFindMgr.ts", "../src/core/dataLoaderMgr.ts", "../src/core/layerMgr.ts", "../src/core/product.ts", "../src/map/mapAction.ts", "../src/map/mapCreate.ts", "../src/map/mapEvent.ts", "../src/map/getMapState.ts", "../src/map/mapScreenshotHandler.ts", "../src/map/mapSyncMoveHandler.ts", "../src/map/mapSyncTimeHandler.ts", "../src/map/syncMapStateToStoreHandler.ts", "../src/map/syncStoreStateToMapHandler.ts", "../src/map/mapInitState.ts", "../src/map/markerMgr.ts", "../src/map/markerHover.ts", "../src/map/mapAutoRotation.ts"],
4
+ "sourcesContent": [
5
+ "import { omit, pick } from 'lodash-es';\nimport { LngLat, PaddingOptions } from 'maplibre-gl';\nimport { subscribeWithSelector } from 'zustand/middleware';\nimport { immer } from 'zustand/middleware/immer';\nimport { createStore } from 'zustand/vanilla';\nimport { PlaySpeedByFrame, PlaySpeedByTiming, TitleAlign, TitleSize } from '../config/product';\nimport { ILayerMgr } from '../core/layerMgr';\nimport { IProduct } from '../core/product';\nimport { IAdCodeInfo } from '../fns';\nimport { IBaseLayerOptions } from '../types/layerOptions';\nimport { Bounds, IMap, PlayMode, PlayStatus, ProjectionType, ViewComponentsStyle } from '../types/map';\nimport { ITimeBarInfo, TitleShowOption } from '../types/product';\nimport { IConfigStore } from './configStore';\nimport { getInitValue } from './defValue';\nimport { toGisValue } from './toGisValue';\n\nexport type IGisValue<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object> = IGisStyleOptions & {\n enableScreenshot?: boolean;\n screenshot?: string;\n productType: ProductTypeT;\n mapGroup?: string;\n} & LayerT;\n\nexport interface IGisStyleOptions {\n projectionType: ProjectionType;\n pitch: number;\n bearing: number;\n disableZoom: boolean;\n disableMove: boolean;\n bounds?: Bounds;\n renderWorldCopies?: boolean;\n boundsLockMinZoom?: boolean;\n boundsPadding?: number | PaddingOptions;\n zoom: number;\n maxZoom?: number;\n minZoom?: number;\n center: [lng: number, lat: number];\n colorPaletteStyle: ViewComponentsStyle;\n layerInfoStyle: ViewComponentsStyle;\n timeBarStyle: ViewComponentsStyle;\n currTimeStyle: ViewComponentsStyle;\n timeInfoStyle: ViewComponentsStyle;\n showBg: boolean;\n showSky: boolean;\n playState: PlayStatus;\n playMode: PlayMode;\n playSpeedByTiming: PlaySpeedByTiming;\n playSpeedByFrame: PlaySpeedByFrame;\n currTm?: number;\n showTitle?: boolean;\n title?: string;\n titleAlign?: TitleAlign;\n titleSize?: TitleSize;\n titleShowOptions?: TitleShowOption[];\n devCustomGrayImageByMercator?: string;\n devCustomWindImageByLnglat?: string;\n enableMapSync: boolean;\n enableMapSyncTime: boolean;\n adcodeInfo: IAdCodeInfo;\n mapBackgroundColor?: string;\n clickPoint?: LngLat;\n glIsDynamicRender?: boolean;\n logoUrl?: string;\n autoRotation?: {\n enable: boolean;\n pos?: {\n center: [lng: number, lat: number];\n zoom: number;\n };\n bounds?: Bounds;\n speed: number;\n };\n}\n\nexport interface ITimingData<TD = any> {\n time: number;\n data?: TD;\n}\n\nexport type IGisStateAndValue<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object> = IGisState<\n LayerT,\n ProductTypeT,\n ModelTypeT,\n DataReqT\n> &\n IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n\nexport type IGisStateAndValueAndFns<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object> = IGisState<\n LayerT,\n ProductTypeT,\n ModelTypeT,\n DataReqT\n> &\n IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT> &\n IGisFns<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n\nexport type IGisState<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object> = {\n mapId: string;\n map?: IMap;\n allLayerMgrs: Record<string, ILayerMgr>;\n mapIsLoaded: boolean;\n mapStateToStoreSyncing?: boolean;\n layersData: Record<keyof LayerT, ITimingData[]>;\n timeBarInfo?: ITimeBarInfo;\n product?: IProduct<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n};\n\nexport type IGisFns<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object> = {\n query: {\n allLayerOptopns: () => Record<string, IBaseLayerOptions>;\n enabledLayerOptopns: () => Record<string, IBaseLayerOptions>;\n enabledLayerMgrs: () => Record<string, ILayerMgr>;\n };\n apply: (\n op:\n | { type: 'changeValue'; value: Partial<IGisStateAndValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>> }\n | { type: 'setLayersData'; name: string; data?: ITimingData[] }\n | { type: 'clearLayersData'; name: string },\n ) => void;\n};\n\nexport function createGisStore<LayerT, ProductTypeT, ModelTypeT, DataReqT>(\n configStore: IConfigStore<LayerT, ProductTypeT, ModelTypeT, DataReqT>,\n initState?: Partial<IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>>,\n) {\n const gisStore = createStore(\n subscribeWithSelector(\n immer<\n IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT> &\n IGisState<LayerT, ProductTypeT, ModelTypeT, DataReqT> &\n IGisFns<LayerT, ProductTypeT, ModelTypeT, DataReqT>\n >((set, get) => {\n const configStoreValue = configStore.getState();\n\n const { productConfig, layerMgrConfig } = configStoreValue;\n\n const allLayerMgrs = layerMgrConfig.params.createLayers();\n\n const allLayerKeys = Object.keys(allLayerMgrs);\n\n const { gisStoreValue, gisValue } = getInitValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>(\n configStoreValue,\n toGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>({ configStore }, initState),\n );\n\n return {\n ...gisStoreValue,\n ...gisValue,\n query: {\n allLayerOptopns: () => {\n return pick(get(), allLayerKeys) as Record<string, IBaseLayerOptions>;\n },\n enabledLayerOptopns: () => {\n const allLayerOptions = get().query.allLayerOptopns();\n return Object.keys(allLayerOptions).reduce<Record<string, IBaseLayerOptions>>((prev, key) => {\n if (allLayerOptions[key].enable) {\n prev[key] = allLayerOptions[key];\n }\n return prev;\n }, {});\n },\n enabledLayerMgrs: () => {\n const enabledLayerOptopns = get().query.enabledLayerOptopns();\n return pick(get().allLayerMgrs, Object.keys(enabledLayerOptopns));\n },\n },\n apply: op => {\n // console.info(`[GisStore Op]`, op);\n switch (op.type) {\n case 'changeValue': {\n set(state => {\n const prevState = { ...state };\n const newProductType = op.value.productType;\n const oldProductType = state.productType;\n\n Object.assign(state, op.value);\n\n // 切换产品\n if (newProductType && oldProductType !== newProductType) {\n state.product = productConfig.findProduct(newProductType);\n if (!state.product) {\n console.warn('product is undefined');\n }\n }\n });\n break;\n }\n case 'setLayersData': {\n set(state => {\n if (op.data === undefined) {\n state.layersData = omit(state.layersData as any, op.name) as any;\n } else {\n state.layersData = { ...(state.layersData as any), [op.name]: op.data };\n }\n });\n break;\n }\n }\n // console.info(`[GisStore get layersData]`, get().layersData);\n },\n };\n }),\n ),\n );\n\n return gisStore;\n}\n\nexport type IGisStore<LayerT = object, ProductTypeT = any, ModelTypeT = any, DataReqT = any> = ReturnType<\n typeof createGisStore<LayerT, ProductTypeT, ModelTypeT, DataReqT>\n>;\n",
6
+ "import { nanoid } from 'nanoid';\nimport { DEF_MAP_CONFIG } from '../config/map';\nimport { PlaySpeedByFrame, PlaySpeedByTiming } from '../config/product';\nimport { IProduct } from '../core/product';\nimport { ProductCtx } from '../types/ctx';\nimport { IReadOnlyConfigStoreValue } from './configStore';\nimport { IGisState, IGisStyleOptions, IGisValue } from './gisStore';\n\nexport function getInitValue<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object>(\n configStoreValue: IReadOnlyConfigStoreValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>,\n initState?: Partial<IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>>,\n): {\n gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n gisStoreValue: IGisState<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n} {\n const { layerMgrConfig, productConfig } = configStoreValue;\n\n const allLayerMgrs = layerMgrConfig.params.createLayers();\n\n let productType: ProductTypeT | undefined = undefined;\n let product: IProduct<LayerT, ProductTypeT, ModelTypeT, DataReqT> | undefined = undefined;\n\n if (initState?.productType) {\n productType = initState.productType;\n product = productConfig.findProduct(productType);\n }\n\n if (!product) {\n productType = productConfig.firstProduct.type;\n product = productConfig.firstProduct;\n }\n\n const gisStoreValue: IGisState<LayerT, ProductTypeT, ModelTypeT, DataReqT> = {\n mapId: nanoid(6),\n map: undefined,\n allLayerMgrs,\n mapIsLoaded: false,\n mapStateToStoreSyncing: false,\n layersData: {} as Record<keyof LayerT, any>,\n timeBarInfo: undefined,\n product,\n };\n\n const gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT> = {\n ...layerMgrConfig.getDefLayerOptions(),\n ...product.getConfig(),\n ...initState,\n productType,\n };\n\n return {\n gisValue,\n gisStoreValue,\n };\n}\n\nexport function getGisValue<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object>(\n ctx: ProductCtx<LayerT, ProductTypeT, ModelTypeT, DataReqT>,\n params?: {\n gisStyleOptions?: Partial<IGisStyleOptions>;\n layerOptions?: Partial<LayerT>;\n },\n): IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT> {\n return {\n productType: undefined,\n enableScreenshot: undefined,\n screenshot: undefined,\n mapGroup: undefined,\n ...getDefGisStyleOptions(params?.gisStyleOptions),\n ...getDefLayerOptions(ctx, params?.layerOptions),\n } as IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n}\n\nexport function getDefGisStyleOptions(params?: Partial<IGisStyleOptions>): IGisStyleOptions {\n return {\n bounds: DEF_MAP_CONFIG.bounds.china,\n playState: 'stop',\n pitch: 0,\n bearing: 0,\n showBg: true,\n showSky: false,\n disableZoom: false,\n disableMove: false,\n renderWorldCopies: true,\n boundsLockMinZoom: false,\n boundsPadding: undefined,\n zoom: 1,\n minZoom: 1,\n maxZoom: 10,\n enableMapSync: true,\n enableMapSyncTime: false,\n center: [0, 0],\n clickPoint: undefined,\n colorPaletteStyle: 'def',\n timeBarStyle: 'mini',\n currTimeStyle: 'def',\n timeInfoStyle: 'def',\n layerInfoStyle: 'def',\n showTitle: true,\n titleShowOptions: ['date', 'layerInfo'],\n playMode: 'timing',\n playSpeedByTiming: PlaySpeedByTiming.MINUTE_60,\n playSpeedByFrame: PlaySpeedByFrame.MILLISECOND_300,\n projectionType: 'mercator',\n mapBackgroundColor: '#fff',\n title: undefined,\n glIsDynamicRender: true,\n titleAlign: 'left',\n titleSize: 'middle',\n currTm: undefined,\n adcodeInfo: {},\n logoUrl: undefined,\n autoRotation: undefined,\n ...params,\n };\n}\n\nexport function getDefLayerOptions<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object>(\n ctx: ProductCtx<LayerT, ProductTypeT, ModelTypeT, DataReqT>,\n params?: Partial<LayerT>,\n): LayerT {\n return {\n ...ctx.configStore.getState().dataReqOptionsConfig.getDefOptions(),\n ...ctx.configStore.getState().layerMgrConfig.getDefLayerOptions(),\n ...params,\n } as LayerT;\n}\n",
7
+ "import { Bounds } from '../types/map';\n\nexport const DEF_MAP_CONFIG = {\n bounds: {\n china: [73.557, 10.159, 135.086, 55.561] as Bounds,\n china2: [73.557, 2.159, 135.086, 60.561] as Bounds,\n world: [-180, -85.251129, 180, 85.251129] as Bounds,\n xinan: [78.0, 21.0, 110.0, 34.0] as Bounds,\n xibei: [73.0, 31.0, 111.0, 49.0] as Bounds,\n huabei: [110.0, 34.0, 120.0, 42.0] as Bounds,\n dongbei: [118.0, 38.0, 135.0, 53.0] as Bounds,\n huanan: [104.0, 18.0, 120.0, 26.0] as Bounds,\n },\n};\n\nexport function test(): string {\n return 'test';\n}\n",
8
+ "import { Bounds } from './map';\n\nexport interface IBaseRenderVo {\n data_mercator?: ImageBitmap;\n texture_mercator?: WebGLTexture;\n bin_mercator?: ArrayBuffer;\n beginTm: number;\n endTm: number;\n bounds: Bounds;\n}\n\nexport interface ICommonRenderVo extends IBaseRenderVo {\n minVal: number;\n maxVal: number;\n}\n\nexport interface I3dRenderVo extends IBaseRenderVo {\n minVal: number;\n maxVal: number;\n size: {\n depth: number;\n width: number;\n height: number;\n };\n}\n\nexport interface IWindRenderVo extends IBaseRenderVo {\n minWindu: number;\n maxWindu: number;\n minWindv: number;\n maxWindv: number;\n}\n\nexport enum ColorRenderType {\n LINEAR = 1,\n BLOCK = 2,\n BLOCK_BY_ORIGINAL_VALUE = 3,\n GREY = 0,\n}\n\nexport enum GridDensity {\n LOOSE = 1,\n DENSE = 2,\n SUPER_DENSE = 3,\n}\n",
9
+ "import { ColorRenderType, GridDensity } from './gl';\nimport { BasemapType } from './map';\nimport { WeatherLevelType } from './product';\n\n/**\n * 基础层\n */\nexport interface IBaseLayerOptions {\n enable: boolean;\n isAnimation?: boolean;\n}\n\n/**\n * 底图\n */\nexport interface IBasemapLayerOptions extends IBaseLayerOptions {\n type?: BasemapType;\n enablePlaceNames?: boolean;\n enableNationalBoundary?: boolean;\n}\n\n/**\n * 城市\n */\nexport interface ICityLayerOptions extends IBaseLayerOptions {\n enableBoundary?: boolean;\n enableNames?: boolean;\n enableLevel1Area?: boolean;\n enableLevel2Area?: boolean;\n lineColor?: string;\n fillColor?: string;\n}\n\n/**\n * 中国区域边界层\n */\nexport interface IChinaLayerOptions extends IBaseLayerOptions {\n enableLine?: boolean;\n enableFill?: boolean;\n enablePoint?: boolean;\n enableCapitalNames?: boolean;\n lineColor?: string;\n lineWidth?: number;\n fillColor?: string;\n hoverFillColor?: string;\n selectedFillColor?: string;\n}\n\nexport interface IMaskLayerOptions extends IBaseLayerOptions {}\n\n/**\n * 地形\n */\nexport interface IDemLayerOptions extends IBaseLayerOptions {\n terrain_type?: '2d' | '3d';\n terrain_style?: 'vector' | 'raster';\n show_terrain_contour?: boolean;\n show_terrain_contourValue?: boolean;\n}\n\n/**\n * 颜色\n */\nexport interface IColorRenderOptions extends IBaseLayerOptions, IGridValueRenderOptions {\n enableColor?: boolean;\n colorRenderType?: ColorRenderType;\n isBicubic?: boolean;\n enableGridValue?: boolean;\n}\n\n/**\n * Wind网格\n */\nexport interface IGridWindRenderOptions {\n gridDensity?: GridDensity;\n gridType?: 'WindBarb' | 'WindArrow' | 'WindSpeedValue';\n iconColor?: string;\n iconOpacity?: number;\n largeValue?: number;\n largeValueIconColor?: string;\n iconSize?: GridRenderIconSize;\n filterValue?: number;\n}\n\n/**\n * Value网格\n */\nexport interface IGridValueRenderOptions {\n valueGridDensity?: GridDensity;\n valueGridFilterValue?: number;\n fontSize?: number;\n fontColor?: string;\n fontHaloColor?: string;\n decimalPlaces?: number; // 小数点后显示几位(0-3),0表示不显示小数点\n maxCharCount?: number; // 最大字符数\n roundWhenNoDecimal?: boolean; // 不显示小数点时是否四舍五入(默认false,直接截断)\n halo?: number;\n highlightColor?: string;\n highlightValue?: number;\n valueScale?: number;\n}\n\n/**\n * 风\n */\nexport interface IWindLayerOptiions extends IBaseLayerOptions, IGridWindRenderOptions, IColorRenderOptions {\n enableParticle?: boolean;\n enableGrid?: boolean;\n level?: WeatherLevelType;\n factorCode?: 'WINDS' | 'WINDS_10M' | 'WINDS_100M';\n colorConfig?: 'WINDS_10M' | 'WINDS_STRONG' | 'WINDS_GUST';\n}\n\n/**\n * 气压\n */\nexport interface IGphLayerOptions extends IBaseLayerOptions {\n enableColor?: boolean;\n enableContour?: boolean;\n enableContourValue?: boolean;\n level?: WeatherLevelType;\n contourInterval?: number;\n contourColor?: string;\n contourLineWidth?: number;\n highlightColor?: string;\n highlightValue?: number;\n highlightLineWidth?: number;\n}\n\nexport enum GridRenderIconSize {\n SMALL = 24,\n MEDIUM = 27,\n LARGE = 30,\n}\n",
10
+ "import { GridDensity } from '../types/gl';\nimport { GridRenderIconSize } from '../types/layerOptions';\nimport { BasemapType, ProjectionType } from '../types/map';\nimport { WeatherLevelType } from '../types/product';\n\n// 层高\nexport const LEVELS: WeatherLevelType[] = [200, 500, 700, 850, 925, 1000];\n\n// 底图类型\nexport const BASEMAP_TYPES: { type: BasemapType; name: string }[] = [\n {\n type: 'tdt_vec',\n name: '街道',\n },\n {\n type: 'windy',\n name: '透明叠加',\n },\n {\n type: 'maptiler-dataviz',\n name: '新底图',\n },\n // {\n // type: 'tdt_img',\n // name: '卫星',\n // },\n];\n\nexport enum PlaySpeedByTiming {\n MINUTE_30 = 30 * 60,\n MINUTE_60 = 60 * 60,\n MINUTE_120 = 120 * 60,\n}\n\nexport enum PlaySpeedByFrame {\n MILLISECOND_1000 = 1000,\n MILLISECOND_500 = 500,\n MILLISECOND_300 = 300,\n MILLISECOND_100 = 100,\n MILLISECOND_50 = 50,\n MILLISECOND_30 = 30,\n}\n\nexport const LEVEL_MAP_HIGHLIGHT_VALUE: Record<WeatherLevelType, number> = {\n 200: 1260,\n 300: 900,\n // 400: 0,\n 500: 588,\n 700: 316,\n // 800: 180,\n 850: 144,\n // 900: 90,\n 925: 0,\n // 950: 0,\n 1000: 10,\n};\n\nexport type TitleAlign = 'left' | 'center' | 'right';\n\nexport type TitleSize = 'large' | 'middle' | 'small';\n\n// 投影类型\nexport const PROJECTION_TYPES: { label: string; value: ProjectionType }[] = [\n { label: '二维平面', value: 'mercator' },\n { label: '三维球形', value: 'globe' },\n];\n\n// 网格密度\nexport const GRID_DENSITY_TYPES = [\n { label: '宽松', value: GridDensity.LOOSE },\n { label: '较密', value: GridDensity.DENSE },\n { label: '超密', value: GridDensity.SUPER_DENSE },\n];\n\n// 风矢图标的颜色\nexport const DEF_WIND_ICON_COLOR: string = '#9E00FF';\n\n// 大风图标的颜色\nexport const DEF_WIND_LARGE_VALUE_ICON_COLOR: string = '#FF0000';\n\n// 默认的省界线颜色\nexport const DEF_CHINA_LAYER_LINE_COLOR: string = '#999';\n\n// 大风风速的大小\nexport const DEF_WIND_LARGE_VALUE: number = 14;\n\n// 风矢图标的大小选项\nexport const GRID_ICON_SIZE_OPTIONS: { label: string; value: GridRenderIconSize }[] = [\n { label: '大', value: GridRenderIconSize.LARGE },\n { label: '中', value: GridRenderIconSize.MEDIUM },\n { label: '小', value: GridRenderIconSize.SMALL },\n];\n",
11
+ "import { pick } from 'lodash-es';\nimport { ProductCtx } from '../types/ctx';\nimport { getGisValue } from './defValue';\nimport { IGisStateAndValue, IGisValue } from './gisStore';\n\nexport function toGisValue<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object>(\n ctx: ProductCtx<LayerT, ProductTypeT, ModelTypeT, DataReqT>,\n from?:\n | IGisStateAndValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>\n | Partial<IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>>,\n): IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT> {\n const res = pick(from, Object.keys(getGisValue(ctx))) as IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n return res;\n}\n",
12
+ "import { subscribeWithSelector } from 'zustand/middleware';\nimport { immer } from 'zustand/middleware/immer';\nimport { createStore } from 'zustand/vanilla';\nimport { ICityConfig, IDataFetchConfig, IDataReqOptionsConfig, ILayerMgrConfig, IProductConfig } from '../interfaces';\n\nexport interface IEnvConfig {\n TILES_DEM_URL: string;\n TILES_TDT_IBO_URL: string;\n TILES_TDT_CVA_URL: string;\n TILES_TDT_VEC_URL: string;\n TILES_TDT_IMG_URL: string;\n TILES_WINDY_URL: string;\n TILES_MAPTILER_DATAVIZ_URL: string;\n}\n\nexport interface IReadOnlyConfigStoreValue<LayerT, ProductTypeT, ModelTypeT, DataReqT> {\n envConfig: IEnvConfig;\n productConfig: IProductConfig<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n dataFetchConfig: IDataFetchConfig;\n layerMgrConfig: ILayerMgrConfig;\n dataReqOptionsConfig: IDataReqOptionsConfig;\n cityConfig?: ICityConfig;\n}\n\nexport interface IConfigStoreState<LayerT, ProductTypeT, ModelTypeT, DataReqT> extends IReadOnlyConfigStoreValue<\n LayerT,\n ProductTypeT,\n ModelTypeT,\n DataReqT\n> {\n initCtx: () => void;\n}\n\n// export function createConfigStore<LayerT, ProductTypeT, ModelTypeT, DataReqT>(\n// initState: IReadOnlyConfigStoreValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>,\n// ) {\n// // const immerFns = immer as (...args: Parameters<typeof immer>) => any;\n\n// return createStore(\n// subscribeWithSelector<IConfigStoreState<LayerT, ProductTypeT, ModelTypeT, DataReqT>>((set, get, store) => {\n// return {\n// ...initState,\n// initCtx: () => {\n// initState.productConfig.initCtx({ configStore: store as any });\n// },\n// };\n// }),\n// );\n// }\n\n// export type IConfigStore<LayerT = object, ProductTypeT = any, ModelTypeT = any, DataReqT = any> = ReturnType<\n// typeof createConfigStore<LayerT, ProductTypeT, ModelTypeT, DataReqT>\n// >;\n\nexport function createConfigStore<LayerT, ProductTypeT, ModelTypeT, DataReqT>(\n initState: IReadOnlyConfigStoreValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>,\n) {\n return createStore(\n subscribeWithSelector(\n immer<IConfigStoreState<LayerT, ProductTypeT, ModelTypeT, DataReqT>>((set, get, store) => {\n return {\n ...initState,\n initCtx: () => {\n initState.productConfig.initCtx({ configStore: store });\n },\n };\n }),\n ),\n ) as any;\n}\n\nexport type IConfigStore<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object> = ReturnType<\n typeof createConfigStore<LayerT, ProductTypeT, ModelTypeT, DataReqT>\n>;\n",
13
+ "import { subscribeWithSelector } from 'zustand/middleware';\nimport { immer } from 'zustand/middleware/immer';\nimport { createStore } from 'zustand/vanilla';\n\nexport interface IMultiMapStatusValue {\n mapStateToStoreSyncing: boolean;\n}\n\nexport interface IMultiMapStatusStoreState extends IMultiMapStatusValue {\n apply: (op: { type: 'changeValue'; value: Partial<IMultiMapStatusValue> }) => void;\n}\n\nexport function createMultiMapStatusStore() {\n return createStore(\n subscribeWithSelector(\n immer<IMultiMapStatusStoreState>(set => {\n return {\n mapStateToStoreSyncing: false,\n apply: op => {\n switch (op.type) {\n case 'changeValue': {\n set(op.value);\n break;\n }\n }\n },\n };\n }),\n ),\n );\n}\n\nexport type IMultiMapStatusStore = ReturnType<typeof createMultiMapStatusStore>;\n",
14
+ "/**\n * Take input from [0, n] and return it as [0, 1]\n * @hidden\n */\nexport function bound01(n, max) {\n if (isOnePointZero(n)) {\n n = '100%';\n }\n const isPercent = isPercentage(n);\n n = max === 360 ? n : Math.min(max, Math.max(0, parseFloat(n)));\n // Automatically convert percentage into number\n if (isPercent) {\n n = parseInt(String(n * max), 10) / 100;\n }\n // Handle floating point rounding errors\n if (Math.abs(n - max) < 0.000001) {\n return 1;\n }\n // Convert into [0, 1] range if it isn't already\n if (max === 360) {\n // If n is a hue given in degrees,\n // wrap around out-of-range values into [0, 360] range\n // then convert into [0, 1].\n n = (n < 0 ? (n % max) + max : n % max) / parseFloat(String(max));\n }\n else {\n // If n not a hue given in degrees\n // Convert into [0, 1] range if it isn't already.\n n = (n % max) / parseFloat(String(max));\n }\n return n;\n}\n/**\n * Force a number between 0 and 1\n * @hidden\n */\nexport function clamp01(val) {\n return Math.min(1, Math.max(0, val));\n}\n/**\n * Need to handle 1.0 as 100%, since once it is a number, there is no difference between it and 1\n * <http://stackoverflow.com/questions/7422072/javascript-how-to-detect-number-as-a-decimal-including-1-0>\n * @hidden\n */\nexport function isOnePointZero(n) {\n return typeof n === 'string' && n.indexOf('.') !== -1 && parseFloat(n) === 1;\n}\n/**\n * Check to see if string passed in is a percentage\n * @hidden\n */\nexport function isPercentage(n) {\n return typeof n === 'string' && n.indexOf('%') !== -1;\n}\n/**\n * Return a valid alpha value [0,1] with all invalid values being set to 1\n * @hidden\n */\nexport function boundAlpha(a) {\n a = parseFloat(a);\n if (isNaN(a) || a < 0 || a > 1) {\n a = 1;\n }\n return a;\n}\n/**\n * Replace a decimal with it's percentage value\n * @hidden\n */\nexport function convertToPercentage(n) {\n if (Number(n) <= 1) {\n return `${Number(n) * 100}%`;\n }\n return n;\n}\n/**\n * Force a hex value to have 2 characters\n * @hidden\n */\nexport function pad2(c) {\n return c.length === 1 ? '0' + c : String(c);\n}\n",
15
+ "import { bound01, pad2 } from './util.js';\n// `rgbToHsl`, `rgbToHsv`, `hslToRgb`, `hsvToRgb` modified from:\n// <http://mjijackson.com/2008/02/rgb-to-hsl-and-rgb-to-hsv-color-model-conversion-algorithms-in-javascript>\n/**\n * Handle bounds / percentage checking to conform to CSS color spec\n * <http://www.w3.org/TR/css3-color/>\n * *Assumes:* r, g, b in [0, 255] or [0, 1]\n * *Returns:* { r, g, b } in [0, 255]\n */\nexport function rgbToRgb(r, g, b) {\n return {\n r: bound01(r, 255) * 255,\n g: bound01(g, 255) * 255,\n b: bound01(b, 255) * 255,\n };\n}\n/**\n * Converts an RGB color value to HSL.\n * *Assumes:* r, g, and b are contained in [0, 255] or [0, 1]\n * *Returns:* { h, s, l } in [0,1]\n */\nexport function rgbToHsl(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n let s = 0;\n const l = (max + min) / 2;\n if (max === min) {\n s = 0;\n h = 0; // achromatic\n }\n else {\n const d = max - min;\n s = l > 0.5 ? d / (2 - max - min) : d / (max + min);\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h, s, l };\n}\nfunction hue2rgb(p, q, t) {\n if (t < 0) {\n t += 1;\n }\n if (t > 1) {\n t -= 1;\n }\n if (t < 1 / 6) {\n return p + (q - p) * (6 * t);\n }\n if (t < 1 / 2) {\n return q;\n }\n if (t < 2 / 3) {\n return p + (q - p) * (2 / 3 - t) * 6;\n }\n return p;\n}\n/**\n * Converts an HSL color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and l are contained [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hslToRgb(h, s, l) {\n let r;\n let g;\n let b;\n h = bound01(h, 360);\n s = bound01(s, 100);\n l = bound01(l, 100);\n if (s === 0) {\n // achromatic\n g = l;\n b = l;\n r = l;\n }\n else {\n const q = l < 0.5 ? l * (1 + s) : l + s - l * s;\n const p = 2 * l - q;\n r = hue2rgb(p, q, h + 1 / 3);\n g = hue2rgb(p, q, h);\n b = hue2rgb(p, q, h - 1 / 3);\n }\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color value to HSV\n *\n * *Assumes:* r, g, and b are contained in the set [0, 255] or [0, 1]\n * *Returns:* { h, s, v } in [0,1]\n */\nexport function rgbToHsv(r, g, b) {\n r = bound01(r, 255);\n g = bound01(g, 255);\n b = bound01(b, 255);\n const max = Math.max(r, g, b);\n const min = Math.min(r, g, b);\n let h = 0;\n const v = max;\n const d = max - min;\n const s = max === 0 ? 0 : d / max;\n if (max === min) {\n h = 0; // achromatic\n }\n else {\n switch (max) {\n case r:\n h = (g - b) / d + (g < b ? 6 : 0);\n break;\n case g:\n h = (b - r) / d + 2;\n break;\n case b:\n h = (r - g) / d + 4;\n break;\n default:\n break;\n }\n h /= 6;\n }\n return { h, s, v };\n}\n/**\n * Converts an HSV color value to RGB.\n *\n * *Assumes:* h is contained in [0, 1] or [0, 360] and s and v are contained in [0, 1] or [0, 100]\n * *Returns:* { r, g, b } in the set [0, 255]\n */\nexport function hsvToRgb(h, s, v) {\n h = bound01(h, 360) * 6;\n s = bound01(s, 100);\n v = bound01(v, 100);\n const i = Math.floor(h);\n const f = h - i;\n const p = v * (1 - s);\n const q = v * (1 - f * s);\n const t = v * (1 - (1 - f) * s);\n const mod = i % 6;\n const r = [v, q, p, p, t, v][mod];\n const g = [t, v, v, q, p, p][mod];\n const b = [p, p, t, v, v, q][mod];\n return { r: r * 255, g: g * 255, b: b * 255 };\n}\n/**\n * Converts an RGB color to hex\n *\n * *Assumes:* r, g, and b are contained in the set [0, 255]\n * *Returns:* a 3 or 6 character hex\n */\nexport function rgbToHex(r, g, b, allow3Char) {\n const hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n // Return a 3 character hex if possible\n if (allow3Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color plus alpha transparency to hex\n *\n * *Assumes:* r, g, b are contained in the set [0, 255] and a in [0, 1]\n * *Returns:* a 4 or 8 character rgba hex\n */\n// eslint-disable-next-line max-params\nexport function rgbaToHex(r, g, b, a, allow4Char) {\n const hex = [\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n pad2(convertDecimalToHex(a)),\n ];\n // Return a 4 character hex if possible\n if (allow4Char &&\n hex[0].startsWith(hex[0].charAt(1)) &&\n hex[1].startsWith(hex[1].charAt(1)) &&\n hex[2].startsWith(hex[2].charAt(1)) &&\n hex[3].startsWith(hex[3].charAt(1))) {\n return hex[0].charAt(0) + hex[1].charAt(0) + hex[2].charAt(0) + hex[3].charAt(0);\n }\n return hex.join('');\n}\n/**\n * Converts an RGBA color to an ARGB Hex8 string\n * Rarely used, but required for \"toFilter()\"\n *\n * *Assumes:* r, g, b are contained in the set [0, 255] and a in [0, 1]\n * *Returns:* a 8 character argb hex\n */\nexport function rgbaToArgbHex(r, g, b, a) {\n const hex = [\n pad2(convertDecimalToHex(a)),\n pad2(Math.round(r).toString(16)),\n pad2(Math.round(g).toString(16)),\n pad2(Math.round(b).toString(16)),\n ];\n return hex.join('');\n}\n/**\n * Converts CMYK to RBG\n * Assumes c, m, y, k are in the set [0, 100]\n */\nexport function cmykToRgb(c, m, y, k) {\n const cConv = c / 100;\n const mConv = m / 100;\n const yConv = y / 100;\n const kConv = k / 100;\n const r = 255 * (1 - cConv) * (1 - kConv);\n const g = 255 * (1 - mConv) * (1 - kConv);\n const b = 255 * (1 - yConv) * (1 - kConv);\n return { r, g, b };\n}\nexport function rgbToCmyk(r, g, b) {\n let c = 1 - r / 255;\n let m = 1 - g / 255;\n let y = 1 - b / 255;\n let k = Math.min(c, m, y);\n if (k === 1) {\n c = 0;\n m = 0;\n y = 0;\n }\n else {\n c = ((c - k) / (1 - k)) * 100;\n m = ((m - k) / (1 - k)) * 100;\n y = ((y - k) / (1 - k)) * 100;\n }\n k *= 100;\n return {\n c: Math.round(c),\n m: Math.round(m),\n y: Math.round(y),\n k: Math.round(k),\n };\n}\n/** Converts a decimal to a hex value */\nexport function convertDecimalToHex(d) {\n return Math.round(parseFloat(d) * 255).toString(16);\n}\n/** Converts a hex value to a decimal */\nexport function convertHexToDecimal(h) {\n return parseIntFromHex(h) / 255;\n}\n/** Parse a base-16 hex value into a base-10 integer */\nexport function parseIntFromHex(val) {\n return parseInt(val, 16);\n}\nexport function numberInputToObject(color) {\n return {\n r: color >> 16,\n g: (color & 0xff00) >> 8,\n b: color & 0xff,\n };\n}\n",
16
+ "// https://github.com/bahamas10/css-color-names/blob/master/css-color-names.json\n/**\n * @hidden\n */\nexport const names = {\n aliceblue: '#f0f8ff',\n antiquewhite: '#faebd7',\n aqua: '#00ffff',\n aquamarine: '#7fffd4',\n azure: '#f0ffff',\n beige: '#f5f5dc',\n bisque: '#ffe4c4',\n black: '#000000',\n blanchedalmond: '#ffebcd',\n blue: '#0000ff',\n blueviolet: '#8a2be2',\n brown: '#a52a2a',\n burlywood: '#deb887',\n cadetblue: '#5f9ea0',\n chartreuse: '#7fff00',\n chocolate: '#d2691e',\n coral: '#ff7f50',\n cornflowerblue: '#6495ed',\n cornsilk: '#fff8dc',\n crimson: '#dc143c',\n cyan: '#00ffff',\n darkblue: '#00008b',\n darkcyan: '#008b8b',\n darkgoldenrod: '#b8860b',\n darkgray: '#a9a9a9',\n darkgreen: '#006400',\n darkgrey: '#a9a9a9',\n darkkhaki: '#bdb76b',\n darkmagenta: '#8b008b',\n darkolivegreen: '#556b2f',\n darkorange: '#ff8c00',\n darkorchid: '#9932cc',\n darkred: '#8b0000',\n darksalmon: '#e9967a',\n darkseagreen: '#8fbc8f',\n darkslateblue: '#483d8b',\n darkslategray: '#2f4f4f',\n darkslategrey: '#2f4f4f',\n darkturquoise: '#00ced1',\n darkviolet: '#9400d3',\n deeppink: '#ff1493',\n deepskyblue: '#00bfff',\n dimgray: '#696969',\n dimgrey: '#696969',\n dodgerblue: '#1e90ff',\n firebrick: '#b22222',\n floralwhite: '#fffaf0',\n forestgreen: '#228b22',\n fuchsia: '#ff00ff',\n gainsboro: '#dcdcdc',\n ghostwhite: '#f8f8ff',\n goldenrod: '#daa520',\n gold: '#ffd700',\n gray: '#808080',\n green: '#008000',\n greenyellow: '#adff2f',\n grey: '#808080',\n honeydew: '#f0fff0',\n hotpink: '#ff69b4',\n indianred: '#cd5c5c',\n indigo: '#4b0082',\n ivory: '#fffff0',\n khaki: '#f0e68c',\n lavenderblush: '#fff0f5',\n lavender: '#e6e6fa',\n lawngreen: '#7cfc00',\n lemonchiffon: '#fffacd',\n lightblue: '#add8e6',\n lightcoral: '#f08080',\n lightcyan: '#e0ffff',\n lightgoldenrodyellow: '#fafad2',\n lightgray: '#d3d3d3',\n lightgreen: '#90ee90',\n lightgrey: '#d3d3d3',\n lightpink: '#ffb6c1',\n lightsalmon: '#ffa07a',\n lightseagreen: '#20b2aa',\n lightskyblue: '#87cefa',\n lightslategray: '#778899',\n lightslategrey: '#778899',\n lightsteelblue: '#b0c4de',\n lightyellow: '#ffffe0',\n lime: '#00ff00',\n limegreen: '#32cd32',\n linen: '#faf0e6',\n magenta: '#ff00ff',\n maroon: '#800000',\n mediumaquamarine: '#66cdaa',\n mediumblue: '#0000cd',\n mediumorchid: '#ba55d3',\n mediumpurple: '#9370db',\n mediumseagreen: '#3cb371',\n mediumslateblue: '#7b68ee',\n mediumspringgreen: '#00fa9a',\n mediumturquoise: '#48d1cc',\n mediumvioletred: '#c71585',\n midnightblue: '#191970',\n mintcream: '#f5fffa',\n mistyrose: '#ffe4e1',\n moccasin: '#ffe4b5',\n navajowhite: '#ffdead',\n navy: '#000080',\n oldlace: '#fdf5e6',\n olive: '#808000',\n olivedrab: '#6b8e23',\n orange: '#ffa500',\n orangered: '#ff4500',\n orchid: '#da70d6',\n palegoldenrod: '#eee8aa',\n palegreen: '#98fb98',\n paleturquoise: '#afeeee',\n palevioletred: '#db7093',\n papayawhip: '#ffefd5',\n peachpuff: '#ffdab9',\n peru: '#cd853f',\n pink: '#ffc0cb',\n plum: '#dda0dd',\n powderblue: '#b0e0e6',\n purple: '#800080',\n rebeccapurple: '#663399',\n red: '#ff0000',\n rosybrown: '#bc8f8f',\n royalblue: '#4169e1',\n saddlebrown: '#8b4513',\n salmon: '#fa8072',\n sandybrown: '#f4a460',\n seagreen: '#2e8b57',\n seashell: '#fff5ee',\n sienna: '#a0522d',\n silver: '#c0c0c0',\n skyblue: '#87ceeb',\n slateblue: '#6a5acd',\n slategray: '#708090',\n slategrey: '#708090',\n snow: '#fffafa',\n springgreen: '#00ff7f',\n steelblue: '#4682b4',\n tan: '#d2b48c',\n teal: '#008080',\n thistle: '#d8bfd8',\n tomato: '#ff6347',\n turquoise: '#40e0d0',\n violet: '#ee82ee',\n wheat: '#f5deb3',\n white: '#ffffff',\n whitesmoke: '#f5f5f5',\n yellow: '#ffff00',\n yellowgreen: '#9acd32',\n};\n",
17
+ "import { cmykToRgb, convertHexToDecimal, hslToRgb, hsvToRgb, parseIntFromHex, rgbToRgb, } from './conversion.js';\nimport { names } from './css-color-names.js';\nimport { boundAlpha, convertToPercentage } from './util.js';\n/**\n * Given a string or object, convert that input to RGB\n *\n * Possible string inputs:\n * ```\n * \"red\"\n * \"#f00\" or \"f00\"\n * \"#ff0000\" or \"ff0000\"\n * \"#ff000000\" or \"ff000000\"\n * \"rgb 255 0 0\" or \"rgb (255, 0, 0)\"\n * \"rgb 1.0 0 0\" or \"rgb (1, 0, 0)\"\n * \"rgba (255, 0, 0, 1)\" or \"rgba 255, 0, 0, 1\"\n * \"rgba (1.0, 0, 0, 1)\" or \"rgba 1.0, 0, 0, 1\"\n * \"hsl(0, 100%, 50%)\" or \"hsl 0 100% 50%\"\n * \"hsla(0, 100%, 50%, 1)\" or \"hsla 0 100% 50%, 1\"\n * \"hsv(0, 100%, 100%)\" or \"hsv 0 100% 100%\"\n * \"cmyk(0, 20, 0, 0)\" or \"cmyk 0 20 0 0\"\n * ```\n */\nexport function inputToRGB(color) {\n let rgb = { r: 0, g: 0, b: 0 };\n let a = 1;\n let s = null;\n let v = null;\n let l = null;\n let ok = false;\n let format = false;\n if (typeof color === 'string') {\n color = stringInputToObject(color);\n }\n if (typeof color === 'object') {\n if (isValidCSSUnit(color.r) && isValidCSSUnit(color.g) && isValidCSSUnit(color.b)) {\n rgb = rgbToRgb(color.r, color.g, color.b);\n ok = true;\n format = String(color.r).substr(-1) === '%' ? 'prgb' : 'rgb';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.v)) {\n s = convertToPercentage(color.s);\n v = convertToPercentage(color.v);\n rgb = hsvToRgb(color.h, s, v);\n ok = true;\n format = 'hsv';\n }\n else if (isValidCSSUnit(color.h) && isValidCSSUnit(color.s) && isValidCSSUnit(color.l)) {\n s = convertToPercentage(color.s);\n l = convertToPercentage(color.l);\n rgb = hslToRgb(color.h, s, l);\n ok = true;\n format = 'hsl';\n }\n else if (isValidCSSUnit(color.c) &&\n isValidCSSUnit(color.m) &&\n isValidCSSUnit(color.y) &&\n isValidCSSUnit(color.k)) {\n rgb = cmykToRgb(color.c, color.m, color.y, color.k);\n ok = true;\n format = 'cmyk';\n }\n if (Object.prototype.hasOwnProperty.call(color, 'a')) {\n a = color.a;\n }\n }\n a = boundAlpha(a);\n return {\n ok,\n format: color.format || format,\n r: Math.min(255, Math.max(rgb.r, 0)),\n g: Math.min(255, Math.max(rgb.g, 0)),\n b: Math.min(255, Math.max(rgb.b, 0)),\n a,\n };\n}\n// <http://www.w3.org/TR/css3-values/#integers>\nconst CSS_INTEGER = '[-\\\\+]?\\\\d+%?';\n// <http://www.w3.org/TR/css3-values/#number-value>\nconst CSS_NUMBER = '[-\\\\+]?\\\\d*\\\\.\\\\d+%?';\n// Allow positive/negative integer/number. Don't capture the either/or, just the entire outcome.\nconst CSS_UNIT = '(?:' + CSS_NUMBER + ')|(?:' + CSS_INTEGER + ')';\n// Actual matching.\n// Parentheses and commas are optional, but not required.\n// Whitespace can take the place of commas or opening paren\n// eslint-disable-next-line prettier/prettier\nconst PERMISSIVE_MATCH3 = '[\\\\s|\\\\(]+(' + CSS_UNIT + ')[,|\\\\s]+(' + CSS_UNIT + ')[,|\\\\s]+(' + CSS_UNIT + ')\\\\s*\\\\)?';\nconst PERMISSIVE_MATCH4 = \n// eslint-disable-next-line prettier/prettier\n'[\\\\s|\\\\(]+(' + CSS_UNIT + ')[,|\\\\s]+(' + CSS_UNIT + ')[,|\\\\s]+(' + CSS_UNIT + ')[,|\\\\s]+(' + CSS_UNIT + ')\\\\s*\\\\)?';\nconst matchers = {\n CSS_UNIT: new RegExp(CSS_UNIT),\n rgb: new RegExp('rgb' + PERMISSIVE_MATCH3),\n rgba: new RegExp('rgba' + PERMISSIVE_MATCH4),\n hsl: new RegExp('hsl' + PERMISSIVE_MATCH3),\n hsla: new RegExp('hsla' + PERMISSIVE_MATCH4),\n hsv: new RegExp('hsv' + PERMISSIVE_MATCH3),\n hsva: new RegExp('hsva' + PERMISSIVE_MATCH4),\n cmyk: new RegExp('cmyk' + PERMISSIVE_MATCH4),\n hex3: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex6: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n hex4: /^#?([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})([0-9a-fA-F]{1})$/,\n hex8: /^#?([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})([0-9a-fA-F]{2})$/,\n};\n/**\n * Permissive string parsing. Take in a number of formats, and output an object\n * based on detected format. Returns `{ r, g, b }` or `{ h, s, l }` or `{ h, s, v}` or `{c, m, y, k}` or `{c, m, y, k, a}`\n */\nexport function stringInputToObject(color) {\n color = color.trim().toLowerCase();\n if (color.length === 0) {\n return false;\n }\n let named = false;\n if (names[color]) {\n color = names[color];\n named = true;\n }\n else if (color === 'transparent') {\n return { r: 0, g: 0, b: 0, a: 0, format: 'name' };\n }\n // Try to match string input using regular expressions.\n // Keep most of the number bounding out of this function - don't worry about [0,1] or [0,100] or [0,360]\n // Just return an object and let the conversion functions handle that.\n // This way the result will be the same whether the tinycolor is initialized with string or object.\n let match = matchers.rgb.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3] };\n }\n match = matchers.rgba.exec(color);\n if (match) {\n return { r: match[1], g: match[2], b: match[3], a: match[4] };\n }\n match = matchers.hsl.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3] };\n }\n match = matchers.hsla.exec(color);\n if (match) {\n return { h: match[1], s: match[2], l: match[3], a: match[4] };\n }\n match = matchers.hsv.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3] };\n }\n match = matchers.hsva.exec(color);\n if (match) {\n return { h: match[1], s: match[2], v: match[3], a: match[4] };\n }\n match = matchers.cmyk.exec(color);\n if (match) {\n return {\n c: match[1],\n m: match[2],\n y: match[3],\n k: match[4],\n };\n }\n match = matchers.hex8.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n a: convertHexToDecimal(match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex6.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1]),\n g: parseIntFromHex(match[2]),\n b: parseIntFromHex(match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n match = matchers.hex4.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n a: convertHexToDecimal(match[4] + match[4]),\n format: named ? 'name' : 'hex8',\n };\n }\n match = matchers.hex3.exec(color);\n if (match) {\n return {\n r: parseIntFromHex(match[1] + match[1]),\n g: parseIntFromHex(match[2] + match[2]),\n b: parseIntFromHex(match[3] + match[3]),\n format: named ? 'name' : 'hex',\n };\n }\n return false;\n}\n/**\n * Check to see if it looks like a CSS unit\n * (see `matchers` above for definition).\n */\nexport function isValidCSSUnit(color) {\n if (typeof color === 'number') {\n return !Number.isNaN(color);\n }\n return matchers.CSS_UNIT.test(color);\n}\n",
18
+ "import { numberInputToObject, rgbaToHex, rgbToCmyk, rgbToHex, rgbToHsl, rgbToHsv, } from './conversion.js';\nimport { names } from './css-color-names.js';\nimport { inputToRGB } from './format-input.js';\nimport { bound01, boundAlpha, clamp01 } from './util.js';\nexport class TinyColor {\n constructor(color = '', opts = {}) {\n // If input is already a tinycolor, return itself\n if (color instanceof TinyColor) {\n // eslint-disable-next-line no-constructor-return\n return color;\n }\n if (typeof color === 'number') {\n color = numberInputToObject(color);\n }\n this.originalInput = color;\n const rgb = inputToRGB(color);\n this.originalInput = color;\n this.r = rgb.r;\n this.g = rgb.g;\n this.b = rgb.b;\n this.a = rgb.a;\n this.roundA = Math.round(100 * this.a) / 100;\n this.format = opts.format ?? rgb.format;\n this.gradientType = opts.gradientType;\n // Don't let the range of [0,255] come back in [0,1].\n // Potentially lose a little bit of precision here, but will fix issues where\n // .5 gets interpreted as half of the total, instead of half of 1\n // If it was supposed to be 128, this was already taken care of by `inputToRgb`\n if (this.r < 1) {\n this.r = Math.round(this.r);\n }\n if (this.g < 1) {\n this.g = Math.round(this.g);\n }\n if (this.b < 1) {\n this.b = Math.round(this.b);\n }\n this.isValid = rgb.ok;\n }\n isDark() {\n return this.getBrightness() < 128;\n }\n isLight() {\n return !this.isDark();\n }\n /**\n * Returns the perceived brightness of the color, from 0-255.\n */\n getBrightness() {\n // http://www.w3.org/TR/AERT#color-contrast\n const rgb = this.toRgb();\n return (rgb.r * 299 + rgb.g * 587 + rgb.b * 114) / 1000;\n }\n /**\n * Returns the perceived luminance of a color, from 0-1.\n */\n getLuminance() {\n // http://www.w3.org/TR/2008/REC-WCAG20-20081211/#relativeluminancedef\n const rgb = this.toRgb();\n let R;\n let G;\n let B;\n const RsRGB = rgb.r / 255;\n const GsRGB = rgb.g / 255;\n const BsRGB = rgb.b / 255;\n if (RsRGB <= 0.03928) {\n R = RsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n R = Math.pow((RsRGB + 0.055) / 1.055, 2.4);\n }\n if (GsRGB <= 0.03928) {\n G = GsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n G = Math.pow((GsRGB + 0.055) / 1.055, 2.4);\n }\n if (BsRGB <= 0.03928) {\n B = BsRGB / 12.92;\n }\n else {\n // eslint-disable-next-line prefer-exponentiation-operator\n B = Math.pow((BsRGB + 0.055) / 1.055, 2.4);\n }\n return 0.2126 * R + 0.7152 * G + 0.0722 * B;\n }\n /**\n * Returns the alpha value of a color, from 0-1.\n */\n getAlpha() {\n return this.a;\n }\n /**\n * Sets the alpha value on the current color.\n *\n * @param alpha - The new alpha value. The accepted range is 0-1.\n */\n setAlpha(alpha) {\n this.a = boundAlpha(alpha);\n this.roundA = Math.round(100 * this.a) / 100;\n return this;\n }\n /**\n * Returns whether the color is monochrome.\n */\n isMonochrome() {\n const { s } = this.toHsl();\n return s === 0;\n }\n /**\n * Returns the object as a HSVA object.\n */\n toHsv() {\n const hsv = rgbToHsv(this.r, this.g, this.b);\n return { h: hsv.h * 360, s: hsv.s, v: hsv.v, a: this.a };\n }\n /**\n * Returns the hsva values interpolated into a string with the following format:\n * \"hsva(xxx, xxx, xxx, xx)\".\n */\n toHsvString() {\n const hsv = rgbToHsv(this.r, this.g, this.b);\n const h = Math.round(hsv.h * 360);\n const s = Math.round(hsv.s * 100);\n const v = Math.round(hsv.v * 100);\n return this.a === 1 ? `hsv(${h}, ${s}%, ${v}%)` : `hsva(${h}, ${s}%, ${v}%, ${this.roundA})`;\n }\n /**\n * Returns the object as a HSLA object.\n */\n toHsl() {\n const hsl = rgbToHsl(this.r, this.g, this.b);\n return { h: hsl.h * 360, s: hsl.s, l: hsl.l, a: this.a };\n }\n /**\n * Returns the hsla values interpolated into a string with the following format:\n * \"hsla(xxx, xxx, xxx, xx)\".\n */\n toHslString() {\n const hsl = rgbToHsl(this.r, this.g, this.b);\n const h = Math.round(hsl.h * 360);\n const s = Math.round(hsl.s * 100);\n const l = Math.round(hsl.l * 100);\n return this.a === 1 ? `hsl(${h}, ${s}%, ${l}%)` : `hsla(${h}, ${s}%, ${l}%, ${this.roundA})`;\n }\n /**\n * Returns the hex value of the color.\n * @param allow3Char will shorten hex value to 3 char if possible\n */\n toHex(allow3Char = false) {\n return rgbToHex(this.r, this.g, this.b, allow3Char);\n }\n /**\n * Returns the hex value of the color -with a # prefixed.\n * @param allow3Char will shorten hex value to 3 char if possible\n */\n toHexString(allow3Char = false) {\n return '#' + this.toHex(allow3Char);\n }\n /**\n * Returns the hex 8 value of the color.\n * @param allow4Char will shorten hex value to 4 char if possible\n */\n toHex8(allow4Char = false) {\n return rgbaToHex(this.r, this.g, this.b, this.a, allow4Char);\n }\n /**\n * Returns the hex 8 value of the color -with a # prefixed.\n * @param allow4Char will shorten hex value to 4 char if possible\n */\n toHex8String(allow4Char = false) {\n return '#' + this.toHex8(allow4Char);\n }\n /**\n * Returns the shorter hex value of the color depends on its alpha -with a # prefixed.\n * @param allowShortChar will shorten hex value to 3 or 4 char if possible\n */\n toHexShortString(allowShortChar = false) {\n return this.a === 1 ? this.toHexString(allowShortChar) : this.toHex8String(allowShortChar);\n }\n /**\n * Returns the object as a RGBA object.\n */\n toRgb() {\n return {\n r: Math.round(this.r),\n g: Math.round(this.g),\n b: Math.round(this.b),\n a: this.a,\n };\n }\n /**\n * Returns the RGBA values interpolated into a string with the following format:\n * \"RGBA(xxx, xxx, xxx, xx)\".\n */\n toRgbString() {\n const r = Math.round(this.r);\n const g = Math.round(this.g);\n const b = Math.round(this.b);\n return this.a === 1 ? `rgb(${r}, ${g}, ${b})` : `rgba(${r}, ${g}, ${b}, ${this.roundA})`;\n }\n /**\n * Returns the object as a RGBA object.\n */\n toPercentageRgb() {\n const fmt = (x) => `${Math.round(bound01(x, 255) * 100)}%`;\n return {\n r: fmt(this.r),\n g: fmt(this.g),\n b: fmt(this.b),\n a: this.a,\n };\n }\n /**\n * Returns the RGBA relative values interpolated into a string\n */\n toPercentageRgbString() {\n const rnd = (x) => Math.round(bound01(x, 255) * 100);\n return this.a === 1\n ? `rgb(${rnd(this.r)}%, ${rnd(this.g)}%, ${rnd(this.b)}%)`\n : `rgba(${rnd(this.r)}%, ${rnd(this.g)}%, ${rnd(this.b)}%, ${this.roundA})`;\n }\n toCmyk() {\n return {\n ...rgbToCmyk(this.r, this.g, this.b),\n };\n }\n toCmykString() {\n const { c, m, y, k } = rgbToCmyk(this.r, this.g, this.b);\n return `cmyk(${c}, ${m}, ${y}, ${k})`;\n }\n /**\n * The 'real' name of the color -if there is one.\n */\n toName() {\n if (this.a === 0) {\n return 'transparent';\n }\n if (this.a < 1) {\n return false;\n }\n const hex = '#' + rgbToHex(this.r, this.g, this.b, false);\n for (const [key, value] of Object.entries(names)) {\n if (hex === value) {\n return key;\n }\n }\n return false;\n }\n toString(format) {\n const formatSet = Boolean(format);\n format = format ?? this.format;\n let formattedString = false;\n const hasAlpha = this.a < 1 && this.a >= 0;\n const needsAlphaFormat = !formatSet && hasAlpha && (format.startsWith('hex') || format === 'name');\n if (needsAlphaFormat) {\n // Special case for \"transparent\", all other non-alpha formats\n // will return rgba when there is transparency.\n if (format === 'name' && this.a === 0) {\n return this.toName();\n }\n return this.toRgbString();\n }\n if (format === 'rgb') {\n formattedString = this.toRgbString();\n }\n if (format === 'prgb') {\n formattedString = this.toPercentageRgbString();\n }\n if (format === 'hex' || format === 'hex6') {\n formattedString = this.toHexString();\n }\n if (format === 'hex3') {\n formattedString = this.toHexString(true);\n }\n if (format === 'hex4') {\n formattedString = this.toHex8String(true);\n }\n if (format === 'hex8') {\n formattedString = this.toHex8String();\n }\n if (format === 'name') {\n formattedString = this.toName();\n }\n if (format === 'hsl') {\n formattedString = this.toHslString();\n }\n if (format === 'hsv') {\n formattedString = this.toHsvString();\n }\n if (format === 'cmyk') {\n formattedString = this.toCmykString();\n }\n return formattedString || this.toHexString();\n }\n toNumber() {\n return (Math.round(this.r) << 16) + (Math.round(this.g) << 8) + Math.round(this.b);\n }\n clone() {\n return new TinyColor(this.toString());\n }\n /**\n * Lighten the color a given amount. Providing 100 will always return white.\n * @param amount - valid between 1-100\n */\n lighten(amount = 10) {\n const hsl = this.toHsl();\n hsl.l += amount / 100;\n hsl.l = clamp01(hsl.l);\n return new TinyColor(hsl);\n }\n /**\n * Brighten the color a given amount, from 0 to 100.\n * @param amount - valid between 1-100\n */\n brighten(amount = 10) {\n const rgb = this.toRgb();\n rgb.r = Math.max(0, Math.min(255, rgb.r - Math.round(255 * -(amount / 100))));\n rgb.g = Math.max(0, Math.min(255, rgb.g - Math.round(255 * -(amount / 100))));\n rgb.b = Math.max(0, Math.min(255, rgb.b - Math.round(255 * -(amount / 100))));\n return new TinyColor(rgb);\n }\n /**\n * Darken the color a given amount, from 0 to 100.\n * Providing 100 will always return black.\n * @param amount - valid between 1-100\n */\n darken(amount = 10) {\n const hsl = this.toHsl();\n hsl.l -= amount / 100;\n hsl.l = clamp01(hsl.l);\n return new TinyColor(hsl);\n }\n /**\n * Mix the color with pure white, from 0 to 100.\n * Providing 0 will do nothing, providing 100 will always return white.\n * @param amount - valid between 1-100\n */\n tint(amount = 10) {\n return this.mix('white', amount);\n }\n /**\n * Mix the color with pure black, from 0 to 100.\n * Providing 0 will do nothing, providing 100 will always return black.\n * @param amount - valid between 1-100\n */\n shade(amount = 10) {\n return this.mix('black', amount);\n }\n /**\n * Desaturate the color a given amount, from 0 to 100.\n * Providing 100 will is the same as calling greyscale\n * @param amount - valid between 1-100\n */\n desaturate(amount = 10) {\n const hsl = this.toHsl();\n hsl.s -= amount / 100;\n hsl.s = clamp01(hsl.s);\n return new TinyColor(hsl);\n }\n /**\n * Saturate the color a given amount, from 0 to 100.\n * @param amount - valid between 1-100\n */\n saturate(amount = 10) {\n const hsl = this.toHsl();\n hsl.s += amount / 100;\n hsl.s = clamp01(hsl.s);\n return new TinyColor(hsl);\n }\n /**\n * Completely desaturates a color into greyscale.\n * Same as calling `desaturate(100)`\n */\n greyscale() {\n return this.desaturate(100);\n }\n /**\n * Spin takes a positive or negative amount within [-360, 360] indicating the change of hue.\n * Values outside of this range will be wrapped into this range.\n */\n spin(amount) {\n const hsl = this.toHsl();\n const hue = (hsl.h + amount) % 360;\n hsl.h = hue < 0 ? 360 + hue : hue;\n return new TinyColor(hsl);\n }\n /**\n * Mix the current color a given amount with another color, from 0 to 100.\n * 0 means no mixing (return current color).\n */\n mix(color, amount = 50) {\n const rgb1 = this.toRgb();\n const rgb2 = new TinyColor(color).toRgb();\n const p = amount / 100;\n const rgba = {\n r: (rgb2.r - rgb1.r) * p + rgb1.r,\n g: (rgb2.g - rgb1.g) * p + rgb1.g,\n b: (rgb2.b - rgb1.b) * p + rgb1.b,\n a: (rgb2.a - rgb1.a) * p + rgb1.a,\n };\n return new TinyColor(rgba);\n }\n analogous(results = 6, slices = 30) {\n const hsl = this.toHsl();\n const part = 360 / slices;\n const ret = [this];\n for (hsl.h = (hsl.h - ((part * results) >> 1) + 720) % 360; --results;) {\n hsl.h = (hsl.h + part) % 360;\n ret.push(new TinyColor(hsl));\n }\n return ret;\n }\n /**\n * taken from https://github.com/infusion/jQuery-xcolor/blob/master/jquery.xcolor.js\n */\n complement() {\n const hsl = this.toHsl();\n hsl.h = (hsl.h + 180) % 360;\n return new TinyColor(hsl);\n }\n monochromatic(results = 6) {\n const hsv = this.toHsv();\n const { h } = hsv;\n const { s } = hsv;\n let { v } = hsv;\n const res = [];\n const modification = 1 / results;\n while (results--) {\n res.push(new TinyColor({ h, s, v }));\n v = (v + modification) % 1;\n }\n return res;\n }\n splitcomplement() {\n const hsl = this.toHsl();\n const { h } = hsl;\n return [\n this,\n new TinyColor({ h: (h + 72) % 360, s: hsl.s, l: hsl.l }),\n new TinyColor({ h: (h + 216) % 360, s: hsl.s, l: hsl.l }),\n ];\n }\n /**\n * Compute how the color would appear on a background\n */\n onBackground(background) {\n const fg = this.toRgb();\n const bg = new TinyColor(background).toRgb();\n const alpha = fg.a + bg.a * (1 - fg.a);\n return new TinyColor({\n r: (fg.r * fg.a + bg.r * bg.a * (1 - fg.a)) / alpha,\n g: (fg.g * fg.a + bg.g * bg.a * (1 - fg.a)) / alpha,\n b: (fg.b * fg.a + bg.b * bg.a * (1 - fg.a)) / alpha,\n a: alpha,\n });\n }\n /**\n * Alias for `polyad(3)`\n */\n triad() {\n return this.polyad(3);\n }\n /**\n * Alias for `polyad(4)`\n */\n tetrad() {\n return this.polyad(4);\n }\n /**\n * Get polyad colors, like (for 1, 2, 3, 4, 5, 6, 7, 8, etc...)\n * monad, dyad, triad, tetrad, pentad, hexad, heptad, octad, etc...\n */\n polyad(n) {\n const hsl = this.toHsl();\n const { h } = hsl;\n const result = [this];\n const increment = 360 / n;\n for (let i = 1; i < n; i++) {\n result.push(new TinyColor({ h: (h + i * increment) % 360, s: hsl.s, l: hsl.l }));\n }\n return result;\n }\n /**\n * compare color vs current color\n */\n equals(color) {\n const comparedColor = new TinyColor(color);\n /**\n * RGB and CMYK do not have the same color gamut, so a CMYK conversion will never be 100%.\n * This means we need to compare CMYK to CMYK to ensure accuracy of the equals function.\n */\n if (this.format === 'cmyk' || comparedColor.format === 'cmyk') {\n return this.toCmykString() === comparedColor.toCmykString();\n }\n return this.toRgbString() === comparedColor.toRgbString();\n }\n}\n",
19
+ "function g(t){return t()}async function h(t){return await t()}function w(t){return t.filter((r)=>!!r)}class d{static async awaitTimeout(t){return await new Promise((r)=>{setTimeout(()=>{r(1)},t)})}static async run(t){let{maxCount:r,interval:s,isStopkFun:i,exec:a}=t,o=null;for(let e=0;e<r;e++)if(o=await a(),await this.awaitTimeout(s),i(o))break;if(o===null)throw Error(\"no result\");return o}}class l{static async awaitTimeout(t){return await new Promise((r)=>{setTimeout(()=>{r(1)},t)})}static async refresh(t){let{maxQueryCount:r,queryInterval:s,breakFun:i,queryFun:a}=t,o=null;try{for(let e=0;e<r;e++)if(o=await a(),await l.awaitTimeout(s),i(o))break}catch(e){console.info(\"error:\",e)}return o}}import{TinyColor as x}from\"@ctrl/tinycolor\";function q(t,r=1){return new x(t).setAlpha(r).toRgbString()}import{clsx as f}from\"clsx\";import{twMerge as y}from\"tailwind-merge\";function F(...t){return y(f(t))}class p{list=[];add(t){this.list.push(t)}dispose(){this.list.forEach((t)=>t()),this.list=[]}static create(){return new p}}class T{abortControllers={};entity(t=\"default\"){return this.abortControllers[t]?.abort(\"Re-request\"),this.abortControllers[t]=new AbortController,this.abortControllers[t]}abort(){Object.values(this.abortControllers).forEach((t)=>{t.abort(\"AbortControllersMgr.abort\")})}}import c from\"axios\";function L(t){let{baseURL:r,onAuthorization:s,onHeaders:i,withCredentials:a}=t??{},o=c.create({baseURL:r,timeout:1e4,withCredentials:a,headers:{\"Content-Type\":\"application/json\",\"Access-Control-Allow-Origin\":\"*\",...i?.()}});return o.interceptors.request.use(async(e)=>{let n=s?.();return e.headers.authorization=n?\"Bearer \"+n:\"\",e}),o.interceptors.response.use((e)=>{let{code:n}=e.data;if(t?.onResponse?.(e),n!==0&&n!==200)throw new m(n,e.data.message);return e}),{get:async(e,n)=>{return(await o.get(e,{...n})).data},post:async(e,n,u)=>{return(await o.post(e,n,{...u})).data},delete:async(e,n)=>{return(await o.delete(e,{...n})).data},put:async(e,n,u)=>{return(await o.put(e,n,{...u})).data},isCancel:(e)=>c.isCancel(e)}}class m extends Error{code;constructor(t,r){super(r);this.code=t}}export{q as toRgbString,h as getResAsync,g as getRes,w as getList,L as createFetcher,F as cn,p as SubscribeMgr,l as SleepHelper,d as LoopHelper,m as FetchError,T as AbortControllersMgr};\n\n//# debugId=3284F63F45F49B3A64756E2164756E21\n",
20
+ "import { toRgbString } from 'iweather-lib';\nimport { IColorPaletteConfig } from '../types/colorPalette';\n\nexport const INFINITY_VALUE = -9999;\n\nexport const COLOR_PALETTE_CONFIG = {\n ROAD_RC: (): IColorPaletteConfig => [\n { value: 1, desc: '干净道路', color: toRgbString('#000000') },\n { value: 2, desc: '雨天湿滑', color: toRgbString('#0000FF') },\n { value: 3, desc: '积冰积雪', color: toRgbString('#BEBEBE') },\n { value: 4, desc: '冰水混合', color: toRgbString('#00FF00') },\n { value: 5, desc: '道路结露', color: toRgbString('#03BFFF') },\n { value: 6, desc: '雪落有化', color: toRgbString('#FFA500') },\n { value: 7, desc: '黑冰', color: toRgbString('#DA6FD6') },\n { value: 8, desc: '冻雨', color: toRgbString('#FF0000') },\n ],\n ROAD_ST: (): IColorPaletteConfig => [\n { value: 48, color: toRgbString('#FCB5B2') },\n { value: 44, color: toRgbString('#E96465') },\n { value: 40, color: toRgbString('#DA2425') },\n { value: 36, color: toRgbString('#CC0100') },\n { value: 32, color: toRgbString('#E20000') },\n { value: 28, color: toRgbString('#F30000') },\n { value: 24, color: toRgbString('#FE0B00') },\n { value: 20, color: toRgbString('#FF3900') },\n { value: 16, color: toRgbString('#FE6101') },\n { value: 14, color: toRgbString('#FE7F00') },\n { value: 12, color: toRgbString('#FF9500') },\n { value: 10, color: toRgbString('#FFAB00') },\n { value: 8, color: toRgbString('#FDC10A') },\n { value: 6, color: toRgbString('#FDD421') },\n { value: 4, color: toRgbString('#FEE53E') },\n { value: 2, color: toRgbString('#FFF47A') },\n { value: 0, color: toRgbString('#FFFCB2') },\n { value: -2, color: toRgbString('#C6E7F7') },\n { value: -4, color: toRgbString('#ACDBF4') },\n { value: -6, color: toRgbString('#92CFEE') },\n { value: -8, color: toRgbString('#6BC6F1') },\n { value: -10, color: toRgbString('#33C2F7') },\n { value: -12, color: toRgbString('#01BFFF') },\n { value: -14, color: toRgbString('#02AEFE') },\n { value: -16, color: toRgbString('#0E9CFF') },\n { value: -18, color: toRgbString('#1B8BFB') },\n { value: -20, color: toRgbString('#287BF0') },\n { value: -22, color: toRgbString('#386DE5') },\n { value: -24, color: toRgbString('#3157E7') },\n { value: -26, color: toRgbString('#1C35EE') },\n { value: -28, color: toRgbString('#0004FB') },\n { value: -30, color: toRgbString('#2502F9') },\n { value: -32, color: toRgbString('#540BF5') },\n { value: -34, color: toRgbString('#8018EC') },\n ],\n ROAD_SN: (): IColorPaletteConfig => [\n { value: 30, color: toRgbString('#A81018') },\n { value: 20, color: toRgbString('#EA4F25') },\n { value: 10, color: toRgbString('#F6782B') },\n { value: 5, color: toRgbString('#F9AE44') },\n { value: 2, color: toRgbString('#65BC4D') },\n { value: 1, color: toRgbString('#A0CF50') },\n { value: 0.5, color: toRgbString('#4699AA') },\n { value: 0.2, color: toRgbString('#7EBEE7') },\n { value: 0.1, color: toRgbString('#D0EDFA') },\n ],\n ROAD_RA: (): IColorPaletteConfig => [\n { value: 250, color: toRgbString('#82003E') },\n { value: 100, color: toRgbString('#FF00FF') },\n { value: 50, color: toRgbString('#0000FE') },\n { value: 25, color: toRgbString('#64B8FD') },\n { value: 10, color: toRgbString('#36BB44') },\n { value: 0.1, color: toRgbString('#A7F28F') },\n ],\n PRTY: (): IColorPaletteConfig => [\n { value: 1, desc: '雨', color: toRgbString('#50A4CD') },\n { value: 2, desc: '雨', color: toRgbString('#50A4CD'), isViewDisplay: false },\n { value: 3, desc: '冻雨', color: toRgbString('#CD5050') },\n { value: 4, desc: '冻雨', color: toRgbString('#CD5050'), isViewDisplay: false },\n { value: 5, desc: '雪', color: toRgbString('#CD8F50') },\n { value: 6, desc: '雪', color: toRgbString('#CD8F50'), isViewDisplay: false },\n { value: 7, desc: '雨夹雪', color: toRgbString('#A4CD50') },\n { value: 8, desc: '雨夹雪', color: toRgbString('#A4CD50'), isViewDisplay: false },\n { value: 9, desc: '雨夹雪', color: toRgbString('#A4CD50'), isViewDisplay: false },\n { value: 10, desc: '雨夹雪', color: toRgbString('#A4CD50'), isViewDisplay: false },\n { value: 11, desc: '雨夹雪', color: toRgbString('#A4CD50'), isViewDisplay: false },\n { value: 12, desc: '雨夹雪', color: toRgbString('#A4CD50'), isViewDisplay: false },\n { value: 13, desc: '雨夹雪', color: toRgbString('#A4CD50'), isViewDisplay: false },\n ],\n OBS_PRTY: (): IColorPaletteConfig => [\n { value: 1, desc: '雨', color: toRgbString('#4169E1') },\n { value: 5, desc: '雪', color: toRgbString('#70808F') },\n { value: 7, desc: '雨夹雪', color: toRgbString('#E685E6') },\n { value: 8, desc: '冰粒', color: toRgbString('#FFB2B5') },\n ],\n SFI: (): IColorPaletteConfig => [\n { value: 0.95, color: toRgbString('#A00000') },\n { value: 0.9, color: toRgbString('#C80800') },\n { value: 0.8, color: toRgbString('#F82800') },\n { value: 0.7, color: toRgbString('#F86800') },\n { value: 0.5, color: toRgbString('#F8B420') },\n { value: 0.3, color: toRgbString('#F8EC78') },\n { value: -0.3, color: toRgbString('#F8FCF8') },\n { value: -0.5, color: toRgbString('#C8FCF8') },\n { value: -0.7, color: toRgbString('#90E4F8') },\n { value: -0.8, color: toRgbString('#58BCF8') },\n { value: -0.9, color: toRgbString('#3094E8') },\n { value: -0.95, color: toRgbString('#1058B0') },\n { value: -1, color: toRgbString('#083078') },\n ],\n TPI: (): IColorPaletteConfig => [\n { value: 0.95, color: toRgbString('#A00000') },\n { value: 0.9, color: toRgbString('#C80800') },\n { value: 0.8, color: toRgbString('#F82800') },\n { value: 0.7, color: toRgbString('#F86800') },\n { value: 0.5, color: toRgbString('#F8B420') },\n { value: 0.3, color: toRgbString('#F8EC78') },\n { value: -0.3, color: toRgbString('#F8FCF8') },\n { value: -0.5, color: toRgbString('#C8FCF8') },\n { value: -0.7, color: toRgbString('#90E4F8') },\n { value: -0.8, color: toRgbString('#58BCF8') },\n { value: -0.9, color: toRgbString('#3094E8') },\n { value: -0.95, color: toRgbString('#1058B0') },\n { value: -1, color: toRgbString('#083078') },\n ],\n PQPF: (): IColorPaletteConfig => [\n { desc: '95', value: 0.95, color: toRgbString('#8878F8') },\n { desc: '90', value: 0.9, color: toRgbString('#90BCF8') },\n { desc: '80', value: 0.8, color: toRgbString('#30BCF8') },\n { desc: '70', value: 0.7, color: toRgbString('#A0ECF0') },\n { desc: '60', value: 0.6, color: toRgbString('#40FC20') },\n { desc: '50', value: 0.5, color: toRgbString('#90FC60') },\n { desc: '40', value: 0.4, color: toRgbString('#D8FC58') },\n { desc: '30', value: 0.3, color: toRgbString('#F8FC60') },\n { desc: '20', value: 0.2, color: toRgbString('#F8D460') },\n { desc: '10', value: 0.1, color: toRgbString('#F88C10') },\n { desc: '5', value: 0.05, color: toRgbString('#F8A440') },\n { desc: '1', value: 0.01, color: toRgbString('#F8BC70') },\n ],\n STATION_TEM_CHANGE: (): IColorPaletteConfig => [\n { value: 20, color: toRgbString('#250605') },\n { value: 16, color: toRgbString('#451110') },\n { value: 12, color: toRgbString('#9E1017') },\n { value: 8, color: toRgbString('#DC4F21') },\n { value: 4, color: toRgbString('#E79100') },\n { value: 0, color: toRgbString('#EFD85E') },\n { value: -4, color: toRgbString('#A0E6A9') },\n { value: -8, color: toRgbString('#9EC2DA') },\n { value: -12, color: toRgbString('#6994DF') },\n { value: -16, color: toRgbString('#345BB2') },\n { value: -20, color: toRgbString('#111564') },\n ],\n AIR_TEM: (): IColorPaletteConfig => [\n { value: 30, color: toRgbString('#9C0F08') },\n { value: 25, color: toRgbString('#C34610') },\n { value: 20, color: toRgbString('#D15109') },\n { value: 15, color: toRgbString('#EE950C') },\n { value: 10, color: toRgbString('#F9C65C') },\n { value: 5, color: toRgbString('#F8D28B') },\n { value: 0, color: toRgbString('#FBE5A5') },\n { value: -5, color: toRgbString('#D2E2E6') },\n { value: -10, color: toRgbString('#A4DCE9') },\n { value: -15, color: toRgbString('#AFE2ED') },\n { value: -20, color: toRgbString('#8EDEF3') },\n { value: -25, color: toRgbString('#49EAEE') },\n { value: -30, color: toRgbString('#0BE7E5') },\n { value: -35, color: toRgbString('#09AAE0') },\n { value: -40, color: toRgbString('#4275CF') },\n { value: -45, color: toRgbString('#2358AF') },\n { value: -50, color: toRgbString('#063285') },\n { value: -55, color: toRgbString('#0B0A62') },\n { value: -60, color: toRgbString('#31005E') },\n ],\n AIR_CHANGE_TEM: (): IColorPaletteConfig => [\n { value: 20, color: toRgbString('#FE0000') },\n { value: 15, color: toRgbString('#FF6300') },\n { value: 10, color: toRgbString('#FFB800') },\n { value: 5, color: toRgbString('#FEFE38') },\n { value: 0, color: toRgbString('#FCFCFC') },\n { value: -5, color: toRgbString('#38FEFE') },\n { value: -10, color: toRgbString('#23ADFF') },\n { value: -15, color: toRgbString('#693CF4') },\n { value: -20, color: toRgbString('#CC00CC') },\n ],\n STATION_TEM: (): IColorPaletteConfig => [\n { value: 40, color: toRgbString('#E60000') },\n { value: 37, color: toRgbString('#FF5500') },\n { value: 35, color: toRgbString('#FA9589') },\n { value: 32, color: toRgbString('#FECFA5') },\n { value: 28, color: toRgbString('#FFF3C3') },\n { value: 24, color: toRgbString('#FDFCA1') },\n { value: 20, color: toRgbString('#BFFE8B') },\n { value: 16, color: toRgbString('#CBFFD1') },\n { value: 12, color: toRgbString('#F2FFEE') },\n { value: 8, color: toRgbString('#D2FBFF') },\n { value: 4, color: toRgbString('#ACE7F6') },\n { value: 0, color: toRgbString('#81D2FF') },\n { value: -4, color: toRgbString('#3BA0F0') },\n { value: -8, color: toRgbString('#2074D5') },\n { value: -12, color: toRgbString('#1B5CA9') },\n { value: -14, color: toRgbString('#062B8D') },\n ],\n STATION_TEM_MAX_GE: (): IColorPaletteConfig => [\n { value: 10, color: toRgbString('#E93A4D') },\n { value: 9, color: toRgbString('#EB626E') },\n { value: 8, color: toRgbString('#F0979F') },\n { value: 7, color: toRgbString('#3C64D8') },\n { value: 6, color: toRgbString('#5297FB') },\n { value: 5, color: toRgbString('#77D4FD') },\n { value: 4, color: toRgbString('#61CFC9') },\n { value: 3, color: toRgbString('#6CF831') },\n { value: 2, color: toRgbString('#6FFA80') },\n { value: 1, color: toRgbString('#DCFDFF') },\n ],\n STATION_GUST: (): IColorPaletteConfig<{ level: number }> => [\n { desc: '17级', value: 56.1, color: toRgbString('#E60000'), data: { level: 17 } },\n { desc: '16级', value: 51.0, color: toRgbString('#E60000'), data: { level: 16 } },\n { desc: '15级', value: 46.2, color: toRgbString('#E60000'), data: { level: 15 } },\n { desc: '14级', value: 41.5, color: toRgbString('#E60000'), data: { level: 14 } },\n { desc: '13级', value: 37, color: toRgbString('#E60000'), data: { level: 13 } },\n { desc: '12级', value: 32.7, color: toRgbString('#E60000'), data: { level: 12 } },\n { desc: '11级', value: 28.5, color: toRgbString('#E60000'), data: { level: 11 } },\n { desc: '10级', value: 24.5, color: toRgbString('#E60000'), data: { level: 10 } },\n { desc: '9级', value: 20.8, color: toRgbString('#E60000'), data: { level: 9 } },\n { desc: '8级', value: 17.2, color: toRgbString('#E60000'), data: { level: 8 } },\n { desc: '7级', value: 13.9, color: toRgbString('#E60000'), data: { level: 7 } },\n { desc: '6级', value: 10.8, color: toRgbString('#E60000'), data: { level: 6 } },\n { desc: '5级', value: 8.0, color: toRgbString('#E60000'), data: { level: 5 } },\n { desc: '4级', value: 5.5, color: toRgbString('#E60000'), data: { level: 4 } },\n { desc: '3级', value: 3.4, color: toRgbString('#E60000'), data: { level: 3 } },\n { desc: '2级', value: 1.6, color: toRgbString('#E60000'), data: { level: 2 } },\n { desc: '1级', value: 0.3, color: toRgbString('#E60000'), data: { level: 1 } },\n { desc: '0级', value: 0, color: toRgbString('#E60000'), data: { level: 0 } },\n ],\n STATION_PRE: {\n H1: (): IColorPaletteConfig => [\n { value: 100, color: toRgbString('#F701FA') },\n { value: 50, color: toRgbString('#0100FD') },\n { value: 25, color: toRgbString('#5EB9FF') },\n { value: 10, color: toRgbString('#3DB941') },\n { value: 5, color: toRgbString('#71D972') },\n { value: 2.5, color: toRgbString('#B5F7A7') },\n { value: 0.1, color: toRgbString('#D9F8D1') },\n ],\n H3: (): IColorPaletteConfig => [\n { value: 100, color: toRgbString('#F701FA') },\n { value: 50, color: toRgbString('#0100FD') },\n { value: 25, color: toRgbString('#5EB9FF') },\n { value: 10, color: toRgbString('#3DB941') },\n { value: 5, color: toRgbString('#71D972') },\n { value: 2.5, color: toRgbString('#B5F7A7') },\n { value: 0.1, color: toRgbString('#D9F8D1') },\n ],\n H6: (): IColorPaletteConfig => [\n { value: 100, color: toRgbString('#F701FA') },\n { value: 50, color: toRgbString('#0100FD') },\n { value: 25, color: toRgbString('#5EB9FF') },\n { value: 10, color: toRgbString('#3DB941') },\n { value: 5, color: toRgbString('#71D972') },\n { value: 2.5, color: toRgbString('#B5F7A7') },\n { value: 0.1, color: toRgbString('#D9F8D1') },\n ],\n H24: (): IColorPaletteConfig => [\n { value: 250, color: toRgbString('#7F033A') },\n { value: 100, color: toRgbString('#F701FA') },\n { value: 50, color: toRgbString('#0100FD') },\n { value: 25, color: toRgbString('#5EB9FF') },\n { value: 10, color: toRgbString('#3DB941') },\n { value: 0.1, color: toRgbString('#A6F28E') },\n ],\n },\n TTPS: {\n '3H-6H': (): IColorPaletteConfig => [\n { value: 15, color: toRgbString('#060606') },\n { value: 12, color: toRgbString('#1E1E1E') },\n { value: 10, color: toRgbString('#3A3A3A') },\n { value: 8, color: toRgbString('#505050') },\n { value: 5, color: toRgbString('#6C6C6C') },\n { value: 2.5, color: toRgbString('#828282') },\n { value: 1, color: toRgbString('#999999') },\n { value: 0.5, color: toRgbString('#C8C8C8') },\n { value: 0.01, color: toRgbString('#EAEAEA') },\n ],\n '12H-24H': (): IColorPaletteConfig => [\n { value: 30, color: toRgbString('#480271') },\n { value: 20, color: toRgbString('#7543E8') },\n { value: 10, color: toRgbString('#484848') },\n { value: 5, color: toRgbString('#747474') },\n { value: 2.5, color: toRgbString('#A6A6A6') },\n { value: 0.01, color: toRgbString('#CFCFCF') },\n ],\n },\n VIS: (): IColorPaletteConfig => [\n { value: 15, color: toRgbString('#C9EAFB') },\n { value: 10, color: toRgbString('#97DCF2') },\n { value: 8, color: toRgbString('#65C8EA') },\n { value: 7, color: toRgbString('#2FF9AB') },\n { value: 6, color: toRgbString('#00FF00') },\n { value: 5, color: toRgbString('#D8FC2B') },\n { value: 4, color: toRgbString('#FFEA00') },\n { value: 3, color: toRgbString('#FFBC04') },\n { value: 2, color: toRgbString('#FE5400') },\n { value: 1, color: toRgbString('#FD0100') },\n { value: 0.5, color: toRgbString('#9D00FF') },\n { value: INFINITY_VALUE, desc: '0', color: toRgbString('#712600') },\n ],\n SLEET: {\n '3H-6H': (): IColorPaletteConfig => [\n { value: 15, color: toRgbString('#4B0968') },\n { value: 12, color: toRgbString('#64116A') },\n { value: 10, color: toRgbString('#851976') },\n { value: 8, color: toRgbString('#A52882') },\n { value: 5, color: toRgbString('#C23A8F') },\n { value: 2.5, color: toRgbString('#D55298') },\n { value: 1, color: toRgbString('#E675A2') },\n { value: 0.5, color: toRgbString('#F1B1BA') },\n { value: 0.1, color: toRgbString('#F8D9D6') },\n ],\n '12H-24H': (): IColorPaletteConfig => [\n { desc: '≥250', value: 250, color: toRgbString('#4B0968') },\n { value: 100, color: toRgbString('#851976') },\n { value: 50, color: toRgbString('#C23B8F') },\n { value: 25, color: toRgbString('#E675A2') },\n { value: 10, color: toRgbString('#F1B1BA') },\n { value: 0.1, color: toRgbString('#F8D9D6') },\n ],\n YBY_GEOJSON: (): IColorPaletteConfig => [\n { desc: '≥250', value: 250, backgroundImage: '/huishang/assets/map/icons/sleet/sleet250.png' },\n { value: 100, backgroundImage: '/huishang/assets/map/icons/sleet/sleet100.png' },\n { value: 50, backgroundImage: '/huishang/assets/map/icons/sleet/sleet50.png' },\n { value: 25, backgroundImage: '/huishang/assets/map/icons/sleet/sleet25.png' },\n { value: 10, backgroundImage: '/huishang/assets/map/icons/sleet/sleet10.png' },\n { value: 0, backgroundImage: '/huishang/assets/map/icons/sleet/sleet0.png' },\n ],\n },\n SLEET_RAIN: {\n '3H-6H': (): IColorPaletteConfig => [\n { value: 100, color: toRgbString('#FA00FA') },\n { value: 50, color: toRgbString('#0000FC') },\n { value: 25, color: toRgbString('#62B8FF') },\n { value: 10, color: toRgbString('#259026') },\n { value: 5, color: toRgbString('#38BC39') },\n { value: 2.5, color: toRgbString('#6FDA6F') },\n { value: 0.01, color: toRgbString('#B9F4AB') },\n ],\n '12H-24H': (): IColorPaletteConfig => [\n { value: 250, color: toRgbString('#82003E') },\n { value: 100, color: toRgbString('#FF00FF') },\n { value: 50, color: toRgbString('#0000FE') },\n { value: 25, color: toRgbString('#64B8FD') },\n { value: 10, color: toRgbString('#36BB44') },\n { value: 0.1, color: toRgbString('#A7F28F') },\n ],\n },\n SLEET_SNOW: {\n '3H-6H': (): IColorPaletteConfig => [\n { value: 15, color: toRgbString('#060606') },\n { value: 12, color: toRgbString('#1E1E1E') },\n { value: 10, color: toRgbString('#3A3A3A') },\n { value: 8, color: toRgbString('#505050') },\n { value: 5, color: toRgbString('#6C6C6C') },\n { value: 2.5, color: toRgbString('#828282') },\n { value: 1, color: toRgbString('#999999') },\n { value: 0.5, color: toRgbString('#C8C8C8') },\n { value: 0.01, color: toRgbString('#EAEAEA') },\n ],\n '12H-24H': (): IColorPaletteConfig => [\n { value: 30, color: toRgbString('#480271') },\n { value: 20, color: toRgbString('#7543E8') },\n { value: 10, color: toRgbString('#484848') },\n { value: 5, color: toRgbString('#747474') },\n { value: 2.5, color: toRgbString('#A6A6A6') },\n { value: 0.01, color: toRgbString('#CFCFCF') },\n ],\n },\n TEM_CHANGE: (): IColorPaletteConfig => [\n { value: 10, color: toRgbString('#8B001A') },\n { value: 8, color: toRgbString('#BC0028') },\n { value: 6, color: toRgbString('#E70000') },\n { value: 4, color: toRgbString('#F05C00') },\n { value: 2, color: toRgbString('#F99400') },\n { value: 0, color: toRgbString('#FEE47D') },\n { value: -2, color: toRgbString('#BFFFE9') },\n { value: -4, color: toRgbString('#98DCF1') },\n { value: -6, color: toRgbString('#75B2D7') },\n { value: -8, color: toRgbString('#006FFE') },\n { value: -10, color: toRgbString('#014CAB') },\n { value: -12, color: toRgbString('#0000FE') },\n { value: -14, color: toRgbString('#AA00E6') },\n { value: -16, color: toRgbString('#4C0073') },\n { value: -18, color: toRgbString('#800000') },\n { value: INFINITY_VALUE, color: toRgbString('#3E0000') },\n ],\n TEM: {\n DEF: (): IColorPaletteConfig => [\n { value: 40, color: toRgbString('#E90102') },\n { value: 37, color: toRgbString('#FE5400') },\n { value: 35, color: toRgbString('#FA9689') },\n { value: 32, color: toRgbString('#FDCFA8') },\n { value: 28, color: toRgbString('#FFF3C6') },\n { value: 24, color: toRgbString('#FCFE9D') },\n { value: 20, color: toRgbString('#C0FE8C') },\n { value: 16, color: toRgbString('#D2FFD2') },\n { value: 12, color: toRgbString('#F3FFF0') },\n { value: 8, color: toRgbString('#D2FBFF') },\n { value: 4, color: toRgbString('#ACE7F6') },\n { value: 0, color: toRgbString('#83D3FF') },\n { value: -4, color: toRgbString('#39A1EF') },\n { value: -8, color: toRgbString('#1A77D2') },\n { value: -12, color: toRgbString('#135CA8') },\n { value: INFINITY_VALUE, color: toRgbString('#002A85') },\n ],\n DEG0L: (): IColorPaletteConfig => [\n { value: 5000, color: toRgbString('#FCB5B2') },\n { value: 4750, color: toRgbString('#E96465') },\n { value: 4500, color: toRgbString('#DA2425') },\n { value: 4250, color: toRgbString('#CC0100') },\n { value: 4000, color: toRgbString('#F30000') },\n { value: 3750, color: toRgbString('#FF3900') },\n { value: 3500, color: toRgbString('#FE6101') },\n { value: 3250, color: toRgbString('#FF9500') },\n { value: 3000, color: toRgbString('#FDC10A') },\n { value: 2750, color: toRgbString('#FDD421') },\n { value: 2500, color: toRgbString('#FFF47A') },\n { value: 2250, color: toRgbString('#FFFCB2') },\n { value: 2000, color: toRgbString('#ACDBF4') },\n { value: 1750, color: toRgbString('#92CFEE') },\n { value: 1500, color: toRgbString('#33C2F7') },\n { value: 1250, color: toRgbString('#01BFFF') },\n { value: 1000, color: toRgbString('#0E9CFF') },\n { value: 750, color: toRgbString('#1B8BFB') },\n { value: 500, color: toRgbString('#386DE5') },\n { value: 250, color: toRgbString('#3157E7') },\n { value: 0, color: toRgbString('#0004FB') },\n { value: INFINITY_VALUE, color: toRgbString('#540BF5') },\n ],\n NMC: (): IColorPaletteConfig => [\n { value: 34, color: toRgbString('#FCB5B2') },\n { value: 32, color: toRgbString('#E96465') },\n { value: 30, color: toRgbString('#DA2425') },\n { value: 28, color: toRgbString('#CC0100') },\n { value: 26, color: toRgbString('#E20000') },\n { value: 24, color: toRgbString('#F30000') },\n { value: 22, color: toRgbString('#FE0B00') },\n { value: 20, color: toRgbString('#FF3900') },\n { value: 18, color: toRgbString('#FE6101') },\n { value: 16, color: toRgbString('#FE7F00') },\n { value: 14, color: toRgbString('#FF9500') },\n { value: 12, color: toRgbString('#FFAB00') },\n { value: 10, color: toRgbString('#FDC10A') },\n { value: 8, color: toRgbString('#FDD421') },\n { value: 6, color: toRgbString('#FEE53E') },\n { value: 4, color: toRgbString('#FFF47A') },\n { value: 2, color: toRgbString('#FFFCB2') },\n { value: 0, color: toRgbString('#C6E7F7') },\n { value: -2, color: toRgbString('#ACDBF4') },\n { value: -4, color: toRgbString('#92CFEE') },\n { value: -6, color: toRgbString('#6BC6F1') },\n { value: -8, color: toRgbString('#33C2F7') },\n { value: -10, color: toRgbString('#01BFFF') },\n { value: -12, color: toRgbString('#02AEFE') },\n { value: -14, color: toRgbString('#0E9CFF') },\n { value: -16, color: toRgbString('#1B8BFB') },\n { value: -18, color: toRgbString('#287BF0') },\n { value: -20, color: toRgbString('#386DE5') },\n { value: -22, color: toRgbString('#3157E7') },\n { value: -24, color: toRgbString('#1C35EE') },\n { value: -26, color: toRgbString('#0004FB') },\n { value: -28, color: toRgbString('#2502F9') },\n { value: -30, color: toRgbString('#540BF5') },\n { value: -100, color: toRgbString('#8018EC') },\n ],\n XWEATHER: (): IColorPaletteConfig => [\n { value: -50, desc: '-50', color: toRgbString('#9C619B') },\n { value: -40, desc: '-40', color: toRgbString('#58005b') },\n { value: -30, desc: '-30', color: toRgbString('#ce00d7') },\n { value: -20, desc: '-20', color: toRgbString('#121475') },\n { value: -10, desc: '-10', color: toRgbString('#5b97f8') },\n { value: 0, desc: '0', color: toRgbString('#81e8ff') },\n { value: 5, desc: '5', color: toRgbString('#0f7001') },\n { value: 15, desc: '15', color: toRgbString('#ecf93d') },\n { value: 25, desc: '25', color: toRgbString('#e90f0b') },\n { value: 35, desc: '35', color: toRgbString('#6b0001') },\n { value: 45, desc: '45', color: toRgbString('#fff7e2') },\n { value: 50, desc: '50', color: toRgbString('#7b7b7b') },\n ],\n },\n SKTE: (): IColorPaletteConfig => [\n { value: 40, color: toRgbString('#E90102') },\n { value: 37, color: toRgbString('#FE5400') },\n { value: 35, color: toRgbString('#FA9689') },\n { value: 32, color: toRgbString('#FDCFA8') },\n { value: 28, color: toRgbString('#FFF3C6') },\n { value: 24, color: toRgbString('#FCFE9D') },\n { value: 20, color: toRgbString('#C0FE8C') },\n { value: 16, color: toRgbString('#D2FFD2') },\n { value: 12, color: toRgbString('#F3FFF0') },\n { value: 8, color: toRgbString('#D2FBFF') },\n { value: 4, color: toRgbString('#ACE7F6') },\n { value: 0, color: toRgbString('#83D3FF') },\n { value: -4, color: toRgbString('#39A1EF') },\n { value: -8, color: toRgbString('#1A77D2') },\n { value: -12, color: toRgbString('#135CA8') },\n { value: INFINITY_VALUE, color: toRgbString('#002A85') },\n ],\n CPR: (): IColorPaletteConfig => [\n { value: 10, color: toRgbString('#B2CEFD') },\n { value: 20, color: toRgbString('#3897F6') },\n { value: 30, color: toRgbString('#78BAFD') },\n { value: 40, color: toRgbString('#B5F1FA') },\n { value: 50, color: toRgbString('#FFE978') },\n { value: 60, color: toRgbString('#FFA101') },\n { value: 70, color: toRgbString('#FF2F00') },\n { value: 80, color: toRgbString('#C10300') },\n { value: 90, color: toRgbString('#A60000') },\n ],\n SHU: (): IColorPaletteConfig => [\n { value: 4, color: toRgbString('#D7E7F9') },\n { value: 5, color: toRgbString('#B2CEFD') },\n { value: 6, color: toRgbString('#90B5FC') },\n { value: 7, color: toRgbString('#7E9AFA') },\n { value: 8, color: toRgbString('#6272F7') },\n { value: 9, color: toRgbString('#0065FE') },\n { value: 10, color: toRgbString('#029697') },\n { value: 11, color: toRgbString('#04C62E') },\n { value: 12, color: toRgbString('#04C62E') },\n { value: 13, color: toRgbString('#63FF00') },\n { value: 14, color: toRgbString('#95FF01') },\n { value: 15, color: toRgbString('#C5FF31') },\n { value: 16, color: toRgbString('#FDFF00') },\n { value: 17, color: toRgbString('#FEC800') },\n { value: 18, color: toRgbString('#FFA101') },\n { value: 19, color: toRgbString('#FF7E00') },\n { value: 20, color: toRgbString('#FE1200') },\n ],\n TCW: (): IColorPaletteConfig => [\n { value: 25, color: toRgbString('#D9E3FE') },\n { value: 30, color: toRgbString('#9AB2FC') },\n { value: 35, color: toRgbString('#8493FC') },\n { value: 40, color: toRgbString('#666FF0') },\n { value: 45, color: toRgbString('#549591') },\n { value: 50, color: toRgbString('#6FC445') },\n { value: 55, color: toRgbString('#A2FC3C') },\n { value: 60, color: toRgbString('#D7FF4F') },\n { value: 65, color: toRgbString('#FFFF3B') },\n { value: 70, color: toRgbString('#EEC62E') },\n { value: 75, color: toRgbString('#E17A20') },\n { value: 80, color: toRgbString('#D11E09') },\n ],\n EPT: (): IColorPaletteConfig => [\n { value: 320, color: toRgbString('#B8E1FB') },\n { value: 325, color: toRgbString('#6FB1E3') },\n { value: 330, color: toRgbString('#469CA1') },\n { value: 335, color: toRgbString('#59BC49') },\n { value: 340, color: toRgbString('#E7E35B') },\n { value: 345, color: toRgbString('#F69739') },\n { value: 350, color: toRgbString('#E74A21') },\n { value: 355, color: toRgbString('#C61821') },\n { value: 360, color: toRgbString('#930E0F') },\n ],\n MF: (): IColorPaletteConfig => [\n { value: 45, color: toRgbString('#F3F3F3') },\n { value: 43, color: toRgbString('#E3E3E3') },\n { value: 41, color: toRgbString('#D3D3D3') },\n { value: 39, color: toRgbString('#C3C3C3') },\n { value: 37, color: toRgbString('#B3B3B3') },\n { value: 35, color: toRgbString('#A3A3A3') },\n { value: 33, color: toRgbString('#939393') },\n { value: 31, color: toRgbString('#80338C') },\n { value: 29, color: toRgbString('#A03494') },\n { value: 27, color: toRgbString('#C3399A') },\n { value: 25, color: toRgbString('#E35BAB') },\n { value: 23, color: toRgbString('#F47EB2') },\n { value: 21, color: toRgbString('#FAA3BE') },\n { value: 19, color: toRgbString('#FBC0C7') },\n { value: 17, color: toRgbString('#9C3941') },\n { value: 15, color: toRgbString('#C64347') },\n { value: 13, color: toRgbString('#E45551') },\n { value: 11, color: toRgbString('#F77965') },\n { value: 9, color: toRgbString('#FC9C82') },\n { value: 7, color: toRgbString('#FCBEA8') },\n { value: 5, color: toRgbString('#FDDECF') },\n ],\n VOR: (): IColorPaletteConfig => [\n { value: 1, color: toRgbString('#FFF5CC') },\n { value: 2, color: toRgbString('#FFE670') },\n { value: 3, color: toRgbString('#FFCC33') },\n { value: 4, color: toRgbString('#FFAF33') },\n { value: 6, color: toRgbString('#FF9933') },\n { value: 8, color: toRgbString('#FF6F33') },\n { value: 10, color: toRgbString('#FF5500') },\n { value: 12, color: toRgbString('#E6281E') },\n { value: 14, color: toRgbString('#C81E14') },\n { value: 16, color: toRgbString('#A5150C') },\n ],\n MFD: (): IColorPaletteConfig => [\n { value: -0.5, color: toRgbString('#F2F5F3') },\n { value: -1.0, color: toRgbString('#E5ECE8') },\n { value: -1.5, color: toRgbString('#D9E3DD') },\n { value: -2.0, color: toRgbString('#CCDAD1') },\n { value: -2.5, color: toRgbString('#BFD0C6') },\n { value: -3.0, color: toRgbString('#B2C7BA') },\n { value: -3.5, color: toRgbString('#A6BEAF') },\n { value: -4.0, color: toRgbString('#99B4A4') },\n { value: -4.5, color: toRgbString('#8DAB99') },\n { value: -5.0, color: toRgbString('#80A28D') },\n { value: -5.5, color: toRgbString('#739882') },\n { value: -6.0, color: toRgbString('#668F76') },\n { value: -6.5, color: toRgbString('#5A866B') },\n { value: -7.0, color: toRgbString('#4D7C60') },\n { value: -7.5, color: toRgbString('#407354') },\n { value: -8.0, color: toRgbString('#336949') },\n { value: -8.5, color: toRgbString('#26603D') },\n { value: -9.0, color: toRgbString('#195631') },\n { value: -9.5, color: toRgbString('#0D4E27') },\n { value: -10.0, color: toRgbString('#00441B') },\n ],\n VVP: (): IColorPaletteConfig => [\n { value: 3, color: toRgbString('#9F3A0C') },\n { value: 2.8, color: toRgbString('#AA4812') },\n { value: 2.6, color: toRgbString('#B45D18') },\n { value: 2.4, color: toRgbString('#BD6F21') },\n { value: 2.2, color: toRgbString('#C47D30') },\n { value: 2, color: toRgbString('#CB853F') },\n { value: 1.8, color: toRgbString('#CD8F52') },\n { value: 1.6, color: toRgbString('#D59B62') },\n { value: 1.4, color: toRgbString('#D9A970') },\n { value: 1.2, color: toRgbString('#DEB47D') },\n { value: 1, color: toRgbString('#E4C391') },\n { value: 0.8, color: toRgbString('#E8CB9F') },\n { value: 0.6, color: toRgbString('#EFD8B1') },\n { value: 0.4, color: toRgbString('#F2E4C1') },\n { value: 0.2, color: toRgbString('#F6EDCE') },\n { value: 0, color: toRgbString('#FDFBE1') },\n { value: -0.2, color: toRgbString('#F8FBDE') },\n { value: -0.4, color: toRgbString('#ECF5CC') },\n { value: -0.6, color: toRgbString('#E2F2C0') },\n { value: -0.8, color: toRgbString('#D8ECB3') },\n { value: -1, color: toRgbString('#CBE6A1') },\n { value: -1.2, color: toRgbString('#C3DF9A') },\n { value: -1.4, color: toRgbString('#B9D988') },\n { value: -1.6, color: toRgbString('#ACD676') },\n { value: -1.8, color: toRgbString('#A2D369') },\n { value: -2, color: toRgbString('#97CC5A') },\n { value: -2.2, color: toRgbString('#8DC84D') },\n { value: -2.4, color: toRgbString('#84C440') },\n { value: -2.6, color: toRgbString('#72BA31') },\n { value: -2.8, color: toRgbString('#63B12A') },\n { value: -3, color: toRgbString('#50A723') },\n { value: INFINITY_VALUE, color: toRgbString('#41A11F') },\n ],\n SSR: (): IColorPaletteConfig => [\n { value: 1000, color: toRgbString('#C21000') },\n { value: 900, color: toRgbString('#D31000') },\n { value: 800, color: toRgbString('#E41300') },\n { value: 700, color: toRgbString('#F51300') },\n { value: 600, color: toRgbString('#FF1300') },\n { value: 500, color: toRgbString('#FF2311') },\n { value: 400, color: toRgbString('#FF857B') },\n { value: 300, color: toRgbString('#FFA19A') },\n { value: 200, color: toRgbString('#FFBAB5') },\n { value: 10, color: toRgbString('#FFCFCD') },\n ],\n RHU: (): IColorPaletteConfig => [\n { value: 95, color: toRgbString('#1A7E36') },\n { value: 90, color: toRgbString('#37944A') },\n { value: 85, color: toRgbString('#50A95B') },\n { value: 80, color: toRgbString('#6EBB73') },\n { value: 75, color: toRgbString('#93D190') },\n { value: 70, color: toRgbString('#ADDDA9') },\n { value: 65, color: toRgbString('#C2E7BA') },\n { value: 60, color: toRgbString('#D4EED0') },\n { value: 55, color: toRgbString('#E3F1DF') },\n { value: 50, color: toRgbString('#EEF4ED') },\n { value: 45, color: toRgbString('#F3EEF2') },\n { value: 40, color: toRgbString('#EEE4F0') },\n { value: 35, color: toRgbString('#E7D5E8') },\n { value: 30, color: toRgbString('#DAC3DF') },\n { value: 25, color: toRgbString('#CCB1D7') },\n { value: 20, color: toRgbString('#BD9ECA') },\n { value: 15, color: toRgbString('#A681B4') },\n { value: 10, color: toRgbString('#9970AC') },\n { value: 5, color: toRgbString('#8D529C') },\n { value: 0, color: toRgbString('#7C318B') },\n ],\n TBB: (): IColorPaletteConfig => [\n { value: 183, color: toRgbString('#ffffff') },\n { value: 184, color: toRgbString('#e4e4e4') },\n { value: 185, color: toRgbString('#c8c8c8') },\n { value: 186, color: toRgbString('#adadad') },\n { value: 187, color: toRgbString('#919191') },\n { value: 188, color: toRgbString('#767676') },\n { value: 189, color: toRgbString('#5a5a5a') },\n { value: 190, color: toRgbString('#3f3f3f') },\n { value: 191, color: toRgbString('#232323') },\n { value: 192, color: toRgbString('#080808') },\n { value: 193, color: toRgbString('#140000') },\n { value: 194, color: toRgbString('#2f0000') },\n { value: 195, color: toRgbString('#4b0000') },\n { value: 196, color: toRgbString('#660000') },\n { value: 197, color: toRgbString('#820000') },\n { value: 198, color: toRgbString('#9d0000') },\n { value: 199, color: toRgbString('#b90000') },\n { value: 200, color: toRgbString('#d40000') },\n { value: 201, color: toRgbString('#f00000') },\n { value: 202, color: toRgbString('#ff0c00') },\n { value: 203, color: toRgbString('#ff2800') },\n { value: 204, color: toRgbString('#ff4300') },\n { value: 205, color: toRgbString('#ff5f00') },\n { value: 206, color: toRgbString('#ff7a00') },\n { value: 207, color: toRgbString('#ff9600') },\n { value: 208, color: toRgbString('#ffb100') },\n { value: 209, color: toRgbString('#ffcd00') },\n { value: 210, color: toRgbString('#ffe800') },\n { value: 211, color: toRgbString('#faff00') },\n { value: 212, color: toRgbString('#deff00') },\n { value: 213, color: toRgbString('#c3ff00') },\n { value: 214, color: toRgbString('#a7ff00') },\n { value: 215, color: toRgbString('#8cff00') },\n { value: 216, color: toRgbString('#70ff00') },\n { value: 217, color: toRgbString('#55ff00') },\n { value: 218, color: toRgbString('#39ff00') },\n { value: 219, color: toRgbString('#1eff00') },\n { value: 220, color: toRgbString('#02ff00') },\n { value: 221, color: toRgbString('#00e60b') },\n { value: 222, color: toRgbString('#00ca17') },\n { value: 223, color: toRgbString('#00af24') },\n { value: 224, color: toRgbString('#009330') },\n { value: 225, color: toRgbString('#00783d') },\n { value: 226, color: toRgbString('#005c49') },\n { value: 227, color: toRgbString('#004156') },\n { value: 228, color: toRgbString('#002562') },\n { value: 229, color: toRgbString('#000000') },\n { value: 230, color: toRgbString('#00127d') },\n { value: 231, color: toRgbString('#002d8c') },\n { value: 232, color: toRgbString('#00499b') },\n { value: 233, color: toRgbString('#0064aa') },\n { value: 234, color: toRgbString('#0080b9') },\n { value: 235, color: toRgbString('#009bc8') },\n { value: 236, color: toRgbString('#00b7d7') },\n { value: 237, color: toRgbString('#00d2e6') },\n { value: 238, color: toRgbString('#00eef5') },\n { value: 239, color: toRgbString('#08fdfd') },\n { value: 240, color: toRgbString('#1cf6f6') },\n { value: 241, color: toRgbString('#31efef') },\n { value: 242, color: toRgbString('#45e8e8') },\n { value: 243, color: toRgbString('#5ae1e1') },\n { value: 244, color: toRgbString('#6edada') },\n { value: 245, color: toRgbString('#83d3d3') },\n { value: 246, color: toRgbString('#97cccc') },\n { value: 247, color: toRgbString('#acc5c5') },\n { value: 248, color: toRgbString('#bebebe') },\n { value: 249, color: toRgbString('#bcbcbc') },\n { value: 250, color: toRgbString('#b9b9b9') },\n { value: 251, color: toRgbString('#b7b7b7') },\n { value: 252, color: toRgbString('#b4b4b4') },\n { value: 253, color: toRgbString('#b2b2b2') },\n { value: 254, color: toRgbString('#afafaf') },\n { value: 255, color: toRgbString('#adadad') },\n { value: 256, color: toRgbString('#aaaaaa') },\n { value: 257, color: toRgbString('#a8a8a8') },\n { value: 258, color: toRgbString('#a5a5a5') },\n { value: 259, color: toRgbString('#a3a3a3') },\n { value: 260, color: toRgbString('#a0a0a0') },\n { value: 261, color: toRgbString('#9d9d9d') },\n { value: 262, color: toRgbString('#9b9b9b') },\n { value: 263, color: toRgbString('#989898') },\n { value: 264, color: toRgbString('#969696') },\n { value: 265, color: toRgbString('#939393') },\n { value: 266, color: toRgbString('#919191') },\n { value: 267, color: toRgbString('#8e8e8e') },\n { value: 268, color: toRgbString('#8b8b8b') },\n { value: 269, color: toRgbString('#898989') },\n { value: 270, color: toRgbString('#868686') },\n { value: 271, color: toRgbString('#848484') },\n { value: 272, color: toRgbString('#818181') },\n { value: 273, color: toRgbString('#7e7e7e') },\n { value: 274, color: toRgbString('#7c7c7c') },\n { value: 275, color: toRgbString('#797979') },\n { value: 276, color: toRgbString('#777777') },\n { value: 277, color: toRgbString('#747474') },\n { value: 278, color: toRgbString('#717171') },\n { value: 279, color: toRgbString('#6f6f6f') },\n { value: 280, color: toRgbString('#6c6c6c') },\n { value: 281, color: toRgbString('#6a6a6a') },\n { value: 282, color: toRgbString('#676767') },\n { value: 283, color: toRgbString('#656565') },\n { value: 284, color: toRgbString('#626262') },\n { value: 285, color: toRgbString('#5f5f5f') },\n { value: 286, color: toRgbString('#5d5d5d') },\n { value: 287, color: toRgbString('#5a5a5a') },\n { value: 288, color: toRgbString('#585858') },\n { value: 289, color: toRgbString('#555555') },\n { value: 290, color: toRgbString('#535353') },\n { value: 291, color: toRgbString('#505050') },\n { value: 292, color: toRgbString('#4e4e4e') },\n { value: 293, color: toRgbString('#4b4b4b') },\n { value: 294, color: toRgbString('#494949') },\n { value: 295, color: toRgbString('#464646') },\n { value: 296, color: toRgbString('#444444') },\n { value: 297, color: toRgbString('#414141') },\n { value: 298, color: toRgbString('#3f3f3f') },\n { value: 299, color: toRgbString('#3c3c3c') },\n { value: 300, color: toRgbString('#393939') },\n { value: 301, color: toRgbString('#373737') },\n { value: 302, color: toRgbString('#343434') },\n { value: 303, color: toRgbString('#323232') },\n { value: 304, color: toRgbString('#2f2f2f') },\n { value: 305, color: toRgbString('#2d2d2d') },\n { value: 306, color: toRgbString('#2a2a2a') },\n { value: 307, color: toRgbString('#272727') },\n { value: 308, color: toRgbString('#252525') },\n { value: 309, color: toRgbString('#222222') },\n { value: 310, color: toRgbString('#202020') },\n { value: 311, color: toRgbString('#1d1d1d') },\n { value: 312, color: toRgbString('#1a1a1a') },\n { value: 313, color: toRgbString('#181818') },\n { value: 314, color: toRgbString('#151515') },\n { value: 315, color: toRgbString('#131313') },\n { value: 316, color: toRgbString('#101010') },\n { value: 317, color: toRgbString('#0d0d0d') },\n { value: 318, color: toRgbString('#0b0b0b') },\n { value: 319, color: toRgbString('#080808') },\n { value: 320, color: toRgbString('#060606') },\n { value: 321, color: toRgbString('#030303') },\n { value: 322, color: toRgbString('#000000') },\n ],\n RADAR: (): IColorPaletteConfig => [\n { value: 70, color: toRgbString('#AD90F0') },\n { value: 65, color: toRgbString('#9600B4') },\n { value: 60, color: toRgbString('#FF00F0') },\n { value: 55, color: toRgbString('#C00000') },\n { value: 50, color: toRgbString('#D60000') },\n { value: 45, color: toRgbString('#FF0000') },\n { value: 40, color: toRgbString('#FF9000') },\n { value: 35, color: toRgbString('#E7C000') },\n { value: 30, color: toRgbString('#FFFF00') },\n { value: 25, color: toRgbString('#019000') },\n { value: 20, color: toRgbString('#00D800') },\n { value: 15, color: toRgbString('#6DFA3D') },\n { value: 10, color: toRgbString('#64E7EB') },\n { value: 5, color: toRgbString('#419DF1') },\n ],\n SUND: (): IColorPaletteConfig => [\n { value: 95, color: toRgbString('#1A7E36') },\n { value: 90, color: toRgbString('#37944A') },\n { value: 85, color: toRgbString('#50A95B') },\n { value: 80, color: toRgbString('#6EBB73') },\n { value: 75, color: toRgbString('#93D190') },\n { value: 70, color: toRgbString('#ADDDA9') },\n { value: 65, color: toRgbString('#C2E7BA') },\n { value: 60, color: toRgbString('#D4EED0') },\n { value: 55, color: toRgbString('#E3F1DF') },\n { value: 50, color: toRgbString('#EEF4ED') },\n { value: 45, color: toRgbString('#F3EEF2') },\n { value: 40, color: toRgbString('#EEE4F0') },\n { value: 35, color: toRgbString('#E7D5E8') },\n { value: 30, color: toRgbString('#DAC3DF') },\n { value: 25, color: toRgbString('#CCB1D7') },\n { value: 20, color: toRgbString('#BD9ECA') },\n { value: 15, color: toRgbString('#A681B4') },\n { value: 10, color: toRgbString('#9970AC') },\n { value: 5, color: toRgbString('#8D529C') },\n { value: 0, color: toRgbString('#7C318B') },\n ],\n K: (): IColorPaletteConfig => [\n { value: 20, color: toRgbString('#93FFE0') },\n { value: 25, color: toRgbString('#D3FF54') },\n { value: 30, color: toRgbString('#FBEF38') },\n { value: 35, color: toRgbString('#E99D25') },\n { value: 40, color: toRgbString('#DD500B') },\n { value: 45, color: toRgbString('#DB0000') },\n { value: 50, color: toRgbString('#950100') },\n ],\n FOG: (): IColorPaletteConfig => [\n { desc: '特强浓雾', value: 5, color: toRgbString('#01534D', 0.6) },\n { desc: '强浓雾', value: 4, color: toRgbString('#009A9C', 0.6) },\n { desc: '浓雾', value: 3, color: toRgbString('#01CFCD', 0.6) },\n { desc: '大雾', value: 2, color: toRgbString('#D3FF54', 0.6) },\n { desc: '轻雾', value: 1, color: toRgbString('#93FFE0', 0.6) },\n ],\n STATION_VIS: (): IColorPaletteConfig => [\n { desc: '≥30', value: 30 * 1000, color: toRgbString('#ffffff', 0) },\n { desc: '20~30', value: 20 * 1000, color: toRgbString('#C7ECFF') },\n { desc: '10~20', value: 10 * 1000, color: toRgbString('#94DEF7') },\n { desc: '5~10', value: 5 * 1000, color: toRgbString('#74FE2F') },\n { desc: '3~5', value: 3 * 1000, color: toRgbString('#FDFF03') },\n { desc: '2~3', value: 2 * 1000, color: toRgbString('#FFB249') },\n { desc: '1~2', value: 1 * 1000, color: toRgbString('#FD5701') },\n { desc: '0.5~1', value: 0.5 * 1000, color: toRgbString('#FB0200') },\n { desc: '0.2~0.5', value: 0.2 * 1000, color: toRgbString('#9B00FE') },\n { desc: '0~0.2', value: 0, color: toRgbString('#722400') },\n ],\n STATION_PM10: (): IColorPaletteConfig => [\n { desc: '严重', value: 420, color: toRgbString('#9A034E') },\n { desc: '重度', value: 350, color: toRgbString('#D00042') },\n { desc: '中度', value: 250, color: toRgbString('#FC3B27') },\n { desc: '轻度', value: 150, color: toRgbString('#FDA926') },\n { desc: '良', value: 50, color: toRgbString('#EEDB43') },\n { desc: '优', value: 0, color: toRgbString('#4BCE2C') },\n ],\n ['STATION_PM2.5']: (): IColorPaletteConfig => [\n { desc: '严重', value: 250, color: toRgbString('#9A034E') },\n { desc: '重度', value: 150, color: toRgbString('#D00042') },\n { desc: '中度', value: 115, color: toRgbString('#FC3B27') },\n { desc: '轻度', value: 75, color: toRgbString('#FDA926') },\n { desc: '良', value: 35, color: toRgbString('#EEDB43') },\n { desc: '优', value: 0, color: toRgbString('#4BCE2C') },\n ],\n HAZE: (): IColorPaletteConfig => [\n { desc: '重度霾', value: 3, color: toRgbString('#7C0022') },\n { desc: '中度霾', value: 2, color: toRgbString('#AD7100') },\n { desc: '轻度霾', value: 1, color: toRgbString('#DECC00') },\n ],\n DUST: (): IColorPaletteConfig => [\n { desc: '特强沙尘暴', value: 4, color: toRgbString('#6C4824') },\n { desc: '强沙尘暴', value: 3, color: toRgbString('#9E6327') },\n { desc: '沙尘暴', value: 2, color: toRgbString('#BEA124') },\n { desc: '扬沙或浮尘', value: 1, color: toRgbString('#FAD676') },\n ],\n TCC: (): IColorPaletteConfig => [\n { desc: '99', value: 0.99, color: toRgbString('#FCFCFC') },\n { desc: '90', value: 0.9, color: toRgbString('#F0F0F0') },\n { desc: '80', value: 0.8, color: toRgbString('#DEDEDE') },\n { desc: '70', value: 0.7, color: toRgbString('#D2D2D2') },\n { desc: '60', value: 0.6, color: toRgbString('#C0C0C0') },\n { desc: '50', value: 0.5, color: toRgbString('#A2A2A2') },\n { desc: '40', value: 0.4, color: toRgbString('#969696') },\n { desc: '30', value: 0.3, color: toRgbString('#848484') },\n { desc: '20', value: 0.2, color: toRgbString('#787878') },\n { desc: '0', value: 0, color: toRgbString('#666666') },\n ],\n SDE: (): IColorPaletteConfig => [\n { value: 30, color: toRgbString('#A81018') },\n { value: 25, color: toRgbString('#EA4F25') },\n { value: 20, color: toRgbString('#F6782B') },\n { value: 15, color: toRgbString('#F9AE44') },\n { value: 10, color: toRgbString('#65BC4D') },\n { value: 5, color: toRgbString('#9FCE4F') },\n { value: 2.5, color: toRgbString('#4699AA') },\n { value: 1, color: toRgbString('#7EBEE7') },\n { value: 0.5, color: toRgbString('#D0EDFA') },\n // { value: 0, color: toRgbString('#FFFFFF') },\n ],\n ADI: (): IColorPaletteConfig => [\n { value: 40, color: toRgbString('#216311') },\n { value: 35, color: toRgbString('#3A7B19') },\n { value: 30, color: toRgbString('#529C21') },\n { value: 25, color: toRgbString('#72AF39') },\n { value: 20, color: toRgbString('#94CA58') },\n { value: 15, color: toRgbString('#B3DE80') },\n { value: 10, color: toRgbString('#D1ECAF') },\n { value: 5, color: toRgbString('#E9F5D5') },\n { value: 0, color: toRgbString('#F4F7ED') },\n { value: -5, color: toRgbString('#F9F1F4') },\n { value: -10, color: toRgbString('#FDE4EF') },\n { value: -15, color: toRgbString('#F8CEE6') },\n { value: -20, color: toRgbString('#EEB0D5') },\n { value: -25, color: toRgbString('#E58DBE') },\n { value: -30, color: toRgbString('#D85DA1') },\n { value: -35, color: toRgbString('#CB2589') },\n { value: -40, color: toRgbString('#AF076B') },\n { value: INFINITY_VALUE, color: toRgbString('#910052') },\n ],\n SSP: (): IColorPaletteConfig => [\n { value: 1060, color: toRgbString('#550089') },\n { value: 1055, color: toRgbString('#3A01AD') },\n { value: 1050, color: toRgbString('#1C00D4') },\n { value: 1045, color: toRgbString('#0001F9') },\n { value: 1040, color: toRgbString('#042CC0') },\n { value: 1035, color: toRgbString('#026775') },\n { value: 1030, color: toRgbString('#04A320') },\n { value: 1025, color: toRgbString('#39C43F') },\n { value: 1020, color: toRgbString('#87DB8C') },\n { value: 1015, color: toRgbString('#DAF3DD') },\n { value: 1010, color: toRgbString('#FEFFD9') },\n { value: 1005, color: toRgbString('#FFFE82') },\n { value: 1000, color: toRgbString('#FFFF32') },\n { value: 995, color: toRgbString('#FFF700') },\n { value: 990, color: toRgbString('#FDD902') },\n { value: 985, color: toRgbString('#FFBF03') },\n { value: 980, color: toRgbString('#FF9C00') },\n { value: 975, color: toRgbString('#FF6900') },\n { value: 970, color: toRgbString('#FE2D00') },\n { value: 0, color: toRgbString('#FE0000') },\n ],\n CAPES: (): IColorPaletteConfig => [\n { value: 200, color: toRgbString('#FFE1D3') },\n { value: 500, color: toRgbString('#FFFF9B') },\n { value: 1000, color: toRgbString('#F7E049') },\n { value: 1500, color: toRgbString('#EAA828') },\n { value: 2000, color: toRgbString('#E16E1A') },\n { value: 2500, color: toRgbString('#DB0000') },\n { value: 3000, color: toRgbString('#AB0000') },\n { value: 3500, color: toRgbString('#892827') },\n { value: 4000, color: toRgbString('#E068B1') },\n ],\n GPH: (): IColorPaletteConfig => [\n { value: 1050, desc: '1050', color: toRgbString('#B56561') },\n { value: 1030, desc: '1030', color: toRgbString('#C07269') },\n { value: 1010, desc: '1010', color: toRgbString('#98B8C5') },\n { value: 990, desc: '990', color: toRgbString('#697DA1') },\n { value: 970, desc: '970', color: toRgbString('#595991') },\n { value: 950, desc: '950', color: toRgbString('#58568F') },\n { value: 930, desc: '930', color: toRgbString('#58568F') },\n ],\n SNOW: {\n OBS_GRID: (): IColorPaletteConfig => [\n { value: 0.1, color: toRgbString('#CCCCCC') },\n { value: 2.5, color: toRgbString('#A1A1A1') },\n { value: 5, color: toRgbString('#707070') },\n { value: 10, color: toRgbString('#4A4A4A') },\n { value: 20, color: toRgbString('#7345E6') },\n { desc: '≥30', value: 30, color: toRgbString('#4D0074') },\n ],\n YBY_GEOJSON: (): IColorPaletteConfig => [\n { value: 0, color: toRgbString('#CCCCCC') },\n { value: 2.5, color: toRgbString('#A1A1A1') },\n { value: 5, color: toRgbString('#707070') },\n { value: 10, color: toRgbString('#4A4A4A') },\n { value: 20, color: toRgbString('#7345E6') },\n { desc: '≥30', value: 30, color: toRgbString('#4D0074') },\n ],\n },\n CLWC: () => [\n { value: 10, color: toRgbString('#013616') },\n { value: 5, color: toRgbString('#055023') },\n { value: 2.5, color: toRgbString('#06671F') },\n { value: 2, color: toRgbString('#077E1A') },\n { value: 1.5, color: toRgbString('#089516') },\n { value: 1, color: toRgbString('#1FA527') },\n { value: 0.5, color: toRgbString('#42B240') },\n { value: 0.25, color: toRgbString('#66C05B') },\n { value: 0.05, color: toRgbString('#8BCF7C') },\n { value: 0.02, color: toRgbString('#B1DFA7') },\n { value: 0.01, color: toRgbString('#D9EFD4') },\n ],\n CIWC: () => [\n { value: 10, color: toRgbString('#666D84') },\n { value: 5, color: toRgbString('#8C95B0') },\n { value: 2.5, color: toRgbString('#7A88A4') },\n { value: 2, color: toRgbString('#91ABD2') },\n { value: 1.5, color: toRgbString('#9EBEDF') },\n { value: 1, color: toRgbString('#AAD1EB') },\n { value: 0.5, color: toRgbString('#BCDEF3') },\n { value: 0.25, color: toRgbString('#CDECFA') },\n { value: 0.1, color: toRgbString('#DCF1FB') },\n { value: 0.05, color: toRgbString('#EAF6FB') },\n { value: 0.01, color: toRgbString('#F5FAFC') },\n ],\n // CLWC: () => [\n // { value: 50, color: toRgbString('#A20008') },\n // { value: 20, color: toRgbString('#B50000') },\n // { value: 10, color: toRgbString('#D10002') },\n // { value: 5, color: toRgbString('#E50000') },\n // { value: 3, color: toRgbString('#ED3505') },\n // { value: 2, color: toRgbString('#F28F00') },\n // { value: 1, color: toRgbString('#F9CA0C') },\n // { value: 0.5, color: toRgbString('#F6FF03') },\n // { value: 0.3, color: toRgbString('#B5FB09') },\n // { value: 0.2, color: toRgbString('#66EB09') },\n // { value: 0.1, color: toRgbString('#0CCC30') },\n // ],\n // CIWC: () => [\n // { value: 50, color: toRgbString('#46027F') },\n // { value: 20, color: toRgbString('#5A0F93') },\n // { value: 10, color: toRgbString('#5718B3') },\n // { value: 5, color: toRgbString('#541FD2') },\n // { value: 3, color: toRgbString('#523AF5') },\n // { value: 2, color: toRgbString('#5652FA') },\n // { value: 1, color: toRgbString('#5175FA') },\n // { value: 0.5, color: toRgbString('#579AF5') },\n // { value: 0.3, color: toRgbString('#53C0FB') },\n // { value: 0.2, color: toRgbString('#54E8FB') },\n // { value: 0.1, color: toRgbString('#53FFF9') },\n // ],\n RAIN: {\n SHORT: () => [\n { value: 0.02, color: toRgbString('#B9F4AB') },\n { value: 0.1, color: toRgbString('#6FDA6F') },\n { value: 1, color: toRgbString('#38BC39') },\n { value: 2.5, color: toRgbString('#259026') },\n { value: 5, color: toRgbString('#62B8FF') },\n { value: 10, color: toRgbString('#0000FC') },\n { value: 15, color: toRgbString('#FA00FA') },\n ],\n // 实况(网格)\n OBS_GRID: (): IColorPaletteConfig => [\n { value: 0.1, color: toRgbString('#D9F8D2') },\n { value: 2.5, color: toRgbString('#B8F4AA') },\n { value: 5, color: toRgbString('#73D86E') },\n { value: 10, color: toRgbString('#3DB93D') },\n { value: 25, color: toRgbString('#61B8FF') },\n { value: 50, color: toRgbString('#0000FE') },\n { value: 100, color: toRgbString('#FA00FA') },\n { desc: '≥250', value: 250, color: toRgbString('#810040') },\n ],\n YBY_GEOJSON: (): IColorPaletteConfig => [\n { desc: '≥250', value: 250, color: toRgbString('#82003E') },\n { value: 100, color: toRgbString('#FF00FF') },\n { value: 50, color: toRgbString('#0000FE') },\n { value: 25, color: toRgbString('#64B8FD') },\n { value: 10, color: toRgbString('#36BB44') },\n { value: 0, color: toRgbString('#A7F28F') },\n ],\n '3H-6H': (): IColorPaletteConfig => [\n { desc: '≥100', value: 100, color: toRgbString('#FA00FA') },\n { value: 50, color: toRgbString('#0000FC') },\n { value: 25, color: toRgbString('#62B8FF') },\n { value: 10, color: toRgbString('#259026') },\n { value: 5, color: toRgbString('#38BC39') },\n { value: 2.5, color: toRgbString('#6FDA6F') },\n { value: 0.01, color: toRgbString('#B9F4AB') },\n ],\n '12H-24H': (): IColorPaletteConfig => [\n { desc: '≥250', value: 250, color: toRgbString('#82003E') },\n { value: 100, color: toRgbString('#FF00FF') },\n { value: 50, color: toRgbString('#0000FE') },\n { value: 25, color: toRgbString('#64B8FD') },\n { value: 10, color: toRgbString('#36BB44') },\n { value: 0.1, color: toRgbString('#A7F28F') },\n ],\n CPE: (): IColorPaletteConfig => [\n { value: 250, color: toRgbString('#82003E') },\n { value: 100, color: toRgbString('#FF00FF') },\n { value: 50, color: toRgbString('#0000FE') },\n { value: 25, color: toRgbString('#64B8FD') },\n { value: 10, color: toRgbString('#36BB44') },\n { value: 0.1, color: toRgbString('#A7F28F') },\n ],\n RAIN_1H: (): IColorPaletteConfig => [\n { value: 0.1, color: toRgbString('#B7EF98') },\n { value: 1.5, color: toRgbString('#63B54F') },\n { value: 7, color: toRgbString('#75B7F9') },\n { value: 15, color: toRgbString('#001BD6') },\n { value: 40, color: toRgbString('#E63CF2') },\n { value: 50, color: toRgbString('#76163F') },\n ],\n // 夏季\n RAIN_Summer: (): IColorPaletteConfig => [\n { value: 0.1, color: toRgbString('#B7F4A4') },\n { value: 10, color: toRgbString('#64CA63') },\n { value: 25, color: toRgbString('#81C6FF') },\n { value: 50, color: toRgbString('#3335FE') },\n { value: 100, color: toRgbString('#FD33FD') },\n { desc: '≥250', value: 250, color: toRgbString('#9C3367') },\n ],\n // 冬季\n RAIN_Winter: (): IColorPaletteConfig => [\n { value: 0.1, color: toRgbString('#E4ECF7') },\n { value: 2.5, color: toRgbString('#BAF3A4') },\n { value: 5, color: toRgbString('#65CB65') },\n { value: 10, color: toRgbString('#579E58') },\n { value: 20, color: toRgbString('#83C5FF') },\n { value: 25, color: toRgbString('#34A8FF') },\n { value: 50, color: toRgbString('#3534FC') },\n { desc: '≥100', value: 100, color: toRgbString('#FA3DEF') },\n ],\n },\n WINDS: {\n DEF: (): IColorPaletteConfig => [\n { value: 44, color: toRgbString('#881F15') },\n { value: 40, color: toRgbString('#BD3028') },\n { value: 36, color: toRgbString('#E56437') },\n { value: 32, color: toRgbString('#F5BD5F') },\n { value: 28, color: toRgbString('#ADCE64') },\n { value: 24, color: toRgbString('#63A47E') },\n { value: 20, color: toRgbString('#71A0D2') },\n { value: 16, color: toRgbString('#B7DEFC') },\n ],\n WINDS_10M: (): IColorPaletteConfig => [\n { value: 28.5, color: toRgbString('#F00082') },\n { value: 24.5, color: toRgbString('#FA3C3C') },\n { value: 20.5, color: toRgbString('#F08228') },\n { value: 17.2, color: toRgbString('#E6AF2D') },\n { value: 13.9, color: toRgbString('#E6DC32') },\n { value: 10.8, color: toRgbString('#A0E632') },\n { value: 8, color: toRgbString('#00DC00') },\n { value: 5.5, color: toRgbString('#00D28C') },\n { value: 3.4, color: toRgbString('#00C8C8') },\n ],\n WINDS_STRONG: (): IColorPaletteConfig => [\n { value: 12, color: toRgbString('#B7DEFC') },\n { value: 16, color: toRgbString('#71A0D2') },\n { value: 20, color: toRgbString('#63A47E') },\n { value: 24, color: toRgbString('#ADCE64') },\n { value: 28, color: toRgbString('#F5BD5F') },\n { value: 32, color: toRgbString('#E56437') },\n { value: 36, color: toRgbString('#BD3028') },\n { value: 40, color: toRgbString('#881F15') },\n ],\n WINDS_GUST: (): IColorPaletteConfig => [\n { value: 28.5, color: toRgbString('#DD5D51') },\n { value: 24.5, color: toRgbString('#DC2300') },\n { value: 20.8, color: toRgbString('#F87000') },\n { value: 17.2, color: toRgbString('#FFA202') },\n { value: 13.9, color: toRgbString('#FFD900') },\n { value: 10.8, color: toRgbString('#EDF900') },\n { value: 8, color: toRgbString('#40ED00') },\n ],\n },\n KINDEX: (): IColorPaletteConfig => [\n { value: 20, color: toRgbString('#93FFE0') },\n { value: 25, color: toRgbString('#D3FF54') },\n { value: 30, color: toRgbString('#FBEF38') },\n { value: 35, color: toRgbString('#E99D25') },\n { value: 40, color: toRgbString('#DD500B') },\n { value: 45, color: toRgbString('#DB0000') },\n { value: 50, color: toRgbString('#950100') },\n ],\n SST: (): IColorPaletteConfig => [\n { value: 34, color: toRgbString('#FCB5B2') },\n { value: 32, color: toRgbString('#E96465') },\n { value: 30, color: toRgbString('#DA2425') },\n { value: 28, color: toRgbString('#CC0100') },\n { value: 26, color: toRgbString('#E20000') },\n { value: 24, color: toRgbString('#F30000') },\n { value: 22, color: toRgbString('#FE0B00') },\n { value: 20, color: toRgbString('#FF3900') },\n { value: 18, color: toRgbString('#FE6101') },\n { value: 16, color: toRgbString('#FE7F00') },\n { value: 14, color: toRgbString('#FF9500') },\n { value: 12, color: toRgbString('#FFAB00') },\n { value: 10, color: toRgbString('#FDC10A') },\n { value: 8, color: toRgbString('#FDD421') },\n { value: 6, color: toRgbString('#FEE53E') },\n { value: 4, color: toRgbString('#FFF47A') },\n { value: 2, color: toRgbString('#FFFCB2') },\n { value: 0, color: toRgbString('#C6E7F7') },\n { value: -2, color: toRgbString('#ACDBF4') },\n { value: -4, color: toRgbString('#92CFEE') },\n { value: -6, color: toRgbString('#6BC6F1') },\n { value: -8, color: toRgbString('#33C2F7') },\n { value: -10, color: toRgbString('#01BFFF') },\n { value: -12, color: toRgbString('#02AEFE') },\n { value: -14, color: toRgbString('#0E9CFF') },\n { value: -16, color: toRgbString('#1B8BFB') },\n { value: -18, color: toRgbString('#287BF0') },\n { value: -20, color: toRgbString('#386DE5') },\n { value: -22, color: toRgbString('#3157E7') },\n { value: -24, color: toRgbString('#1C35EE') },\n { value: -26, color: toRgbString('#0004FB') },\n { value: -28, color: toRgbString('#2502F9') },\n { value: -30, color: toRgbString('#540BF5') },\n { value: INFINITY_VALUE, color: toRgbString('#8018EC') },\n ],\n SSP_CHANGE: (): IColorPaletteConfig => [\n { value: 45, color: toRgbString('#540186') },\n { value: 40, color: toRgbString('#3A00AE') },\n { value: 35, color: toRgbString('#1601D4') },\n { value: 30, color: toRgbString('#0000F8') },\n { value: 25, color: toRgbString('#002DBE') },\n { value: 20, color: toRgbString('#036677') },\n { value: 15, color: toRgbString('#04A41D') },\n { value: 10, color: toRgbString('#3AC63B') },\n { value: 5, color: toRgbString('#89DB8A') },\n { value: 0, color: toRgbString('#DBF3DC') },\n { value: -5, color: toRgbString('#FEFDDD') },\n { value: -10, color: toRgbString('#FFFD87') },\n { value: -15, color: toRgbString('#FFFE34') },\n { value: -20, color: toRgbString('#FEF900') },\n { value: -25, color: toRgbString('#FFD900') },\n { value: -30, color: toRgbString('#FEC000') },\n { value: -35, color: toRgbString('#FF9902') },\n { value: -40, color: toRgbString('#FD6C00') },\n { value: -45, color: toRgbString('#FF2E00') },\n { value: INFINITY_VALUE, color: toRgbString('#FF0000') },\n ],\n};\n",
21
+ "export type WeatherLevelType = 200 | 300 | 500 | 700 | 850 | 925 | 1000;\n\nexport type IntervalType = '48H' | '24H' | '12H' | '6H' | '3H' | '1H';\n\nexport type SpaceCode = 'G020' | 'G010' | 'G005'; // G020高层类,G010地面类,G005\n\nexport type TitleShowOption = 'name' | 'date' | 'layerInfo';\n\nexport enum StepRangeUnit {\n H = 'H',\n M = 'M',\n}\n\nexport interface IProductGroupConfig {\n name: string;\n icon: any;\n isDev?: boolean;\n}\n\nexport type ITimeBarInfo = {\n timingTimeBar: {\n initTime: number;\n timeRange: [startTime: number, endTime: number];\n };\n frameTimeBar?: {\n initTime: number;\n items: {\n time: number;\n desc?: string;\n }[];\n };\n};\n",
22
+ "import maplibregl from 'maplibre-gl';\n\nexport const mapgl = maplibregl;\n\nexport type IMap = maplibregl.Map;\n\nexport type IControl = maplibregl.IControl;\n\nexport type ICustomLayerInterface = maplibregl.CustomLayerInterface;\n\nexport type Bounds = [lngMin: number, latMin: number, lngMax: number, latMax: number];\n\nexport type PlayStatus = 'drag' | 'play' | 'stop';\n\nexport type PlayMode = 'timing' | 'frame';\n\nexport type ProjectionType = 'globe' | 'mercator';\n\nexport type ViewComponentsStyle = 'mini' | 'def' | 'hidden';\n\nexport type BasemapType = 'none' | 'tdt_vec' | 'tdt_img' | 'windy' | 'maptiler-dataviz';\n\nexport interface IMapState {\n bearing: number;\n pitch: number;\n center: [lng: number, lat: number];\n zoom: number;\n bounds?: Bounds;\n}\n",
23
+ "import { TinyColor } from '@ctrl/tinycolor';\nimport { IColorPaletteConfig, IColorPaletteVo } from '../types/colorPalette';\n\n/**\n * 创建色卡信息\n * @param configs\n * @returns\n */\nexport function createColorPalette(configs: IColorPaletteConfig): IColorPaletteVo {\n const sortedConfigs = configs.sort((a, b) => b.value - a.value);\n const values = sortedConfigs.map(e => e.value);\n const minValue = Math.min(...values);\n const maxValue = Math.max(...values);\n\n const stops = sortedConfigs.map(e => e.value).reverse();\n const colors = sortedConfigs\n .map(e => Object.values(new TinyColor(e.color).toRgb()))\n .reverse()\n .flat();\n\n const w = 255;\n const h = 20;\n const canvas = document.createElement('canvas');\n const ctx = canvas.getContext('2d')!;\n canvas.width = w;\n canvas.height = h;\n\n const gradient = ctx.createLinearGradient(0, 0, w, h);\n const normalizedColors: [number, string][] = sortedConfigs.map(e => {\n let normalizedValue = (e.value - minValue) / (maxValue - minValue);\n normalizedValue = isNaN(normalizedValue) ? 0 : normalizedValue;\n return [normalizedValue, new TinyColor(e.color).toRgbString()];\n });\n normalizedColors.forEach(([stop, color]) => gradient.addColorStop(+stop, color));\n ctx.fillStyle = gradient;\n ctx.fillRect(0, 0, w, h);\n\n const imageData = ctx.getImageData(0, 0, w, h);\n const imageDataUrl = canvas.toDataURL();\n\n return {\n config: sortedConfigs,\n minValue,\n maxValue,\n stops,\n colors,\n imageData,\n imageDataUrl,\n };\n}\n",
24
+ "import { Bounds } from '../../types/map';\n\n/**\n * 解析exif DataRange字段\n * @param dataRange\n * @returns\n */\nexport function parseExifDataRange(dataRange: string) {\n const [minVal, maxVal] = dataRange\n .replace(/[\\[\\]]/g, '')\n .split(',')\n .map((e: string) => parseFloat(e)) as [maxVal: number, minVal: number];\n return { maxVal, minVal };\n}\n\n/**\n * 解析exif 3d size字段\n * @param dataRange\n * @returns\n */\nexport function parseExif3dSize(size: string) {\n const [width, height, depth] = size\n .replace(/[\\[\\]]/g, '')\n .split(',')\n .map((e: string) => parseFloat(e)) as [width: number, height: number, depth: number];\n return { width, height, depth };\n}\n\n/**\n * 解析exif DataRange字段(风)\n * @param dataRange\n * @returns\n */\nexport function parseExifDataRangeWithWind(dataRange: string) {\n const [minWindu, maxWindu, minWindv, maxWindv, minWinds, maxWinds] = dataRange\n .replace(/[\\[\\]]/g, '')\n .split(',')\n .map((e: string) => parseFloat(e)) as [\n minWindu: number,\n maxWindu: number,\n minWindv: number,\n maxWindv: number,\n minWinds: number,\n maxWinds: number,\n ];\n return { minWindu, maxWindu, minWindv, maxWindv, minWinds, maxWinds };\n}\n\n/**\n * 解析exif Bounds字段\n * @param bounds\n * @returns\n */\nexport function parseExifBounds(bounds: string): Bounds {\n return bounds\n .replace(/[\\[\\]]/g, '')\n .split(',')\n .map((e: string) => parseFloat(e)) as Bounds;\n}\n",
25
+ "import * as exifr from 'exifr';\n\ninterface IBaseExif {\n BitDepth: number;\n Filter: string;\n Interlace: string;\n ColorType: string;\n ImageWidth: string;\n ImageHeight: string;\n Compression: string;\n}\n\nexport async function readExif<T = {}>(img: string | ArrayBuffer): Promise<T & IBaseExif> {\n let arrayBuffer;\n if (img instanceof ArrayBuffer) {\n arrayBuffer = img;\n } else {\n const res = await fetch(img);\n arrayBuffer = await res.arrayBuffer();\n }\n\n const exif = await exifr.parse(arrayBuffer);\n\n return exif as T & IBaseExif;\n}\n",
26
+ "import { readExif } from './readExif';\n\nexport interface IReadImageInfo {\n data: ImageBitmap;\n exif: { bounds: string; dataRange: string };\n}\n\nexport async function readImagWithExif(imgUrl: string, signal?: AbortSignal): Promise<IReadImageInfo> {\n const res = await fetch(imgUrl, { signal });\n\n const arrayBuffer = await res.arrayBuffer();\n\n const exif = await readExif<IReadImageInfo['exif']>(arrayBuffer);\n\n const blob = new Blob([arrayBuffer]);\n\n const imageBitmap = await createImageBitmap(blob);\n\n return { exif, data: imageBitmap };\n}\n",
27
+ "import { parseExifBounds, parseExifDataRange, parseExifDataRangeWithWind } from './parseExif';\nimport { readImagWithExif } from './readImagWithExif';\n\nexport interface IReadImageWithExifOptions {\n isWorker?: boolean;\n signal?: AbortSignal;\n}\n\nexport async function readImageWithCommonExif(imgUrl: string, options?: IReadImageWithExifOptions) {\n const imageWithExif = await readImagWithExif(imgUrl, options?.signal);\n\n const { exif, ...attr } = imageWithExif;\n\n const dataRange = parseExifDataRange(exif.dataRange);\n\n const bounds = parseExifBounds(exif.bounds);\n\n return {\n ...attr,\n dataRange,\n bounds,\n };\n}\n\nexport async function readImageWithWindExif(imgUrl: string, options?: IReadImageWithExifOptions) {\n // const imageWithExif = options?.isWorker ? await loadWorker(imgUrl) : await readImagWithExif(imgUrl, options?.signal);\n const imageWithExif = await readImagWithExif(imgUrl, options?.signal);\n\n const { exif, ...attr } = imageWithExif;\n\n const dataRange = parseExifDataRangeWithWind(exif.dataRange);\n\n const bounds = parseExifBounds(exif.bounds);\n\n return {\n ...attr,\n dataRange,\n bounds,\n };\n}\n",
28
+ "function mod(x: number, y: number): number {\n return ((x % y) + y) % y;\n}\n\nexport function wrapLongitude(lng: number, minLng?: number): number {\n let wrappedLng = mod(lng + 180, 360) - 180;\n if (typeof minLng === 'number' && wrappedLng < minLng) {\n wrappedLng += 360;\n }\n return wrappedLng;\n}\n\n/**\n * 包装bounds\n * @param bounds\n * @returns\n */\nexport function wrapBounds(bounds: GeoJSON.BBox): GeoJSON.BBox {\n const minLng = bounds[2] - bounds[0] < 360 ? wrapLongitude(bounds[0]) : -180;\n const maxLng = bounds[2] - bounds[0] < 360 ? wrapLongitude(bounds[2], minLng) : 180;\n\n const minLat = Math.max(bounds[1], -85.051129);\n const maxLat = Math.min(bounds[3], 85.051129);\n\n const mercatorBounds = [minLng, minLat, maxLng, maxLat] as GeoJSON.BBox;\n return mercatorBounds;\n}\n\n/**\n * 将map的bounds转换成包装好的bounds\n * @param map\n * @returns\n */\nexport function getViewportBounds(map: maplibregl.Map): GeoJSON.BBox {\n const viewportBounds = map.getBounds().toArray().flat() as GeoJSON.BBox;\n return wrapBounds(viewportBounds);\n}\n",
29
+ "import { INFINITY_VALUE } from '../config/colorPalette';\nimport { IColorPaletteConfig } from '../types/colorPalette';\n\nexport interface IColorPaletteFns {\n toColor: (val: number) => string | undefined;\n values: number[];\n min: number;\n max: number;\n}\n\nexport function toColorPaletteFns(colorPalette: IColorPaletteConfig): IColorPaletteFns {\n const sortedColorPalette = colorPalette.sort((a, b) => a.value - b.value);\n const values = sortedColorPalette.flatMap(e => e.value).filter(e => e !== INFINITY_VALUE);\n const min = Math.min(...values);\n const max = Math.max(...values);\n return {\n values,\n min,\n max,\n toColor: (val: number) => {\n let outColor: string | undefined;\n if (val >= sortedColorPalette[sortedColorPalette.length - 1].value) {\n outColor = sortedColorPalette[sortedColorPalette.length - 1].color!;\n } else {\n for (let i = 0; i < colorPalette.length; i++) {\n if (val >= sortedColorPalette[i].value && val < sortedColorPalette[i + 1].value) {\n outColor = sortedColorPalette[i].color!;\n break;\n }\n }\n }\n return outColor;\n },\n };\n}\n",
30
+ "import * as maplibregl from 'maplibre-gl';\nimport { IMap } from '../types/map';\n\nexport function getVisibleWraps(map: IMap): number[] {\n const isGlobe = map.getProjection()?.type === 'globe';\n if (isGlobe || (map.getRenderWorldCopies && !map.getRenderWorldCopies())) {\n return [0];\n }\n\n const corners: maplibregl.Point[] = [\n new maplibregl.Point(0, 0),\n new maplibregl.Point(map.transform.width, 0),\n new maplibregl.Point(map.transform.width, map.transform.height),\n new maplibregl.Point(0, map.transform.height),\n ];\n\n let minWrap = Infinity;\n let maxWrap = -Infinity;\n\n for (const p of corners) {\n const merc = map.transform.screenPointToMercatorCoordinate(p);\n if (merc) {\n minWrap = Math.min(minWrap, Math.floor(merc.x));\n maxWrap = Math.max(maxWrap, Math.floor(merc.x));\n }\n }\n\n if (minWrap === Infinity || maxWrap === -Infinity) {\n return [-1, 0, 1];\n }\n\n const wraps = [];\n\n for (let i = minWrap; i <= maxWrap; i++) {\n wraps.push(i);\n }\n\n return wraps;\n}\n",
31
+ "import * as maplibregl from 'maplibre-gl';\nimport { Bounds } from '../types/map';\n\nexport interface IGridMesh {\n a_pos: { numComponents: 2; data: number[] };\n a_uv: { numComponents: 2; data: number[] };\n indices: number[];\n}\n\nexport function createGridMesh(bounds: Bounds, gridSize: number): IGridMesh {\n const Arrays: IGridMesh = {\n a_pos: { numComponents: 2, data: [] },\n a_uv: { numComponents: 2, data: [] },\n indices: [],\n };\n\n const [minLng, minLat, maxLng, maxLat] = bounds;\n const nw = maplibregl.MercatorCoordinate.fromLngLat({ lng: minLng, lat: maxLat });\n const se = maplibregl.MercatorCoordinate.fromLngLat({ lng: maxLng, lat: minLat });\n\n for (let y = 0; y <= gridSize; y++) {\n for (let x = 0; x <= gridSize; x++) {\n const u = x / gridSize;\n const v = y / gridSize;\n const posX = nw.x + (se.x - nw.x) * u;\n const posY = nw.y + (se.y - nw.y) * v;\n Arrays.a_pos.data.push(posX, posY);\n Arrays.a_uv.data.push(u, v);\n }\n }\n\n for (let y = 0; y < gridSize; y++) {\n for (let x = 0; x < gridSize; x++) {\n const i = y * (gridSize + 1) + x;\n const top = i;\n const bottom = i + (gridSize + 1);\n Arrays.indices.push(top, bottom, top + 1);\n Arrays.indices.push(bottom, bottom + 1, top + 1);\n }\n }\n return Arrays;\n}\n",
32
+ "import { IColorPaletteConfig } from '../types/colorPalette';\n\nexport function scaleColorPaletteConfig(colorPaletteConfig: IColorPaletteConfig, valueScale: number): IColorPaletteConfig {\n return colorPaletteConfig.map(e => {\n return {\n ...e,\n value: e.value * valueScale,\n };\n });\n}\n",
33
+ "import { FeatureCollection, Geometry } from 'geojson';\nimport china_province from './file/china_province.json';\nimport china from './file/china.json';\nimport { produce } from 'immer';\nimport { AreaGeoJsonProperties } from './types';\nimport * as turf from '@turf/turf';\n\nexport interface IChinaGeoJSON {\n gb: string;\n name: string;\n geojson_boundary: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n geojson_provinces: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n provinces: {\n name: string;\n gb: string;\n geojson: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n }[];\n}\n\nexport function getChina(): IChinaGeoJSON {\n const chinaGeoJson = china as unknown as FeatureCollection<Geometry, AreaGeoJsonProperties>;\n const feature = chinaGeoJson.features[0];\n const provinces = getChinaProvinces();\n\n return {\n gb: feature.properties.gb,\n name: feature.properties.name,\n geojson_boundary: china as unknown as FeatureCollection<Geometry, AreaGeoJsonProperties>,\n geojson_provinces: provinces,\n provinces: provinces.features.map(e => ({\n name: e.properties.name,\n gb: e.properties.gb,\n geojson: turf.featureCollection([e]),\n })),\n };\n}\n\nfunction getChinaProvinces(): FeatureCollection<Geometry, AreaGeoJsonProperties> {\n const data = china_province as unknown as FeatureCollection<Geometry, AreaGeoJsonProperties>;\n return produce(data, draft => {\n draft.features.forEach(e => {\n e.id = e.properties.gb;\n });\n });\n}\n",
34
+ "import china_province from './file/china_province.json';\nimport china_city from './file/chain_city.json';\nimport china_county from './file/china_county.json';\nimport { produce } from 'immer';\nimport { FeatureCollection, Geometry } from 'geojson';\nimport { AreaGeoJsonProperties } from './types';\nimport * as turf from '@turf/turf';\n\nexport interface IProvinceGeoJson {\n name: string;\n gb: string;\n geojson_boundary: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n geojson_citys: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n geojson_countys: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n citys: {\n name: string;\n gb: string;\n geojson: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n }[];\n}\n\nexport function getProvince(_province_gb: string): IProvinceGeoJson {\n const china_provinces = china_province as unknown as FeatureCollection<Geometry, AreaGeoJsonProperties>;\n\n const province = china_provinces.features.find(e => e.properties.gb === _province_gb)!;\n\n const citys = getCitysByProvince(_province_gb);\n\n const countys = getCountysByProvince(_province_gb);\n\n return {\n name: province.properties.name,\n gb: province.properties.gb,\n geojson_boundary: turf.featureCollection([province]),\n geojson_citys: turf.featureCollection([...citys.features]),\n geojson_countys: turf.featureCollection([...countys.features]),\n citys: citys.features.map(e => ({\n name: e.properties.name,\n gb: e.properties.gb,\n geojson: turf.featureCollection([e]),\n })),\n };\n}\n\nfunction getCitysByProvince(_province_gb: string): FeatureCollection<Geometry, AreaGeoJsonProperties> {\n const china_city_geojson = china_city as unknown as FeatureCollection<Geometry, AreaGeoJsonProperties>;\n\n const province_gb_key = _province_gb.substring(0, _province_gb.length - 4);\n\n const citys = turf.featureCollection(\n china_city_geojson.features.filter(e => {\n return e.properties.gb.substring(0, e.properties.gb.length - 4) === province_gb_key;\n }),\n );\n\n return produce(citys, draft => {\n draft.features.forEach(e => {\n e.id = e.properties.gb;\n });\n });\n}\n\nfunction getCountysByProvince(_province_gb: string): FeatureCollection<Geometry, AreaGeoJsonProperties> {\n const china_county_geojson = china_county as unknown as FeatureCollection<Geometry, AreaGeoJsonProperties>;\n\n const province_gb_key = _province_gb.substring(0, _province_gb.length - 4);\n\n const citys = turf.featureCollection(\n china_county_geojson.features.filter(e => {\n return e.properties.gb.substring(0, e.properties.gb.length - 4) === province_gb_key;\n }),\n );\n\n return produce(citys, draft => {\n draft.features.forEach(e => {\n e.id = e.properties.gb;\n });\n });\n}\n",
35
+ "import china_city from './file/chain_city.json';\nimport china_county from './file/china_county.json';\nimport * as turf from '@turf/turf';\nimport { produce } from 'immer';\nimport { FeatureCollection, Geometry } from 'geojson';\nimport { AreaGeoJsonProperties } from './types';\n\nexport interface ICityGeoJson {\n name: string;\n gb: string;\n geojson_boundary: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n geojson_countys: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n countys: {\n name: string;\n gb: string;\n geojson: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n }[];\n}\n\nexport function getCity(_city_gb: string): ICityGeoJson {\n const china_citys = china_city as unknown as FeatureCollection<Geometry, AreaGeoJsonProperties>;\n\n const city = china_citys.features.find(e => e.properties.gb === _city_gb)!;\n\n const countys = getCountysByCity(_city_gb);\n\n return {\n name: city.properties.name,\n gb: city.properties.gb,\n geojson_boundary: turf.featureCollection([city]),\n geojson_countys: turf.featureCollection([...countys.features]),\n countys: countys.features.map(e => ({\n name: e.properties.name,\n gb: e.properties.gb,\n geojson: turf.featureCollection([e]),\n })),\n };\n}\n\nfunction getCountysByCity(_city_gb: string): FeatureCollection<Geometry, AreaGeoJsonProperties> {\n const china_countys = china_county as unknown as FeatureCollection<Geometry, AreaGeoJsonProperties>;\n\n const city_gb_key = _city_gb.substring(0, _city_gb.length - 2);\n\n const countys = turf.featureCollection(\n china_countys.features.filter(e => {\n return e.properties.gb.substring(0, e.properties.gb.length - 2) === city_gb_key;\n }),\n );\n\n return produce(countys, draft => {\n draft.features.forEach(e => {\n e.id = e.properties.gb;\n });\n });\n}\n",
36
+ "import china_county from './file/china_county.json';\nimport * as turf from '@turf/turf';\nimport { FeatureCollection, Geometry } from 'geojson';\nimport { AreaGeoJsonProperties } from './types';\n\nexport interface ICountyGeoJson {\n name: string;\n gb: string;\n geojson_boundary: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n}\n\nexport function getCounty(_county_gb: string): ICountyGeoJson {\n const china_countys = china_county as unknown as FeatureCollection<Geometry, AreaGeoJsonProperties>;\n\n const county = china_countys.features.find(e => e.properties.gb === _county_gb)!;\n\n return {\n name: county.properties.name,\n gb: county.properties.gb,\n geojson_boundary: turf.featureCollection([county]),\n };\n}\n",
37
+ "import { FeatureCollection } from 'geojson';\nimport land from './file/land.json';\n\nexport function getLand() {\n return land as unknown as FeatureCollection;\n}\n",
38
+ "import { FeatureCollection, Point } from 'geojson';\nimport china_province_names from './file/china_province_names.json';\n\nexport type IProvinceNamesGeoJSON = FeatureCollection<\n Point,\n { province: string; abbreviation: string; capital: string }\n>;\n\nexport function getProvinceNames() {\n return china_province_names as unknown as IProvinceNamesGeoJSON;\n}\n",
39
+ "import { getChina, IChinaGeoJSON } from './getChina';\nimport { getCity, ICityGeoJson } from './getCity';\nimport { getCounty, ICountyGeoJson } from './getCounty';\nimport { getProvince, IProvinceGeoJson } from './getProvince';\nimport { IAdCodeInfo } from './types';\n\nexport interface IAdcodeInfoVo {\n china?: IChinaGeoJSON;\n province?: IProvinceGeoJson;\n city?: ICityGeoJson;\n county?: ICountyGeoJson;\n}\n\nexport function toAdcodeInfoVo(adcodeInfo: IAdCodeInfo): IAdcodeInfoVo {\n const { province, city, county } = adcodeInfo;\n\n const vo = {\n china: getChina(),\n province: province ? getProvince(province) : undefined,\n city: city ? getCity(city) : undefined,\n county: county ? getCounty(county) : undefined,\n };\n\n return vo;\n}\n",
40
+ "import { CustomRenderMethodInput } from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { createGridMesh, getVisibleWraps } from '../../fns';\nimport { Bounds, ICustomLayerInterface, IMap } from '../../types/map';\n\nexport abstract class ExCustomLayer implements ICustomLayerInterface {\n abstract onMount(): void;\n abstract onUnMount(): void;\n abstract onRender(options: CustomRenderMethodInput, wraps: number[]): boolean | void;\n\n public id: string;\n public type: 'custom' = 'custom';\n public map!: IMap;\n public gl!: WebGLRenderingContext | WebGL2RenderingContext;\n protected textureOptions: { [key: string]: twgl.TextureOptions } = {};\n protected textures: { [key: string]: WebGLTexture } = {};\n private programInfoCache = new Map<string, twgl.ProgramInfo>();\n\n constructor(props: { id: string }) {\n this.id = props.id;\n }\n\n protected createProgramInfo(\n name: string,\n options: maplibregl.CustomRenderMethodInput,\n onVertShader: () => string,\n onFragShader: () => string,\n ): twgl.ProgramInfo {\n const key = `${options.shaderData.variantName}-${name}`;\n\n if (!this.programInfoCache.has(key)) {\n const programInfo = twgl.createProgramInfo(this.gl2, [onVertShader(), onFragShader()]);\n this.programInfoCache.set(key, programInfo);\n }\n\n return this.programInfoCache.get(key)!;\n }\n\n protected get gl2() {\n if (!this.gl) throw new Error('gl is not initialized');\n if (this.gl instanceof WebGLRenderingContext) throw new Error('gl is not WebGL2RenderingContext');\n return this.gl;\n }\n\n public onAdd(map: IMap, gl: WebGLRenderingContext | WebGL2RenderingContext): void {\n this.map = map;\n this.gl = gl;\n this.onMount();\n }\n\n public onRemove(map: IMap, gl: WebGLRenderingContext | WebGL2RenderingContext): void {\n this.onUnMount();\n }\n\n public render(gl: WebGLRenderingContext | WebGL2RenderingContext, options: CustomRenderMethodInput) {\n const wraps = getVisibleWraps(this.map);\n this.onRender(options, wraps);\n }\n\n public rerender() {\n try {\n this.map.triggerRepaint();\n } catch (error) {\n console.info('rerender error', error);\n }\n }\n\n protected animationFrameId?: number = undefined;\n protected isStop: boolean = true;\n protected time: number = 0;\n\n run(fn: (now: number) => void) {\n this.stop();\n\n this.isStop = false;\n\n const exeRun = (now: number) => {\n if (this.isStop) return;\n this.time = now;\n fn(now);\n this.animationFrameId = requestAnimationFrame(exeRun);\n };\n\n requestAnimationFrame(exeRun);\n }\n\n public stop() {\n this.isStop = true;\n if (this.animationFrameId) cancelAnimationFrame(this.animationFrameId);\n }\n\n protected setTextureOptions(\n gl: WebGLRenderingContext | WebGL2RenderingContext,\n options: { [key: string]: twgl.TextureOptions | WebGLTexture },\n ) {\n const textures: { [key: string]: WebGLTexture } = {};\n const textureOptions: { [key: string]: twgl.TextureOptions } = {};\n Object.keys(options).forEach(key => {\n const item = options[key];\n if (item instanceof WebGLTexture) {\n textures[key] = item;\n } else {\n textureOptions[key] = item;\n }\n });\n this.textures = {\n ...this.textures,\n ...textures,\n ...twgl.createTextures(gl, textureOptions),\n };\n }\n\n protected readBufferToArray(gl: WebGL2RenderingContext, buffer: WebGLBuffer, bufferSize: number) {\n gl.bindBuffer(gl.ARRAY_BUFFER, buffer);\n const readData = new Float32Array(bufferSize);\n gl.getBufferSubData(gl.ARRAY_BUFFER, 0, readData);\n return Array.from(readData);\n }\n\n private gridMeshBufferInfo: Record<string, twgl.BufferInfo> = {};\n\n protected getGridMeshBufferInfo(gl: WebGLRenderingContext, bounds: Bounds): twgl.BufferInfo {\n const gridSize = 64;\n\n const key = bounds.toString() + ',' + gridSize;\n\n if (this.gridMeshBufferInfo[key]) return this.gridMeshBufferInfo[key];\n\n const gridMesh = createGridMesh(bounds, gridSize);\n\n this.gridMeshBufferInfo[key] = twgl.createBufferInfoFromArrays(gl, gridMesh as any);\n\n return this.gridMeshBufferInfo[key];\n }\n}\n",
41
+ "import { CustomRenderMethodInput } from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { Bounds } from '../../types/map';\nimport { ExCustomLayer } from '../base/ExCustomLayer';\nimport { calculateRenderBounds } from './fns/calculateRenderBounds';\nimport { createProjectionMatrix } from './fns/createProjectionMatrix';\nimport { hasViewportChanged, ViewportState } from './fns/hasViewportChanged';\nimport { lngLatToMercator } from './fns/lngLatToMercator';\nimport { MaskGeoJson, processGeoJSON } from './fns/processGeoJSON';\n\ntype MaskLayerOptions = {\n id: string;\n maskData?: MaskGeoJson;\n};\n\nexport class MaskLayer extends ExCustomLayer {\n private maskData?: MaskGeoJson;\n private maskSize = 2048;\n private lastViewportState: ViewportState = { zoom: -1, center: [0, 0] };\n private maskTexture: WebGLTexture | null = null;\n private fbo!: twgl.FramebufferInfo;\n private vbo!: twgl.BufferInfo;\n private vCount!: number;\n private renderBounds: Bounds | null = null;\n private fullBounds!: Bounds;\n\n constructor(options: MaskLayerOptions) {\n super({ id: options.id });\n this.maskData = options.maskData;\n }\n\n onMount() {\n const gl = this.gl2;\n\n if (this.maskData) {\n this.setMaskData(this.maskData);\n }\n\n this.maskTexture = twgl.createTexture(gl, {\n width: this.maskSize,\n height: this.maskSize,\n internalFormat: gl.RGBA,\n format: gl.RGBA,\n type: gl.UNSIGNED_BYTE,\n mag: gl.LINEAR,\n min: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n });\n\n this.fbo = twgl.createFramebufferInfo(gl, [{ attachment: this.maskTexture }]);\n }\n\n public setMaskData(maskData: MaskGeoJson) {\n this.maskData = maskData;\n\n const { flatData, bounds } = processGeoJSON(maskData);\n\n this.vbo = twgl.createBufferInfoFromArrays(this.gl, {\n a_pos: { numComponents: 2, data: flatData, drawType: this.gl.STATIC_DRAW },\n });\n\n this.vCount = flatData.length / 2;\n\n this.fullBounds = bounds;\n }\n\n onRender(options: CustomRenderMethodInput, wraps: number[]): boolean | void {\n if (!this.maskData) return;\n\n const gl = this.gl2;\n const zoom = this.map.getZoom();\n const center = this.map.getCenter();\n\n const programInfo = this.createProgramInfo(\n 'mask-data',\n options,\n () => this.getVertShader(),\n () => this.getFragShader(),\n );\n\n gl.useProgram(programInfo.program);\n\n if (hasViewportChanged(this.lastViewportState, zoom, center)) {\n this._updateMask(gl, programInfo);\n this.lastViewportState = { zoom, center: [center.lng, center.lat] };\n }\n }\n\n private _updateMask(gl: WebGL2RenderingContext, programInfo: twgl.ProgramInfo) {\n const b = this.map.getBounds();\n const sw = lngLatToMercator([b.getWest(), b.getSouth()]);\n const ne = lngLatToMercator([b.getEast(), b.getNorth()]);\n this.renderBounds = calculateRenderBounds(this.fullBounds, sw, ne);\n\n twgl.bindFramebufferInfo(gl, this.fbo);\n gl.viewport(0, 0, this.maskSize, this.maskSize);\n gl.clearColor(0, 0, 0, 0);\n gl.clear(gl.COLOR_BUFFER_BIT);\n\n const matrix = createProjectionMatrix(...this.renderBounds);\n\n twgl.setUniforms(programInfo, {\n u_matrix: matrix,\n });\n\n twgl.setBuffersAndAttributes(gl, programInfo, this.vbo);\n\n twgl.drawBufferInfo(gl, this.vbo, gl.TRIANGLES, this.vCount);\n\n gl.bindFramebuffer(gl.FRAMEBUFFER, null);\n }\n\n public getMaskTexture(): WebGLTexture | null {\n return this.maskTexture;\n }\n\n public getRenderBounds(): Bounds | null {\n return this.renderBounds;\n }\n\n onUnMount() {}\n\n private getVertShader() {\n return `#version 300 es\n in vec2 a_pos;\n\n uniform mat4 u_matrix;\n\n void main() { \n gl_Position = u_matrix * vec4(a_pos, 0.0, 1.0); \n }`;\n }\n\n private getFragShader() {\n return `#version 300 es\n precision highp float;\n\n out vec4 fragColor;\n\n void main() {\n fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n }\n `;\n }\n\n static shaderData = {\n vs: `\n uniform vec4 u_maskBounds;\n out vec2 v_maskUV;\n\n void setMaskUV(vec2 pos) {\n v_maskUV = (pos - u_maskBounds.xy) / (u_maskBounds.zw - u_maskBounds.xy);\n }\n `,\n fs: `\n in vec2 v_maskUV;\n uniform bool u_hasMask;\n uniform sampler2D u_mask;\n\n bool checkMask() {\n if(u_hasMask){\n if (v_maskUV.x < 0.0 || v_maskUV.x > 1.0 || v_maskUV.y < 0.0 || v_maskUV.y > 1.0) return true;\n if (texture(u_mask, v_maskUV).r < 0.1) return true; \n };\n return false;\n }\n `,\n };\n\n getMaskUniforms(): Record<string, any> {\n const maskTexture = this.getMaskTexture();\n const renderBounds = this.getRenderBounds();\n if (maskTexture && renderBounds) {\n return {\n u_mask: maskTexture,\n u_maskBounds: renderBounds,\n u_hasMask: true,\n };\n }\n return {};\n }\n}\n",
42
+ "import { Bounds } from '../../../types/map';\n\n/**\n * 计算带填充的渲染边界\n */\nexport function calculateRenderBounds(\n fullBounds: Bounds,\n sw: [number, number],\n ne: [number, number],\n paddingRatio: number = 0.1,\n): [number, number, number, number] {\n const padX = (ne[0] - sw[0]) * paddingRatio;\n const padY = (sw[1] - ne[1]) * paddingRatio;\n\n return [\n Math.max(fullBounds[0], sw[0] - padX),\n Math.max(fullBounds[1], ne[1] - padY),\n Math.min(fullBounds[2], ne[0] + padX),\n Math.min(fullBounds[3], sw[1] + padY),\n ];\n}\n",
43
+ "/**\n * 创建正交投影矩阵\n */\nexport function createProjectionMatrix(minX: number, minY: number, maxX: number, maxY: number): Float32Array {\n return new Float32Array([\n 2 / (maxX - minX),\n 0,\n 0,\n 0,\n 0,\n 2 / (maxY - minY),\n 0,\n 0,\n 0,\n 0,\n 1,\n 0,\n -(maxX + minX) / (maxX - minX),\n -(maxY + minY) / (maxY - minY),\n 0,\n 1,\n ]);\n}\n",
44
+ "/**\n * 检查视口状态是否发生变化\n */\nexport interface ViewportState {\n zoom: number;\n center: [number, number];\n}\n\nexport interface Center {\n lng: number;\n lat: number;\n}\n\nexport function hasViewportChanged(\n lastState: ViewportState,\n currentZoom: number,\n currentCenter: Center,\n zoomThreshold: number = 0.01,\n distanceThreshold: number = 0.001,\n): boolean {\n const zoomChanged = Math.abs(lastState.zoom - currentZoom) > zoomThreshold;\n const distChanged =\n Math.hypot(lastState.center[0] - currentCenter.lng, lastState.center[1] - currentCenter.lat) > distanceThreshold;\n\n return zoomChanged || distChanged;\n}\n",
45
+ "import { Position } from 'geojson';\nimport maplibregl, { LngLatLike } from 'maplibre-gl';\n\nexport function lngLatToMercator(lngLat: Position): [number, number] {\n const m = maplibregl.MercatorCoordinate.fromLngLat(lngLat as LngLatLike);\n return [m.x, m.y];\n}\n",
46
+ "import earcut from 'earcut';\nimport type { Feature, FeatureCollection, GeoJsonProperties, MultiPolygon, Polygon, Position } from 'geojson';\nimport maplibregl, { LngLatLike } from 'maplibre-gl';\n\nexport type MaskGeoJson =\n | FeatureCollection<Polygon | MultiPolygon, GeoJsonProperties>\n | Feature<Polygon | MultiPolygon, GeoJsonProperties>;\n\n/**\n * 改进版:解析 GeoJSON 所有要素,生成统一的顶点数据\n */\nexport function processGeoJSON(geojson: MaskGeoJson): { flatData: number[]; bounds: [number, number, number, number] } {\n const flatData: number[] = [];\n let minX = 1,\n minY = 1,\n maxX = 0,\n maxY = 0;\n\n const features: Array<Feature<Polygon | MultiPolygon, GeoJsonProperties>> =\n geojson.type === 'FeatureCollection'\n ? (geojson.features as Feature<Polygon | MultiPolygon, GeoJsonProperties>[])\n : [geojson as Feature<Polygon | MultiPolygon, GeoJsonProperties>];\n\n features.forEach(feature => {\n const geometry = feature.geometry as Polygon | MultiPolygon;\n const coords: Position[][][] =\n geometry.type === 'MultiPolygon' ? (geometry.coordinates as Position[][][]) : [geometry.coordinates as Position[][]];\n\n coords.forEach(polygon => {\n const data: number[] = [];\n const holes: number[] = [];\n polygon.forEach((ring: Position[], i: number) => {\n if (i > 0) holes.push(data.length / 2);\n ring.forEach((c: Position) => {\n const m = maplibregl.MercatorCoordinate.fromLngLat(c as LngLatLike);\n data.push(m.x, m.y);\n minX = Math.min(minX, m.x);\n minY = Math.min(minY, m.y);\n maxX = Math.max(maxX, m.x);\n maxY = Math.max(maxY, m.y);\n });\n });\n const indices = earcut(data, holes);\n indices.forEach(idx => flatData.push(data[idx * 2], data[idx * 2 + 1]));\n });\n });\n\n return { flatData, bounds: [minX, minY, maxX, maxY] };\n}\n",
47
+ "import { IBaseRenderVo, ICommonRenderVo } from '../../types/gl';\nimport { Bounds } from '../../types/map';\nimport { MaskLayer } from '../mask/mask-layer';\nimport { ExCustomLayer } from './ExCustomLayer';\n\nexport interface IExTimingLayerProps {\n id: string;\n bounds?: Bounds;\n maskLayer?: MaskLayer;\n}\n\nexport abstract class ExTimingLayer<T extends IBaseRenderVo = ICommonRenderVo> extends ExCustomLayer {\n protected bounds?: Bounds;\n protected isAnimation: boolean = true;\n protected t = 0;\n protected data?: T;\n protected nextData?: T;\n private maskLayer?: MaskLayer;\n\n constructor(props: IExTimingLayerProps) {\n super({ id: props.id });\n this.bounds = props.bounds;\n this.maskLayer = props.maskLayer;\n }\n\n setIsAnimation(isAnimation: boolean = true) {\n this.isAnimation = isAnimation;\n }\n\n setBounds(bounds: Bounds) {\n this.bounds = bounds;\n }\n\n onMount() {}\n\n setMaskLayer(maskLayer: MaskLayer) {\n this.maskLayer = maskLayer;\n }\n\n updateData(data: T | undefined, nextData: T | undefined, t: number) {\n if (!nextData) nextData = data;\n\n if (data && nextData && this.data !== data) {\n this.setBounds(data.bounds);\n this.setTextureOptions(this.gl, {\n u_image0: data.texture_mercator || {\n src: data.data_mercator,\n mag: this.gl.LINEAR,\n min: this.gl.LINEAR,\n wrap: this.gl.CLAMP_TO_EDGE,\n },\n u_image1: nextData.texture_mercator! || {\n src: nextData.data_mercator,\n mag: this.gl.LINEAR,\n min: this.gl.LINEAR,\n wrap: this.gl.CLAMP_TO_EDGE,\n },\n });\n }\n\n this.data = data;\n this.nextData = nextData;\n this.t = this.isAnimation ? t : 0;\n this.rerender();\n }\n\n clear() {\n this.data = undefined;\n this.nextData = undefined;\n this.t = 0;\n this.rerender();\n }\n\n get maskShaderData() {\n return MaskLayer.shaderData;\n }\n\n get maskUniforms() {\n return this.maskLayer?.getMaskUniforms();\n }\n}\n",
48
+ "import maplibregl, { CustomRenderMethodInput } from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { IColorPaletteVo } from '../../types/colorPalette';\nimport { ColorRenderType, IBaseRenderVo, ICommonRenderVo } from '../../types/gl';\nimport { ExTimingLayer, IExTimingLayerProps } from '../base/ExTimingLayer';\n\nexport interface IColorLayerProps extends IExTimingLayerProps {\n palette?: IColorPaletteVo;\n}\n\nexport abstract class ColorLayer<T extends IBaseRenderVo = ICommonRenderVo> extends ExTimingLayer<T> {\n abstract getImageUniforms(image1: T, image2: T): Record<string, any>;\n abstract getFragShader(): string;\n\n private palette?: IColorPaletteVo;\n private renderType: ColorRenderType = ColorRenderType.LINEAR;\n private isBicubic: boolean = false;\n\n constructor(props: IColorLayerProps) {\n super(props);\n this.palette = props.palette;\n }\n\n getVertShader(options: CustomRenderMethodInput): string {\n return `\n #version 300 es\n\n ${options.shaderData.vertexShaderPrelude}\n ${options.shaderData.define}\n ${this.maskShaderData.vs}\n\n in vec2 a_pos;\n in vec2 a_uv;\n uniform vec2 u_offset;\n out vec2 v_uv;\n\n void main() {\n gl_Position = projectTile(a_pos + u_offset);\n v_uv = a_uv;\n setMaskUV(a_pos);\n }\n `;\n }\n\n onMount() {\n if (this.palette) {\n this.setPalette(this.palette);\n }\n super.onMount();\n }\n\n onUnMount() {}\n\n setPalette(palette: IColorPaletteVo) {\n this.palette = palette;\n this.setTextureOptions(this.gl, {\n u_paletteTexture: {\n src: this.palette.imageData,\n mag: this.gl.LINEAR,\n min: this.gl.LINEAR,\n wrap: this.gl.CLAMP_TO_EDGE,\n },\n });\n }\n\n setIsBicubic(isBicubic: boolean = false) {\n this.isBicubic = isBicubic;\n }\n\n setRenderType(renderType?: ColorRenderType) {\n if (renderType !== undefined) {\n this.renderType = renderType;\n }\n }\n\n // updateData(image1: T | undefined, image2: T | undefined, t: number, options: { magAndMinType?: number } = {}) {\n // super.updateData(image1, image2, t, {\n // magAndMinType: this.renderType === ColorRenderType.BLOCK_BY_ORIGINAL_VALUE ? this.gl.NEAREST : this.gl.LINEAR,\n // });\n // }\n\n onRender(options: CustomRenderMethodInput, wraps: number[]) {\n if (!this.data || !this.nextData) return;\n if (!this.bounds) return;\n\n const gl = this.gl2;\n\n const programInfo = this.createProgramInfo(\n 'color',\n options,\n () => this.getVertShader(options),\n () => this.getFragShader(),\n );\n const bufferInfo = this.getGridMeshBufferInfo(gl, this.bounds);\n gl.useProgram(programInfo.program);\n twgl.setUniformsAndBindTextures(programInfo, this.textures);\n twgl.setBuffersAndAttributes(gl, programInfo, bufferInfo);\n\n for (const wrap of wraps) {\n const uniforms = {\n u_projection_fallback_matrix: options.defaultProjectionData.fallbackMatrix,\n u_projection_matrix: options.defaultProjectionData.mainMatrix,\n u_projection_tile_mercator_coords: options.defaultProjectionData.tileMercatorCoords,\n u_projection_clipping_plane: options.defaultProjectionData.clippingPlane,\n u_projection_transition: options.defaultProjectionData.projectionTransition,\n u_cmin: this.palette?.minValue,\n u_cmax: this.palette?.maxValue,\n u_isBicubic: this.isBicubic,\n u_t: this.t,\n u_stops: this.palette?.stops,\n u_colors: this.palette?.colors,\n u_stopCount: this.palette?.stops.length,\n u_renderType: this.renderType,\n u_offset: [wrap, 0],\n ...this.getImageUniforms(this.data, this.nextData),\n ...this.maskUniforms,\n };\n\n twgl.setUniforms(programInfo, uniforms);\n\n twgl.drawBufferInfo(gl, bufferInfo, gl.TRIANGLES);\n }\n }\n}\n",
49
+ "export const texture_bicubic = `\nvec2 getTextureSize(sampler2D tex, int lod) {\n highp vec2 texSize;\n ivec2 tempTexSize = textureSize(tex, lod).xy;\n texSize.x = float(tempTexSize.x);\n texSize.y = float(tempTexSize.y);\n return texSize;\n}\n \n// Bicubic 插值核函数\nfloat bicubic_kernel(float x) {\n x = abs(x);\n if (x <= 1.0) {\n return 1.0 - 2.5 * x * x + 1.5 * x * x * x;\n } else if (x < 2.0) {\n return -0.5 * x * x * x + 2.5 * x * x - 4.0 * x + 2.0;\n } else {\n return 0.0;\n }\n}\n\n// 对灰度图进行 Bicubic 插值\nvec4 texture_bicubic(sampler2D tex, vec2 texCoord, int lod) {\n vec2 texSize = getTextureSize(tex, lod);\n\n vec2 invTexSize = 1.0 / texSize;\n\n vec2 intTexCoord = floor(texCoord * texSize);\n vec2 fracTexCoord = fract(texCoord * texSize);\n\n vec4 color = vec4(0.0);\n float weight = 0.0;\n\n for (int i = -1; i <= 2; i++) {\n for (int j = -1; j <= 2; j++) {\n vec2 offset = vec2(i, j);\n vec2 sampleTexCoord = (intTexCoord + offset) * invTexSize;\n float kernelWeight = bicubic_kernel(fracTexCoord.x - float(i)) * bicubic_kernel(fracTexCoord.y - float(j));\n vec4 sampleColor = texture(tex, sampleTexCoord,0.0);\n color += sampleColor * kernelWeight;\n weight += kernelWeight;\n }\n }\n\n return color / weight;\n\n return vec4(0.0);\n}\n`;\n",
50
+ "import { texture_bicubic } from '../../fns/glsl/texture_bicubic';\nimport { ICommonRenderVo } from '../../types/gl';\nimport { ColorLayer } from './ColorLayer';\n\nexport class CommonColorLayer extends ColorLayer<ICommonRenderVo> {\n getFragShader(): string {\n return `\n #version 300 es\n precision mediump float;\n\n ${texture_bicubic}\n ${this.maskShaderData.fs}\n\n in vec2 v_uv;\n out vec4 outColor;\n\n uniform vec4 u_tile_info;\n\n uniform sampler2D u_image0;\n uniform float u_vmin0;\n uniform float u_vmax0;\n\n uniform sampler2D u_image1;\n uniform float u_vmin1;\n uniform float u_vmax1;\n\n uniform sampler2D u_paletteTexture;\n uniform float u_cmax;\n uniform float u_cmin;\n\n uniform float u_t;\n\n uniform bool u_isBicubic;\n uniform int u_renderType;\n uniform int u_stopCount;\n uniform float u_stops[100];\n uniform float u_colors[400];\n\n #define RENDER_LINEAR 1\n #define RENDER_BLOCK 2\n #define RENDER_BLOCK_BY_ORIGINAL_VALUE 3\n #define RENDER_GREY 0\n\n vec4 getColor(int i){\n return vec4(u_colors[i*4+0] / 255.0,u_colors[i*4+1] / 255.0,u_colors[i*4+2] / 255.0,u_colors[i*4+3]);\n }\n\n void main() {\n if(checkMask()) discard;\n \n vec4 color0 = u_isBicubic ? texture_bicubic(u_image0, v_uv, 0) : texture(u_image0, v_uv);\n vec4 color1 = u_isBicubic ? texture_bicubic(u_image1, v_uv, 0) : texture(u_image1, v_uv);\n float r = mix(color0.r,color1.r,u_t);\n\n if(u_renderType == RENDER_BLOCK_BY_ORIGINAL_VALUE){\n float v = round(r * 255.0);\n for (int i = 0; i < u_stopCount; i++) {\n if(v == u_stops[i]){\n outColor = getColor(i);\n break;\n }\n }\n return;\n }\n\n float u_vmax = mix(u_vmax0,u_vmax1,u_t);\n float u_vmin = mix(u_vmin0,u_vmin1,u_t);\n float v = r * (u_vmax - u_vmin) + u_vmin;\n if(u_renderType == RENDER_LINEAR){\n if(v >= u_cmin){\n float p = (v - u_cmin) / (u_cmax - u_cmin);\n vec4 rampColor = texture(u_paletteTexture, vec2(p, 0.5));\n outColor = rampColor;\n }\n }else if(u_renderType == RENDER_BLOCK){\n if(v >= u_stops[u_stopCount - 1]){\n outColor = getColor(u_stopCount - 1);\n }else{\n for (int i = 0; i < u_stopCount; i++) {\n if(v >= u_stops[i] && v < u_stops[i+1]){\n outColor = getColor(i);\n break;\n }\n }\n }\n }else{\n outColor = color0;\n }\n }\n `;\n }\n\n getImageUniforms(image1: ICommonRenderVo, image2: ICommonRenderVo) {\n return {\n u_vmin0: image1.minVal,\n u_vmax0: image1.maxVal,\n u_vmin1: image2.minVal,\n u_vmax1: image2.maxVal,\n };\n }\n}\n",
51
+ "import { texture_bicubic } from '../../fns/glsl/texture_bicubic';\nimport { IWindRenderVo } from '../../types/gl';\nimport { ColorLayer } from './ColorLayer';\n\nexport class WindColorLayer extends ColorLayer<IWindRenderVo> {\n getFragShader(): string {\n return `\n #version 300 es\n precision mediump float;\n\n ${texture_bicubic}\n ${this.maskShaderData.fs}\n \n in vec2 v_uv;\n out vec4 outColor;\n\n uniform sampler2D u_image0;\n uniform vec4 u_image0_value_range; //min_windu, max_windu, min_windv, max_windv\n\n uniform sampler2D u_image1;\n uniform vec4 u_image1_value_range; \n\n uniform sampler2D u_paletteTexture;\n uniform float u_cmin;\n uniform float u_cmax;\n\n uniform bool u_isBicubic;\n uniform float u_t;\n\n uniform sampler2D u_maskTexture;\n \n uniform int u_stopCount;\n uniform int u_renderType;\n uniform float u_stops[100];\n uniform float u_colors[400];\n\n #define RENDER_LINEAR 1\n #define RENDER_BLOCK 2\n #define RENDER_GREY 0\n\n void main() {\n if(checkMask()) discard;\n\n vec4 color0 = u_isBicubic ? texture_bicubic(u_image0, v_uv, 0) : texture(u_image0, v_uv);\n vec4 color1 = u_isBicubic ? texture_bicubic(u_image1, v_uv, 0) : texture(u_image1, v_uv);\n\n float colorR = mix(color0.r,color1.r,u_t);\n float colorG = mix(color0.g,color1.g,u_t);\n float min_windu = mix(u_image0_value_range.r,u_image1_value_range.r,u_t);\n float max_windu = mix(u_image0_value_range.g,u_image1_value_range.g,u_t);\n float min_windv = mix(u_image0_value_range.b,u_image1_value_range.b,u_t);\n float max_windv = mix(u_image0_value_range.a,u_image1_value_range.a,u_t);\n\n float windu = colorR * (max_windu - min_windu) + min_windu;\n float windv = colorG * (max_windv - min_windv) + min_windv;\n float winds = sqrt(windu * windu + windv * windv);\n\n float v = winds;\n if(u_renderType == RENDER_LINEAR){\n if(v >= u_cmin){\n float p = (v - u_cmin) / (u_cmax - u_cmin);\n vec4 rampColor = texture(u_paletteTexture, vec2(p, 0.5));\n outColor = vec4(rampColor.rgb, 1.0);\n }\n }else if(u_renderType == RENDER_BLOCK){\n for (int i = 0; i < u_stopCount; i++) {\n if(i == u_stopCount - 1 ? v >= u_stops[i] : v >= u_stops[i] && v < u_stops[i+1]){\n float r = u_colors[i*4+0] / 255.0;\n float g = u_colors[i*4+1] / 255.0;\n float b = u_colors[i*4+2] / 255.0;\n float a = u_colors[i*4+3];\n outColor = vec4(r,g,b,a);\n break;\n }\n }\n }else{\n outColor = color0;\n }\n }\n `;\n }\n\n getImageUniforms(image1: IWindRenderVo, image2: IWindRenderVo) {\n return {\n u_image0_value_range: [image1.minWindu, image1.maxWindu, image1.minWindv, image1.maxWindv],\n u_image1_value_range: [image2.minWindu, image2.maxWindu, image2.minWindv, image2.maxWindv],\n };\n }\n}\n",
52
+ "import { isUndefined, omitBy } from 'lodash-es';\nimport { CustomRenderMethodInput } from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { contourFns } from '../../fns/glsl/contourFns';\nimport { texture_bicubic } from '../../fns/glsl/texture_bicubic';\nimport { toGlColor } from '../../fns/toGlColor';\nimport { ExTimingLayer } from '../base/ExTimingLayer';\n\ninterface IContourOptions {\n contourInterval: number;\n contourLineWidth: number;\n contourColor: string;\n highlightValue: number;\n highlightColor: string;\n highlightLineWidth: number;\n}\n\nexport class ContourLayer extends ExTimingLayer {\n private options: IContourOptions = {\n highlightValue: 588,\n highlightColor: '#FF0000',\n highlightLineWidth: 2,\n contourColor: '#666666',\n contourInterval: 4,\n contourLineWidth: 1,\n };\n\n getVertShader(options: CustomRenderMethodInput): string {\n return `\n #version 300 es\n\n ${options.shaderData.vertexShaderPrelude}\n ${options.shaderData.define}\n ${this.maskShaderData.vs}\n\n in vec2 a_pos;\n in vec2 a_uv;\n uniform vec2 u_offset;\n out vec2 v_uv;\n\n void main() {\n gl_Position = projectTile(a_pos + u_offset);\n v_uv = a_uv;\n setMaskUV(a_pos);\n }\n `;\n }\n\n getFragShader(): string {\n return `\n #version 300 es\n precision highp float;\n\n ${texture_bicubic}\n ${contourFns}\n ${this.maskShaderData.fs}\n\n in vec2 v_uv;\n out vec4 outColor;\n \n uniform sampler2D u_image0;\n uniform float u_vmin0;\n uniform float u_vmax0;\n \n uniform sampler2D u_image1;\n uniform float u_vmin1;\n uniform float u_vmax1;\n \n uniform int u_lod;\n uniform float u_t;\n uniform float u_pixel_ratio;\n \n uniform float u_contour_interval;\n uniform float u_contour_lineWidth;\n uniform vec4 u_contour_color;\n\n uniform float u_highlight_value;\n uniform float u_highlight_lineWidth;\n uniform vec4 u_highlight_color;\n\n void main() {\n if(checkMask()) discard;\n\n vec4 color0 = texture_bicubic(u_image0, v_uv, u_lod);\n vec4 color1 = texture_bicubic(u_image1, v_uv, u_lod);\n float r = mix(color0.r,color1.r,u_t); \n float u_vmin = mix(u_vmin0,u_vmin1,u_t);\n float u_vmax = mix(u_vmax0,u_vmax1,u_t);\n float v = r * (u_vmax - u_vmin) + u_vmin;\n \n bool isHighlightContour = isContourFns(v, u_highlight_value, u_highlight_lineWidth , u_pixel_ratio);\n if(isHighlightContour){\n outColor = u_highlight_color;\n return;\n }\n \n float newMinVal = u_highlight_value - ceil((u_highlight_value - u_vmin) / u_contour_interval) * u_contour_interval;\n float newMaxVal = u_highlight_value + ceil((u_vmax - u_highlight_value) / u_contour_interval) * u_contour_interval;\n for(float val=newMinVal ; val<=newMaxVal ; val+=u_contour_interval){\n bool isContour = isContourFns(v, val, u_contour_lineWidth , u_pixel_ratio);\n if(isContour){\n outColor = u_contour_color;\n }\n }\n }\n `;\n }\n\n public setOptions(options: Partial<IContourOptions>) {\n this.options = {\n ...this.options,\n ...omitBy(options, value => isUndefined(value)),\n };\n }\n\n onRender(options: CustomRenderMethodInput, wraps: number[]) {\n if (!this.data || !this.nextData) return;\n if (!this.bounds) return;\n\n const gl = this.gl2;\n\n const programInfo = this.createProgramInfo(\n 'contour',\n options,\n () => this.getVertShader(options),\n () => this.getFragShader(),\n );\n\n gl.useProgram(programInfo.program);\n\n const bufferInfo = this.getGridMeshBufferInfo(gl, this.bounds);\n\n twgl.setUniformsAndBindTextures(programInfo, this.textures);\n twgl.setBuffersAndAttributes(gl, programInfo, bufferInfo);\n\n for (const wrap of wraps) {\n twgl.setUniforms(programInfo, {\n u_projection_fallback_matrix: options.defaultProjectionData.fallbackMatrix,\n u_projection_matrix: options.defaultProjectionData.mainMatrix,\n u_projection_tile_mercator_coords: options.defaultProjectionData.tileMercatorCoords,\n u_projection_clipping_plane: options.defaultProjectionData.clippingPlane,\n u_projection_transition: options.defaultProjectionData.projectionTransition,\n\n u_offset: [wrap, 0],\n u_pixel_ratio: window.devicePixelRatio,\n u_vmin0: this.data.minVal,\n u_vmax0: this.data.maxVal,\n u_vmin1: this.nextData.minVal,\n u_vmax1: this.nextData.maxVal,\n u_t: this.t,\n u_lod: 3,\n\n u_highlight_value: this.options.highlightValue,\n u_highlight_lineWidth: this.options.highlightLineWidth,\n u_highlight_color: toGlColor(this.options.highlightColor),\n\n u_contour_interval: this.options.contourInterval,\n u_contour_lineWidth: this.options.contourLineWidth,\n u_contour_color: toGlColor(this.options.contourColor),\n\n ...this.maskUniforms,\n });\n twgl.drawBufferInfo(gl, bufferInfo, gl.TRIANGLES);\n }\n }\n\n onUnMount(): void {}\n}\n",
53
+ "export const contourFns = `\n bool isContourFns(float val, float contourValue, float lineWidth, float pixelRatio){\n float d = length(vec2(dFdx(val), dFdy(val)));\n float diff = abs(val - contourValue);\n float contour = 1.0 - smoothstep(0.0, d * lineWidth * pixelRatio, diff);\n return contour != 0.0;\n }\n`;\n",
54
+ "import { TinyColor } from '@ctrl/tinycolor';\n\nexport function toGlColor(color: string) {\n const rgb = new TinyColor(color).toRgb();\n return [rgb.r / 255, rgb.g / 255, rgb.b / 255, rgb.a];\n}\n",
55
+ "import * as turf from '@turf/turf';\nimport * as d3 from 'd3';\nimport { Feature, GeoJsonProperties, Point } from 'geojson';\nimport { debounce, groupBy, map, range } from 'lodash-es';\nimport { CustomRenderMethodInput, GeoJSONSource } from 'maplibre-gl';\nimport { DEF_MAP_CONFIG } from '../../config/map';\nimport { ICommonRenderVo } from '../../types/gl';\nimport { Bounds } from '../../types/map';\nimport { ExCustomLayer } from '../base/ExCustomLayer';\nimport { booleanPointInBbox, mixImageData, pngToContours } from './lib';\n\nconst thresholdsStep = 3;\nconst isolationSize = 30;\nconst showLine = false;\n\nexport class ContourValueLayer extends ExCustomLayer {\n public image1?: ICommonRenderVo;\n public image2?: ICommonRenderVo;\n public bounds?: Bounds;\n public t = 0;\n public visible = true;\n public show: Function;\n\n public wrapId(subId: string) {\n return `${this.id}-${subId}`;\n }\n\n constructor(props: { id: string; bounds?: Bounds }) {\n super({ id: props.id });\n this.bounds = props.bounds;\n\n this.show = debounce(() => {\n if (!this.map) return;\n\n if (!this.image1 || !this.image2) return;\n\n if (!this.visible) return;\n\n const bounds = {\n minLng: DEF_MAP_CONFIG.bounds.world[0],\n maxLng: DEF_MAP_CONFIG.bounds.world[2],\n maxLat: DEF_MAP_CONFIG.bounds.world[3],\n minLat: DEF_MAP_CONFIG.bounds.world[1],\n };\n\n const minVal = d3.interpolate(this.image1.minVal, this.image2.minVal)(this.t);\n const maxVal = d3.interpolate(this.image1.maxVal, this.image2.maxVal)(this.t);\n const imageData = mixImageData(this.image1.data_mercator!, this.image2.data_mercator!, this.t);\n\n pngToContours({\n maxVal,\n minVal,\n img: imageData,\n thresholds: map(range(Math.floor(minVal), Math.ceil(maxVal), thresholdsStep), num => num),\n bounds,\n }).then(({ geojson }) => {\n const lineData = geojson;\n const centerList: Feature<Point, GeoJsonProperties>[] = [];\n geojson.features.forEach(feature => {\n if (feature.geometry.type === 'MultiPolygon') {\n feature.geometry.coordinates.forEach(e => {\n e.forEach(e1 => {\n if (\n e1.length < 500 &&\n e1.length > 30 &&\n !e1.find(\n p => p[0] === bounds.minLng || p[0] === bounds.maxLng || p[1] === bounds.minLat || p[1] === bounds.maxLat,\n )\n ) {\n const center = turf.centroid(turf.polygon([e1]));\n center.properties = { value: feature.properties?.value };\n centerList.push(center);\n }\n });\n });\n }\n });\n\n const pointList = Object.values(\n groupBy(\n centerList.map(item => {\n const coordinates = item.geometry.coordinates;\n const bounds = booleanPointInBbox(coordinates, isolationSize)!;\n return {\n value: item.properties!.value,\n coordinates,\n bounds,\n };\n }),\n item => JSON.stringify(item.bounds),\n ),\n )\n .map(e => e[e.length - 1])\n .flat();\n\n const pointData = turf.featureCollection<any, { value: number }>(\n pointList.map(e => {\n return turf.point(e.coordinates, { value: e.value });\n }),\n );\n\n try {\n if (showLine) {\n this.map.getSource<GeoJSONSource>(this.wrapId('line-source'))?.setData(lineData);\n }\n this.map.getSource<GeoJSONSource>(this.wrapId('value-source'))?.setData(pointData);\n } catch (error) {\n console.info('ERROR: map is removed');\n }\n });\n }, 200);\n }\n\n public setVisible(visible: boolean) {\n if (!this.map) return;\n\n this.visible = visible;\n if (!this.visible) {\n if (showLine) {\n this.map?.getSource<GeoJSONSource>(this.wrapId('line-source'))?.setData(turf.featureCollection([]));\n }\n this.map?.getSource<GeoJSONSource>(this.wrapId('value-source'))?.setData(turf.featureCollection([]));\n } else {\n this.show();\n }\n }\n\n public setVisibility(visibility?: boolean) {\n const layerId = this.wrapId('value-layer');\n if (!!this.map.getLayer(layerId)) {\n this.map.setLayoutProperty(layerId, 'visibility', visibility ? 'visible' : 'none');\n }\n }\n\n onMount() {\n Promise.all([\n this.map.loadImage(`/huishang/assets/map/huanliu-h.png`),\n this.map.loadImage(`/huishang/assets/map/huanliu-l.png`),\n ]).then(([huanliuH, huanliuL]) => {\n try {\n if (!this.map.hasImage('huanliu-h')) this.map.addImage('huanliu-h', huanliuH.data);\n if (!this.map.hasImage('huanliu-l')) this.map.addImage('huanliu-l', huanliuL.data);\n } catch (error) {\n console.info('ERROR: map is removed');\n }\n });\n\n // 绘制等值线\n this.map.addSource(this.wrapId('line-source'), {\n type: 'geojson',\n data: turf.featureCollection([]),\n });\n\n this.map.addLayer({\n type: 'line',\n id: this.wrapId('line-layer'),\n source: this.wrapId('line-source'),\n minzoom: 0,\n maxzoom: 11,\n paint: {\n 'line-opacity': 1,\n 'line-color': '#9C7A1E',\n 'line-width': 2,\n },\n });\n\n this.map.addLayer({\n type: 'symbol',\n id: this.wrapId('line-layer-symbol'),\n source: this.wrapId('line-source'),\n minzoom: 0,\n maxzoom: 11,\n layout: {\n 'symbol-placement': 'line-center',\n 'text-field': ['get', 'value'],\n 'text-size': 18,\n 'text-font': ['Noto Sans Bold'],\n 'icon-allow-overlap': true,\n 'text-allow-overlap': true,\n },\n paint: {\n 'text-color': '#fff',\n 'text-halo-color': '#000',\n 'text-halo-width': 2,\n 'text-opacity': 1,\n },\n });\n\n // 绘制等值点\n this.map.addSource(this.wrapId('value-source'), {\n type: 'geojson',\n data: turf.featureCollection([]),\n });\n\n this.map.addLayer({\n type: 'symbol',\n id: this.wrapId('value-layer'),\n source: this.wrapId('value-source'),\n layout: {\n 'icon-image': ['case', ['>=', ['get', 'value'], 1000], 'huanliu-h', 'huanliu-l'],\n 'icon-size': 0.26,\n 'text-field': ['get', 'value'],\n 'text-font': ['Noto Sans Bold'],\n 'text-offset': [0, 1.25],\n 'text-anchor': 'top',\n 'text-size': 20,\n },\n paint: {\n 'text-color': ['case', ['>=', ['get', 'value'], 1000], '#E83F41', '#3800F9'],\n 'text-halo-color': 'white',\n 'text-halo-width': 2,\n 'text-halo-blur': 1,\n },\n });\n }\n\n onUnMount(): void {\n if (!!this.map.getLayer(this.wrapId('line-layer'))) this.map.removeLayer(this.wrapId('line-layer'));\n if (!!this.map.getLayer(this.wrapId('value-layer'))) this.map.removeLayer(this.wrapId('value-layer'));\n if (!!this.map.getLayer(this.wrapId('line-layer-symbol'))) this.map.removeLayer(this.wrapId('line-layer-symbol'));\n if (!!this.map.getSource(this.wrapId('line-source'))) this.map.removeSource(this.wrapId('line-source'));\n if (!!this.map.getSource(this.wrapId('value-source'))) this.map.removeSource(this.wrapId('value-source'));\n }\n\n clear() {\n this.image1 = undefined;\n this.image2 = undefined;\n this.t = 0;\n try {\n this.map?.getSource<GeoJSONSource>(this.wrapId('line-source'))?.setData(turf.featureCollection([]));\n this.map?.getSource<GeoJSONSource>(this.wrapId('value-source'))?.setData(turf.featureCollection([]));\n } catch (error) {\n console.info('ERROR: map is removed');\n }\n }\n\n setBounds(bounds: Bounds) {\n this.bounds = bounds;\n }\n\n updateData(image1: ICommonRenderVo | undefined, image2: ICommonRenderVo | undefined, t: number) {\n if (!image2) image2 = image1;\n if (image1) {\n this.setBounds(image1.bounds);\n }\n this.image1 = image1;\n this.image2 = image2;\n this.t = t;\n this.show();\n }\n\n onRender(options: CustomRenderMethodInput, wraps: number[]) {}\n}\n",
56
+ "import * as turf from '@turf/turf';\nimport * as d3 from 'd3';\nimport { Position } from 'geojson';\nimport { map, range } from 'lodash-es';\n\nfunction toImageData(img: ImageBitmap): ImageData {\n const canvas = new OffscreenCanvas(img.width, img.height);\n const ctx = canvas.getContext('2d');\n ctx!.drawImage(img, 0, 0);\n return ctx!.getImageData(0, 0, img.width, img.height);\n}\n\nexport function mixImageData(data1: ImageBitmap, data2: ImageBitmap, t: number) {\n const imageData1 = toImageData(data1);\n const imageData2 = toImageData(data2);\n\n let mixedData = new ImageData(data1.width, data1.height);\n for (let i = 0; i < mixedData.data.length; i += 4) {\n mixedData.data[i] = d3.interpolate(imageData1.data[i], imageData2.data[i])(t);\n mixedData.data[i + 1] = d3.interpolate(imageData1.data[i + 1], imageData2.data[i + 1])(t);\n mixedData.data[i + 2] = d3.interpolate(imageData1.data[i + 2], imageData2.data[i + 2])(t);\n mixedData.data[i + 3] = d3.interpolate(imageData1.data[i + 3], imageData2.data[i + 3])(t);\n }\n return mixedData;\n}\n\nexport function booleanPointInBbox(point: Position, size: number) {\n const rows = map(range(-180, 180 + 1, size), num => num);\n const cols = map(range(-90, 90 + 1, size), num => num);\n\n let hitBounds;\n for (let i = 0; i < rows.length; i++) {\n for (let j = 0; j < cols.length; j++) {\n const bounds = {\n minLng: rows[i],\n maxLng: rows[i] + size,\n minLat: cols[j],\n maxLat: cols[j] + size,\n };\n\n const bool = turf.booleanPointInPolygon(\n turf.point(point),\n turf.bboxPolygon([bounds.minLng, bounds.minLat, bounds.maxLng, bounds.maxLat]),\n );\n\n if (bool) {\n hitBounds = bounds;\n }\n }\n }\n\n return hitBounds;\n}\n\nexport async function pngToContours(params: {\n img: ImageData;\n thresholds: number[];\n minVal: number;\n maxVal: number;\n bounds: {\n minLng: number;\n maxLng: number;\n maxLat: number;\n minLat: number;\n };\n}) {\n let { img, thresholds, minVal, maxVal } = params;\n\n const gphData = decodeImageData(img, minVal, maxVal);\n\n const contours = d3.contours().size([gphData.width, gphData.height]).smooth(true).thresholds(thresholds);\n\n const isolines = contours(gphData.data as any);\n\n const geojson = toGeoJson(isolines, gphData.width, gphData.height, params.bounds);\n\n return { isolines, gphData, width: gphData.width, height: gphData.height, geojson };\n}\n\nfunction toGeoJson(\n isolines: d3.ContourMultiPolygon[],\n width: number,\n height: number,\n bounds: {\n minLng: number;\n maxLng: number;\n maxLat: number;\n minLat: number;\n },\n) {\n const { minLng, maxLng, maxLat, minLat } = bounds;\n\n function convertCoords(coords: number[][][][], width: number, height: number) {\n var result = [];\n for (let poly of coords) {\n var newPoly = [];\n for (let ring of poly) {\n if (ring.length < 4) continue;\n var newRing = [];\n for (let p of ring) {\n const lng = minLng + (maxLng - minLng) * (p[0] / width);\n const lat = maxLat - (maxLat - minLat) * (p[1] / height);\n newRing.push([lng, lat]);\n }\n newPoly.push(newRing);\n }\n result.push(newPoly);\n }\n return result;\n }\n\n const geojson: GeoJSON.FeatureCollection = {\n type: 'FeatureCollection',\n features: [],\n };\n\n for (let polygon of isolines) {\n if (polygon.coordinates.length === 0) continue;\n\n geojson.features.push({\n type: 'Feature',\n properties: {\n value: polygon.value,\n },\n geometry: {\n type: polygon.type,\n coordinates: convertCoords(polygon.coordinates, width, height),\n },\n });\n }\n\n return geojson;\n}\n\nexport function decodeImageData(img: ImageData, min: number, max: number) {\n const decoder: (r: number, g: number, b: number) => number = (r, g, b) => {\n const v = (r / 255) * (max - min) + min;\n return v;\n };\n\n const data = new Float32Array(img.width * img.height);\n for (let i = 0; i < img.data.length; i += 4) {\n data[i / 4] = decoder(img.data[i], img.data[i + 1], img.data[i + 2]);\n }\n\n return {\n data,\n width: img.width,\n height: img.height,\n };\n}\n\nlet offscreenCanvas: OffscreenCanvas;\nlet offscreenContext: OffscreenCanvasRenderingContext2D;\nexport function loadImageData(img: ImageBitmap): ImageData {\n if (!offscreenCanvas) {\n offscreenCanvas = new OffscreenCanvas(img.width, img.height);\n offscreenContext = offscreenCanvas.getContext('2d', {\n willReadFrequently: true,\n }) as OffscreenCanvasRenderingContext2D;\n }\n offscreenContext.drawImage(img, 0, 0, img.width, img.height);\n const rgba = offscreenContext.getImageData(0, 0, img.width, img.height).data;\n return new ImageData(rgba, img.width, img.height);\n}\n",
57
+ "import { isUndefined, omitBy } from 'lodash-es';\nimport { CustomRenderMethodInput } from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { contourFns } from '../../fns/glsl/contourFns';\nimport { texture_bicubic } from '../../fns/glsl/texture_bicubic';\nimport { toGlColor } from '../../fns/toGlColor';\nimport { ExTimingLayer } from '../base/ExTimingLayer';\n\ninterface IContourOptions {\n renderLod: number;\n lines: {\n width: number;\n color: string;\n value: number;\n }[];\n}\n\nexport class ContourLayerByValue extends ExTimingLayer {\n private options: IContourOptions = {\n renderLod: 3,\n lines: [],\n };\n\n getVertShader(options: CustomRenderMethodInput): string {\n return `\n #version 300 es\n\n ${options.shaderData.vertexShaderPrelude}\n ${options.shaderData.define}\n ${this.maskShaderData.vs}\n\n in vec2 a_pos;\n in vec2 a_uv;\n uniform vec2 u_offset;\n out vec2 v_uv;\n\n void main() {\n gl_Position = projectTile(a_pos + u_offset);\n v_uv = a_uv;\n setMaskUV(a_pos);\n }\n `;\n }\n\n getFragShader(): string {\n return `\n #version 300 es\n precision highp float;\n\n ${texture_bicubic}\n ${contourFns}\n ${this.maskShaderData.fs}\n\n in vec2 v_uv;\n out vec4 outColor;\n \n uniform sampler2D u_image0;\n uniform float u_vmin0;\n uniform float u_vmax0;\n \n uniform sampler2D u_image1;\n uniform float u_vmin1;\n uniform float u_vmax1;\n \n uniform int u_lod;\n uniform float u_t;\n uniform float u_pixel_ratio;\n \n uniform float u_line_config[30];\n uniform int u_line_count;\n\n void main() {\n if(checkMask()) discard;\n\n vec4 color0 = texture_bicubic(u_image0, v_uv, u_lod);\n vec4 color1 = texture_bicubic(u_image1, v_uv, u_lod);\n float r = mix(color0.r,color1.r,u_t); \n float u_vmin = mix(u_vmin0,u_vmin1,u_t);\n float u_vmax = mix(u_vmax0,u_vmax1,u_t);\n float v = r * (u_vmax - u_vmin) + u_vmin;\n\n for(int i = 0 ; i < u_line_count ; i++ ){\n float value = u_line_config[i*6+0];\n float width = u_line_config[i*6+1];\n vec4 color = vec4(u_line_config[i*6+2], u_line_config[i*6+3], u_line_config[i*6+4], u_line_config[i*6+5]);\n bool isContour = isContourFns(v, value, width, u_pixel_ratio);\n if(isContour){\n outColor = color;\n }\n }\n }\n `;\n }\n\n public setOptions(options: Partial<IContourOptions>) {\n this.options = {\n ...this.options,\n ...omitBy(options, value => isUndefined(value)),\n };\n }\n\n onRender(options: CustomRenderMethodInput, wraps: number[]) {\n if (!this.data || !this.nextData) return;\n if (!this.bounds) return;\n\n const gl = this.gl2;\n\n const programInfo = this.createProgramInfo(\n 'contourByValue',\n options,\n () => this.getVertShader(options),\n () => this.getFragShader(),\n );\n\n gl.useProgram(programInfo.program);\n\n const bufferInfo = this.getGridMeshBufferInfo(gl, this.bounds);\n\n twgl.setUniformsAndBindTextures(programInfo, this.textures);\n twgl.setBuffersAndAttributes(gl, programInfo, bufferInfo);\n\n for (const wrap of wraps) {\n twgl.setUniforms(programInfo, {\n u_projection_fallback_matrix: options.defaultProjectionData.fallbackMatrix,\n u_projection_matrix: options.defaultProjectionData.mainMatrix,\n u_projection_tile_mercator_coords: options.defaultProjectionData.tileMercatorCoords,\n u_projection_clipping_plane: options.defaultProjectionData.clippingPlane,\n u_projection_transition: options.defaultProjectionData.projectionTransition,\n\n u_offset: [wrap, 0],\n\n u_pixel_ratio: window.devicePixelRatio,\n u_vmin0: this.data.minVal,\n u_vmax0: this.data.maxVal,\n u_vmin1: this.nextData.minVal,\n u_vmax1: this.nextData.maxVal,\n u_t: this.t,\n u_lod: this.options.renderLod,\n u_line_count: this.options.lines.length,\n u_line_config: this.options.lines.map(line => [line.value, line.width, ...toGlColor(line.color)]).flat(),\n });\n twgl.drawBufferInfo(gl, bufferInfo, gl.TRIANGLES);\n }\n }\n\n onUnMount(): void {}\n}\n",
58
+ "import { TinyColor } from '@ctrl/tinycolor';\nimport { CustomRenderMethodInput } from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { DEF_WIND_ICON_COLOR, DEF_WIND_LARGE_VALUE, DEF_WIND_LARGE_VALUE_ICON_COLOR } from '../../config/product';\nimport { defComputeFs } from '../../fns/glsl/defComputeFs';\nimport { GridDensity, IWindRenderVo } from '../../types/gl';\nimport { GridRenderIconSize, IGridWindRenderOptions } from '../../types/layerOptions';\nimport { ExTimingLayer } from '../base/ExTimingLayer';\nimport { getComputeVs } from './computeVs';\nimport { getDrawFs } from './drawFs';\nimport { getDrawVs } from './drawVs';\nimport { calculateGridInfo } from './utils/calculateGridInfo';\nimport { calculateViewportGridUvBuffer } from './utils/calculateViewportGridUv';\nimport { toBoundsCoords } from './utils/toBoundsCoords';\nimport { toWebGlSizeByPixel } from './utils/toWebGlSizeByPixel';\n\nexport class GridWindLayer extends ExTimingLayer<IWindRenderVo> {\n private options: Required<IGridWindRenderOptions> = {\n iconColor: DEF_WIND_ICON_COLOR,\n largeValueIconColor: DEF_WIND_LARGE_VALUE_ICON_COLOR,\n largeValue: DEF_WIND_LARGE_VALUE,\n iconSize: GridRenderIconSize.MEDIUM,\n gridDensity: GridDensity.SUPER_DENSE,\n iconOpacity: 1,\n filterValue: 0,\n gridType: 'WindBarb',\n };\n private iconColor: number[] = Object.values(new TinyColor(this.options.iconColor).toRgb());\n private largeValueIconColor: number[] = Object.values(new TinyColor(this.options.largeValueIconColor).toRgb());\n private SHADER_MAP = new Map<\n string,\n {\n feedbackProgramInfo: twgl.ProgramInfo;\n drawProgramInfo: twgl.ProgramInfo;\n feedback: WebGLTransformFeedback;\n drawVertexArrayInfo: twgl.VertexArrayInfo;\n tfBufferInfo: twgl.BufferInfo;\n numInstances: number;\n }\n >();\n\n onMount(): void {\n this.loadWinnIconTexture();\n }\n\n onUnMount(): void {}\n\n getShader(gl: WebGL2RenderingContext, options: CustomRenderMethodInput) {\n const { shaderData } = options;\n if (gl instanceof WebGLRenderingContext) throw new Error('gl is not WebGL2RenderingContext');\n\n if (this.SHADER_MAP.has(shaderData.variantName)) {\n return this.SHADER_MAP.get(shaderData.variantName);\n }\n\n // 创建反馈程序\n const feedbackProgramInfo = twgl.createProgramInfo(gl, [getComputeVs(), defComputeFs], {\n transformFeedbackVaryings: ['a_windInfoOut'],\n });\n const numInstances = 200 * 200;\n const tfBufferInfo = twgl.createBufferInfoFromArrays(gl, {\n a_windInfoOut: { numComponents: 4, data: new Float32Array(numInstances * 4), drawType: gl.DYNAMIC_DRAW },\n a_position: {\n numComponents: 2,\n data: new Float32Array(numInstances * 2),\n drawType: gl.DYNAMIC_DRAW,\n },\n });\n const feedback = twgl.createTransformFeedback(gl, feedbackProgramInfo, tfBufferInfo);\n\n // 创建绘制程序\n const drawProgramInfo = this.createProgramInfo(\n 'grid-wind-draw',\n options,\n () => getDrawVs(options, this.maskShaderData.vs),\n () => getDrawFs(options, this.maskShaderData.fs),\n );\n const drawBufferInfo = twgl.createBufferInfoFromArrays(gl, {\n ...twgl.primitives.createXYQuadVertices(),\n windInfo: { numComponents: 4, buffer: tfBufferInfo.attribs!.a_windInfoOut.buffer, divisor: 1 },\n });\n const drawVertexArrayInfo = twgl.createVertexArrayInfo(gl, drawProgramInfo, drawBufferInfo);\n\n this.SHADER_MAP.set(shaderData.variantName, {\n feedbackProgramInfo,\n drawProgramInfo,\n feedback,\n drawVertexArrayInfo,\n tfBufferInfo,\n numInstances,\n });\n\n return this.SHADER_MAP.get(shaderData.variantName);\n }\n\n public loadWinnIconTexture(src: string = '/huishang/assets/map/icons/winds/v4/wind-icons.png') {\n const gl = this.gl2;\n this.setTextureOptions(gl, {\n u_texture: {\n src,\n mag: gl.LINEAR,\n min: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n },\n });\n }\n\n public setOptions(options: IGridWindRenderOptions) {\n this.options = { ...this.options, ...options };\n this.iconColor = Object.values(new TinyColor(this.options.iconColor).toRgb());\n this.largeValueIconColor = Object.values(new TinyColor(this.options.largeValueIconColor).toRgb());\n this.map.triggerRepaint();\n }\n\n onRender(options: CustomRenderMethodInput, wraps: number[]) {\n if (!this.data || !this.nextData) return;\n if (!this.bounds) return;\n\n const gl = this.gl2;\n\n const { feedbackProgramInfo, drawProgramInfo, feedback, drawVertexArrayInfo, tfBufferInfo, numInstances } = this.getShader(\n gl,\n options,\n )!;\n\n // GGPU\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n gl.enable(gl.RASTERIZER_DISCARD);\n gl.useProgram(feedbackProgramInfo.program);\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, feedback);\n gl.beginTransformFeedback(gl.POINTS);\n twgl.setUniformsAndBindTextures(feedbackProgramInfo, {\n ...this.textures,\n u_image1_value_range: [this.data.minWindu, this.data.maxWindu, this.data.minWindv, this.data.maxWindv],\n u_image2_value_range: [this.nextData.minWindu, this.nextData.maxWindu, this.nextData.minWindv, this.nextData.maxWindv],\n u_bounds: toBoundsCoords(this.bounds),\n u_filter_winds: this.options.filterValue,\n t: this.t,\n });\n // 计算显示区域网格坐标数据\n const sizeNormalize = toWebGlSizeByPixel(this.map, this.options.iconSize);\n const gridInfo = calculateGridInfo(this.map, this.options.gridDensity, {\n [GridDensity.LOOSE]: 18,\n [GridDensity.DENSE]: 22,\n [GridDensity.SUPER_DENSE]: 28,\n });\n const viewportGridUvData = calculateViewportGridUvBuffer(this.map, numInstances, gridInfo.rowCount, gridInfo.colCount);\n twgl.setAttribInfoBufferFromArray(gl, tfBufferInfo.attribs!.a_position, viewportGridUvData.buffer);\n twgl.setBuffersAndAttributes(gl, feedbackProgramInfo, tfBufferInfo);\n twgl.drawBufferInfo(gl, tfBufferInfo, gl.POINTS);\n gl.endTransformFeedback();\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);\n gl.disable(gl.RASTERIZER_DISCARD);\n\n // console.info(\n // '========onRender====data2====',\n // this.readBufferToArray(gl, tfBufferInfo.attribs!.a_windInfoOut.buffer, numInstances * 3),\n // );\n\n // DRAW\n for (const wrap of wraps) {\n twgl.drawObjectList(gl, [\n {\n programInfo: drawProgramInfo,\n vertexArrayInfo: drawVertexArrayInfo,\n uniforms: {\n bounds: this.bounds,\n u_projection_fallback_matrix: options.defaultProjectionData.fallbackMatrix,\n u_projection_matrix: options.defaultProjectionData.mainMatrix,\n u_projection_tile_mercator_coords: options.defaultProjectionData.tileMercatorCoords,\n u_projection_clipping_plane: options.defaultProjectionData.clippingPlane,\n u_projection_transition: options.defaultProjectionData.projectionTransition,\n offset: wrap,\n size: sizeNormalize,\n u_texture_exists: true,\n u_iconColor: this.iconColor,\n u_iconOpacity: this.options.iconOpacity,\n u_large_value: this.options.largeValue,\n u_large_value_iconColor: this.largeValueIconColor,\n iconsTextureSize: [1188, 54],\n iconSize: [54, 54],\n ...this.maskUniforms,\n ...this.textures,\n },\n instanceCount: viewportGridUvData.list.length,\n },\n ]);\n }\n }\n}\n",
59
+ "export const defComputeFs = `#version 300 es\nprecision mediump float;\nout vec4 o;\nvoid main() {\n o = vec4(0);\n}\n`;\n",
60
+ "export function getComputeVs() {\n return `#version 300 es\n precision highp float;\n\n in vec2 a_position;\n out vec4 a_windInfoOut;\n\n uniform sampler2D u_image0;\n uniform sampler2D u_image1;\n uniform vec4 u_image1_value_range; //min_windu, max_windu, min_windv, max_windv\n uniform vec4 u_image2_value_range; //min_windu, max_windu, min_windv, max_windv\n\n uniform vec4 u_bounds;\n uniform float u_filter_winds;\n uniform float t;\n\n // 计算风向角度\n // u: 东西方向风速分量(东为正,西为负)\n // v: 南北方向风速分量(北为正,南为负)\n // 返回值:风向角度(以度为单位,0°为正北,顺时针增加)\n float calculateWindDirection(float u, float v) {\n float radians = atan(v, u);\n\n float degrees = degrees(radians);\n\n float windDirection = mod(90.0 - degrees + 360.0, 360.0);\n\n return windDirection;\n }\n\n // 数值映射函数\n float map(float value, float inMin, float inMax, float outMin, float outMax) {\n return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n }\n\n void main() {\n float bounds_left = u_bounds[0];\n float bounds_top = u_bounds[1];\n float bounds_right = u_bounds[2];\n float bounds_bottom = u_bounds[3];\n\n\n // 只显示bound区域内的数据\n if(a_position.x < bounds_left || a_position.x > bounds_right || a_position.y < bounds_top || a_position.y > bounds_bottom){\n a_windInfoOut = vec4(a_position.x, a_position.y, -1.0, -1.0);\n return;\n }\n\n // 采样坐标转换\n // 将采样坐标转为为bound区域内的坐标\n float x = map(a_position.x, bounds_left, bounds_right, 0.0, 1.0);\n float y = map(a_position.y, bounds_top, bounds_bottom, 0.0, 1.0);\n vec2 sample_coord = vec2(x, y);\n \n // 计算风速风向\n vec4 color1 = texture(u_image0, sample_coord);\n vec4 color2 = texture(u_image1, sample_coord);\n float colorR = mix(color1.r,color2.r,t);\n float colorG = mix(color1.g,color2.g,t);\n float min_windu = mix(u_image1_value_range.r,u_image2_value_range.r,0.0);\n float max_windu = mix(u_image1_value_range.g,u_image2_value_range.g,0.0);\n float min_windv = mix(u_image1_value_range.b,u_image2_value_range.b,0.0);\n float max_windv = mix(u_image1_value_range.a,u_image2_value_range.a,0.0);\n float windu = colorR * (max_windu - min_windu) + min_windu;\n float windv = colorG * (max_windv - min_windv) + min_windv;\n float winds = sqrt(windu * windu + windv * windv);\n float windd = calculateWindDirection(windu, windv);\n\n // 风速过滤\n if(winds < u_filter_winds){\n a_windInfoOut = vec4(a_position.x, a_position.y, -1.0, -1.0);\n return;\n }\n\n a_windInfoOut = vec4(a_position.x, a_position.y, winds, windd);\n }`;\n}\n",
61
+ "import * as maplibregl from 'maplibre-gl';\n\nexport function getDrawFs(options: maplibregl.CustomRenderMethodInput, maskShaderData: string = '') {\n return `#version 300 es\n precision highp float;\n\n ${maskShaderData}\n\n in vec2 v_texcoord;\n in vec4 v_iconColor;\n\n uniform float u_iconOpacity;\n uniform sampler2D u_texture;\n uniform bool u_texture_exists;\n\n out vec4 outColor;\n \n void main() {\n if(checkMask()) discard;\n\n if(u_texture_exists){\n outColor = texture(u_texture, v_texcoord);\n outColor = v_iconColor * outColor.a;\n }\n }`;\n}\n",
62
+ "import * as maplibregl from 'maplibre-gl';\n\nexport function getDrawVs(options: maplibregl.CustomRenderMethodInput, maskShaderData: string = '') {\n return `#version 300 es\n ${options.shaderData.vertexShaderPrelude}\n ${options.shaderData.define}\n ${maskShaderData}\n\n in vec2 position;\n in vec2 texcoord;\n in vec4 windInfo;\n\n uniform float offset;\n uniform float size;\n uniform vec2 iconSize;\n uniform vec2 iconsTextureSize;\n uniform vec4 u_iconColor;\n uniform float u_large_value;\n uniform vec4 u_large_value_iconColor;\n\n out vec2 v_texcoord;\n out vec4 v_iconColor;\n \n void main() {\n vec2 translationPosition = windInfo.xy;\n float windSpeed = windInfo.z;\n float windDirection = windInfo.w;\n\n if(windSpeed == -1.0) return;\n \n mat4 translateMatrix = mat4(1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n translationPosition.x + offset, translationPosition.y, 0.0, 1.0);\n\n mat4 scaleMatrix = mat4(size, 0.0, 0.0, 0.0,\n 0.0, size, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0);\n\n float angle = radians(0.0 - windDirection - 180.0);\n mat4 rotateMatrix = mat4(\n cos(angle), -sin(angle), 0.0, 0.0,\n sin(angle), cos(angle), 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0\n );\n\n vec4 v_pos = translateMatrix * scaleMatrix * rotateMatrix * vec4(vec2(position.x, position.y), 0.0, 1.0);\n gl_Position = projectTile(v_pos.xy);\n setMaskUV(v_pos.xy);\n gl_PointSize = 15.0;\n\n // 计算风速图标的索引\n float windsIconIndex = ceil(windSpeed / 2.0);\n if(windsIconIndex >= iconsTextureSize.x / iconSize.x){\n windsIconIndex = iconsTextureSize.x / iconSize.x - 1.0;\n }\n\n // 精灵图标定位\n float x = windsIconIndex * iconSize.x;\n vec2 instanceIconFrames = vec2(x, 0.0);\n v_texcoord = mix(\n instanceIconFrames.xy,\n instanceIconFrames.xy + iconSize,\n (position.xy + 1.0) / 2.0\n ) / iconsTextureSize;\n\n\n // 颜色\n if(windSpeed > u_large_value){\n v_iconColor = vec4(u_large_value_iconColor.rgb / 255.0, u_large_value_iconColor.a);\n }else{\n v_iconColor = vec4(u_iconColor.rgb / 255.0, u_iconColor.a);\n }\n }`;\n}\n",
63
+ "import { GridDensity } from '../../../types/gl';\nimport { IMap } from '../../../types/map';\n\nexport function calculateGridInfo(map: IMap, density: GridDensity, valueMap: Record<GridDensity, number>) {\n const zoom = map.getZoom();\n\n const baseGridCount = valueMap[density];\n\n // zoom 每增加一级,格点增加1倍-1\n const gridCount = baseGridCount + (baseGridCount - 1) * (Math.pow(2, Math.floor(zoom)) - 1);\n\n const colCount = gridCount;\n const rowCount = gridCount;\n\n return {\n rowCount,\n colCount,\n };\n}\n",
64
+ "import { uniq } from 'lodash-es';\nimport { getViewportBounds } from '../../../fns';\nimport { IMap } from '../../../types/map';\n\nexport function calculateViewportGridUvBuffer(map: IMap, numInstances: number, rowCount: number, colCount: number) {\n const viewportUvs = calculateViewportGridUv(map, rowCount, colCount);\n const viewportUvsBuffer = new Float32Array(numInstances * 4);\n try {\n viewportUvsBuffer.set(viewportUvs.flat());\n } catch (error) {\n console.info('ERROR:', numInstances, viewportUvs.flat().length, error);\n }\n return { buffer: viewportUvsBuffer, list: viewportUvs };\n}\n\nexport function calculateViewportGridUv(map: IMap, rowCount: number, colCount: number) {\n const viewportBounds = getViewportBounds(map);\n\n // 检查是否跨越了经度边界(180度或-180度)\n const isCrossingDateLine = viewportBounds[2] > 180;\n\n // 处理跨越国际日期变更线的情况\n if (isCrossingDateLine) {\n // 将视口分为两个矩形:一个从左边界到180度,另一个从-180度到右边界\n const leftBounds: GeoJSON.BBox = [viewportBounds[0], viewportBounds[1], 180, viewportBounds[3]];\n const rightBounds: GeoJSON.BBox = [-180, viewportBounds[1], viewportBounds[2], viewportBounds[3]];\n\n // 左矩形的四个角\n const leftRect = {\n topLeft: [leftBounds[0], leftBounds[3]] as [number, number],\n bottomLeft: [leftBounds[0], leftBounds[1]] as [number, number],\n topRight: [leftBounds[2], leftBounds[3]] as [number, number],\n bottomRight: [leftBounds[2], leftBounds[1]] as [number, number],\n };\n\n // 右矩形的四个角\n const rightRect = {\n topLeft: [rightBounds[0], rightBounds[3]] as [number, number],\n bottomLeft: [rightBounds[0], rightBounds[1]] as [number, number],\n topRight: [rightBounds[2], rightBounds[3]] as [number, number],\n bottomRight: [rightBounds[2], rightBounds[1]] as [number, number],\n };\n\n // 计算两个矩形区域内的索引\n const leftIndices = calculateIndicesInRect(leftRect, rowCount, colCount);\n const rightIndices = calculateIndicesInRect(rightRect, rowCount, colCount);\n\n // 合并两个区域的索引\n const indices = uniq([...leftIndices, ...rightIndices]);\n const uvCoordinates = indicesToUv(indices, rowCount, colCount);\n return uvCoordinates;\n } else {\n // 如果没有跨越日期变更线,使用原始的矩形区域\n const leftTopLngLat: [number, number] = [viewportBounds[0], viewportBounds[3]];\n const leftBottomLngLat: [number, number] = [viewportBounds[0], viewportBounds[1]];\n const rightTopLngLat: [number, number] = [viewportBounds[2], viewportBounds[3]];\n const rightBottomLngLat: [number, number] = [viewportBounds[2], viewportBounds[1]];\n\n const rect = {\n topLeft: leftTopLngLat,\n bottomLeft: leftBottomLngLat,\n topRight: rightTopLngLat,\n bottomRight: rightBottomLngLat,\n };\n\n const indices = calculateIndicesInRect(rect, rowCount, colCount);\n const uvCoordinates = indicesToUv(indices, rowCount, colCount);\n return uvCoordinates;\n }\n}\n\nfunction indicesToUv(indices: number[], rowCount: number, colCount: number) {\n const uvCoordinates = indices.map(index => {\n const row = Math.floor(index / colCount);\n const col = index % colCount;\n const u = col / (colCount - 1);\n const v = row / (rowCount - 1);\n return [u, v];\n });\n\n return uvCoordinates;\n}\n\n// 辅助函数:计算矩形区域内的所有索引\nfunction calculateIndicesInRect(\n rect: {\n topLeft: [number, number];\n bottomLeft: [number, number];\n topRight: [number, number];\n bottomRight: [number, number];\n },\n rowCount: number,\n colCount: number,\n): number[] {\n // 获取四个角的索引\n const topLeftIndex = calculateIndexFromLngLat(rect.topLeft, rowCount, colCount);\n const bottomLeftIndex = calculateIndexFromLngLat(rect.bottomLeft, rowCount, colCount);\n const topRightIndex = calculateIndexFromLngLat(rect.topRight, rowCount, colCount);\n const bottomRightIndex = calculateIndexFromLngLat(rect.bottomRight, rowCount, colCount);\n\n // 确定行列范围\n const minRow = Math.max(\n 0,\n Math.min(\n Math.floor(topLeftIndex / colCount),\n Math.floor(bottomLeftIndex / colCount),\n Math.floor(topRightIndex / colCount),\n Math.floor(bottomRightIndex / colCount),\n ),\n );\n\n const maxRow = Math.min(\n rowCount - 1,\n Math.max(\n Math.floor(topLeftIndex / colCount),\n Math.floor(bottomLeftIndex / colCount),\n Math.floor(topRightIndex / colCount),\n Math.floor(bottomRightIndex / colCount),\n ),\n );\n\n const minCol = Math.max(\n 0,\n Math.min(topLeftIndex % colCount, bottomLeftIndex % colCount, topRightIndex % colCount, bottomRightIndex % colCount),\n );\n\n const maxCol = Math.min(\n colCount - 1,\n Math.max(topLeftIndex % colCount, bottomLeftIndex % colCount, topRightIndex % colCount, bottomRightIndex % colCount),\n );\n\n // 收集矩形区域内的所有索引\n const indices: number[] = [];\n for (let row = minRow; row <= maxRow; row++) {\n for (let col = minCol; col <= maxCol; col++) {\n indices.push(row * colCount + col);\n }\n }\n\n return indices;\n}\n\n// 从经纬度计算墨卡托坐标\nexport const mercatorFromLngLat = (lngLat: [number, number]): [number, number] => {\n const lng = lngLat[0];\n const lat = lngLat[1];\n\n // 计算墨卡托X坐标\n const x = (lng + 180) / 360;\n\n // 计算墨卡托Y坐标\n const latRad = (lat * Math.PI) / 180;\n const y = (1 - Math.log(Math.tan(latRad) + 1 / Math.cos(latRad)) / Math.PI) / 2;\n\n return [x, y];\n};\n\n// 从经纬度计算网格索引\nexport const calculateIndexFromLngLat = (lngLat: [number, number], rowCount: number, colCount: number): number => {\n // 1. 将经纬度转换为墨卡托坐标\n const [u, v] = mercatorFromLngLat(lngLat);\n\n // 2. 从UV坐标计算行和列\n const row = Math.round(v * (rowCount - 1));\n const col = Math.round(u * (colCount - 1));\n\n // 3. 计算索引\n const index = row * colCount + col;\n\n return index;\n};\n",
65
+ "import * as maplibregl from 'maplibre-gl';\nimport { Bounds } from '../../../types/map';\n\nexport function toBoundsCoords(bounds: Bounds) {\n const leftTop = maplibregl.MercatorCoordinate.fromLngLat({\n lng: bounds[0],\n lat: bounds[3],\n });\n const leftBotton = maplibregl.MercatorCoordinate.fromLngLat({\n lng: bounds[0],\n lat: bounds[1],\n });\n const rightTop = maplibregl.MercatorCoordinate.fromLngLat({\n lng: bounds[2],\n lat: bounds[3],\n });\n const rightBottom = maplibregl.MercatorCoordinate.fromLngLat({\n lng: bounds[2],\n lat: bounds[1],\n });\n\n const boundsData = [\n Object.values(leftTop).slice(0, 2),\n Object.values(leftBotton).slice(0, 2),\n Object.values(rightTop).slice(0, 2),\n Object.values(rightBottom).slice(0, 2),\n ].flat();\n\n return [leftTop.x, leftTop.y, rightBottom.x, rightBottom.y];\n}\n",
66
+ "import * as maplibregl from 'maplibre-gl';\nimport { IMap } from '../../../types/map';\n\nexport function toWebGlSizeByPixel(map: IMap, pixelSize: number) {\n const center = map.getCenter();\n\n const leftLngLat = new maplibregl.LngLat(center.lng - 1, center.lat);\n const rightLngLat = new maplibregl.LngLat(center.lng + 1, center.lat);\n\n const leftPixel = map.project(leftLngLat);\n const rightPixel = map.project(rightLngLat);\n\n const leftNormalize = maplibregl.MercatorCoordinate.fromLngLat(leftLngLat);\n const rightNormalize = maplibregl.MercatorCoordinate.fromLngLat(rightLngLat);\n\n const bl = pixelSize / (rightPixel.x - leftPixel.x);\n const sizeNormalize = bl * (rightNormalize.x - leftNormalize.x);\n\n return sizeNormalize / 2;\n}\n",
67
+ "import { CustomRenderMethodInput } from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { defComputeFs } from '../../fns/glsl/defComputeFs';\nimport { IWindRenderVo } from '../../types/gl';\nimport { Bounds } from '../../types/map';\nimport { ExTimingLayer, IExTimingLayerProps } from '../base/ExTimingLayer';\nimport { toWebGlSizeByPixel } from '../maplibre-gridWind/utils/toWebGlSizeByPixel';\nimport { getComputeVs } from './computeVs';\nimport { getDrawFs } from './drawFs';\nimport { getDrawVs } from './drawVs';\nimport { wrapBounds } from './utils/bounds';\n\ninterface IWindParticleLayerOptions {\n numParticles: number;\n width: number;\n maxAge: number;\n color: [number, number, number];\n isAnimation: boolean;\n speedFactor: number;\n opacity: number;\n}\n\ninterface IWindParticleLayerState {\n image1?: IWindRenderVo;\n image2?: IWindRenderVo;\n bounds?: Bounds;\n t: number;\n setNdx: number;\n customRenderMethodInput?: CustomRenderMethodInput;\n time: number;\n numInstances: number;\n numAgedInstances: number;\n previousViewportZoom: number;\n previousTime: number;\n stepRequested: boolean;\n u_line_width: number;\n isRun: boolean;\n}\n\nexport class MapLibreWindParticleLayer extends ExTimingLayer<IWindRenderVo> {\n private state: IWindParticleLayerState;\n private options: IWindParticleLayerOptions;\n private FPS = 20;\n private SHADER_MAP = new Map<\n string,\n {\n feedbackProgramInfo: twgl.ProgramInfo;\n drawProgramInfo: twgl.ProgramInfo;\n drawVertexArrayInfo: twgl.VertexArrayInfo;\n sets: {\n feedback: WebGLTransformFeedback;\n tfBufferInfo: twgl.BufferInfo;\n }[];\n }\n >();\n\n constructor(props: IExTimingLayerProps) {\n super(props);\n this.state = {\n image1: undefined,\n image2: undefined,\n bounds: undefined,\n isRun: true,\n t: 0,\n setNdx: 0,\n customRenderMethodInput: undefined,\n time: 0,\n numInstances: 0,\n numAgedInstances: 0,\n previousViewportZoom: 0,\n previousTime: 0,\n stepRequested: false,\n u_line_width: 1,\n };\n this.options = {\n numParticles: 5000,\n width: 1,\n maxAge: 5,\n color: [255, 255, 255],\n isAnimation: true,\n speedFactor: 15,\n opacity: 1,\n };\n }\n\n public setOptions(options: Partial<IWindParticleLayerOptions>) {\n this.options = { ...this.options, ...options };\n this.setState({\n numInstances: this.options.numParticles * this.options.maxAge,\n numAgedInstances: this.options.numParticles * (this.options.maxAge - 1),\n });\n }\n\n public setState(state: Partial<IWindParticleLayerState>) {\n this.state = { ...this.state, ...state };\n }\n\n private getShader(gl: WebGLRenderingContext | WebGL2RenderingContext, options: CustomRenderMethodInput) {\n const { shaderData } = options;\n if (gl instanceof WebGLRenderingContext) throw new Error('gl is not WebGL2RenderingContext');\n\n if (this.SHADER_MAP.has(shaderData.variantName)) {\n return this.SHADER_MAP.get(shaderData.variantName);\n }\n\n const { numParticles, maxAge, color } = this.options;\n\n const { numInstances } = this.state;\n\n // 粒子颜色\n const colorData = Array.from({ length: numInstances })\n .map((e, i) => {\n const age = Math.floor(i / numParticles);\n return [color[0], color[1], color[2], 255 * (1 - age / maxAge)].map(d => d / 255);\n })\n .flat();\n\n // 创建反馈程序\n const feedbackProgramInfo = twgl.createProgramInfo(gl, [getComputeVs(options), defComputeFs], {\n transformFeedbackVaryings: ['targetPosition'],\n });\n const tfBufferInfo1 = twgl.createBufferInfoFromArrays(gl, {\n sourcePosition: { numComponents: 3, data: new Float32Array(numInstances * 3) },\n targetPosition: { numComponents: 3, data: new Float32Array(numInstances * 3) },\n });\n const tfBufferInfo2 = twgl.createBufferInfoFromArrays(gl, {\n sourcePosition: { numComponents: 3, buffer: tfBufferInfo1.attribs?.targetPosition.buffer },\n targetPosition: { numComponents: 3, buffer: tfBufferInfo1.attribs?.sourcePosition.buffer },\n });\n const feedback1 = twgl.createTransformFeedback(gl, feedbackProgramInfo, tfBufferInfo1);\n const feedback2 = twgl.createTransformFeedback(gl, feedbackProgramInfo, tfBufferInfo2);\n\n // 创建绘制程序\n const drawProgramInfo = twgl.createProgramInfo(gl, [\n getDrawVs(options, this.maskShaderData.vs),\n getDrawFs(options, this.maskShaderData.fs),\n ]);\n const drawBufferInfo = twgl.createBufferInfoFromArrays(gl, {\n position: { numComponents: 2, data: new Float32Array([0, -0.5, 1, -0.5, 1, 0.5, 0, -0.5, 1, 0.5, 0, 0.5]) },\n instanceSourcePosition: { numComponents: 3, buffer: tfBufferInfo1.attribs?.sourcePosition.buffer, divisor: 1 },\n instanceTargetPosition: { numComponents: 3, buffer: tfBufferInfo1.attribs?.targetPosition.buffer, divisor: 1 },\n instanceColor: { numComponents: 4, data: new Float32Array(colorData), divisor: 1 },\n });\n const drawVertexArrayInfo = twgl.createVertexArrayInfo(gl, drawProgramInfo, drawBufferInfo);\n\n // 保存\n this.SHADER_MAP.set(shaderData.variantName, {\n feedbackProgramInfo,\n drawProgramInfo,\n drawVertexArrayInfo,\n sets: [\n {\n feedback: feedback1,\n tfBufferInfo: tfBufferInfo1,\n },\n {\n feedback: feedback2,\n tfBufferInfo: tfBufferInfo2,\n },\n ],\n });\n\n return this.SHADER_MAP.get(shaderData.variantName);\n }\n\n public onMount() {\n this.run(time => {\n this.setState({ time: Math.ceil(time) });\n if (this.state.isRun) {\n this.map.triggerRepaint();\n }\n });\n }\n\n public onUnMount(): void {}\n\n public clear(): void {}\n\n public onRender(options: CustomRenderMethodInput, wraps: number[]) {\n this.setState({ customRenderMethodInput: options });\n\n if (this.state.time - this.state.previousTime > 1000 / this.FPS) {\n this.runTransform();\n }\n\n for (const wrap of wraps) {\n this.runDraw(wrap);\n }\n }\n\n public runTransform() {\n const gl = this.gl2;\n\n const { image1, image2, bounds, customRenderMethodInput, setNdx, t, previousViewportZoom, time, numAgedInstances } =\n this.state;\n\n const { numParticles, maxAge, speedFactor } = this.options;\n\n if (!image1 || !image2 || !bounds || !customRenderMethodInput) return;\n\n const { feedbackProgramInfo, sets } = this.getShader(this.gl, customRenderMethodInput)!;\n\n const { feedback, tfBufferInfo } = sets[setNdx];\n\n const zoom = this.map.getZoom();\n\n const mapBounds = this.map.getBounds();\n\n const seed = Math.random();\n\n const imageUnscale = [-128, 127];\n\n const viewportBounds = wrapBounds(mapBounds.toArray().flat() as any);\n\n // console.info('======viewportBounds=====', viewportBounds);\n\n const viewportZoomChangeFactor = 2 ** ((previousViewportZoom - zoom) * 4);\n\n const currentSpeedFactor = speedFactor / 2 ** (zoom + 7);\n\n gl.enable(gl.RASTERIZER_DISCARD);\n gl.useProgram(feedbackProgramInfo.program);\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, feedback);\n gl.beginTransformFeedback(gl.POINTS);\n twgl.setBuffersAndAttributes(gl, feedbackProgramInfo, tfBufferInfo);\n twgl.setUniformsAndBindTextures(feedbackProgramInfo, {\n ...this.textures,\n t,\n imageUnscale,\n bounds,\n viewportBounds,\n viewportZoomChangeFactor,\n numParticles,\n maxAge,\n speedFactor: currentSpeedFactor,\n time,\n seed,\n });\n twgl.drawBufferInfo(gl, tfBufferInfo, gl.POINTS);\n gl.endTransformFeedback();\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);\n gl.disable(gl.RASTERIZER_DISCARD);\n\n // console.info(\n // '========onRender====data2====',\n // this.readBufferToArray(gl, tfBufferInfo.attribs!.sourcePosition.buffer, this.state.numInstances * 3),\n // this.readBufferToArray(gl, tfBufferInfo.attribs!.targetPosition.buffer, this.state.numInstances * 3),\n // );\n\n // 复制老化粒子\n gl.bindBuffer(gl.COPY_READ_BUFFER, tfBufferInfo.attribs!.sourcePosition.buffer);\n gl.bindBuffer(gl.COPY_WRITE_BUFFER, tfBufferInfo.attribs!.targetPosition.buffer);\n gl.copyBufferSubData(gl.COPY_READ_BUFFER, gl.COPY_WRITE_BUFFER, 0, numParticles * 4 * 3, numAgedInstances * 4 * 3);\n gl.bindBuffer(gl.COPY_READ_BUFFER, null);\n gl.bindBuffer(gl.COPY_WRITE_BUFFER, null);\n\n this.setState({\n setNdx: 1 - setNdx,\n previousViewportZoom: zoom,\n previousTime: time,\n });\n }\n\n public runDraw(offset: number) {\n const gl = this.gl2;\n\n const { customRenderMethodInput, numInstances } = this.state;\n\n if (!customRenderMethodInput) return;\n\n const { drawProgramInfo, drawVertexArrayInfo } = this.getShader(this.gl, customRenderMethodInput)!;\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n twgl.drawObjectList(gl, [\n {\n programInfo: drawProgramInfo,\n vertexArrayInfo: drawVertexArrayInfo,\n uniforms: {\n u_projection_fallback_matrix: customRenderMethodInput.defaultProjectionData.fallbackMatrix,\n u_projection_matrix: customRenderMethodInput.defaultProjectionData.mainMatrix,\n u_projection_tile_mercator_coords: customRenderMethodInput.defaultProjectionData.tileMercatorCoords,\n u_projection_clipping_plane: customRenderMethodInput.defaultProjectionData.clippingPlane,\n u_projection_transition: customRenderMethodInput.defaultProjectionData.projectionTransition,\n offset,\n u_opacity: this.options.opacity,\n u_line_width: toWebGlSizeByPixel(this.map, this.options.width) * 2,\n ...this.maskUniforms,\n },\n instanceCount: numInstances,\n },\n ]);\n }\n\n public updateData(image1: IWindRenderVo | undefined, image2: IWindRenderVo | undefined, t: number) {\n if (!image2) image2 = image1;\n if (image1 && image2 && this.state.image1 !== image1) {\n this.setState({ bounds: image1.bounds });\n\n this.setTextureOptions(this.gl, {\n bitmapTexture1: image1.texture_mercator!,\n bitmapTexture2: image2.texture_mercator!,\n });\n }\n\n this.setState({\n image1,\n image2,\n t: this.options.isAnimation ? t : 0,\n });\n\n this.map.triggerRepaint();\n }\n}\n",
68
+ "export const mercatorFuns = `\n#define PI 3.1415926535897932384626433832795\n\n// UV转经纬度 (UV是0-1范围)\nvec2 toLngLatByUv(vec2 uv){\n float x = uv.x * 360.0 - 180.0;\n float y = 360.0 / PI * atan(exp((180.0 - uv.y * 360.0) * PI / 180.0)) - 90.0;\n return vec2(x, y);\n}\n\n// 经纬度转UV (UV是0-1范围)\nvec2 toUvByLngLat(vec2 lngLat){\n float x = (180.0 + lngLat.x) / 360.0;\n float y = (180.0 - (180.0 / PI * log(tan(PI / 4.0 + lngLat.y * PI / 360.0)))) / 360.0;\n return vec2(x, y);\n}\n`;\n",
69
+ "import { CustomRenderMethodInput } from 'maplibre-gl';\nimport { mercatorFuns } from '../../fns/glsl/mercatorFuns';\n\n// 计算顶点着色器代码生成函数\nexport function getComputeVs(options: CustomRenderMethodInput) {\n return `\n #version 300 es\n precision highp float;\n\n ${mercatorFuns}\n\n in vec3 sourcePosition; // 输入的粒子源位置(x=经度,y=纬度,z=其他)\n out vec3 targetPosition; // 输出粒子的目标位置\n\n // ================== uniform 输入区 ==================\n uniform vec4 viewportBounds; // 地图当前可视边界 [minLng, minLat, maxLng, maxLat]\n uniform float viewportZoomChangeFactor; // 缩放变化因子(用于粒子重布)\n uniform sampler2D bitmapTexture1; // 风场速度贴图1\n uniform sampler2D bitmapTexture2; // 风场速度贴图2(用于插值)\n uniform float t; // 动画插值参数\n uniform vec2 imageUnscale; // 风场数据的反归一化参数\n uniform vec4 bounds; // 原始风场数据边界 [minLng, minLat, maxLng, maxLat]\n uniform float numParticles; // 总粒子数\n uniform float maxAge; // 最大寿命\n uniform float speedFactor; // 风速缩放系数\n uniform float time; // 当前全局时间戳\n uniform float seed; // 用于随机生成的种子\n\n // ================== 常量 ==================\n const vec2 DROP_POSITION = vec2(0.0, 0.0); // 用于标记被丢弃的粒子\n\n // ================ 工具函数 =================\n\n // 判断值是否为NaN,兼容GLSL的isnan\n bool isNaN(float value) {\n return !(value <= 0. || 0. <= value);\n }\n\n // 经度环绕。归一化到[-180,180)\n float wrapLongitude(float lng) {\n float wrappedLng = mod(lng + 180., 360.) - 180.;\n return wrappedLng;\n }\n\n // 经度环绕。带minLng,保证递增顺序,应用于数据区域边界场景\n float wrapLongitude(float lng, float minLng) {\n float wrappedLng = wrapLongitude(lng);\n if (wrappedLng < minLng) {\n wrappedLng += 360.;\n }\n return wrappedLng;\n }\n\n // 伪随机数生成。sin+dot实现\n float randFloat(vec2 seed) {\n return fract(sin(dot(seed.xy, vec2(12.9898, 78.233))) * 43758.5453);\n }\n\n // 生成均匀分布的[0,1)二维随机数\n vec2 randPoint(vec2 seed) {\n return vec2(randFloat(seed + 1.3), randFloat(seed + 2.1));\n }\n\n // 将归一化点(0-1)映射为当前viewport内的经纬度范围实际坐标\n vec2 uvToViewportLngLat(vec2 point) {\n vec2 viewportBoundsMin = viewportBounds.xy;\n vec2 viewportBoundsMax = viewportBounds.zw;\n return mix(viewportBoundsMin, viewportBoundsMax, point);\n }\n\n // 检查位置是否处于指定边界bounds内\n bool isPositionInBounds(vec2 position, vec4 bounds) {\n vec2 boundsMin = bounds.xy;\n vec2 boundsMax = bounds.zw;\n float lng = wrapLongitude(position.x, boundsMin.x);\n float lat = position.y;\n return (\n boundsMin.x <= lng && lng <= boundsMax.x &&\n boundsMin.y <= lat && lat <= boundsMax.y\n );\n }\n\n // 检查位置是否在视窗内\n bool isPositionInViewport(vec2 position) {\n return isPositionInBounds(position, viewportBounds);\n }\n\n // 判断风场贴图采样值是否有效\n bool raster_has_values(vec4 values) {\n // RGB风场数据:alpha为1才是有效\n if (imageUnscale.x < imageUnscale.y) {\n return values.a == 1.;\n } else {\n // float风场数据:非NaN有效\n return !isNaN(values.x);\n }\n }\n\n // 提取风速,反归一化\n vec2 raster_get_values(vec4 color) {\n if (imageUnscale.x < imageUnscale.y) {\n // 插值解码\n return mix(vec2(imageUnscale.x), vec2(imageUnscale.y), color.xy);\n } else {\n // 直接读取\n return color.xy;\n }\n }\n\n vec2 getTextureUV(vec2 lngLat, vec4 dataBounds) {\n // 1. 计算当前点在全球墨卡托投影下的 UV (0.0 ~ 1.0)\n vec2 globalUv = toUvByLngLat(lngLat);\n\n // 2. 计算纹理边界 (bounds) 在全球墨卡托下的 UV 范围\n // 注意:墨卡托坐标中,纬度越高 Y 越小 (85°N 对应 Y≈0)\n // dataBounds 格式: [minLng, minLat, maxLng, maxLat]\n // 纹理左上角坐标为 (minLng, maxLat),右下角为 (maxLng, minLat)\n vec2 uvMin = toUvByLngLat(vec2(dataBounds.x, dataBounds.w)); // 纹理左上角在世界地图的位置\n vec2 uvMax = toUvByLngLat(vec2(dataBounds.z, dataBounds.y)); // 纹理右下角在世界地图的位置\n\n // 3. 将全球坐标映射到局部纹理坐标 (0.0 ~ 1.0)\n // 公式: (current - min) / (max - min)\n vec2 textureUv = (globalUv - uvMin) / (uvMax - uvMin);\n\n return textureUv;\n}\n\n void main() {\n // 用gl_VertexID编码粒子索引和其年龄 (轮转):\n // 低位为粒子编号,高位为年龄,每个粒子多帧叠加寿命prolong\n float particleIndex = mod(float(gl_VertexID), numParticles);\n float particleAge = floor(float(gl_VertexID) / numParticles);\n\n // 只处理首龄(age0)的新粒子,其它age>0的粒子由copyData GPU memcpy 老化\n if (particleAge > 0.) {\n return;\n }\n\n // ========== 粒子需要重生或初始化 ==========\n // 1. 刚创建(DROP_POSITION)\n if (sourcePosition.xy == DROP_POSITION) {\n // 用种子和粒子编号为每个粒子生成唯一随机位置,防止空间聚集\n vec2 particleSeed = vec2((particleIndex) * seed / numParticles);\n vec2 uvPoint = randPoint(particleSeed); // 得到均匀[0,1)\n vec2 lngLatPoint = uvToViewportLngLat(uvPoint); // 转为当前视口实际经纬度\n targetPosition.xy = lngLatPoint; // 设置粒子新位置\n targetPosition.x = wrapLongitude(targetPosition.x); // 经度再环绕,避免出界\n return;\n }\n\n // 2. 出界:丢弃,等待下一轮被重生\n if (!isPositionInBounds(sourcePosition.xy, bounds)) {\n targetPosition.xy = DROP_POSITION;\n return;\n } \n\n // 3. 地图缩放,避免过密。缩小时部分粒子drop\n if (viewportZoomChangeFactor > 1. && mod(particleIndex, viewportZoomChangeFactor) >= 1.) {\n targetPosition.xy = DROP_POSITION;\n return;\n }\n\n // 4. 按寿命丢弃老化到期的粒子(maxAge+2)确保不会出现两个粒子正好重叠的情况\n if (abs(mod(particleIndex, maxAge + 2.) - mod(time, maxAge + 2.)) < 1.) {\n targetPosition.xy = DROP_POSITION;\n return;\n }\n\n // 采样风场贴图\n vec2 uv = getTextureUV(sourcePosition.xy, bounds);\n vec4 textureColor1 = texture(bitmapTexture1, uv);\n vec4 textureColor2 = texture(bitmapTexture2, uv);\n vec4 textureColor = mix(textureColor1, textureColor2, t);\n\n // 没有风场值则丢弃\n if (!raster_has_values(textureColor)) {\n targetPosition.xy = DROP_POSITION;\n return;\n }\n\n // 计算下一个位置\n vec2 speed = raster_get_values(textureColor) * speedFactor;\n float distortion = cos(radians(sourcePosition.y));\n vec2 offset = vec2(speed.x / distortion, speed.y);\n targetPosition.xy = sourcePosition.xy + offset;\n targetPosition.x = wrapLongitude(targetPosition.x);\n }\n `;\n}\n",
70
+ "import { CustomRenderMethodInput } from 'maplibre-gl';\n\nexport const getDrawFs = (options: CustomRenderMethodInput, maskShaderData: string = '') => {\n return `\n #version 300 es\n precision highp float;\n\n ${maskShaderData}\n\n in float drop;\n in vec4 v_color;\n\n uniform float u_opacity;\n\n out vec4 fragColor;\n\n void main() {\n if(checkMask()) discard;\n if (drop > 0.5) discard;\n fragColor = v_color * vec4(1.0,1.0,1.0,u_opacity);\n }\n `;\n};\n",
71
+ "import { CustomRenderMethodInput } from 'maplibre-gl';\nimport { mercatorFuns } from '../../fns/glsl/mercatorFuns';\n\nexport function getDrawVs(options: CustomRenderMethodInput, maskShaderData: string = '') {\n return `\n #version 300 es\n \n precision highp float;\n\n ${options.shaderData.vertexShaderPrelude}\n ${options.shaderData.define}\n ${maskShaderData}\n ${mercatorFuns}\n\n in vec2 position;\n in vec3 instanceSourcePosition;\n in vec3 instanceTargetPosition;\n in vec4 instanceColor;\n\n out float drop;\n out vec4 v_color;\n \n uniform float u_line_width;\n uniform float offset;\n \n vec2 DROP_POSITION = vec2(0);\n\n // 通过2个点绘制带宽度的线(矩形)\n // https://wwwtyro.net/2019/11/18/instanced-lines.html\n // https://wwwtyro.net/2021/10/01/instanced-lines-part-2.html\n vec2 toLinePos(vec2 pointA, vec2 pointB,float width){\n vec2 xBasis = pointB - pointA;\n vec2 yBasis = normalize(vec2(-xBasis.y, xBasis.x));\n vec2 point = pointA + xBasis * position.x + yBasis * width * position.y;\n return point;\n }\n \n // 判断两个经纬度点是否跨越本初子午线(0°经线)并返回方向\n // -1 东向西跨越\n // 1 西向东跨越\n // 0 不跨越\n float checkMeridianCross(vec2 pointA, vec2 pointB) {\n if(abs(pointB.x - pointA.x) > 180.0){\n return (pointB.x > pointA.x) ? -1.0 : 1.0;\n }\n return 0.0;\n }\n\n void main() {\n drop = float(instanceSourcePosition.xy == DROP_POSITION || instanceTargetPosition.x == 0.0);\n \n float cross = checkMeridianCross(instanceSourcePosition.xy,instanceTargetPosition.xy);\n vec2 pointA = toUvByLngLat(instanceSourcePosition.xy);\n vec2 pointB = toUvByLngLat(instanceTargetPosition.xy);\n\n pointB = pointB + vec2(cross, 0);\n\n vec2 point = toLinePos(pointA,pointB,u_line_width);\n\n gl_Position = projectTile(point + vec2(offset ,0.0));\n \n setMaskUV(point);\n\n v_color = instanceColor;\n } \n`;\n}\n",
72
+ "function mod(x: number, y: number): number {\n return ((x % y) + y) % y;\n}\n\nexport function wrapLongitude(lng: number, minLng?: number): number {\n let wrappedLng = mod(lng + 180, 360) - 180;\n if (typeof minLng === 'number' && wrappedLng < minLng) {\n wrappedLng += 360;\n }\n return wrappedLng;\n}\n\nexport function wrapBounds(bounds: GeoJSON.BBox): GeoJSON.BBox {\n // wrap longitude\n const minLng = bounds[2] - bounds[0] < 360 ? wrapLongitude(bounds[0]) : -180;\n const maxLng = bounds[2] - bounds[0] < 360 ? wrapLongitude(bounds[2], minLng) : 180;\n // clip latitude\n const minLat = Math.max(bounds[1], -85.051129);\n const maxLat = Math.min(bounds[3], 85.051129);\n\n const mercatorBounds = [minLng, minLat, maxLng, maxLat] as GeoJSON.BBox;\n return mercatorBounds;\n}\n",
73
+ "/**\n * Common utilities\n * @module glMatrix\n */\n\n// Configuration Constants\nexport var EPSILON = 0.000001;\nexport var ARRAY_TYPE = typeof Float32Array !== \"undefined\" ? Float32Array : Array;\nexport var RANDOM = Math.random;\nexport var ANGLE_ORDER = \"zyx\";\n\n/**\n * Symmetric round\n * see https://www.npmjs.com/package/round-half-up-symmetric#user-content-detailed-background\n *\n * @param {Number} a value to round\n */\nexport function round(a) {\n if (a >= 0) return Math.round(a);\n return a % 0.5 === 0 ? Math.floor(a) : Math.round(a);\n}\n\n/**\n * Sets the type of array used when creating new vectors and matrices\n *\n * @param {Float32ArrayConstructor | ArrayConstructor} type Array type, such as Float32Array or Array\n */\nexport function setMatrixArrayType(type) {\n ARRAY_TYPE = type;\n}\nvar degree = Math.PI / 180;\nvar radian = 180 / Math.PI;\n\n/**\n * Convert Degree To Radian\n *\n * @param {Number} a Angle in Degrees\n */\nexport function toRadian(a) {\n return a * degree;\n}\n\n/**\n * Convert Radian To Degree\n *\n * @param {Number} a Angle in Radians\n */\nexport function toDegree(a) {\n return a * radian;\n}\n\n/**\n * Tests whether or not the arguments have approximately the same value, within an absolute\n * or relative tolerance of glMatrix.EPSILON (an absolute tolerance is used for values less\n * than or equal to 1.0, and a relative tolerance is used for larger values)\n *\n * @param {Number} a The first number to test.\n * @param {Number} b The second number to test.\n * @param {Number} tolerance Absolute or relative tolerance (default glMatrix.EPSILON)\n * @returns {Boolean} True if the numbers are approximately equal, false otherwise.\n */\nexport function equals(a, b) {\n var tolerance = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : EPSILON;\n return Math.abs(a - b) <= tolerance * Math.max(1, Math.abs(a), Math.abs(b));\n}",
74
+ "import * as glMatrix from \"./common.js\";\n\n/**\n * 4x4 Matrix<br>Format: column-major, when typed out it looks like row-major<br>The matrices are being post multiplied.\n * @module mat4\n */\n\n/**\n * Creates a new identity mat4\n *\n * @returns {mat4} a new 4x4 matrix\n */\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(16);\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n }\n out[0] = 1;\n out[5] = 1;\n out[10] = 1;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a new mat4 initialized with values from an existing matrix\n *\n * @param {ReadonlyMat4} a matrix to clone\n * @returns {mat4} a new 4x4 matrix\n */\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n\n/**\n * Copy the values from one mat4 to another\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n\n/**\n * Create a new mat4 with the given values\n *\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} A new mat4\n */\nexport function fromValues(m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n var out = new glMatrix.ARRAY_TYPE(16);\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n\n/**\n * Set the components of a mat4 to the given values\n *\n * @param {mat4} out the receiving matrix\n * @param {Number} m00 Component in column 0, row 0 position (index 0)\n * @param {Number} m01 Component in column 0, row 1 position (index 1)\n * @param {Number} m02 Component in column 0, row 2 position (index 2)\n * @param {Number} m03 Component in column 0, row 3 position (index 3)\n * @param {Number} m10 Component in column 1, row 0 position (index 4)\n * @param {Number} m11 Component in column 1, row 1 position (index 5)\n * @param {Number} m12 Component in column 1, row 2 position (index 6)\n * @param {Number} m13 Component in column 1, row 3 position (index 7)\n * @param {Number} m20 Component in column 2, row 0 position (index 8)\n * @param {Number} m21 Component in column 2, row 1 position (index 9)\n * @param {Number} m22 Component in column 2, row 2 position (index 10)\n * @param {Number} m23 Component in column 2, row 3 position (index 11)\n * @param {Number} m30 Component in column 3, row 0 position (index 12)\n * @param {Number} m31 Component in column 3, row 1 position (index 13)\n * @param {Number} m32 Component in column 3, row 2 position (index 14)\n * @param {Number} m33 Component in column 3, row 3 position (index 15)\n * @returns {mat4} out\n */\nexport function set(out, m00, m01, m02, m03, m10, m11, m12, m13, m20, m21, m22, m23, m30, m31, m32, m33) {\n out[0] = m00;\n out[1] = m01;\n out[2] = m02;\n out[3] = m03;\n out[4] = m10;\n out[5] = m11;\n out[6] = m12;\n out[7] = m13;\n out[8] = m20;\n out[9] = m21;\n out[10] = m22;\n out[11] = m23;\n out[12] = m30;\n out[13] = m31;\n out[14] = m32;\n out[15] = m33;\n return out;\n}\n\n/**\n * Set a mat4 to the identity matrix\n *\n * @param {mat4} out the receiving matrix\n * @returns {mat4} out\n */\nexport function identity(out) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Transpose the values of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\nexport function transpose(out, a) {\n // If we are transposing ourselves we can skip a few steps but have to cache some values\n if (out === a) {\n var a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a12 = a[6],\n a13 = a[7];\n var a23 = a[11];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a01;\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a02;\n out[9] = a12;\n out[11] = a[14];\n out[12] = a03;\n out[13] = a13;\n out[14] = a23;\n } else {\n out[0] = a[0];\n out[1] = a[4];\n out[2] = a[8];\n out[3] = a[12];\n out[4] = a[1];\n out[5] = a[5];\n out[6] = a[9];\n out[7] = a[13];\n out[8] = a[2];\n out[9] = a[6];\n out[10] = a[10];\n out[11] = a[14];\n out[12] = a[3];\n out[13] = a[7];\n out[14] = a[11];\n out[15] = a[15];\n }\n return out;\n}\n\n/**\n * Inverts a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4 | null} out, or null if source matrix is not invertible\n */\nexport function invert(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32;\n\n // Calculate the determinant\n var det = b00 * b11 - b01 * b10 + b02 * b09 + b03 * b08 - b04 * b07 + b05 * b06;\n if (!det) {\n return null;\n }\n det = 1.0 / det;\n out[0] = (a11 * b11 - a12 * b10 + a13 * b09) * det;\n out[1] = (a02 * b10 - a01 * b11 - a03 * b09) * det;\n out[2] = (a31 * b05 - a32 * b04 + a33 * b03) * det;\n out[3] = (a22 * b04 - a21 * b05 - a23 * b03) * det;\n out[4] = (a12 * b08 - a10 * b11 - a13 * b07) * det;\n out[5] = (a00 * b11 - a02 * b08 + a03 * b07) * det;\n out[6] = (a32 * b02 - a30 * b05 - a33 * b01) * det;\n out[7] = (a20 * b05 - a22 * b02 + a23 * b01) * det;\n out[8] = (a10 * b10 - a11 * b08 + a13 * b06) * det;\n out[9] = (a01 * b08 - a00 * b10 - a03 * b06) * det;\n out[10] = (a30 * b04 - a31 * b02 + a33 * b00) * det;\n out[11] = (a21 * b02 - a20 * b04 - a23 * b00) * det;\n out[12] = (a11 * b07 - a10 * b09 - a12 * b06) * det;\n out[13] = (a00 * b09 - a01 * b07 + a02 * b06) * det;\n out[14] = (a31 * b01 - a30 * b03 - a32 * b00) * det;\n out[15] = (a20 * b03 - a21 * b01 + a22 * b00) * det;\n return out;\n}\n\n/**\n * Calculates the adjugate of a mat4\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the source matrix\n * @returns {mat4} out\n */\nexport function adjoint(out, a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b00 = a00 * a11 - a01 * a10;\n var b01 = a00 * a12 - a02 * a10;\n var b02 = a00 * a13 - a03 * a10;\n var b03 = a01 * a12 - a02 * a11;\n var b04 = a01 * a13 - a03 * a11;\n var b05 = a02 * a13 - a03 * a12;\n var b06 = a20 * a31 - a21 * a30;\n var b07 = a20 * a32 - a22 * a30;\n var b08 = a20 * a33 - a23 * a30;\n var b09 = a21 * a32 - a22 * a31;\n var b10 = a21 * a33 - a23 * a31;\n var b11 = a22 * a33 - a23 * a32;\n out[0] = a11 * b11 - a12 * b10 + a13 * b09;\n out[1] = a02 * b10 - a01 * b11 - a03 * b09;\n out[2] = a31 * b05 - a32 * b04 + a33 * b03;\n out[3] = a22 * b04 - a21 * b05 - a23 * b03;\n out[4] = a12 * b08 - a10 * b11 - a13 * b07;\n out[5] = a00 * b11 - a02 * b08 + a03 * b07;\n out[6] = a32 * b02 - a30 * b05 - a33 * b01;\n out[7] = a20 * b05 - a22 * b02 + a23 * b01;\n out[8] = a10 * b10 - a11 * b08 + a13 * b06;\n out[9] = a01 * b08 - a00 * b10 - a03 * b06;\n out[10] = a30 * b04 - a31 * b02 + a33 * b00;\n out[11] = a21 * b02 - a20 * b04 - a23 * b00;\n out[12] = a11 * b07 - a10 * b09 - a12 * b06;\n out[13] = a00 * b09 - a01 * b07 + a02 * b06;\n out[14] = a31 * b01 - a30 * b03 - a32 * b00;\n out[15] = a20 * b03 - a21 * b01 + a22 * b00;\n return out;\n}\n\n/**\n * Calculates the determinant of a mat4\n *\n * @param {ReadonlyMat4} a the source matrix\n * @returns {Number} determinant of a\n */\nexport function determinant(a) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n var b0 = a00 * a11 - a01 * a10;\n var b1 = a00 * a12 - a02 * a10;\n var b2 = a01 * a12 - a02 * a11;\n var b3 = a20 * a31 - a21 * a30;\n var b4 = a20 * a32 - a22 * a30;\n var b5 = a21 * a32 - a22 * a31;\n var b6 = a00 * b5 - a01 * b4 + a02 * b3;\n var b7 = a10 * b5 - a11 * b4 + a12 * b3;\n var b8 = a20 * b2 - a21 * b1 + a22 * b0;\n var b9 = a30 * b2 - a31 * b1 + a32 * b0;\n\n // Calculate the determinant\n return a13 * b6 - a03 * b7 + a33 * b8 - a23 * b9;\n}\n\n/**\n * Multiplies two mat4s\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\nexport function multiply(out, a, b) {\n var a00 = a[0],\n a01 = a[1],\n a02 = a[2],\n a03 = a[3];\n var a10 = a[4],\n a11 = a[5],\n a12 = a[6],\n a13 = a[7];\n var a20 = a[8],\n a21 = a[9],\n a22 = a[10],\n a23 = a[11];\n var a30 = a[12],\n a31 = a[13],\n a32 = a[14],\n a33 = a[15];\n\n // Cache only the current line of the second matrix\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n out[0] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[1] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[2] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[3] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[4];\n b1 = b[5];\n b2 = b[6];\n b3 = b[7];\n out[4] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[5] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[6] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[7] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[8];\n b1 = b[9];\n b2 = b[10];\n b3 = b[11];\n out[8] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[9] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[10] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[11] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n b0 = b[12];\n b1 = b[13];\n b2 = b[14];\n b3 = b[15];\n out[12] = b0 * a00 + b1 * a10 + b2 * a20 + b3 * a30;\n out[13] = b0 * a01 + b1 * a11 + b2 * a21 + b3 * a31;\n out[14] = b0 * a02 + b1 * a12 + b2 * a22 + b3 * a32;\n out[15] = b0 * a03 + b1 * a13 + b2 * a23 + b3 * a33;\n return out;\n}\n\n/**\n * Translate a mat4 by the given vector\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to translate\n * @param {ReadonlyVec3} v vector to translate by\n * @returns {mat4} out\n */\nexport function translate(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n if (a === out) {\n out[12] = a[0] * x + a[4] * y + a[8] * z + a[12];\n out[13] = a[1] * x + a[5] * y + a[9] * z + a[13];\n out[14] = a[2] * x + a[6] * y + a[10] * z + a[14];\n out[15] = a[3] * x + a[7] * y + a[11] * z + a[15];\n } else {\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n out[0] = a00;\n out[1] = a01;\n out[2] = a02;\n out[3] = a03;\n out[4] = a10;\n out[5] = a11;\n out[6] = a12;\n out[7] = a13;\n out[8] = a20;\n out[9] = a21;\n out[10] = a22;\n out[11] = a23;\n out[12] = a00 * x + a10 * y + a20 * z + a[12];\n out[13] = a01 * x + a11 * y + a21 * z + a[13];\n out[14] = a02 * x + a12 * y + a22 * z + a[14];\n out[15] = a03 * x + a13 * y + a23 * z + a[15];\n }\n return out;\n}\n\n/**\n * Scales the mat4 by the dimensions in the given vec3 not using vectorization\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {ReadonlyVec3} v the vec3 to scale the matrix by\n * @returns {mat4} out\n **/\nexport function scale(out, a, v) {\n var x = v[0],\n y = v[1],\n z = v[2];\n out[0] = a[0] * x;\n out[1] = a[1] * x;\n out[2] = a[2] * x;\n out[3] = a[3] * x;\n out[4] = a[4] * y;\n out[5] = a[5] * y;\n out[6] = a[6] * y;\n out[7] = a[7] * y;\n out[8] = a[8] * z;\n out[9] = a[9] * z;\n out[10] = a[10] * z;\n out[11] = a[11] * z;\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n return out;\n}\n\n/**\n * Rotates a mat4 by the given angle around the given axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nexport function rotate(out, a, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.sqrt(x * x + y * y + z * z);\n var s, c, t;\n var a00, a01, a02, a03;\n var a10, a11, a12, a13;\n var a20, a21, a22, a23;\n var b00, b01, b02;\n var b10, b11, b12;\n var b20, b21, b22;\n if (len < glMatrix.EPSILON) {\n return null;\n }\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n a00 = a[0];\n a01 = a[1];\n a02 = a[2];\n a03 = a[3];\n a10 = a[4];\n a11 = a[5];\n a12 = a[6];\n a13 = a[7];\n a20 = a[8];\n a21 = a[9];\n a22 = a[10];\n a23 = a[11];\n\n // Construct the elements of the rotation matrix\n b00 = x * x * t + c;\n b01 = y * x * t + z * s;\n b02 = z * x * t - y * s;\n b10 = x * y * t - z * s;\n b11 = y * y * t + c;\n b12 = z * y * t + x * s;\n b20 = x * z * t + y * s;\n b21 = y * z * t - x * s;\n b22 = z * z * t + c;\n\n // Perform rotation-specific matrix multiplication\n out[0] = a00 * b00 + a10 * b01 + a20 * b02;\n out[1] = a01 * b00 + a11 * b01 + a21 * b02;\n out[2] = a02 * b00 + a12 * b01 + a22 * b02;\n out[3] = a03 * b00 + a13 * b01 + a23 * b02;\n out[4] = a00 * b10 + a10 * b11 + a20 * b12;\n out[5] = a01 * b10 + a11 * b11 + a21 * b12;\n out[6] = a02 * b10 + a12 * b11 + a22 * b12;\n out[7] = a03 * b10 + a13 * b11 + a23 * b12;\n out[8] = a00 * b20 + a10 * b21 + a20 * b22;\n out[9] = a01 * b20 + a11 * b21 + a21 * b22;\n out[10] = a02 * b20 + a12 * b21 + a22 * b22;\n out[11] = a03 * b20 + a13 * b21 + a23 * b22;\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n return out;\n}\n\n/**\n * Rotates a matrix by the given angle around the X axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function rotateX(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n out[3] = a[3];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[4] = a10 * c + a20 * s;\n out[5] = a11 * c + a21 * s;\n out[6] = a12 * c + a22 * s;\n out[7] = a13 * c + a23 * s;\n out[8] = a20 * c - a10 * s;\n out[9] = a21 * c - a11 * s;\n out[10] = a22 * c - a12 * s;\n out[11] = a23 * c - a13 * s;\n return out;\n}\n\n/**\n * Rotates a matrix by the given angle around the Y axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function rotateY(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a20 = a[8];\n var a21 = a[9];\n var a22 = a[10];\n var a23 = a[11];\n if (a !== out) {\n // If the source and destination differ, copy the unchanged rows\n out[4] = a[4];\n out[5] = a[5];\n out[6] = a[6];\n out[7] = a[7];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[0] = a00 * c - a20 * s;\n out[1] = a01 * c - a21 * s;\n out[2] = a02 * c - a22 * s;\n out[3] = a03 * c - a23 * s;\n out[8] = a00 * s + a20 * c;\n out[9] = a01 * s + a21 * c;\n out[10] = a02 * s + a22 * c;\n out[11] = a03 * s + a23 * c;\n return out;\n}\n\n/**\n * Rotates a matrix by the given angle around the Z axis\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to rotate\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function rotateZ(out, a, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n var a00 = a[0];\n var a01 = a[1];\n var a02 = a[2];\n var a03 = a[3];\n var a10 = a[4];\n var a11 = a[5];\n var a12 = a[6];\n var a13 = a[7];\n if (a !== out) {\n // If the source and destination differ, copy the unchanged last row\n out[8] = a[8];\n out[9] = a[9];\n out[10] = a[10];\n out[11] = a[11];\n out[12] = a[12];\n out[13] = a[13];\n out[14] = a[14];\n out[15] = a[15];\n }\n\n // Perform axis-specific matrix multiplication\n out[0] = a00 * c + a10 * s;\n out[1] = a01 * c + a11 * s;\n out[2] = a02 * c + a12 * s;\n out[3] = a03 * c + a13 * s;\n out[4] = a10 * c - a00 * s;\n out[5] = a11 * c - a01 * s;\n out[6] = a12 * c - a02 * s;\n out[7] = a13 * c - a03 * s;\n return out;\n}\n\n/**\n * Creates a matrix from a vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\nexport function fromTranslation(out, v) {\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a vector scaling\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.scale(dest, dest, vec);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyVec3} v Scaling vector\n * @returns {mat4} out\n */\nexport function fromScaling(out, v) {\n out[0] = v[0];\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = v[1];\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = v[2];\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a given angle around a given axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotate(dest, dest, rad, axis);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @param {ReadonlyVec3} axis the axis to rotate around\n * @returns {mat4} out\n */\nexport function fromRotation(out, rad, axis) {\n var x = axis[0],\n y = axis[1],\n z = axis[2];\n var len = Math.sqrt(x * x + y * y + z * z);\n var s, c, t;\n if (len < glMatrix.EPSILON) {\n return null;\n }\n len = 1 / len;\n x *= len;\n y *= len;\n z *= len;\n s = Math.sin(rad);\n c = Math.cos(rad);\n t = 1 - c;\n\n // Perform rotation-specific matrix multiplication\n out[0] = x * x * t + c;\n out[1] = y * x * t + z * s;\n out[2] = z * x * t - y * s;\n out[3] = 0;\n out[4] = x * y * t - z * s;\n out[5] = y * y * t + c;\n out[6] = z * y * t + x * s;\n out[7] = 0;\n out[8] = x * z * t + y * s;\n out[9] = y * z * t - x * s;\n out[10] = z * z * t + c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from the given angle around the X axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateX(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function fromXRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n\n // Perform axis-specific matrix multiplication\n out[0] = 1;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = c;\n out[6] = s;\n out[7] = 0;\n out[8] = 0;\n out[9] = -s;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Y axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateY(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function fromYRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n\n // Perform axis-specific matrix multiplication\n out[0] = c;\n out[1] = 0;\n out[2] = -s;\n out[3] = 0;\n out[4] = 0;\n out[5] = 1;\n out[6] = 0;\n out[7] = 0;\n out[8] = s;\n out[9] = 0;\n out[10] = c;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from the given angle around the Z axis\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.rotateZ(dest, dest, rad);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {Number} rad the angle to rotate the matrix by\n * @returns {mat4} out\n */\nexport function fromZRotation(out, rad) {\n var s = Math.sin(rad);\n var c = Math.cos(rad);\n\n // Perform axis-specific matrix multiplication\n out[0] = c;\n out[1] = s;\n out[2] = 0;\n out[3] = 0;\n out[4] = -s;\n out[5] = c;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 1;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a quaternion rotation and vector translation\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n * let quatMat = mat4.create();\n * mat4.fromQuat(quatMat, quat);\n * mat4.multiply(dest, dest, quatMat);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @returns {mat4} out\n */\nexport function fromRotationTranslation(out, q, v) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - (yy + zz);\n out[1] = xy + wz;\n out[2] = xz - wy;\n out[3] = 0;\n out[4] = xy - wz;\n out[5] = 1 - (xx + zz);\n out[6] = yz + wx;\n out[7] = 0;\n out[8] = xz + wy;\n out[9] = yz - wx;\n out[10] = 1 - (xx + yy);\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a new mat4 from a dual quat.\n *\n * @param {mat4} out Matrix\n * @param {ReadonlyQuat2} a Dual Quaternion\n * @returns {mat4} mat4 receiving operation result\n */\nexport function fromQuat2(out, a) {\n var translation = new glMatrix.ARRAY_TYPE(3);\n var bx = -a[0],\n by = -a[1],\n bz = -a[2],\n bw = a[3],\n ax = a[4],\n ay = a[5],\n az = a[6],\n aw = a[7];\n var magnitude = bx * bx + by * by + bz * bz + bw * bw;\n //Only scale if it makes sense\n if (magnitude > 0) {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2 / magnitude;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2 / magnitude;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2 / magnitude;\n } else {\n translation[0] = (ax * bw + aw * bx + ay * bz - az * by) * 2;\n translation[1] = (ay * bw + aw * by + az * bx - ax * bz) * 2;\n translation[2] = (az * bw + aw * bz + ax * by - ay * bx) * 2;\n }\n fromRotationTranslation(out, a, translation);\n return out;\n}\n\n/**\n * Returns the translation vector component of a transformation\n * matrix. If a matrix is built with fromRotationTranslation,\n * the returned vector will be the same as the translation vector\n * originally supplied.\n * @param {vec3} out Vector to receive translation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nexport function getTranslation(out, mat) {\n out[0] = mat[12];\n out[1] = mat[13];\n out[2] = mat[14];\n return out;\n}\n\n/**\n * Returns the scaling factor component of a transformation\n * matrix. If a matrix is built with fromRotationTranslationScale\n * with a normalized Quaternion parameter, the returned vector will be\n * the same as the scaling vector\n * originally supplied.\n * @param {vec3} out Vector to receive scaling factor component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {vec3} out\n */\nexport function getScaling(out, mat) {\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out[0] = Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13);\n out[1] = Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23);\n out[2] = Math.sqrt(m31 * m31 + m32 * m32 + m33 * m33);\n return out;\n}\n\n/**\n * Returns a quaternion representing the rotational component\n * of a transformation matrix. If a matrix is built with\n * fromRotationTranslation, the returned quaternion will be the\n * same as the quaternion originally supplied.\n * @param {quat} out Quaternion to receive the rotation component\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @return {quat} out\n */\nexport function getRotation(out, mat) {\n var scaling = new glMatrix.ARRAY_TYPE(3);\n getScaling(scaling, mat);\n var is1 = 1 / scaling[0];\n var is2 = 1 / scaling[1];\n var is3 = 1 / scaling[2];\n var sm11 = mat[0] * is1;\n var sm12 = mat[1] * is2;\n var sm13 = mat[2] * is3;\n var sm21 = mat[4] * is1;\n var sm22 = mat[5] * is2;\n var sm23 = mat[6] * is3;\n var sm31 = mat[8] * is1;\n var sm32 = mat[9] * is2;\n var sm33 = mat[10] * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out[3] = 0.25 * S;\n out[0] = (sm23 - sm32) / S;\n out[1] = (sm31 - sm13) / S;\n out[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out[3] = (sm23 - sm32) / S;\n out[0] = 0.25 * S;\n out[1] = (sm12 + sm21) / S;\n out[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out[3] = (sm31 - sm13) / S;\n out[0] = (sm12 + sm21) / S;\n out[1] = 0.25 * S;\n out[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out[3] = (sm12 - sm21) / S;\n out[0] = (sm31 + sm13) / S;\n out[1] = (sm23 + sm32) / S;\n out[2] = 0.25 * S;\n }\n return out;\n}\n\n/**\n * Decomposes a transformation matrix into its rotation, translation\n * and scale components. Returns only the rotation component\n * @param {quat} out_r Quaternion to receive the rotation component\n * @param {vec3} out_t Vector to receive the translation vector\n * @param {vec3} out_s Vector to receive the scaling factor\n * @param {ReadonlyMat4} mat Matrix to be decomposed (input)\n * @returns {quat} out_r\n */\nexport function decompose(out_r, out_t, out_s, mat) {\n out_t[0] = mat[12];\n out_t[1] = mat[13];\n out_t[2] = mat[14];\n var m11 = mat[0];\n var m12 = mat[1];\n var m13 = mat[2];\n var m21 = mat[4];\n var m22 = mat[5];\n var m23 = mat[6];\n var m31 = mat[8];\n var m32 = mat[9];\n var m33 = mat[10];\n out_s[0] = Math.sqrt(m11 * m11 + m12 * m12 + m13 * m13);\n out_s[1] = Math.sqrt(m21 * m21 + m22 * m22 + m23 * m23);\n out_s[2] = Math.sqrt(m31 * m31 + m32 * m32 + m33 * m33);\n var is1 = 1 / out_s[0];\n var is2 = 1 / out_s[1];\n var is3 = 1 / out_s[2];\n var sm11 = m11 * is1;\n var sm12 = m12 * is2;\n var sm13 = m13 * is3;\n var sm21 = m21 * is1;\n var sm22 = m22 * is2;\n var sm23 = m23 * is3;\n var sm31 = m31 * is1;\n var sm32 = m32 * is2;\n var sm33 = m33 * is3;\n var trace = sm11 + sm22 + sm33;\n var S = 0;\n if (trace > 0) {\n S = Math.sqrt(trace + 1.0) * 2;\n out_r[3] = 0.25 * S;\n out_r[0] = (sm23 - sm32) / S;\n out_r[1] = (sm31 - sm13) / S;\n out_r[2] = (sm12 - sm21) / S;\n } else if (sm11 > sm22 && sm11 > sm33) {\n S = Math.sqrt(1.0 + sm11 - sm22 - sm33) * 2;\n out_r[3] = (sm23 - sm32) / S;\n out_r[0] = 0.25 * S;\n out_r[1] = (sm12 + sm21) / S;\n out_r[2] = (sm31 + sm13) / S;\n } else if (sm22 > sm33) {\n S = Math.sqrt(1.0 + sm22 - sm11 - sm33) * 2;\n out_r[3] = (sm31 - sm13) / S;\n out_r[0] = (sm12 + sm21) / S;\n out_r[1] = 0.25 * S;\n out_r[2] = (sm23 + sm32) / S;\n } else {\n S = Math.sqrt(1.0 + sm33 - sm11 - sm22) * 2;\n out_r[3] = (sm12 - sm21) / S;\n out_r[0] = (sm31 + sm13) / S;\n out_r[1] = (sm23 + sm32) / S;\n out_r[2] = 0.25 * S;\n }\n return out_r;\n}\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n * let quatMat = mat4.create();\n * mat4.fromQuat(quatMat, quat);\n * mat4.multiply(dest, dest, quatMat);\n * mat4.scale(dest, dest, scale)\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @returns {mat4} out\n */\nexport function fromRotationTranslationScale(out, q, v, s) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n out[0] = (1 - (yy + zz)) * sx;\n out[1] = (xy + wz) * sx;\n out[2] = (xz - wy) * sx;\n out[3] = 0;\n out[4] = (xy - wz) * sy;\n out[5] = (1 - (xx + zz)) * sy;\n out[6] = (yz + wx) * sy;\n out[7] = 0;\n out[8] = (xz + wy) * sz;\n out[9] = (yz - wx) * sz;\n out[10] = (1 - (xx + yy)) * sz;\n out[11] = 0;\n out[12] = v[0];\n out[13] = v[1];\n out[14] = v[2];\n out[15] = 1;\n return out;\n}\n\n/**\n * Creates a matrix from a quaternion rotation, vector translation and vector scale, rotating and scaling around the given origin\n * This is equivalent to (but much faster than):\n *\n * mat4.identity(dest);\n * mat4.translate(dest, dest, vec);\n * mat4.translate(dest, dest, origin);\n * let quatMat = mat4.create();\n * mat4.fromQuat(quatMat, quat);\n * mat4.multiply(dest, dest, quatMat);\n * mat4.scale(dest, dest, scale)\n * mat4.translate(dest, dest, negativeOrigin);\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {quat} q Rotation quaternion\n * @param {ReadonlyVec3} v Translation vector\n * @param {ReadonlyVec3} s Scaling vector\n * @param {ReadonlyVec3} o The origin vector around which to scale and rotate\n * @returns {mat4} out\n */\nexport function fromRotationTranslationScaleOrigin(out, q, v, s, o) {\n // Quaternion math\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var xy = x * y2;\n var xz = x * z2;\n var yy = y * y2;\n var yz = y * z2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n var sx = s[0];\n var sy = s[1];\n var sz = s[2];\n var ox = o[0];\n var oy = o[1];\n var oz = o[2];\n var out0 = (1 - (yy + zz)) * sx;\n var out1 = (xy + wz) * sx;\n var out2 = (xz - wy) * sx;\n var out4 = (xy - wz) * sy;\n var out5 = (1 - (xx + zz)) * sy;\n var out6 = (yz + wx) * sy;\n var out8 = (xz + wy) * sz;\n var out9 = (yz - wx) * sz;\n var out10 = (1 - (xx + yy)) * sz;\n out[0] = out0;\n out[1] = out1;\n out[2] = out2;\n out[3] = 0;\n out[4] = out4;\n out[5] = out5;\n out[6] = out6;\n out[7] = 0;\n out[8] = out8;\n out[9] = out9;\n out[10] = out10;\n out[11] = 0;\n out[12] = v[0] + ox - (out0 * ox + out4 * oy + out8 * oz);\n out[13] = v[1] + oy - (out1 * ox + out5 * oy + out9 * oz);\n out[14] = v[2] + oz - (out2 * ox + out6 * oy + out10 * oz);\n out[15] = 1;\n return out;\n}\n\n/**\n * Calculates a 4x4 matrix from the given quaternion\n *\n * @param {mat4} out mat4 receiving operation result\n * @param {ReadonlyQuat} q Quaternion to create matrix from\n *\n * @returns {mat4} out\n */\nexport function fromQuat(out, q) {\n var x = q[0],\n y = q[1],\n z = q[2],\n w = q[3];\n var x2 = x + x;\n var y2 = y + y;\n var z2 = z + z;\n var xx = x * x2;\n var yx = y * x2;\n var yy = y * y2;\n var zx = z * x2;\n var zy = z * y2;\n var zz = z * z2;\n var wx = w * x2;\n var wy = w * y2;\n var wz = w * z2;\n out[0] = 1 - yy - zz;\n out[1] = yx + wz;\n out[2] = zx - wy;\n out[3] = 0;\n out[4] = yx - wz;\n out[5] = 1 - xx - zz;\n out[6] = zy + wx;\n out[7] = 0;\n out[8] = zx + wy;\n out[9] = zy - wx;\n out[10] = 1 - xx - yy;\n out[11] = 0;\n out[12] = 0;\n out[13] = 0;\n out[14] = 0;\n out[15] = 1;\n return out;\n}\n\n/**\n * Generates a frustum matrix with the given bounds\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Number} left Left bound of the frustum\n * @param {Number} right Right bound of the frustum\n * @param {Number} bottom Bottom bound of the frustum\n * @param {Number} top Top bound of the frustum\n * @param {Number} near Near bound of the frustum\n * @param {Number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function frustum(out, left, right, bottom, top, near, far) {\n var rl = 1 / (right - left);\n var tb = 1 / (top - bottom);\n var nf = 1 / (near - far);\n out[0] = near * 2 * rl;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = near * 2 * tb;\n out[6] = 0;\n out[7] = 0;\n out[8] = (right + left) * rl;\n out[9] = (top + bottom) * tb;\n out[10] = (far + near) * nf;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[14] = far * near * 2 * nf;\n out[15] = 0;\n return out;\n}\n\n/**\n * Generates a perspective projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\nexport function perspectiveNO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2);\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n if (far != null && far !== Infinity) {\n var nf = 1 / (near - far);\n out[10] = (far + near) * nf;\n out[14] = 2 * far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -2 * near;\n }\n return out;\n}\n\n/**\n * Alias for {@link mat4.perspectiveNO}\n * @function\n */\nexport var perspective = perspectiveNO;\n\n/**\n * Generates a perspective projection matrix suitable for WebGPU with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n * Passing null/undefined/no value for far will generate infinite projection matrix.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} fovy Vertical field of view in radians\n * @param {number} aspect Aspect ratio. typically viewport width/height\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum, can be null or Infinity\n * @returns {mat4} out\n */\nexport function perspectiveZO(out, fovy, aspect, near, far) {\n var f = 1.0 / Math.tan(fovy / 2);\n out[0] = f / aspect;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = f;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[11] = -1;\n out[12] = 0;\n out[13] = 0;\n out[15] = 0;\n if (far != null && far !== Infinity) {\n var nf = 1 / (near - far);\n out[10] = far * nf;\n out[14] = far * near * nf;\n } else {\n out[10] = -1;\n out[14] = -near;\n }\n return out;\n}\n\n/**\n * Generates a perspective projection matrix with the given field of view.\n * This is primarily useful for generating projection matrices to be used\n * with the still experiemental WebVR API.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {Object} fov Object containing the following values: upDegrees, downDegrees, leftDegrees, rightDegrees\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function perspectiveFromFieldOfView(out, fov, near, far) {\n var upTan = Math.tan(fov.upDegrees * Math.PI / 180.0);\n var downTan = Math.tan(fov.downDegrees * Math.PI / 180.0);\n var leftTan = Math.tan(fov.leftDegrees * Math.PI / 180.0);\n var rightTan = Math.tan(fov.rightDegrees * Math.PI / 180.0);\n var xScale = 2.0 / (leftTan + rightTan);\n var yScale = 2.0 / (upTan + downTan);\n out[0] = xScale;\n out[1] = 0.0;\n out[2] = 0.0;\n out[3] = 0.0;\n out[4] = 0.0;\n out[5] = yScale;\n out[6] = 0.0;\n out[7] = 0.0;\n out[8] = -((leftTan - rightTan) * xScale * 0.5);\n out[9] = (upTan - downTan) * yScale * 0.5;\n out[10] = far / (near - far);\n out[11] = -1.0;\n out[12] = 0.0;\n out[13] = 0.0;\n out[14] = far * near / (near - far);\n out[15] = 0.0;\n return out;\n}\n\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [-1, 1],\n * which matches WebGL/OpenGL's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function orthoNO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = 2 * nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = (far + near) * nf;\n out[15] = 1;\n return out;\n}\n\n/**\n * Alias for {@link mat4.orthoNO}\n * @function\n */\nexport var ortho = orthoNO;\n\n/**\n * Generates a orthogonal projection matrix with the given bounds.\n * The near/far clip planes correspond to a normalized device coordinate Z range of [0, 1],\n * which matches WebGPU/Vulkan/DirectX/Metal's clip volume.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {number} left Left bound of the frustum\n * @param {number} right Right bound of the frustum\n * @param {number} bottom Bottom bound of the frustum\n * @param {number} top Top bound of the frustum\n * @param {number} near Near bound of the frustum\n * @param {number} far Far bound of the frustum\n * @returns {mat4} out\n */\nexport function orthoZO(out, left, right, bottom, top, near, far) {\n var lr = 1 / (left - right);\n var bt = 1 / (bottom - top);\n var nf = 1 / (near - far);\n out[0] = -2 * lr;\n out[1] = 0;\n out[2] = 0;\n out[3] = 0;\n out[4] = 0;\n out[5] = -2 * bt;\n out[6] = 0;\n out[7] = 0;\n out[8] = 0;\n out[9] = 0;\n out[10] = nf;\n out[11] = 0;\n out[12] = (left + right) * lr;\n out[13] = (top + bottom) * bt;\n out[14] = near * nf;\n out[15] = 1;\n return out;\n}\n\n/**\n * Generates a look-at matrix with the given eye position, focal point, and up axis.\n * If you want a matrix that actually makes an object look at another object, you should use targetTo instead.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} center Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\nexport function lookAt(out, eye, center, up) {\n var x0, x1, x2, y0, y1, y2, z0, z1, z2, len;\n var eyex = eye[0];\n var eyey = eye[1];\n var eyez = eye[2];\n var upx = up[0];\n var upy = up[1];\n var upz = up[2];\n var centerx = center[0];\n var centery = center[1];\n var centerz = center[2];\n if (Math.abs(eyex - centerx) < glMatrix.EPSILON && Math.abs(eyey - centery) < glMatrix.EPSILON && Math.abs(eyez - centerz) < glMatrix.EPSILON) {\n return identity(out);\n }\n z0 = eyex - centerx;\n z1 = eyey - centery;\n z2 = eyez - centerz;\n len = 1 / Math.sqrt(z0 * z0 + z1 * z1 + z2 * z2);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n x0 = upy * z2 - upz * z1;\n x1 = upz * z0 - upx * z2;\n x2 = upx * z1 - upy * z0;\n len = Math.sqrt(x0 * x0 + x1 * x1 + x2 * x2);\n if (!len) {\n x0 = 0;\n x1 = 0;\n x2 = 0;\n } else {\n len = 1 / len;\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n y0 = z1 * x2 - z2 * x1;\n y1 = z2 * x0 - z0 * x2;\n y2 = z0 * x1 - z1 * x0;\n len = Math.sqrt(y0 * y0 + y1 * y1 + y2 * y2);\n if (!len) {\n y0 = 0;\n y1 = 0;\n y2 = 0;\n } else {\n len = 1 / len;\n y0 *= len;\n y1 *= len;\n y2 *= len;\n }\n out[0] = x0;\n out[1] = y0;\n out[2] = z0;\n out[3] = 0;\n out[4] = x1;\n out[5] = y1;\n out[6] = z1;\n out[7] = 0;\n out[8] = x2;\n out[9] = y2;\n out[10] = z2;\n out[11] = 0;\n out[12] = -(x0 * eyex + x1 * eyey + x2 * eyez);\n out[13] = -(y0 * eyex + y1 * eyey + y2 * eyez);\n out[14] = -(z0 * eyex + z1 * eyey + z2 * eyez);\n out[15] = 1;\n return out;\n}\n\n/**\n * Generates a matrix that makes something look at something else.\n *\n * @param {mat4} out mat4 frustum matrix will be written into\n * @param {ReadonlyVec3} eye Position of the viewer\n * @param {ReadonlyVec3} target Point the viewer is looking at\n * @param {ReadonlyVec3} up vec3 pointing up\n * @returns {mat4} out\n */\nexport function targetTo(out, eye, target, up) {\n var eyex = eye[0],\n eyey = eye[1],\n eyez = eye[2],\n upx = up[0],\n upy = up[1],\n upz = up[2];\n var z0 = eyex - target[0],\n z1 = eyey - target[1],\n z2 = eyez - target[2];\n var len = z0 * z0 + z1 * z1 + z2 * z2;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n z0 *= len;\n z1 *= len;\n z2 *= len;\n }\n var x0 = upy * z2 - upz * z1,\n x1 = upz * z0 - upx * z2,\n x2 = upx * z1 - upy * z0;\n len = x0 * x0 + x1 * x1 + x2 * x2;\n if (len > 0) {\n len = 1 / Math.sqrt(len);\n x0 *= len;\n x1 *= len;\n x2 *= len;\n }\n out[0] = x0;\n out[1] = x1;\n out[2] = x2;\n out[3] = 0;\n out[4] = z1 * x2 - z2 * x1;\n out[5] = z2 * x0 - z0 * x2;\n out[6] = z0 * x1 - z1 * x0;\n out[7] = 0;\n out[8] = z0;\n out[9] = z1;\n out[10] = z2;\n out[11] = 0;\n out[12] = eyex;\n out[13] = eyey;\n out[14] = eyez;\n out[15] = 1;\n return out;\n}\n\n/**\n * Returns a string representation of a mat4\n *\n * @param {ReadonlyMat4} a matrix to represent as a string\n * @returns {String} string representation of the matrix\n */\nexport function str(a) {\n return \"mat4(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \", \" + a[3] + \", \" + a[4] + \", \" + a[5] + \", \" + a[6] + \", \" + a[7] + \", \" + a[8] + \", \" + a[9] + \", \" + a[10] + \", \" + a[11] + \", \" + a[12] + \", \" + a[13] + \", \" + a[14] + \", \" + a[15] + \")\";\n}\n\n/**\n * Returns Frobenius norm of a mat4\n *\n * @param {ReadonlyMat4} a the matrix to calculate Frobenius norm of\n * @returns {Number} Frobenius norm\n */\nexport function frob(a) {\n return Math.sqrt(a[0] * a[0] + a[1] * a[1] + a[2] * a[2] + a[3] * a[3] + a[4] * a[4] + a[5] * a[5] + a[6] * a[6] + a[7] * a[7] + a[8] * a[8] + a[9] * a[9] + a[10] * a[10] + a[11] * a[11] + a[12] * a[12] + a[13] * a[13] + a[14] * a[14] + a[15] * a[15]);\n}\n\n/**\n * Adds two mat4's\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n out[3] = a[3] + b[3];\n out[4] = a[4] + b[4];\n out[5] = a[5] + b[5];\n out[6] = a[6] + b[6];\n out[7] = a[7] + b[7];\n out[8] = a[8] + b[8];\n out[9] = a[9] + b[9];\n out[10] = a[10] + b[10];\n out[11] = a[11] + b[11];\n out[12] = a[12] + b[12];\n out[13] = a[13] + b[13];\n out[14] = a[14] + b[14];\n out[15] = a[15] + b[15];\n return out;\n}\n\n/**\n * Subtracts matrix b from matrix a\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @returns {mat4} out\n */\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n out[3] = a[3] - b[3];\n out[4] = a[4] - b[4];\n out[5] = a[5] - b[5];\n out[6] = a[6] - b[6];\n out[7] = a[7] - b[7];\n out[8] = a[8] - b[8];\n out[9] = a[9] - b[9];\n out[10] = a[10] - b[10];\n out[11] = a[11] - b[11];\n out[12] = a[12] - b[12];\n out[13] = a[13] - b[13];\n out[14] = a[14] - b[14];\n out[15] = a[15] - b[15];\n return out;\n}\n\n/**\n * Multiply each element of the matrix by a scalar.\n *\n * @param {mat4} out the receiving matrix\n * @param {ReadonlyMat4} a the matrix to scale\n * @param {Number} b amount to scale the matrix's elements by\n * @returns {mat4} out\n */\nexport function multiplyScalar(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n out[3] = a[3] * b;\n out[4] = a[4] * b;\n out[5] = a[5] * b;\n out[6] = a[6] * b;\n out[7] = a[7] * b;\n out[8] = a[8] * b;\n out[9] = a[9] * b;\n out[10] = a[10] * b;\n out[11] = a[11] * b;\n out[12] = a[12] * b;\n out[13] = a[13] * b;\n out[14] = a[14] * b;\n out[15] = a[15] * b;\n return out;\n}\n\n/**\n * Adds two mat4's after multiplying each element of the second operand by a scalar value.\n *\n * @param {mat4} out the receiving vector\n * @param {ReadonlyMat4} a the first operand\n * @param {ReadonlyMat4} b the second operand\n * @param {Number} scale the amount to scale b's elements by before adding\n * @returns {mat4} out\n */\nexport function multiplyScalarAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n out[3] = a[3] + b[3] * scale;\n out[4] = a[4] + b[4] * scale;\n out[5] = a[5] + b[5] * scale;\n out[6] = a[6] + b[6] * scale;\n out[7] = a[7] + b[7] * scale;\n out[8] = a[8] + b[8] * scale;\n out[9] = a[9] + b[9] * scale;\n out[10] = a[10] + b[10] * scale;\n out[11] = a[11] + b[11] * scale;\n out[12] = a[12] + b[12] * scale;\n out[13] = a[13] + b[13] * scale;\n out[14] = a[14] + b[14] * scale;\n out[15] = a[15] + b[15] * scale;\n return out;\n}\n\n/**\n * Returns whether or not the matrices have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2] && a[3] === b[3] && a[4] === b[4] && a[5] === b[5] && a[6] === b[6] && a[7] === b[7] && a[8] === b[8] && a[9] === b[9] && a[10] === b[10] && a[11] === b[11] && a[12] === b[12] && a[13] === b[13] && a[14] === b[14] && a[15] === b[15];\n}\n\n/**\n * Returns whether or not the matrices have approximately the same elements in the same position.\n *\n * @param {ReadonlyMat4} a The first matrix.\n * @param {ReadonlyMat4} b The second matrix.\n * @returns {Boolean} True if the matrices are equal, false otherwise.\n */\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2],\n a3 = a[3];\n var a4 = a[4],\n a5 = a[5],\n a6 = a[6],\n a7 = a[7];\n var a8 = a[8],\n a9 = a[9],\n a10 = a[10],\n a11 = a[11];\n var a12 = a[12],\n a13 = a[13],\n a14 = a[14],\n a15 = a[15];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2],\n b3 = b[3];\n var b4 = b[4],\n b5 = b[5],\n b6 = b[6],\n b7 = b[7];\n var b8 = b[8],\n b9 = b[9],\n b10 = b[10],\n b11 = b[11];\n var b12 = b[12],\n b13 = b[13],\n b14 = b[14],\n b15 = b[15];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2)) && Math.abs(a3 - b3) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a3), Math.abs(b3)) && Math.abs(a4 - b4) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a4), Math.abs(b4)) && Math.abs(a5 - b5) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a5), Math.abs(b5)) && Math.abs(a6 - b6) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a6), Math.abs(b6)) && Math.abs(a7 - b7) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a7), Math.abs(b7)) && Math.abs(a8 - b8) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a8), Math.abs(b8)) && Math.abs(a9 - b9) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a9), Math.abs(b9)) && Math.abs(a10 - b10) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a10), Math.abs(b10)) && Math.abs(a11 - b11) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a11), Math.abs(b11)) && Math.abs(a12 - b12) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a12), Math.abs(b12)) && Math.abs(a13 - b13) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a13), Math.abs(b13)) && Math.abs(a14 - b14) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a14), Math.abs(b14)) && Math.abs(a15 - b15) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a15), Math.abs(b15));\n}\n\n/**\n * Alias for {@link mat4.multiply}\n * @function\n */\nexport var mul = multiply;\n\n/**\n * Alias for {@link mat4.subtract}\n * @function\n */\nexport var sub = subtract;",
75
+ "import * as glMatrix from \"./common.js\";\n\n/**\n * 3 Dimensional Vector\n * @module vec3\n */\n\n/**\n * Creates a new, empty vec3\n *\n * @returns {vec3} a new 3D vector\n */\nexport function create() {\n var out = new glMatrix.ARRAY_TYPE(3);\n if (glMatrix.ARRAY_TYPE != Float32Array) {\n out[0] = 0;\n out[1] = 0;\n out[2] = 0;\n }\n return out;\n}\n\n/**\n * Creates a new vec3 initialized with values from an existing vector\n *\n * @param {ReadonlyVec3} a vector to clone\n * @returns {vec3} a new 3D vector\n */\nexport function clone(a) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Calculates the length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate length of\n * @returns {Number} length of a\n */\nexport function length(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Creates a new vec3 initialized with the given values\n *\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} a new 3D vector\n */\nexport function fromValues(x, y, z) {\n var out = new glMatrix.ARRAY_TYPE(3);\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Copy the values from one vec3 to another\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the source vector\n * @returns {vec3} out\n */\nexport function copy(out, a) {\n out[0] = a[0];\n out[1] = a[1];\n out[2] = a[2];\n return out;\n}\n\n/**\n * Set the components of a vec3 to the given values\n *\n * @param {vec3} out the receiving vector\n * @param {Number} x X component\n * @param {Number} y Y component\n * @param {Number} z Z component\n * @returns {vec3} out\n */\nexport function set(out, x, y, z) {\n out[0] = x;\n out[1] = y;\n out[2] = z;\n return out;\n}\n\n/**\n * Adds two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function add(out, a, b) {\n out[0] = a[0] + b[0];\n out[1] = a[1] + b[1];\n out[2] = a[2] + b[2];\n return out;\n}\n\n/**\n * Subtracts vector b from vector a\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function subtract(out, a, b) {\n out[0] = a[0] - b[0];\n out[1] = a[1] - b[1];\n out[2] = a[2] - b[2];\n return out;\n}\n\n/**\n * Multiplies two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function multiply(out, a, b) {\n out[0] = a[0] * b[0];\n out[1] = a[1] * b[1];\n out[2] = a[2] * b[2];\n return out;\n}\n\n/**\n * Divides two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function divide(out, a, b) {\n out[0] = a[0] / b[0];\n out[1] = a[1] / b[1];\n out[2] = a[2] / b[2];\n return out;\n}\n\n/**\n * Math.ceil the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to ceil\n * @returns {vec3} out\n */\nexport function ceil(out, a) {\n out[0] = Math.ceil(a[0]);\n out[1] = Math.ceil(a[1]);\n out[2] = Math.ceil(a[2]);\n return out;\n}\n\n/**\n * Math.floor the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to floor\n * @returns {vec3} out\n */\nexport function floor(out, a) {\n out[0] = Math.floor(a[0]);\n out[1] = Math.floor(a[1]);\n out[2] = Math.floor(a[2]);\n return out;\n}\n\n/**\n * Returns the minimum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function min(out, a, b) {\n out[0] = Math.min(a[0], b[0]);\n out[1] = Math.min(a[1], b[1]);\n out[2] = Math.min(a[2], b[2]);\n return out;\n}\n\n/**\n * Returns the maximum of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function max(out, a, b) {\n out[0] = Math.max(a[0], b[0]);\n out[1] = Math.max(a[1], b[1]);\n out[2] = Math.max(a[2], b[2]);\n return out;\n}\n\n/**\n * symmetric round the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to round\n * @returns {vec3} out\n */\nexport function round(out, a) {\n out[0] = glMatrix.round(a[0]);\n out[1] = glMatrix.round(a[1]);\n out[2] = glMatrix.round(a[2]);\n return out;\n}\n\n/**\n * Scales a vec3 by a scalar number\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to scale\n * @param {Number} b amount to scale the vector by\n * @returns {vec3} out\n */\nexport function scale(out, a, b) {\n out[0] = a[0] * b;\n out[1] = a[1] * b;\n out[2] = a[2] * b;\n return out;\n}\n\n/**\n * Adds two vec3's after scaling the second operand by a scalar value\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} scale the amount to scale b by before adding\n * @returns {vec3} out\n */\nexport function scaleAndAdd(out, a, b, scale) {\n out[0] = a[0] + b[0] * scale;\n out[1] = a[1] + b[1] * scale;\n out[2] = a[2] + b[2] * scale;\n return out;\n}\n\n/**\n * Calculates the euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} distance between a and b\n */\nexport function distance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return Math.sqrt(x * x + y * y + z * z);\n}\n\n/**\n * Calculates the squared euclidian distance between two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} squared distance between a and b\n */\nexport function squaredDistance(a, b) {\n var x = b[0] - a[0];\n var y = b[1] - a[1];\n var z = b[2] - a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Calculates the squared length of a vec3\n *\n * @param {ReadonlyVec3} a vector to calculate squared length of\n * @returns {Number} squared length of a\n */\nexport function squaredLength(a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n return x * x + y * y + z * z;\n}\n\n/**\n * Negates the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to negate\n * @returns {vec3} out\n */\nexport function negate(out, a) {\n out[0] = -a[0];\n out[1] = -a[1];\n out[2] = -a[2];\n return out;\n}\n\n/**\n * Returns the inverse of the components of a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to invert\n * @returns {vec3} out\n */\nexport function inverse(out, a) {\n out[0] = 1.0 / a[0];\n out[1] = 1.0 / a[1];\n out[2] = 1.0 / a[2];\n return out;\n}\n\n/**\n * Normalize a vec3\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a vector to normalize\n * @returns {vec3} out\n */\nexport function normalize(out, a) {\n var x = a[0];\n var y = a[1];\n var z = a[2];\n var len = x * x + y * y + z * z;\n if (len > 0) {\n //TODO: evaluate use of glm_invsqrt here?\n len = 1 / Math.sqrt(len);\n }\n out[0] = a[0] * len;\n out[1] = a[1] * len;\n out[2] = a[2] * len;\n return out;\n}\n\n/**\n * Calculates the dot product of two vec3's\n *\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {Number} dot product of a and b\n */\nexport function dot(a, b) {\n return a[0] * b[0] + a[1] * b[1] + a[2] * b[2];\n}\n\n/**\n * Computes the cross product of two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @returns {vec3} out\n */\nexport function cross(out, a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2];\n var bx = b[0],\n by = b[1],\n bz = b[2];\n out[0] = ay * bz - az * by;\n out[1] = az * bx - ax * bz;\n out[2] = ax * by - ay * bx;\n return out;\n}\n\n/**\n * Performs a linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function lerp(out, a, b, t) {\n var ax = a[0];\n var ay = a[1];\n var az = a[2];\n out[0] = ax + t * (b[0] - ax);\n out[1] = ay + t * (b[1] - ay);\n out[2] = az + t * (b[2] - az);\n return out;\n}\n\n/**\n * Performs a spherical linear interpolation between two vec3's\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function slerp(out, a, b, t) {\n var angle = Math.acos(Math.min(Math.max(dot(a, b), -1), 1));\n var sinTotal = Math.sin(angle);\n var ratioA = Math.sin((1 - t) * angle) / sinTotal;\n var ratioB = Math.sin(t * angle) / sinTotal;\n out[0] = ratioA * a[0] + ratioB * b[0];\n out[1] = ratioA * a[1] + ratioB * b[1];\n out[2] = ratioA * a[2] + ratioB * b[2];\n return out;\n}\n\n/**\n * Performs a hermite interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function hermite(out, a, b, c, d, t) {\n var factorTimes2 = t * t;\n var factor1 = factorTimes2 * (2 * t - 3) + 1;\n var factor2 = factorTimes2 * (t - 2) + t;\n var factor3 = factorTimes2 * (t - 1);\n var factor4 = factorTimes2 * (3 - 2 * t);\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Performs a bezier interpolation with two control points\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the first operand\n * @param {ReadonlyVec3} b the second operand\n * @param {ReadonlyVec3} c the third operand\n * @param {ReadonlyVec3} d the fourth operand\n * @param {Number} t interpolation amount, in the range [0-1], between the two inputs\n * @returns {vec3} out\n */\nexport function bezier(out, a, b, c, d, t) {\n var inverseFactor = 1 - t;\n var inverseFactorTimesTwo = inverseFactor * inverseFactor;\n var factorTimes2 = t * t;\n var factor1 = inverseFactorTimesTwo * inverseFactor;\n var factor2 = 3 * t * inverseFactorTimesTwo;\n var factor3 = 3 * factorTimes2 * inverseFactor;\n var factor4 = factorTimes2 * t;\n out[0] = a[0] * factor1 + b[0] * factor2 + c[0] * factor3 + d[0] * factor4;\n out[1] = a[1] * factor1 + b[1] * factor2 + c[1] * factor3 + d[1] * factor4;\n out[2] = a[2] * factor1 + b[2] * factor2 + c[2] * factor3 + d[2] * factor4;\n return out;\n}\n\n/**\n * Generates a random vector with the given scale\n *\n * @param {vec3} out the receiving vector\n * @param {Number} [scale] Length of the resulting vector. If omitted, a unit vector will be returned\n * @returns {vec3} out\n */\nexport function random(out, scale) {\n scale = scale === undefined ? 1.0 : scale;\n var r = glMatrix.RANDOM() * 2.0 * Math.PI;\n var z = glMatrix.RANDOM() * 2.0 - 1.0;\n var zScale = Math.sqrt(1.0 - z * z) * scale;\n out[0] = Math.cos(r) * zScale;\n out[1] = Math.sin(r) * zScale;\n out[2] = z * scale;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat4.\n * 4th vector component is implicitly '1'\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat4} m matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat4(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n var w = m[3] * x + m[7] * y + m[11] * z + m[15];\n w = w || 1.0;\n out[0] = (m[0] * x + m[4] * y + m[8] * z + m[12]) / w;\n out[1] = (m[1] * x + m[5] * y + m[9] * z + m[13]) / w;\n out[2] = (m[2] * x + m[6] * y + m[10] * z + m[14]) / w;\n return out;\n}\n\n/**\n * Transforms the vec3 with a mat3.\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyMat3} m the 3x3 matrix to transform with\n * @returns {vec3} out\n */\nexport function transformMat3(out, a, m) {\n var x = a[0],\n y = a[1],\n z = a[2];\n out[0] = x * m[0] + y * m[3] + z * m[6];\n out[1] = x * m[1] + y * m[4] + z * m[7];\n out[2] = x * m[2] + y * m[5] + z * m[8];\n return out;\n}\n\n/**\n * Transforms the vec3 with a quat\n * Can also be used for dual quaternions. (Multiply it with the real part)\n *\n * @param {vec3} out the receiving vector\n * @param {ReadonlyVec3} a the vector to transform\n * @param {ReadonlyQuat} q normalized quaternion to transform with\n * @returns {vec3} out\n */\nexport function transformQuat(out, a, q) {\n // Fast Vector Rotation using Quaternions by Robert Eisele\n // https://raw.org/proof/vector-rotation-using-quaternions/\n\n var qx = q[0],\n qy = q[1],\n qz = q[2],\n qw = q[3];\n var vx = a[0],\n vy = a[1],\n vz = a[2];\n\n // t = q x v\n var tx = qy * vz - qz * vy;\n var ty = qz * vx - qx * vz;\n var tz = qx * vy - qy * vx;\n\n // t = 2t\n tx = tx + tx;\n ty = ty + ty;\n tz = tz + tz;\n\n // v + w t + q x t\n out[0] = vx + qw * tx + qy * tz - qz * ty;\n out[1] = vy + qw * ty + qz * tx - qx * tz;\n out[2] = vz + qw * tz + qx * ty - qy * tx;\n return out;\n}\n\n/**\n * Rotate a 3D vector around the x-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateX(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0];\n r[1] = p[1] * Math.cos(rad) - p[2] * Math.sin(rad);\n r[2] = p[1] * Math.sin(rad) + p[2] * Math.cos(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the y-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateY(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[2] * Math.sin(rad) + p[0] * Math.cos(rad);\n r[1] = p[1];\n r[2] = p[2] * Math.cos(rad) - p[0] * Math.sin(rad);\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Rotate a 3D vector around the z-axis\n * @param {vec3} out The receiving vec3\n * @param {ReadonlyVec3} a The vec3 point to rotate\n * @param {ReadonlyVec3} b The origin of the rotation\n * @param {Number} rad The angle of rotation in radians\n * @returns {vec3} out\n */\nexport function rotateZ(out, a, b, rad) {\n var p = [],\n r = [];\n //Translate point to the origin\n p[0] = a[0] - b[0];\n p[1] = a[1] - b[1];\n p[2] = a[2] - b[2];\n\n //perform rotation\n r[0] = p[0] * Math.cos(rad) - p[1] * Math.sin(rad);\n r[1] = p[0] * Math.sin(rad) + p[1] * Math.cos(rad);\n r[2] = p[2];\n\n //translate to correct position\n out[0] = r[0] + b[0];\n out[1] = r[1] + b[1];\n out[2] = r[2] + b[2];\n return out;\n}\n\n/**\n * Get the angle between two 3D vectors\n * @param {ReadonlyVec3} a The first operand\n * @param {ReadonlyVec3} b The second operand\n * @returns {Number} The angle in radians\n */\nexport function angle(a, b) {\n var ax = a[0],\n ay = a[1],\n az = a[2],\n bx = b[0],\n by = b[1],\n bz = b[2],\n mag = Math.sqrt((ax * ax + ay * ay + az * az) * (bx * bx + by * by + bz * bz)),\n cosine = mag && dot(a, b) / mag;\n return Math.acos(Math.min(Math.max(cosine, -1), 1));\n}\n\n/**\n * Set the components of a vec3 to zero\n *\n * @param {vec3} out the receiving vector\n * @returns {vec3} out\n */\nexport function zero(out) {\n out[0] = 0.0;\n out[1] = 0.0;\n out[2] = 0.0;\n return out;\n}\n\n/**\n * Returns a string representation of a vector\n *\n * @param {ReadonlyVec3} a vector to represent as a string\n * @returns {String} string representation of the vector\n */\nexport function str(a) {\n return \"vec3(\" + a[0] + \", \" + a[1] + \", \" + a[2] + \")\";\n}\n\n/**\n * Returns whether or not the vectors have exactly the same elements in the same position (when compared with ===)\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function exactEquals(a, b) {\n return a[0] === b[0] && a[1] === b[1] && a[2] === b[2];\n}\n\n/**\n * Returns whether or not the vectors have approximately the same elements in the same position.\n *\n * @param {ReadonlyVec3} a The first vector.\n * @param {ReadonlyVec3} b The second vector.\n * @returns {Boolean} True if the vectors are equal, false otherwise.\n */\nexport function equals(a, b) {\n var a0 = a[0],\n a1 = a[1],\n a2 = a[2];\n var b0 = b[0],\n b1 = b[1],\n b2 = b[2];\n return Math.abs(a0 - b0) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a0), Math.abs(b0)) && Math.abs(a1 - b1) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a1), Math.abs(b1)) && Math.abs(a2 - b2) <= glMatrix.EPSILON * Math.max(1.0, Math.abs(a2), Math.abs(b2));\n}\n\n/**\n * Alias for {@link vec3.subtract}\n * @function\n */\nexport var sub = subtract;\n\n/**\n * Alias for {@link vec3.multiply}\n * @function\n */\nexport var mul = multiply;\n\n/**\n * Alias for {@link vec3.divide}\n * @function\n */\nexport var div = divide;\n\n/**\n * Alias for {@link vec3.distance}\n * @function\n */\nexport var dist = distance;\n\n/**\n * Alias for {@link vec3.squaredDistance}\n * @function\n */\nexport var sqrDist = squaredDistance;\n\n/**\n * Alias for {@link vec3.length}\n * @function\n */\nexport var len = length;\n\n/**\n * Alias for {@link vec3.squaredLength}\n * @function\n */\nexport var sqrLen = squaredLength;\n\n/**\n * Perform some operation over an array of vec3s.\n *\n * @param {Array} a the array of vectors to iterate over\n * @param {Number} stride Number of elements between the start of each vec3. If 0 assumes tightly packed\n * @param {Number} offset Number of elements to skip at the beginning of the array\n * @param {Number} count Number of vec3s to iterate over. If 0 iterates over entire array\n * @param {Function} fn Function to call for each vector in the array\n * @param {Object} [arg] additional argument to pass to fn\n * @returns {Array} a\n * @function\n */\nexport var forEach = function () {\n var vec = create();\n return function (a, stride, offset, count, fn, arg) {\n var i, l;\n if (!stride) {\n stride = 3;\n }\n if (!offset) {\n offset = 0;\n }\n if (count) {\n l = Math.min(count * stride + offset, a.length);\n } else {\n l = a.length;\n }\n for (i = offset; i < l; i += stride) {\n vec[0] = a[i];\n vec[1] = a[i + 1];\n vec[2] = a[i + 2];\n fn(vec, vec, arg);\n a[i] = vec[0];\n a[i + 1] = vec[1];\n a[i + 2] = vec[2];\n }\n return a;\n };\n}();",
76
+ "import { mat4, vec3 } from 'gl-matrix';\nimport { isUndefined, omitBy } from 'lodash-es';\nimport * as maplibregl from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { IColorPaletteVo } from '../../types/colorPalette';\nimport { I3dRenderVo } from '../../types/gl';\nimport { ExTimingLayer } from '../base/ExTimingLayer';\nimport { getBoxVertexSource } from './box.vs';\nimport { getMatrix } from './lib/getMatrix';\nimport { lineFragmentSource } from './line.fs';\nimport { sliceFragmentSource } from './slice.fs';\nimport { volumeFragmentSource } from './volume.fs';\n\nexport interface I3DProfileOptions {\n sliceX: number; // 切面位置(归一化坐标 [-0.5, 0.5])\n sliceY: number;\n sliceZ: number;\n steps: number; // Raymarching采样步数(越大越精确,但越慢)\n threshMin: number;\n threshMax: number;\n opacity: number;\n height: number; // 垂直高度(米)\n showVolume: boolean;\n showSlice: boolean;\n showBox: boolean;\n useJitter: boolean;\n showData1: boolean;\n showData2: boolean;\n}\n\nexport class Maplibre3DProfileLayer extends ExTimingLayer {\n renderingMode = '3d';\n palette1?: IColorPaletteVo;\n palette2?: IColorPaletteVo;\n options: I3DProfileOptions = {\n sliceX: 0.5,\n sliceY: 0.5,\n sliceZ: 0.5,\n steps: 200,\n threshMin: 0.05,\n threshMax: 1.0,\n opacity: 2.0,\n height: 1000000, // 垂直高度(米)\n showVolume: true,\n showSlice: true,\n showBox: true,\n useJitter: true,\n showData1: true,\n showData2: true,\n };\n bufferInfoVol!: twgl.BufferInfo;\n bufferInfoSlice!: twgl.BufferInfo;\n bufferInfoLine!: twgl.BufferInfo;\n\n onMount(): void {\n const gl = this.gl2;\n\n // 体积立方体顶点 (Unit Cube)\n const boxVerts = [\n -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5,\n -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5,\n -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5,\n -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5,\n ];\n\n // 切面平面 (Quad)\n const planeVerts = [-0.5, -0.5, 0, 0.5, -0.5, 0, -0.5, 0.5, 0, -0.5, 0.5, 0, 0.5, -0.5, 0, 0.5, 0.5, 0];\n\n // 边框线顶点\n const lineVerts = [\n -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5,\n -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5,\n -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5,\n 0.5, -0.5, -0.5, 0.5, 0.5,\n ];\n\n this.bufferInfoVol = twgl.createBufferInfoFromArrays(gl, { a_pos: { numComponents: 3, data: boxVerts } });\n this.bufferInfoSlice = twgl.createBufferInfoFromArrays(gl, { a_pos: { numComponents: 3, data: planeVerts } });\n this.bufferInfoLine = twgl.createBufferInfoFromArrays(gl, { a_pos: { numComponents: 3, data: lineVerts } });\n }\n\n onUnMount(): void {}\n\n setOptions(options: Partial<I3DProfileOptions>) {\n this.options = {\n ...this.options,\n ...omitBy(options, value => isUndefined(value)),\n };\n this.rerender();\n }\n\n setPalette(palette1: IColorPaletteVo, palette2: IColorPaletteVo) {\n this.palette1 = palette1;\n this.palette2 = palette2;\n this.setTextureOptions(this.gl, {\n u_colorTexture1: {\n src: this.palette1.imageData,\n mag: this.gl.LINEAR,\n min: this.gl.LINEAR,\n wrap: this.gl.CLAMP_TO_EDGE,\n },\n u_colorTexture2: {\n src: this.palette2.imageData,\n mag: this.gl.LINEAR,\n min: this.gl.LINEAR,\n wrap: this.gl.CLAMP_TO_EDGE,\n },\n });\n }\n\n onRender(options: maplibregl.CustomRenderMethodInput, wraps: number[]): void {\n const gl = this.gl2;\n if (!this.bounds) return;\n\n const progInfoVol = this.createProgramInfo(\n 'volume',\n options,\n () => getBoxVertexSource(options),\n () => volumeFragmentSource,\n );\n const progInfoSlice = this.createProgramInfo(\n 'slice',\n options,\n () => getBoxVertexSource(options),\n () => sliceFragmentSource,\n );\n const progInfoLine = this.createProgramInfo(\n 'line',\n options,\n () => getBoxVertexSource(options),\n () => lineFragmentSource,\n );\n\n const matrix = options.defaultProjectionData.mainMatrix;\n\n const [lngMin, latMin, lngMax, latMax] = this.bounds;\n const modelMat = getMatrix(\n [\n [lngMin, latMax],\n [lngMax, latMax],\n [lngMax, latMin],\n [lngMin, latMin],\n ],\n this.options.height,\n );\n\n // 计算相机位置逻辑 (保持原样,纯数学运算)\n const t = this.map.transform;\n const h = this.map.getCanvas().height;\n const fov = 2 * Math.atan(0.5 / 1.5);\n const camDist = h / 2 / Math.tan(fov / 2);\n const scale = 512 * Math.pow(2, t.zoom);\n const pitch = (t.pitch * Math.PI) / 180;\n const bearing = (t.bearing * Math.PI) / 180;\n const zM = (camDist * Math.cos(pitch)) / scale;\n const gM = (camDist * Math.sin(pitch)) / scale;\n const cm = maplibregl.MercatorCoordinate.fromLngLat(this.map.getCenter());\n const cx = cm.x - Math.sin(bearing) * gM;\n const cy = cm.y + Math.cos(bearing) * gM;\n const cz = cm.z + zM;\n const invModel = mat4.create();\n mat4.invert(invModel, modelMat);\n const camLocal = vec3.create();\n vec3.transformMat4(camLocal, [cx, cy, cz], invModel);\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // 1. Box Lines (边框线)\n // if (this.options.showBox) {\n // gl.depthMask(true);\n // gl.depthFunc(gl.LEQUAL);\n // gl.useProgram(progInfoLine.program);\n\n // // TWGL: 设置 Uniforms 和 Buffers\n // twgl.setBuffersAndAttributes(gl, progInfoLine, this.bufferInfoLine);\n // twgl.setUniforms(progInfoLine, {\n // u_matrix: matrix,\n // u_model: modelMat,\n // u_color: [1, 1, 1],\n // });\n\n // // TWGL: 绘制 (自动判断 drawArrays 参数)\n // twgl.drawBufferInfo(gl, this.bufferInfoLine, gl.LINES);\n // }\n\n // // 2. Slice (切面)\n // if (this.options.showSlice) {\n // gl.depthMask(true);\n // gl.depthFunc(gl.LEQUAL);\n // gl.disable(gl.CULL_FACE);\n // gl.useProgram(progInfoSlice.program);\n\n // twgl.setBuffersAndAttributes(gl, progInfoSlice, this.bufferInfoSlice);\n\n // // 基础 Uniforms\n // const sliceUniforms = {\n // u_matrix: matrix,\n // u_model: modelMat,\n // u_threshMin: this.options.threshMin,\n // u_threshMax: this.options.threshMax,\n // u_sliceX: this.options.sliceX,\n // u_sliceY: this.options.sliceY,\n // u_sliceZ: this.options.sliceZ,\n // u_mixRatio: this.t,\n // u_colorRange1: [this.palette1?.minValue, this.palette1?.maxValue],\n // u_colorRange2: [this.palette2?.minValue, this.palette2?.maxValue],\n // u_dataRange1: [this.currData1?.minVal, this.currData1?.maxVal, this.nextData1?.minVal, this.nextData1?.maxVal],\n // u_dataRange2: [this.currData2?.minVal, this.currData2?.maxVal, this.nextData2?.minVal, this.nextData2?.maxVal],\n // u_showData1: this.options.showData1,\n // u_showData2: this.options.showData2,\n // ...this.textures,\n // };\n\n // // 分别绘制三个轴向的切面\n // if (this.options.sliceX < 0.495) {\n // twgl.setUniforms(progInfoSlice, { ...sliceUniforms, u_axis: 0, u_sliceVal: this.options.sliceX });\n // twgl.drawBufferInfo(gl, this.bufferInfoSlice);\n // }\n // if (this.options.sliceY < 0.495) {\n // twgl.setUniforms(progInfoSlice, { ...sliceUniforms, u_axis: 1, u_sliceVal: this.options.sliceY });\n // twgl.drawBufferInfo(gl, this.bufferInfoSlice);\n // }\n // if (this.options.sliceZ < 0.495) {\n // twgl.setUniforms(progInfoSlice, { ...sliceUniforms, u_axis: 2, u_sliceVal: this.options.sliceZ });\n // twgl.drawBufferInfo(gl, this.bufferInfoSlice);\n // }\n // }\n\n // 3. Volume (体积云)\n if (this.options.showVolume) {\n gl.depthMask(false);\n gl.disable(gl.CULL_FACE);\n gl.depthFunc(gl.ALWAYS);\n\n gl.useProgram(progInfoVol.program);\n twgl.setBuffersAndAttributes(gl, progInfoVol, this.bufferInfoVol);\n\n wraps.forEach(wrap => {\n twgl.setUniforms(progInfoVol, {\n u_matrix: matrix,\n u_model: modelMat,\n u_cameraLocalPos: camLocal,\n u_clipMax: [this.options.sliceX, this.options.sliceY, this.options.sliceZ],\n u_sliceX: this.options.sliceX,\n u_sliceY: this.options.sliceY,\n u_sliceZ: this.options.sliceZ,\n u_steps: this.options.steps,\n u_threshMin: this.options.threshMin,\n u_threshMax: this.options.threshMax,\n u_opacity: this.options.opacity,\n u_useJitter: this.options.useJitter,\n u_showSliceLayer: this.options.showSlice,\n u_mixRatio: this.t,\n u_colorRange1: [this.palette1?.minValue, this.palette1?.maxValue],\n u_colorRange2: [this.palette2?.minValue, this.palette2?.maxValue],\n u_dataRange1: [this.currData1?.minVal, this.currData1?.maxVal, this.nextData1?.minVal, this.nextData1?.maxVal],\n u_dataRange2: [this.currData2?.minVal, this.currData2?.maxVal, this.nextData2?.minVal, this.nextData2?.maxVal],\n u_showData1: this.options.showData1,\n u_showData2: this.options.showData2,\n u_offset: [wrap, 0],\n ...this.textures,\n });\n twgl.drawBufferInfo(gl, this.bufferInfoVol);\n });\n }\n\n // 恢复状态\n gl.cullFace(gl.BACK);\n gl.enable(gl.CULL_FACE);\n gl.depthFunc(gl.LEQUAL);\n }\n\n protected currData1?: I3dRenderVo;\n protected nextData1?: I3dRenderVo;\n protected currData2?: I3dRenderVo;\n protected nextData2?: I3dRenderVo;\n\n updateData2(\n currData1: I3dRenderVo,\n nextData1: I3dRenderVo | undefined,\n currData2: I3dRenderVo,\n nextData2: I3dRenderVo | undefined,\n t: number,\n options: { magAndMinType?: number } = {},\n ) {\n console.log('updateData:', currData1, nextData1, currData2, nextData2, t);\n if (!nextData1) nextData1 = currData1;\n if (!nextData2) nextData2 = currData2;\n\n const gl = this.gl2;\n\n if (currData1 && nextData1 && this.currData1 !== currData1) {\n this.setBounds(currData1.bounds);\n console.log('setBound1:', currData1.bounds);\n this.setTextureOptions(this.gl, {\n u_currData1: {\n target: gl.TEXTURE_3D,\n width: currData1.size.width,\n height: currData1.size.height,\n depth: currData1.size.depth,\n min: gl.LINEAR,\n mag: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n internalFormat: gl.R8,\n format: gl.RED,\n type: gl.UNSIGNED_BYTE,\n src: new Uint8Array(currData1.bin_mercator!),\n },\n u_nextData1: {\n target: gl.TEXTURE_3D,\n width: nextData1.size.width,\n height: nextData1.size.height,\n depth: nextData1.size.depth,\n min: gl.LINEAR,\n mag: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n internalFormat: gl.R8,\n format: gl.RED,\n type: gl.UNSIGNED_BYTE,\n src: new Uint8Array(nextData1.bin_mercator!),\n },\n });\n }\n\n if (currData2 && nextData2 && this.currData2 !== currData2) {\n this.setBounds(currData2.bounds);\n this.setTextureOptions(this.gl, {\n u_currData2: {\n target: gl.TEXTURE_3D,\n width: currData2.size.width,\n height: currData2.size.height,\n depth: currData2.size.depth,\n min: gl.LINEAR,\n mag: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n internalFormat: gl.R8,\n format: gl.RED,\n type: gl.UNSIGNED_BYTE,\n src: new Uint8Array(currData2.bin_mercator!),\n },\n u_nextData2: {\n target: gl.TEXTURE_3D,\n width: nextData2.size.width,\n height: nextData2.size.height,\n depth: nextData2.size.depth,\n min: gl.LINEAR,\n mag: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n internalFormat: gl.R8,\n format: gl.RED,\n type: gl.UNSIGNED_BYTE,\n src: new Uint8Array(nextData2.bin_mercator!),\n },\n });\n }\n\n // this.setBounds([-180, -85.251129, 180, 85.251129]);\n\n this.currData1 = currData1;\n this.currData2 = currData2;\n this.nextData1 = nextData1;\n this.nextData2 = nextData2;\n this.t = this.isAnimation ? t : 0;\n this.rerender();\n }\n}\n",
77
+ "/**\n * 通用顶点着色器 (Vertex Shader)\n * 用于体积渲染、切面渲染和边框线渲染\n * 功能:将局部坐标系中的顶点位置变换到屏幕空间\n */\nexport const getBoxVertexSource = (options: maplibregl.CustomRenderMethodInput) => {\n return `#version 300 es\nin vec3 a_pos;\nuniform mat4 u_matrix;\nuniform mat4 u_model;\nuniform vec2 u_offset;\nuniform bool u_isSlice;\nuniform int u_axis;\nuniform float u_sliceVal;\nout vec3 v_localPos;\nvoid main() {\n vec3 pos = a_pos;\n if (u_isSlice) {\n if (u_axis == 0) pos = vec3(u_sliceVal, a_pos.x, a_pos.y);\n else if (u_axis == 1) pos = vec3(a_pos.x, u_sliceVal, a_pos.y);\n else pos = vec3(a_pos.x, a_pos.y, u_sliceVal);\n }\n v_localPos = pos;\n gl_Position = u_matrix * (u_model * vec4(pos, 1.0) + vec4(u_offset, 0.0, 0.0));\n}\n`;\n};\n",
78
+ "import { mat4 } from 'gl-matrix';\nimport * as maplibregl from 'maplibre-gl';\n\n/**\n * 计算模型变换矩阵\n * 将单位立方体([-0.5, 0.5])变换到地图上的指定区域和高度\n * @param {Array} coords - 四个角点的地理坐标 [[lng, lat], ...]\n * @param {number} h - 垂直高度(米)\n * @returns {mat4} 4x4模型矩阵(变换:平移 -> 旋转 -> 缩放)\n */\nexport function getMatrix(coords: maplibregl.LngLatLike[], height: number): mat4 {\n const p0 = maplibregl.MercatorCoordinate.fromLngLat(coords[0]);\n const p1 = maplibregl.MercatorCoordinate.fromLngLat(coords[1]);\n const p2 = maplibregl.MercatorCoordinate.fromLngLat(coords[2]);\n const cx = (p0.x + p2.x) / 2,\n cy = (p0.y + p2.y) / 2;\n const sx = Math.sqrt((p1.x - p0.x) ** 2 + (p1.y - p0.y) ** 2);\n const sy = Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2);\n const cm = new maplibregl.MercatorCoordinate(cx, cy, 0);\n const sz = cm.meterInMercatorCoordinateUnits() * height;\n const rot = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n const m = mat4.create();\n mat4.translate(m, m, [cx, cy, p0.z + sz / 2]);\n mat4.rotateZ(m, m, rot);\n mat4.scale(m, m, [sx, sy, sz]);\n return m;\n}\n",
79
+ "/**\n * 边框线片段着色器 (Line Fragment Shader)\n * 用于渲染体积数据立方体的边框线,简单返回固定颜色\n */\nexport const lineFragmentSource = `#version 300 es\nprecision mediump float;\nuniform vec3 u_color; // 线条颜色\nout vec4 fragColor;\nvoid main() { \n fragColor = vec4(u_color, 0.6); // 60%不透明度\n}\n`;\n",
80
+ "/**\n * 切面渲染片段着色器 (Slice Fragment Shader)\n * 用于渲染2D切面,显示体积数据在特定平面上的投影\n * 相比体积渲染,切面渲染更简单:直接采样切面位置的密度值,映射到颜色\n */\nexport const sliceFragmentSource = `#version 300 es\nprecision highp float;\nprecision highp sampler3D;\nin vec3 v_localPos; // 输入:切面顶点的局部坐标\n\n// uniform sampler3D u_dataTexture; // 当前帧数据纹理\n// uniform sampler3D u_dataTextureNext; // 下一帧数据纹理\n// uniform sampler2D u_colorTexture; // 颜色传递函数\n// uniform float u_cmax;\n// uniform float u_cmin;\n\nuniform sampler3D u_currData1;\nuniform sampler3D u_nextData1;\nuniform sampler2D u_colorTexture1;\n\nuniform sampler3D u_currData2;\nuniform sampler3D u_nextData2;\nuniform sampler2D u_colorTexture2;\n\nuniform vec4 u_dataRange1;\nuniform vec4 u_dataRange2;\nuniform vec2 u_colorRange1;\nuniform vec2 u_colorRange2;\nuniform bool u_showData1;\nuniform bool u_showData2;\n\nuniform float u_sliceX, u_sliceY, u_sliceZ; // X/Y/Z切面位置\nuniform float u_threshMin, u_threshMax; // 密度阈值\nuniform float u_mixRatio; // 时间插值比例\n\nout vec4 fragColor;\n\nvec3 getColor(vec4 u_dataRange, vec2 u_colorRange, float density, sampler2D u_colorTexture){\n float curr_data_min_value = u_dataRange.x;\n float curr_data_max_value = u_dataRange.y;\n float next_data_min_value = u_dataRange.z;\n float next_data_max_value = u_dataRange.w;\n float color_min_value = u_colorRange.x;\n float color_max_value = u_colorRange.y;\n\n float min_value = mix(curr_data_min_value,next_data_min_value,u_mixRatio);\n float max_value = mix(curr_data_max_value,next_data_max_value,u_mixRatio);\n float value = density * (max_value - min_value) + min_value;\n float p = (value - color_min_value) / (color_max_value - color_min_value);\n vec3 color = texture(u_colorTexture, vec2(p, 0.5)).rgb;\n return color;\n}\n\nvoid main() {\n vec3 pos = v_localPos;\n // 裁剪:只显示切面位置之前的部分(切片功能)\n // 0.002是为了避免浮点数精度问题\n if (pos.x > u_sliceX + 0.002 || pos.y > u_sliceY + 0.002 || pos.z > u_sliceZ + 0.002) discard;\n // 将局部坐标[-0.5, 0.5]转换为纹理坐标[0, 1]\n vec3 texCoord = pos + 0.5;\n\n // 时间插值采样密度\n float density1 = u_showData1 ? mix(texture(u_currData1, texCoord).r, texture(u_nextData1, texCoord).r, u_mixRatio) : 0.0;\n float density2 = u_showData2 ? mix(texture(u_currData2, texCoord).r, texture(u_nextData2, texCoord).r, u_mixRatio) : 0.0;\n float density = density1 > density2 ? density1 : density2;\n bool isDensity1 = density1 > density2 ? true : false;\n\n // 阈值过滤:只显示指定密度范围内的数据\n if (density < u_threshMin || density > u_threshMax) discard;\n\n // 通过传递函数将密度映射到颜色\n vec3 col = isDensity1 ? getColor(u_dataRange1, u_colorRange1, density, u_colorTexture1) : getColor(u_dataRange2, u_colorRange2, density, u_colorTexture2);\n col = pow(col, vec3(0.8)) * 1.1; // Gamma校正和亮度增强\n fragColor = vec4(col, 1.0); // 完全不透明的切面\n\n // fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n}\n`;\n",
81
+ "/**\n * 体积渲染片段着色器 (Volume Rendering Fragment Shader)\n * 实现Raymarching算法进行体积渲染\n * 核心原理:从摄像机出发,沿着视线方向逐步采样3D纹理,累积颜色和透明度\n */\nexport const volumeFragmentSource = `#version 300 es\nprecision highp float;\nprecision highp sampler3D;\n\nin vec3 v_localPos; // 输入:当前片段在局部坐标系中的位置\nuniform vec3 u_cameraLocalPos; // 摄像机在局部坐标系中的位置\n\nuniform sampler3D u_currData1;\nuniform sampler3D u_nextData1;\nuniform sampler2D u_colorTexture1;\n\nuniform sampler3D u_currData2;\nuniform sampler3D u_nextData2;\nuniform sampler2D u_colorTexture2;\n\nuniform vec4 u_dataRange1;\nuniform vec4 u_dataRange2;\nuniform vec2 u_colorRange1;\nuniform vec2 u_colorRange2;\n\nuniform vec3 u_clipMax; // 裁剪边界最大值,用于限制体积渲染的范围(切片功能)\n\nuniform float u_sliceX, u_sliceY, u_sliceZ; // X/Y/Z轴的切面位置\nuniform float u_steps; // Raymarching的采样步数(精度)\nuniform float u_opacity; // 整体不透明度倍数\nuniform float u_threshMin, u_threshMax; // 密度阈值范围,只渲染此范围内的体素\nuniform bool u_useJitter; // 是否使用随机抖动(减少层状伪影)\nuniform bool u_showSliceLayer; // 是否显示切面层(影响遮挡检测)\nuniform float u_mixRatio; // 时间插值比例 [0, 1],用于平滑过渡两帧数据 \n\nuniform bool u_showData1;\nuniform bool u_showData2;\n\nout vec4 fragColor;\n\n/**\n * 光线与轴对齐包围盒(AABB)求交算法\n * 计算从orig出发、方向为dir的光线与单位立方体(可能被裁剪)的相交点\n * @param {vec3} orig - 光线起点(摄像机位置)\n * @param {vec3} dir - 光线方向(归一化)\n * @returns {vec2} (tNear, tFar) - 光线进入和离开盒子的参数值\n */\nvec2 hitBox(vec3 orig, vec3 dir) {\n vec3 boxMin = vec3(-0.5); // 立方体最小角点(单位立方体:[-0.5, 0.5])\n vec3 boxMax = u_clipMax; // 立方体最大角点(可能被切片裁剪)\n vec3 invDir = 1.0 / dir; // 方向向量的倒数(避免除零)\n // 计算与每个轴对齐平面的交点参数\n vec3 tmin = (boxMin - orig) * invDir;\n vec3 tmax = (boxMax - orig) * invDir;\n vec3 t1 = min(tmin, tmax); // 每个轴的近交点\n vec3 t2 = max(tmin, tmax); // 每个轴的远交点\n // 近交点是所有轴近交点的最大值,远交点是所有轴远交点的最小值\n float tNear = max(max(t1.x, t1.y), t1.z);\n float tFar = min(min(t2.x, t2.y), t2.z);\n return vec2(tNear, tFar);\n}\n\nvec3 getColor(vec4 u_dataRange, vec2 u_colorRange, float density, sampler2D u_colorTexture){\n float curr_data_min_value = u_dataRange.x;\n float curr_data_max_value = u_dataRange.y;\n float next_data_min_value = u_dataRange.z;\n float next_data_max_value = u_dataRange.w;\n float color_min_value = u_colorRange.x;\n float color_max_value = u_colorRange.y;\n\n float min_value = mix(curr_data_min_value,next_data_min_value,u_mixRatio);\n float max_value = mix(curr_data_max_value,next_data_max_value,u_mixRatio);\n float value = density * (max_value - min_value) + min_value;\n float p = (value - color_min_value) / (color_max_value - color_min_value);\n vec3 color = texture(u_colorTexture, vec2(p, 0.5)).rgb;\n return color;\n}\n\nvoid main() {\n // fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n // return;\n\n vec3 rayDir = normalize(v_localPos - u_cameraLocalPos); // 摄像机到片段的方向\n vec3 rayOrig = u_cameraLocalPos; // 摄像机位置\n \n // 1. Ray-Box Intersection (AABB碰撞检测)\n // 计算光线进入和离开单位立方体的位置,tNear为进入点,tFar为离开点\n vec2 bounds = hitBox(rayOrig, rayDir);\n float tNear = max(0.0, bounds.x);\n float tFar = bounds.y;\n\n // --- 稳健视角逻辑:防止双重渲染 ---\n // 如果我们在盒子外面,且看到的是正面,渲染。\n // 如果我们在盒子里面,正面被裁,只能看到背面,渲染。\n // 但我们不能让外面的时候,正面背面都渲染。\n // gl_FrontFacing: True if front facing.\n // 我们在 disable(CULL_FACE) 模式下。\n bool isInside = bounds.x < 0.0;\n \n // 如果在外面,且当前画的是背面 -> 丢弃(只让正面画)\n // 如果在里面,正面看不见,当前画的是背面 -> 保留\n // 注意:GL 默认 CCW。\n if (!isInside && !gl_FrontFacing) discard;\n\n if (bounds.x > bounds.y || bounds.y < 0.0) discard;\n\n // --- 遮挡检测 ---\n vec3 entryPos = rayOrig + rayDir * tNear;\n float eps = 0.001;\n bool hitSliceFace = false;\n \n // 只有当显示切面层时,才需要做遮挡检测\n if (u_showSliceLayer) {\n if (u_sliceX < 0.495 && abs(entryPos.x - u_sliceX) < eps) hitSliceFace = true;\n if (u_sliceY < 0.495 && abs(entryPos.y - u_sliceY) < eps) hitSliceFace = true;\n if (u_sliceZ < 0.495 && abs(entryPos.z - u_sliceZ) < eps) hitSliceFace = true;\n }\n\n if (hitSliceFace) {\n float d1 = texture(u_currData1, entryPos + 0.5).r;\n float d2 = texture(u_nextData1, entryPos + 0.5).r;\n float d = mix(d1, d2, u_mixRatio);\n if (d >= u_threshMin && d <= u_threshMax) discard; \n }\n \n // 3. Raymarching Loop (光线步进循环)\n float stepSize = 1.732 / u_steps; // 步长:根号3(立方体对角线) / 步数\n float offset = 0.0;\n if (u_useJitter) {\n // 随机抖动起始位置,消除层状伪影 (Wood-grain artifacts)\n float rand = fract(sin(dot(gl_FragCoord.xy, vec2(12.9898, 78.233))) * 43758.5453);\n offset = stepSize * rand;\n }\n float tCurrent = tNear + offset;\n vec4 accColor = vec4(0.0); // 累积颜色 (RGB + Alpha)\n\n for(int i=0; i<600; i++) {\n // 终止条件:超过步数限制、光线穿出盒子、或者不透明度饱和(>0.99)\n if(float(i) >= u_steps * 2.0 || tCurrent >= tFar || accColor.a >= 0.99) break;\n \n vec3 pos = rayOrig + rayDir * tCurrent;\n vec3 texCoord = pos + 0.5; // [-0.5, 0.5] -> [0, 1] 纹理坐标\n\n // 4. Sample Density (采样密度)\n float density1 = u_showData1 ? mix(texture(u_currData1, texCoord).r, texture(u_nextData1, texCoord).r, u_mixRatio) : 0.0;\n float density2 = u_showData2 ? mix(texture(u_currData2, texCoord).r, texture(u_nextData2, texCoord).r, u_mixRatio) : 0.0;\n float density = density1 > density2 ? density1 : density2;\n bool isDensity1 = density1 > density2 ? true : false;\n\n // 5. Transfer Function (传递函数:密度 -> 颜色/不透明度)\n if (density >= u_threshMin && density <= u_threshMax) {\n vec3 col = isDensity1 ? getColor(u_dataRange1, u_colorRange1, density, u_colorTexture1) : getColor(u_dataRange2, u_colorRange2, density, u_colorTexture2);\n col = pow(col, vec3(0.9)); // Gamma校正\n col *= (0.6 + 0.6 * texCoord.z); // 简单的高度阴影模拟\n \n // 计算透明度:基于密度的平滑过渡\n float alphaCurve = smoothstep(u_threshMin, u_threshMin + 0.15, density);\n float alpha = alphaCurve * stepSize * 40.0 * u_opacity * (1.0 + 0.5 * texCoord.z); \n \n // 6. Front-to-Back Blending (从前向后混合)\n // accum.rgb += color * alpha * (1.0 - accum.a)\n accColor.rgb += col * alpha * (1.0 - accColor.a);\n accColor.a += alpha * (1.0 - accColor.a);\n }\n tCurrent += stepSize;\n }\n if (accColor.a < 0.01) discard;\n fragColor = accColor;\n}\n`;\n",
82
+ "import { mat4, vec3 } from 'gl-matrix';\nimport { isUndefined, omitBy } from 'lodash-es';\nimport * as maplibregl from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { IColorPaletteVo } from '../../types/colorPalette';\nimport { I3dRenderVo } from '../../types/gl';\nimport { ExTimingLayer } from '../base/ExTimingLayer';\nimport { getCommonVertexSource } from './common.vs';\nimport { getMatrix } from './lib/getMatrix';\nimport { lineFragmentSource } from './line.fs';\nimport { sliceFragmentSource } from './slice.fs';\nimport { volumeFragmentSource } from './volume.fs';\n\ninterface I3DProfileOptions {\n sliceX: number; // 切面位置(归一化坐标 [-0.5, 0.5])\n sliceY: number;\n sliceZ: number;\n steps: number; // Raymarching采样步数(越大越精确,但越慢)\n threshMin: number;\n threshMax: number;\n opacity: number;\n height: number; // 垂直高度(米)\n showVolume: boolean;\n showSlice: boolean;\n showBox: boolean;\n useJitter: boolean;\n}\n\nexport class Maplibre3DProfileLayerV0 extends ExTimingLayer {\n renderingMode = '3d';\n palette?: IColorPaletteVo;\n options: I3DProfileOptions = {\n sliceX: 0.5,\n sliceY: 0.5,\n sliceZ: 0.5,\n steps: 200,\n threshMin: 0.05,\n threshMax: 1.0,\n opacity: 2.0,\n height: 1000000, // 垂直高度(米)\n showVolume: true,\n showSlice: true,\n showBox: true,\n useJitter: true,\n };\n bufferInfoVol!: twgl.BufferInfo;\n bufferInfoSlice!: twgl.BufferInfo;\n bufferInfoLine!: twgl.BufferInfo;\n\n onMount(): void {\n const gl = this.gl2;\n\n // 体积立方体顶点 (Unit Cube)\n const boxVerts = [\n -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5,\n -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5,\n -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, -0.5, -0.5, -0.5, 0.5,\n -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, -0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5,\n -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, -0.5,\n ];\n\n // 切面平面 (Quad)\n const planeVerts = [-0.5, -0.5, 0, 0.5, -0.5, 0, -0.5, 0.5, 0, -0.5, 0.5, 0, 0.5, -0.5, 0, 0.5, 0.5, 0];\n\n // 边框线顶点\n const lineVerts = [\n -0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5, 0.5, -0.5, -0.5,\n -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, -0.5, 0.5, 0.5,\n -0.5, -0.5, 0.5, -0.5, -0.5, -0.5, -0.5, -0.5, 0.5, 0.5, -0.5, -0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5, 0.5, 0.5, 0.5, -0.5,\n 0.5, -0.5, -0.5, 0.5, 0.5,\n ];\n\n this.bufferInfoVol = twgl.createBufferInfoFromArrays(gl, { a_pos: { numComponents: 3, data: boxVerts } });\n this.bufferInfoSlice = twgl.createBufferInfoFromArrays(gl, { a_pos: { numComponents: 3, data: planeVerts } });\n this.bufferInfoLine = twgl.createBufferInfoFromArrays(gl, { a_pos: { numComponents: 3, data: lineVerts } });\n }\n\n onUnMount(): void {}\n\n setOptions(options: Partial<I3DProfileOptions>) {\n this.options = {\n ...this.options,\n ...omitBy(options, value => isUndefined(value)),\n };\n this.rerender();\n }\n\n setPalette(palette: IColorPaletteVo) {\n this.palette = palette;\n this.setTextureOptions(this.gl, {\n u_colorTexture: {\n src: this.palette.imageData,\n mag: this.gl.LINEAR,\n min: this.gl.LINEAR,\n wrap: this.gl.CLAMP_TO_EDGE,\n },\n });\n }\n\n onRender(options: maplibregl.CustomRenderMethodInput, wraps: number[]): void {\n const gl = this.gl2;\n if (!this.bounds) return;\n\n const progInfoVol = this.createProgramInfo(\n 'volume',\n options,\n () => getCommonVertexSource(options),\n () => volumeFragmentSource,\n );\n const progInfoSlice = this.createProgramInfo(\n 'slice',\n options,\n () => getCommonVertexSource(options),\n () => sliceFragmentSource,\n );\n const progInfoLine = this.createProgramInfo(\n 'line',\n options,\n () => getCommonVertexSource(options),\n () => lineFragmentSource,\n );\n\n const matrix = options.defaultProjectionData.mainMatrix;\n\n const [lngMin, latMin, lngMax, latMax] = this.bounds;\n const modelMat = getMatrix(\n [\n [lngMin, latMax],\n [lngMax, latMax],\n [lngMax, latMin],\n [lngMin, latMin],\n ],\n this.options.height,\n );\n\n // 计算相机位置逻辑 (保持原样,纯数学运算)\n const t = this.map.transform;\n const h = this.map.getCanvas().height;\n const fov = 2 * Math.atan(0.5 / 1.5);\n const camDist = h / 2 / Math.tan(fov / 2);\n const scale = 512 * Math.pow(2, t.zoom);\n const pitch = (t.pitch * Math.PI) / 180;\n const bearing = (t.bearing * Math.PI) / 180;\n const zM = (camDist * Math.cos(pitch)) / scale;\n const gM = (camDist * Math.sin(pitch)) / scale;\n const cm = maplibregl.MercatorCoordinate.fromLngLat(this.map.getCenter());\n const cx = cm.x - Math.sin(bearing) * gM;\n const cy = cm.y + Math.cos(bearing) * gM;\n const cz = cm.z + zM;\n const invModel = mat4.create();\n mat4.invert(invModel, modelMat);\n const camLocal = vec3.create();\n vec3.transformMat4(camLocal, [cx, cy, cz], invModel);\n\n gl.enable(gl.DEPTH_TEST);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // // 1. Box Lines (边框线)\n // if (this.options.showBox) {\n // gl.depthMask(true);\n // gl.depthFunc(gl.LEQUAL);\n // gl.useProgram(progInfoLine.program);\n\n // // TWGL: 设置 Uniforms 和 Buffers\n // twgl.setBuffersAndAttributes(gl, progInfoLine, this.bufferInfoLine);\n // twgl.setUniforms(progInfoLine, {\n // u_matrix: matrix,\n // u_model: modelMat,\n // u_isSlice: false,\n // u_color: [1, 1, 1],\n // });\n\n // // TWGL: 绘制 (自动判断 drawArrays 参数)\n // twgl.drawBufferInfo(gl, this.bufferInfoLine, gl.LINES);\n // }\n\n // // 2. Slice (切面)\n // if (this.options.showSlice) {\n // gl.depthMask(true);\n // gl.depthFunc(gl.LEQUAL);\n // gl.disable(gl.CULL_FACE);\n // gl.useProgram(progInfoSlice.program);\n\n // twgl.setBuffersAndAttributes(gl, progInfoSlice, this.bufferInfoSlice);\n\n // // 基础 Uniforms\n // const sliceUniforms = {\n // u_matrix: matrix,\n // u_model: modelMat,\n // u_threshMin: this.options.threshMin,\n // u_threshMax: this.options.threshMax,\n // u_sliceX: this.options.sliceX,\n // u_sliceY: this.options.sliceY,\n // u_sliceZ: this.options.sliceZ,\n // u_mixRatio: this.t,\n // u_cmin: this.palette?.minValue,\n // u_cmax: this.palette?.maxValue,\n // u_vmin0: this.data?.minVal,\n // u_vmax0: this.data?.maxVal,\n // u_vmin1: this.nextData?.minVal,\n // u_vmax1: this.nextData?.maxVal,\n // ...this.textures,\n // };\n\n // // 分别绘制三个轴向的切面\n // if (this.options.sliceX < 0.495) {\n // twgl.setUniforms(progInfoSlice, { ...sliceUniforms, u_axis: 0, u_sliceVal: this.options.sliceX });\n // twgl.drawBufferInfo(gl, this.bufferInfoSlice);\n // }\n // if (this.options.sliceY < 0.495) {\n // twgl.setUniforms(progInfoSlice, { ...sliceUniforms, u_axis: 1, u_sliceVal: this.options.sliceY });\n // twgl.drawBufferInfo(gl, this.bufferInfoSlice);\n // }\n // if (this.options.sliceZ < 0.495) {\n // twgl.setUniforms(progInfoSlice, { ...sliceUniforms, u_axis: 2, u_sliceVal: this.options.sliceZ });\n // twgl.drawBufferInfo(gl, this.bufferInfoSlice);\n // }\n // }\n\n // 3. Volume (体积云)\n if (this.options.showVolume) {\n gl.depthMask(false);\n gl.disable(gl.CULL_FACE);\n gl.depthFunc(gl.ALWAYS);\n\n gl.useProgram(progInfoVol.program);\n twgl.setBuffersAndAttributes(gl, progInfoVol, this.bufferInfoVol);\n\n wraps.forEach(wrap => {\n twgl.setUniforms(progInfoVol, {\n u_matrix: matrix,\n u_model: modelMat,\n u_cameraLocalPos: camLocal,\n u_clipMax: [this.options.sliceX, this.options.sliceY, this.options.sliceZ],\n u_sliceX: this.options.sliceX,\n u_sliceY: this.options.sliceY,\n u_sliceZ: this.options.sliceZ,\n u_steps: this.options.steps,\n u_threshMin: this.options.threshMin,\n u_threshMax: this.options.threshMax,\n u_opacity: this.options.opacity,\n u_useJitter: this.options.useJitter,\n u_showSliceLayer: this.options.showSlice,\n u_mixRatio: this.t,\n u_cmin: this.palette?.minValue,\n u_cmax: this.palette?.maxValue,\n u_vmin0: this.data?.minVal,\n u_vmax0: this.data?.maxVal,\n u_vmin1: this.nextData?.minVal,\n u_vmax1: this.nextData?.maxVal,\n u_offset: [wrap, 0],\n ...this.textures,\n });\n twgl.drawBufferInfo(gl, this.bufferInfoVol);\n });\n }\n\n // 恢复状态\n gl.cullFace(gl.BACK);\n gl.enable(gl.CULL_FACE);\n gl.depthFunc(gl.LEQUAL);\n }\n\n updateData(\n data: I3dRenderVo | undefined,\n nextData: I3dRenderVo | undefined | undefined,\n t: number,\n options: { magAndMinType?: number } = {},\n ) {\n if (!nextData) nextData = data;\n\n const gl = this.gl2;\n\n if (data && nextData && this.data !== data) {\n this.setBounds(data.bounds);\n this.setTextureOptions(this.gl, {\n u_dataTexture: {\n target: gl.TEXTURE_3D,\n width: data.size.width,\n height: data.size.height,\n depth: data.size.depth,\n min: gl.LINEAR,\n mag: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n internalFormat: gl.R8,\n format: gl.RED,\n type: gl.UNSIGNED_BYTE,\n src: new Uint8Array(data.bin_mercator!),\n },\n u_dataTextureNext: {\n target: gl.TEXTURE_3D,\n width: nextData.size.width,\n height: nextData.size.height,\n depth: nextData.size.depth,\n min: gl.LINEAR,\n mag: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n internalFormat: gl.R8,\n format: gl.RED,\n type: gl.UNSIGNED_BYTE,\n src: new Uint8Array(nextData.bin_mercator!),\n },\n });\n }\n\n this.data = data;\n this.nextData = nextData;\n this.t = this.isAnimation ? t : 0;\n this.rerender();\n }\n}\n",
83
+ "/**\n * 通用顶点着色器 (Vertex Shader)\n * 用于体积渲染、切面渲染和边框线渲染\n * 功能:将局部坐标系中的顶点位置变换到屏幕空间\n */\nexport const getCommonVertexSource = (options: maplibregl.CustomRenderMethodInput) => {\n return `#version 300 es\n\n ${options.shaderData.vertexShaderPrelude}\n ${options.shaderData.define}\n\nin vec3 a_pos;\n\nuniform mat4 u_matrix;\nuniform mat4 u_model;\nuniform bool u_isSlice;\nuniform int u_axis;\nuniform float u_sliceVal;\nuniform vec2 u_offset;\n\nout vec3 v_localPos;\n\nvoid main() {\n vec3 pos = a_pos;\n if (u_isSlice) {\n if (u_axis == 0) pos = vec3(u_sliceVal, a_pos.x, a_pos.y);\n else if (u_axis == 1) pos = vec3(a_pos.x, u_sliceVal, a_pos.y);\n else pos = vec3(a_pos.x, a_pos.y, u_sliceVal);\n }\n v_localPos = pos;\n // u_offset 是平移世界(如wrap地图重影),应该在坐标变换之前加在局部坐标上,再乘u_model得到世界坐标\n gl_Position = u_matrix * (u_model * vec4(pos, 1.0) + vec4(u_offset, 0.0, 0.0));\n}\n`;\n};\n",
84
+ "import { mat4 } from 'gl-matrix';\nimport * as maplibregl from 'maplibre-gl';\n\n/**\n * 计算模型变换矩阵\n * 将单位立方体([-0.5, 0.5])变换到地图上的指定区域和高度\n * @param {Array} coords - 四个角点的地理坐标 [[lng, lat], ...]\n * @param {number} h - 垂直高度(米)\n * @returns {mat4} 4x4模型矩阵(变换:平移 -> 旋转 -> 缩放)\n */\nexport function getMatrix(coords: maplibregl.LngLatLike[], h: number): mat4 {\n const p0 = maplibregl.MercatorCoordinate.fromLngLat(coords[0]);\n const p1 = maplibregl.MercatorCoordinate.fromLngLat(coords[1]);\n const p2 = maplibregl.MercatorCoordinate.fromLngLat(coords[2]);\n const cx = (p0.x + p2.x) / 2,\n cy = (p0.y + p2.y) / 2;\n const sx = Math.sqrt((p1.x - p0.x) ** 2 + (p1.y - p0.y) ** 2);\n const sy = Math.sqrt((p2.x - p1.x) ** 2 + (p2.y - p1.y) ** 2);\n const cm = new maplibregl.MercatorCoordinate(cx, cy, 0);\n const sz = cm.meterInMercatorCoordinateUnits() * h;\n const rot = Math.atan2(p1.y - p0.y, p1.x - p0.x);\n const m = mat4.create();\n mat4.translate(m, m, [cx, cy, p0.z + sz / 2]);\n mat4.rotateZ(m, m, rot);\n mat4.scale(m, m, [sx, sy, sz]);\n return m;\n}\n",
85
+ "/**\n * 边框线片段着色器 (Line Fragment Shader)\n * 用于渲染体积数据立方体的边框线,简单返回固定颜色\n */\nexport const lineFragmentSource = `#version 300 es\nprecision mediump float;\n\nuniform vec3 u_color; // 线条颜色\n\nout vec4 fragColor;\n\nvoid main() { \n fragColor = vec4(u_color, 1.0); // 60%不透明度\n}\n`;\n",
86
+ "/**\n * 切面渲染片段着色器 (Slice Fragment Shader)\n * 用于渲染2D切面,显示体积数据在特定平面上的投影\n * 相比体积渲染,切面渲染更简单:直接采样切面位置的密度值,映射到颜色\n */\nexport const sliceFragmentSource = `#version 300 es\nprecision highp float;\nprecision highp sampler3D;\n\nin vec3 v_localPos;\n\nuniform sampler3D u_dataTexture; // 当前帧数据纹理\nuniform sampler3D u_dataTextureNext; // 下一帧数据纹理\nuniform sampler2D u_colorTexture; // 颜色传递函数\n\nuniform float u_sliceX, u_sliceY, u_sliceZ; // X/Y/Z切面位置\nuniform float u_threshMin, u_threshMax; // 密度阈值\nuniform float u_mixRatio; // 时间插值比例\n\nuniform float u_vmin0;\nuniform float u_vmax0;\nuniform float u_vmin1;\nuniform float u_vmax1;\nuniform float u_cmax;\nuniform float u_cmin;\n\nout vec4 fragColor;\n\nvoid main() {\n vec3 pos = v_localPos;\n\n // 裁剪:只显示切面位置之前的部分(切片功能)\n // 0.002是为了避免浮点数精度问题\n if (pos.x > u_sliceX + 0.002 || pos.y > u_sliceY + 0.002 || pos.z > u_sliceZ + 0.002) discard;\n\n // 将局部坐标[-0.5, 0.5]转换为纹理坐标[0, 1]\n vec3 texCoord = pos + 0.5;\n\n // 时间插值采样密度\n float d1 = texture(u_dataTexture, texCoord).r;\n float d2 = texture(u_dataTextureNext, texCoord).r;\n float density = mix(d1, d2, u_mixRatio);\n\n // 阈值过滤:只显示指定密度范围内的数据\n if (density < u_threshMin || density > u_threshMax) discard;\n\n // 通过传递函数将密度映射到颜色\n float u_vmax = mix(u_vmax0,u_vmax1,u_mixRatio);\n float u_vmin = mix(u_vmin0,u_vmin1,u_mixRatio);\n float v = density * (u_vmax - u_vmin) + u_vmin;\n float p = (v - u_cmin) / (u_cmax - u_cmin);\n vec3 col = texture(u_colorTexture, vec2(p, 0.5)).rgb;\n col = pow(col, vec3(0.8)) * 1.1; // Gamma校正和亮度增强\n fragColor = vec4(col, 1.0); // 完全不透明的切面\n}\n`;\n",
87
+ "/**\n * 体积渲染片段着色器 (Volume Rendering Fragment Shader)\n * 实现Raymarching算法进行体积渲染\n * 核心原理:从摄像机出发,沿着视线方向逐步采样3D纹理,累积颜色和透明度\n */\nexport const volumeFragmentSource = `#version 300 es\nprecision highp float;\nprecision highp sampler3D;\n\nin vec3 v_localPos; // 输入:当前片段在局部坐标系中的位置\nuniform vec3 u_cameraLocalPos; // 摄像机在局部坐标系中的位置\n\nuniform sampler3D u_dataTexture; // 当前帧的3D数据纹理(密度场)\nuniform sampler3D u_dataTextureNext; // 下一帧的3D数据纹理(用于时间插值)\nuniform sampler2D u_colorTexture; // 颜色传递函数纹理(将密度映射到颜色)\nuniform float u_vmin0;\nuniform float u_vmax0;\nuniform float u_vmin1;\nuniform float u_vmax1;\nuniform float u_cmax;\nuniform float u_cmin;\n\nuniform vec3 u_clipMax; // 裁剪边界最大值,用于限制体积渲染的范围(切片功能)\n\nuniform float u_sliceX, u_sliceY, u_sliceZ; // X/Y/Z轴的切面位置\nuniform float u_steps; // Raymarching的采样步数(精度)\nuniform float u_opacity; // 整体不透明度倍数\nuniform float u_threshMin, u_threshMax; // 密度阈值范围,只渲染此范围内的体素\nuniform bool u_useJitter; // 是否使用随机抖动(减少层状伪影)\nuniform bool u_showSliceLayer; // 是否显示切面层(影响遮挡检测)\nuniform float u_mixRatio; // 时间插值比例 [0, 1],用于平滑过渡两帧数据 \n\nout vec4 fragColor;\n\n/**\n * 光线与轴对齐包围盒(AABB)求交算法\n * 计算从orig出发、方向为dir的光线与单位立方体(可能被裁剪)的相交点\n * @param {vec3} orig - 光线起点(摄像机位置)\n * @param {vec3} dir - 光线方向(归一化)\n * @returns {vec2} (tNear, tFar) - 光线进入和离开盒子的参数值\n */\nvec2 hitBox(vec3 orig, vec3 dir) {\n vec3 boxMin = vec3(-0.5); // 立方体最小角点(单位立方体:[-0.5, 0.5])\n vec3 boxMax = u_clipMax; // 立方体最大角点(可能被切片裁剪)\n vec3 invDir = 1.0 / dir; // 方向向量的倒数(避免除零)\n // 计算与每个轴对齐平面的交点参数\n vec3 tmin = (boxMin - orig) * invDir;\n vec3 tmax = (boxMax - orig) * invDir;\n vec3 t1 = min(tmin, tmax); // 每个轴的近交点\n vec3 t2 = max(tmin, tmax); // 每个轴的远交点\n // 近交点是所有轴近交点的最大值,远交点是所有轴远交点的最小值\n float tNear = max(max(t1.x, t1.y), t1.z);\n float tFar = min(min(t2.x, t2.y), t2.z);\n return vec2(tNear, tFar);\n}\n\nvoid main() {\n // fragColor = vec4(1.0, 0.0, 0.0, 1.0);\n // return;\n\n vec3 rayDir = normalize(v_localPos - u_cameraLocalPos); // 摄像机到片段的方向\n vec3 rayOrig = u_cameraLocalPos; // 摄像机位置\n \n // 1. Ray-Box Intersection (AABB碰撞检测)\n // 计算光线进入和离开单位立方体的位置,tNear为进入点,tFar为离开点\n vec2 bounds = hitBox(rayOrig, rayDir);\n float tNear = max(0.0, bounds.x);\n float tFar = bounds.y;\n\n // --- 稳健视角逻辑:防止双重渲染 ---\n // 如果我们在盒子外面,且看到的是正面,渲染。\n // 如果我们在盒子里面,正面被裁,只能看到背面,渲染。\n // 但我们不能让外面的时候,正面背面都渲染。\n // gl_FrontFacing: True if front facing.\n // 我们在 disable(CULL_FACE) 模式下。\n bool isInside = bounds.x < 0.0;\n \n // 如果在外面,且当前画的是背面 -> 丢弃(只让正面画)\n // 如果在里面,正面看不见,当前画的是背面 -> 保留\n // 注意:GL 默认 CCW。\n if (!isInside && !gl_FrontFacing) discard;\n\n if (bounds.x > bounds.y || bounds.y < 0.0) discard;\n\n // --- 遮挡检测 ---\n vec3 entryPos = rayOrig + rayDir * tNear;\n float eps = 0.001;\n bool hitSliceFace = false;\n \n // 只有当显示切面层时,才需要做遮挡检测\n if (u_showSliceLayer) {\n if (u_sliceX < 0.495 && abs(entryPos.x - u_sliceX) < eps) hitSliceFace = true;\n if (u_sliceY < 0.495 && abs(entryPos.y - u_sliceY) < eps) hitSliceFace = true;\n if (u_sliceZ < 0.495 && abs(entryPos.z - u_sliceZ) < eps) hitSliceFace = true;\n }\n\n if (hitSliceFace) {\n float d1 = texture(u_dataTexture, entryPos + 0.5).r;\n float d2 = texture(u_dataTextureNext, entryPos + 0.5).r;\n float d = mix(d1, d2, u_mixRatio);\n if (d >= u_threshMin && d <= u_threshMax) discard; \n }\n \n // 3. Raymarching Loop (光线步进循环)\n float stepSize = 1.732 / u_steps; // 步长:根号3(立方体对角线) / 步数\n float offset = 0.0;\n if (u_useJitter) {\n // 随机抖动起始位置,消除层状伪影 (Wood-grain artifacts)\n float rand = fract(sin(dot(gl_FragCoord.xy, vec2(12.9898, 78.233))) * 43758.5453);\n offset = stepSize * rand;\n }\n float tCurrent = tNear + offset;\n vec4 accColor = vec4(0.0); // 累积颜色 (RGB + Alpha)\n\n for(int i=0; i<600; i++) {\n // 终止条件:超过步数限制、光线穿出盒子、或者不透明度饱和(>0.99)\n if(float(i) >= u_steps * 2.0 || tCurrent >= tFar || accColor.a >= 0.99) break;\n \n vec3 pos = rayOrig + rayDir * tCurrent;\n vec3 texCoord = pos + 0.5; // [-0.5, 0.5] -> [0, 1] 纹理坐标\n\n // 4. Sample Density (采样密度)\n float d1 = texture(u_dataTexture, texCoord).r;\n float d2 = texture(u_dataTextureNext, texCoord).r;\n float density = mix(d1, d2, u_mixRatio); // 时间插值\n\n // 5. Transfer Function (传递函数:密度 -> 颜色/不透明度)\n if (density >= u_threshMin && density <= u_threshMax) {\n float u_vmax = mix(u_vmax0,u_vmax1,u_mixRatio);\n float u_vmin = mix(u_vmin0,u_vmin1,u_mixRatio);\n float v = density * (u_vmax - u_vmin) + u_vmin;\n float p = (v - u_cmin) / (u_cmax - u_cmin);\n vec3 col = texture(u_colorTexture, vec2(p, 0.5)).rgb;\n col = pow(col, vec3(0.9)); // Gamma校正\n col *= (0.6 + 0.6 * texCoord.z); // 简单的高度阴影模拟\n \n // 计算透明度:基于密度的平滑过渡\n float alphaCurve = smoothstep(u_threshMin, u_threshMin + 0.15, density);\n float alpha = alphaCurve * stepSize * 40.0 * u_opacity * (1.0 + 0.5 * texCoord.z); \n \n // 6. Front-to-Back Blending (从前向后混合)\n // accum.rgb += color * alpha * (1.0 - accum.a)\n accColor.rgb += col * alpha * (1.0 - accColor.a);\n accColor.a += alpha * (1.0 - accColor.a);\n }\n tCurrent += stepSize;\n }\n if (accColor.a < 0.01) discard;\n fragColor = accColor;\n}\n`;\n",
88
+ "import { isUndefined, omitBy } from 'lodash-es';\nimport * as maplibregl from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { IColorPaletteVo } from '../../types/colorPalette';\nimport { I3dRenderVo } from '../../types/gl';\nimport { Bounds } from '../../types/map';\nimport { ExTimingLayer } from '../base/ExTimingLayer';\nimport { getCommonVertexSource } from './common.vs';\nimport { calculateSubdivisions } from './lib/calculateSubdivisions';\nimport { createCubeGeometry } from './lib/createCubeGeometry';\nimport { prepareProjectionUniforms } from './lib/prepareProjectionUniforms';\nimport { volumeFragmentSource } from './volume.fs';\n\ninterface I3DProfileOptions {\n sliceX: number; // 切面位置(归一化坐标 [-0.5, 0.5])\n sliceY: number;\n sliceZ: number;\n steps: number; // Raymarching采样步数(越大越精确,但越慢)\n threshMin: number;\n threshMax: number;\n opacity: number;\n height: number; // 垂直高度(米)\n showVolume: boolean;\n showSlice: boolean;\n showBox: boolean;\n useJitter: boolean;\n}\n\nexport class Maplibre3DProfileLayerV3 extends ExTimingLayer {\n renderingMode = '3d';\n palette?: IColorPaletteVo;\n options: I3DProfileOptions = {\n sliceX: 0.5,\n sliceY: 0.5,\n sliceZ: 0.5,\n steps: 200,\n threshMin: 0.05,\n threshMax: 1.0,\n opacity: 2.0,\n height: 1000000, // 垂直高度(米)\n showVolume: true,\n showSlice: true,\n showBox: true,\n useJitter: true,\n };\n bufferInfoVol!: twgl.BufferInfo;\n bufferInfoSlice!: twgl.BufferInfo;\n bufferInfoLine!: twgl.BufferInfo;\n\n private opacity: number = 0.5;\n\n //立方体高度(米)500公里高\n private height: number = 500000;\n\n // 是否启用根据缩放级别动态调整细分密度(推荐开启,可提高性能)\n private adaptiveSubdivision: boolean = true;\n\n // 固定细分密度(仅在 adaptiveSubdivision = false 时使用)\n // 对于全球范围,建议使用 256 以获得最佳曲率\n private fixedSubdivisions: number = 256;\n\n onMount(): void {}\n\n onUnMount(): void {}\n\n setOptions(options: Partial<I3DProfileOptions>) {\n this.options = {\n ...this.options,\n ...omitBy(options, value => isUndefined(value)),\n };\n this.rerender();\n }\n\n setPalette(palette: IColorPaletteVo) {\n this.palette = palette;\n this.setTextureOptions(this.gl, {\n u_colorTexture: {\n src: this.palette.imageData,\n mag: this.gl.LINEAR,\n min: this.gl.LINEAR,\n wrap: this.gl.CLAMP_TO_EDGE,\n },\n });\n }\n\n private gridMeshBufferInfoCache: Record<string, twgl.BufferInfo> = {};\n\n protected getGridMeshBufferInfo3D(gl: WebGLRenderingContext, bounds: Bounds): twgl.BufferInfo {\n const key = bounds.toString() + ',' + this.height;\n\n if (this.gridMeshBufferInfoCache[key]) return this.gridMeshBufferInfoCache[key];\n\n // 计算bounds的中心点和尺寸\n const [minLng, minLat, maxLng, maxLat] = bounds;\n\n // 计算细分密度\n const boundsSpan = Math.max(maxLng - minLng, maxLat - minLat);\n const subdivisions = calculateSubdivisions(boundsSpan, this.map.getZoom(), this.adaptiveSubdivision, this.fixedSubdivisions);\n\n // 创建几何体\n const geometry = createCubeGeometry(bounds, this.height, subdivisions);\n\n // 创建缓冲区信息\n this.gridMeshBufferInfoCache[key] = twgl.createBufferInfoFromArrays(gl, {\n a_pos: { numComponents: 3, data: geometry.positions },\n indices: geometry.indices,\n });\n\n return this.gridMeshBufferInfoCache[key];\n }\n\n onRender(options: maplibregl.CustomRenderMethodInput, wraps: number[]): void {\n // this.bound = [-180, -85.251129, 180, 85.251129];\n // this.bounds = [73.557, 10.159, 135.086, 55.561];\n\n if (!this.bounds) return;\n\n const gl = this.gl2;\n\n const progInfoVol = this.createProgramInfo(\n 'volume',\n options,\n () => getCommonVertexSource(options),\n () => volumeFragmentSource,\n );\n\n const bufferInfo = this.getGridMeshBufferInfo3D(gl, this.bounds);\n\n gl.useProgram(progInfoVol.program);\n\n // 准备uniforms(使用工具函数)\n const projectionUniforms = prepareProjectionUniforms(options.defaultProjectionData);\n const uniforms = {\n ...projectionUniforms,\n };\n\n // 判断是否需要两遍渲染\n const currentOpacity = this.opacity;\n const needsTwoPass = currentOpacity < 1.0;\n\n // 启用深度测试\n gl.enable(gl.DEPTH_TEST);\n gl.depthFunc(gl.LEQUAL);\n\n twgl.setBuffersAndAttributes(gl, progInfoVol, bufferInfo);\n\n // 获取可见的世界副本\n const isGlobe = this.map.getProjection()?.type === 'globe';\n\n // fill_extrusion在透明度<1时使用两遍渲染以避免阴影遮挡\n if (needsTwoPass) {\n // 第一遍:只写入深度缓冲,不写入颜色\n gl.colorMask(false, false, false, false);\n gl.disable(gl.BLEND);\n\n // 为每个世界副本绘制立方体(只写深度)\n for (const wrap of wraps) {\n const wrapUniforms = {\n ...uniforms,\n u_offset: isGlobe ? [0, 0] : [wrap, 0],\n };\n twgl.setUniforms(progInfoVol, wrapUniforms);\n twgl.drawBufferInfo(gl, bufferInfo);\n }\n\n // 第二遍:只绘制与第一遍深度相同的片段\n gl.colorMask(true, true, true, true);\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.depthFunc(gl.EQUAL);\n\n // 为每个世界副本绘制立方体(写颜色)\n for (const wrap of wraps) {\n const wrapUniforms = {\n ...uniforms,\n u_offset: isGlobe ? [0, 0] : [wrap, 0],\n };\n twgl.setUniforms(progInfoVol, wrapUniforms);\n twgl.drawBufferInfo(gl, bufferInfo);\n }\n\n // 恢复深度测试函数\n gl.depthFunc(gl.LEQUAL);\n } else {\n // 不透明物体:单遍渲染\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n\n // 为每个世界副本绘制立方体\n for (const wrap of wraps) {\n const wrapUniforms = {\n ...uniforms,\n u_offset: isGlobe ? [0, 0] : [wrap, 0],\n };\n twgl.setUniforms(progInfoVol, wrapUniforms);\n twgl.drawBufferInfo(gl, bufferInfo);\n }\n }\n }\n\n updateData(\n data: I3dRenderVo | undefined,\n nextData: I3dRenderVo | undefined | undefined,\n t: number,\n options: { magAndMinType?: number } = {},\n ) {\n if (!nextData) nextData = data;\n\n const gl = this.gl2;\n\n if (data && nextData && this.data !== data) {\n this.setBounds(data.bounds);\n this.setTextureOptions(this.gl, {\n u_dataTexture: {\n target: gl.TEXTURE_3D,\n width: data.size.width,\n height: data.size.height,\n depth: data.size.depth,\n min: gl.LINEAR,\n mag: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n internalFormat: gl.R8,\n format: gl.RED,\n type: gl.UNSIGNED_BYTE,\n src: new Uint8Array(data.bin_mercator!),\n },\n u_dataTextureNext: {\n target: gl.TEXTURE_3D,\n width: nextData.size.width,\n height: nextData.size.height,\n depth: nextData.size.depth,\n min: gl.LINEAR,\n mag: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n internalFormat: gl.R8,\n format: gl.RED,\n type: gl.UNSIGNED_BYTE,\n src: new Uint8Array(nextData.bin_mercator!),\n },\n });\n }\n\n this.data = data;\n this.nextData = nextData;\n this.t = this.isAnimation ? t : 0;\n this.rerender();\n }\n}\n",
89
+ "/**\n * 通用顶点着色器 (Vertex Shader)\n * 用于体积渲染、切面渲染和边框线渲染\n * 功能:将局部坐标系中的顶点位置变换到屏幕空间\n */\nexport const getCommonVertexSource = (options: maplibregl.CustomRenderMethodInput) => {\n const baseColor = [0.2, 0.4, 0.8];\n\n return `#version 300 es\n ${options.shaderData.vertexShaderPrelude}\n ${options.shaderData.define}\n \n in vec3 a_pos;\n uniform vec2 u_offset;\n out vec3 v_localPos;\n\n void main() {\n float elevation = a_pos.z;\n \n #ifdef GLOBE\n // 在globe投影中,不使用u_offset(globe不需要世界副本)\n vec2 posInTile = a_pos.xy;\n vec3 spherePos = projectToSphere(posInTile, a_pos.xy);\n gl_Position = interpolateProjectionFor3D(posInTile, spherePos, elevation);\n #else\n // 在mercator投影中,应用偏移以支持世界副本\n vec2 pos2d = a_pos.xy + u_offset;\n const float EARTH_RADIUS = 6371008.8;\n const float EARTH_CIRCUMFERENCE = 2.0 * 3.141592653589793 * EARTH_RADIUS;\n float elevationMercator = elevation / EARTH_CIRCUMFERENCE;\n gl_Position = u_projection_matrix * vec4(pos2d, elevationMercator, 1.0);\n #endif\n\n v_localPos = a_pos;\n }\n`;\n};\n",
90
+ "// 创建立方体几何体(带细分,以适应globe投影的曲率)\n// subdivisions参数控制每个面的细分程度,值越大曲面越平滑,但顶点数也越多\n//\n// 建议设置:\n// - 小范围(bounds跨度 < 30度):8-12 即可\n// - 中等范围(bounds跨度 30-90度):12-16\n// - 大范围(bounds跨度 > 90度,如覆盖整个地球):16-32\n//\n// 性能考虑:\n// - subdivisions = 8: 每个面 9x9 = 81顶点,总计 486顶点,约 2916个三角形\n// - subdivisions = 16: 每个面 17x17 = 289顶点,总计 1734顶点,约 10368个三角形\n// - subdivisions = 32: 每个面 33x33 = 1089顶点,总计 6534顶点,约 39204个三角形\n//\n// 对于覆盖整个地球的bounds,建议使用16-24以获得良好的质量和性能平衡\n/**\n * 根据bounds范围和缩放级别计算细分密度\n * @param boundsSpan - bounds的跨度(度)\n * @param currentZoom - 当前缩放级别\n * @param adaptiveSubdivision - 是否启用自适应细分\n * @param fixedSubdivisions - 固定细分密度(当adaptiveSubdivision为false时使用)\n * @returns 细分密度\n */\nexport function calculateSubdivisions(\n boundsSpan: number,\n currentZoom: number,\n adaptiveSubdivision: boolean,\n fixedSubdivisions: number,\n) {\n if (!adaptiveSubdivision) {\n return fixedSubdivisions;\n }\n\n // 根据bounds范围确定基础细分密度和最小细分密度\n let baseSubdivisions: number;\n let minSubdivisions: number;\n if (boundsSpan > 300) {\n baseSubdivisions = 256;\n minSubdivisions = 128;\n } else if (boundsSpan > 150) {\n baseSubdivisions = 192;\n minSubdivisions = 96;\n } else if (boundsSpan > 60) {\n baseSubdivisions = 128;\n minSubdivisions = 64;\n } else if (boundsSpan > 20) {\n baseSubdivisions = 64;\n minSubdivisions = 32;\n } else {\n baseSubdivisions = 32;\n minSubdivisions = 16;\n }\n\n // 根据缩放级别调整:每增加1个zoom level,细分密度减半\n const divisor = Math.pow(2, Math.floor(currentZoom));\n const subdivisions = Math.max(Math.floor(baseSubdivisions / divisor), minSubdivisions);\n\n // 限制最大细分密度\n const maxSubdivisions = boundsSpan > 300 ? 256 : 128;\n return Math.min(subdivisions, maxSubdivisions);\n}\n",
91
+ "// 创建立方体顶点数据的函数(带细分,以适应globe投影的曲率)\n\nimport * as maplibregl from 'maplibre-gl';\nimport { Bounds } from '../../../types/map';\n\nexport interface ICubeGeometry {\n positions: Float32Array;\n normals: Float32Array;\n indices: Uint16Array | Uint32Array;\n numVertices: number;\n numIndices: number;\n useUint32: boolean;\n}\n\n// 参考fill_extrusion的实现,需要对几何体进行细分以在globe投影下正确显示\nexport function createCubeGeometry(bounds: Bounds, height: number, subdivisions: number = 8): ICubeGeometry {\n const [minLng, minLat, maxLng, maxLat] = bounds;\n\n // 将四个角点转换为Mercator坐标\n const nw = maplibregl.MercatorCoordinate.fromLngLat({ lng: minLng, lat: maxLat });\n const ne = maplibregl.MercatorCoordinate.fromLngLat({ lng: maxLng, lat: maxLat });\n const sw = maplibregl.MercatorCoordinate.fromLngLat({ lng: minLng, lat: minLat });\n const se = maplibregl.MercatorCoordinate.fromLngLat({ lng: maxLng, lat: minLat });\n\n const positions: number[] = [];\n const normals: number[] = []; // 存储法线信息,格式与fill_extrusion相同\n const indices: number[] = [];\n let vertexIndex = 0;\n\n // 法线编码因子(与fill_extrusion相同)\n const FACTOR = Math.pow(2, 13); // 8192\n\n // 辅助函数:添加顶点(与fill_extrusion的addVertex函数格式完全相同)\n // fill_extrusion不共享顶点,每个面都有独立的顶点(硬边hard edges)\n function addVertex(\n x: number,\n y: number,\n z: number,\n nx: number,\n ny: number,\n nz: number,\n isTop: boolean,\n edgeDistance: number = 0,\n ) {\n positions.push(x, y, z);\n const t = isTop ? 1 : 0;\n normals.push(Math.floor(nx * FACTOR) * 2 + t, ny * FACTOR * 2, nz * FACTOR * 2, Math.round(edgeDistance));\n return vertexIndex++;\n }\n\n // 创建细分网格的辅助函数\n // 参考fill_extrusion的实现:使用基于网格的细分\n // fill_extrusion的关键点:\n // 1. 使用EXTENT (8192)坐标系统,cellSize = Math.floor(EXTENT / granularity)\n // 2. 在cellSize的倍数处细分,例如granularity=8时,在1024, 2048, 3072...等处细分\n // 3. 这确保了所有几何体在相同位置细分,避免接缝问题\n //\n // 我们的实现:\n // - 使用Mercator坐标(0-1范围),这是正确的\n // - 但需要实现类似的网格对齐细分\n // - 对于全球范围,需要更密集的细分,特别是在高纬度边缘处\n function createSubdividedQuad(\n bottomLeft: number[],\n bottomRight: number[],\n topLeft: number[],\n topRight: number[],\n normalX: number,\n normalY: number,\n normalZ: number,\n isTop: boolean,\n ) {\n // 计算网格大小(类似于fill_extrusion的granularity cell size)\n const granularity = subdivisions;\n\n const startIndex = vertexIndex;\n\n // 创建细分网格\n // fill_extrusion不共享顶点,每个面都有独立的顶点\n // 关键:确保网格对齐,避免浮点误差导致的接缝问题\n for (let j = 0; j <= subdivisions; j++) {\n for (let i = 0; i <= subdivisions; i++) {\n // 计算网格对齐的u和v坐标\n // 使用精确的整数除法,避免浮点误差累积\n let u = i / granularity;\n let v = j / granularity;\n\n // 确保u和v精确在[0, 1]范围内,并在边界处精确对齐\n if (i === 0) u = 0.0;\n else if (i === subdivisions) u = 1.0;\n else u = Math.min(1.0, Math.max(0.0, u));\n\n if (j === 0) v = 0.0;\n else if (j === subdivisions) v = 1.0;\n else v = Math.min(1.0, Math.max(0.0, v));\n\n // 双线性插值计算顶点位置\n // 使用精确的插值,避免浮点误差\n const bottom = [\n bottomLeft[0] * (1 - u) + bottomRight[0] * u,\n bottomLeft[1] * (1 - u) + bottomRight[1] * u,\n bottomLeft[2] * (1 - u) + bottomRight[2] * u,\n ];\n const top = [\n topLeft[0] * (1 - u) + topRight[0] * u,\n topLeft[1] * (1 - u) + topRight[1] * u,\n topLeft[2] * (1 - u) + topRight[2] * u,\n ];\n\n const pos = [bottom[0] * (1 - v) + top[0] * v, bottom[1] * (1 - v) + top[1] * v, bottom[2] * (1 - v) + top[2] * v];\n\n // fill_extrusion不共享顶点,每个面都有独立的顶点\n addVertex(pos[0], pos[1], pos[2], normalX, normalY, normalZ, isTop, 0);\n }\n }\n\n // 创建三角形索引\n // fill_extrusion使用连续的索引,因为每个面都有独立的顶点\n const verticesPerRow = subdivisions + 1;\n for (let j = 0; j < subdivisions; j++) {\n for (let i = 0; i < subdivisions; i++) {\n const idx = startIndex + j * verticesPerRow + i;\n const nextRow = startIndex + (j + 1) * verticesPerRow + i;\n\n // 两个三角形组成一个四边形\n // 确保逆时针顺序(从外部看)\n // 顶点布局:\n // idx idx+1\n // nextRow nextRow+1\n // 第一个三角形:idx -> nextRow -> idx+1(逆时针)\n // 第二个三角形:idx+1 -> nextRow -> nextRow+1(逆时针)\n indices.push(idx, nextRow, idx + 1);\n indices.push(idx + 1, nextRow, nextRow + 1);\n }\n }\n }\n\n // 底面(向下法线:0, 0, -1)\n // fill_extrusion不共享顶点,每个面都有独立的顶点\n createSubdividedQuad([sw.x, sw.y, 0], [se.x, se.y, 0], [nw.x, nw.y, 0], [ne.x, ne.y, 0], 0, 0, -1, false);\n\n // 顶面(向上法线:0, 0, 1)\n createSubdividedQuad([sw.x, sw.y, height], [se.x, se.y, height], [nw.x, nw.y, height], [ne.x, ne.y, height], 0, 0, 1, true);\n\n // 前面(南面,法线:0, -1, 0)\n // 注意:fill_extrusion的侧面法线是动态计算的,但立方体的侧面是平面,可以使用固定法线\n createSubdividedQuad([sw.x, sw.y, 0], [se.x, se.y, 0], [sw.x, sw.y, height], [se.x, se.y, height], 0, -1, 0, false);\n\n // 后面(北面,法线:0, 1, 0)\n createSubdividedQuad([ne.x, ne.y, 0], [nw.x, nw.y, 0], [ne.x, ne.y, height], [nw.x, nw.y, height], 0, 1, 0, false);\n\n // 左面(西面,法线:-1, 0, 0)\n createSubdividedQuad([sw.x, sw.y, 0], [nw.x, nw.y, 0], [sw.x, sw.y, height], [nw.x, nw.y, height], -1, 0, 0, false);\n\n // 右面(东面,法线:1, 0, 0)\n createSubdividedQuad([se.x, se.y, 0], [ne.x, ne.y, 0], [se.x, se.y, height], [ne.x, ne.y, height], 1, 0, 0, false);\n\n const numVertices = positions.length / 3;\n const numNormals = normals.length / 4;\n const expectedVertices = 6 * (subdivisions + 1) * (subdivisions + 1);\n\n // 验证数据一致性\n if (numVertices !== numNormals) {\n console.error('Vertex count mismatch! Positions:', numVertices, 'Normals:', numNormals);\n }\n if (numVertices !== expectedVertices) {\n console.error('Unexpected vertex count! Expected:', expectedVertices, 'Got:', numVertices);\n }\n\n // 验证索引范围\n // 注意:不能使用Math.max(...indices),因为当数组很大时会导致堆栈溢出\n // 使用循环来查找最大值和最小值\n if (indices.length > 0) {\n let maxIndex = indices[0];\n let minIndex = indices[0];\n for (let i = 1; i < indices.length; i++) {\n if (indices[i] > maxIndex) maxIndex = indices[i];\n if (indices[i] < minIndex) minIndex = indices[i];\n }\n if (maxIndex >= numVertices) {\n console.error('Invalid index! Max index:', maxIndex, 'Num vertices:', numVertices, 'Min index:', minIndex);\n console.error('Index range:', minIndex, 'to', maxIndex, 'but vertices:', numVertices);\n }\n }\n\n // 根据顶点数选择索引类型\n // UNSIGNED_SHORT 支持最多 65535 个顶点\n // UNSIGNED_INT 支持最多 4294967295 个顶点\n const useUint32 = numVertices > 65535;\n const indexArray = useUint32 ? new Uint32Array(indices) : new Uint16Array(indices);\n\n return {\n positions: new Float32Array(positions),\n normals: new Float32Array(normals), // 4个分量:nx编码+t, ny编码, nz编码, edgedistance\n indices: indexArray,\n numVertices: numVertices,\n numIndices: indices.length,\n useUint32: useUint32, // 存储索引类型,用于渲染时选择正确的drawElements类型\n };\n}\n",
92
+ "/**\n * 准备投影相关的uniforms\n * @param {Object} projectionData - MapLibre的投影数据\n * @returns {Object} 投影uniforms对象\n */\nexport function prepareProjectionUniforms(projectionData: maplibregl.ProjectionData): Record<string, any> {\n return {\n u_projection_fallback_matrix: projectionData.fallbackMatrix,\n u_projection_matrix: projectionData.mainMatrix,\n u_projection_tile_mercator_coords: Array.isArray(projectionData.tileMercatorCoords)\n ? projectionData.tileMercatorCoords\n : [...projectionData.tileMercatorCoords],\n u_projection_clipping_plane: Array.isArray(projectionData.clippingPlane)\n ? projectionData.clippingPlane\n : [...projectionData.clippingPlane],\n u_projection_transition: projectionData.projectionTransition,\n };\n}\n",
93
+ "/**\n * 体积渲染片段着色器 (Volume Rendering Fragment Shader)\n * 实现Raymarching算法进行体积渲染\n * 核心原理:从摄像机出发,沿着视线方向逐步采样3D纹理,累积颜色和透明度\n */\nexport const volumeFragmentSource = `#version 300 es\n// precision mediump float;\n\n// out vec4 fragColor;\n\nprecision highp float;\nprecision highp sampler3D;\n\nin vec3 v_localPos; // 输入:当前片段在局部坐标系中的位置\nuniform vec3 u_cameraLocalPos; // 摄像机在局部坐标系中的位置\n\nuniform sampler3D u_dataTexture; // 当前帧的3D数据纹理(密度场)\nuniform sampler3D u_dataTextureNext; // 下一帧的3D数据纹理(用于时间插值)\nuniform sampler2D u_colorTexture; // 颜色传递函数纹理(将密度映射到颜色)\nuniform float u_vmin0;\nuniform float u_vmax0;\nuniform float u_vmin1;\nuniform float u_vmax1;\nuniform float u_cmax;\nuniform float u_cmin;\n\nuniform vec3 u_clipMax; // 裁剪边界最大值,用于限制体积渲染的范围(切片功能)\n\nuniform float u_sliceX, u_sliceY, u_sliceZ; // X/Y/Z轴的切面位置\nuniform float u_steps; // Raymarching的采样步数(精度)\nuniform float u_opacity; // 整体不透明度倍数\nuniform float u_threshMin, u_threshMax; // 密度阈值范围,只渲染此范围内的体素\nuniform bool u_useJitter; // 是否使用随机抖动(减少层状伪影)\nuniform bool u_showSliceLayer; // 是否显示切面层(影响遮挡检测)\nuniform float u_mixRatio; // 时间插值比例 [0, 1],用于平滑过渡两帧数据 \n\nout vec4 fragColor;\n\n/**\n * 光线与轴对齐包围盒(AABB)求交算法\n * 计算从orig出发、方向为dir的光线与单位立方体(可能被裁剪)的相交点\n * @param {vec3} orig - 光线起点(摄像机位置)\n * @param {vec3} dir - 光线方向(归一化)\n * @returns {vec2} (tNear, tFar) - 光线进入和离开盒子的参数值\n */\nvec2 hitBox(vec3 orig, vec3 dir) {\n vec3 boxMin = vec3(-0.5); // 立方体最小角点(单位立方体:[-0.5, 0.5])\n vec3 boxMax = u_clipMax; // 立方体最大角点(可能被切片裁剪)\n vec3 invDir = 1.0 / dir; // 方向向量的倒数(避免除零)\n // 计算与每个轴对齐平面的交点参数\n vec3 tmin = (boxMin - orig) * invDir;\n vec3 tmax = (boxMax - orig) * invDir;\n vec3 t1 = min(tmin, tmax); // 每个轴的近交点\n vec3 t2 = max(tmin, tmax); // 每个轴的远交点\n // 近交点是所有轴近交点的最大值,远交点是所有轴远交点的最小值\n float tNear = max(max(t1.x, t1.y), t1.z);\n float tFar = min(min(t2.x, t2.y), t2.z);\n return vec2(tNear, tFar);\n}\n\nvoid main() {\n fragColor = vec4(1.0, 0.0, 0.0, 0.5);\n return;\n\n vec3 rayDir = normalize(v_localPos - u_cameraLocalPos); // 摄像机到片段的方向\n vec3 rayOrig = u_cameraLocalPos; // 摄像机位置\n \n // 1. Ray-Box Intersection (AABB碰撞检测)\n // 计算光线进入和离开单位立方体的位置,tNear为进入点,tFar为离开点\n vec2 bounds = hitBox(rayOrig, rayDir);\n float tNear = max(0.0, bounds.x);\n float tFar = bounds.y;\n\n // --- 稳健视角逻辑:防止双重渲染 ---\n // 如果我们在盒子外面,且看到的是正面,渲染。\n // 如果我们在盒子里面,正面被裁,只能看到背面,渲染。\n // 但我们不能让外面的时候,正面背面都渲染。\n // gl_FrontFacing: True if front facing.\n // 我们在 disable(CULL_FACE) 模式下。\n bool isInside = bounds.x < 0.0;\n \n // 如果在外面,且当前画的是背面 -> 丢弃(只让正面画)\n // 如果在里面,正面看不见,当前画的是背面 -> 保留\n // 注意:GL 默认 CCW。\n if (!isInside && !gl_FrontFacing) discard;\n\n if (bounds.x > bounds.y || bounds.y < 0.0) discard;\n\n // --- 遮挡检测 ---\n vec3 entryPos = rayOrig + rayDir * tNear;\n float eps = 0.001;\n bool hitSliceFace = false;\n \n // 只有当显示切面层时,才需要做遮挡检测\n if (u_showSliceLayer) {\n if (u_sliceX < 0.495 && abs(entryPos.x - u_sliceX) < eps) hitSliceFace = true;\n if (u_sliceY < 0.495 && abs(entryPos.y - u_sliceY) < eps) hitSliceFace = true;\n if (u_sliceZ < 0.495 && abs(entryPos.z - u_sliceZ) < eps) hitSliceFace = true;\n }\n\n if (hitSliceFace) {\n float d1 = texture(u_dataTexture, entryPos + 0.5).r;\n float d2 = texture(u_dataTextureNext, entryPos + 0.5).r;\n float d = mix(d1, d2, u_mixRatio);\n if (d >= u_threshMin && d <= u_threshMax) discard; \n }\n \n // 3. Raymarching Loop (光线步进循环)\n float stepSize = 1.732 / u_steps; // 步长:根号3(立方体对角线) / 步数\n float offset = 0.0;\n if (u_useJitter) {\n // 随机抖动起始位置,消除层状伪影 (Wood-grain artifacts)\n float rand = fract(sin(dot(gl_FragCoord.xy, vec2(12.9898, 78.233))) * 43758.5453);\n offset = stepSize * rand;\n }\n float tCurrent = tNear + offset;\n vec4 accColor = vec4(0.0); // 累积颜色 (RGB + Alpha)\n\n for(int i=0; i<600; i++) {\n // 终止条件:超过步数限制、光线穿出盒子、或者不透明度饱和(>0.99)\n if(float(i) >= u_steps * 2.0 || tCurrent >= tFar || accColor.a >= 0.99) break;\n \n vec3 pos = rayOrig + rayDir * tCurrent;\n vec3 texCoord = pos + 0.5; // [-0.5, 0.5] -> [0, 1] 纹理坐标\n\n // 4. Sample Density (采样密度)\n float d1 = texture(u_dataTexture, texCoord).r;\n float d2 = texture(u_dataTextureNext, texCoord).r;\n float density = mix(d1, d2, u_mixRatio); // 时间插值\n\n // 5. Transfer Function (传递函数:密度 -> 颜色/不透明度)\n if (density >= u_threshMin && density <= u_threshMax) {\n float u_vmax = mix(u_vmax0,u_vmax1,u_mixRatio);\n float u_vmin = mix(u_vmin0,u_vmin1,u_mixRatio);\n float v = density * (u_vmax - u_vmin) + u_vmin;\n float p = (v - u_cmin) / (u_cmax - u_cmin);\n vec3 col = texture(u_colorTexture, vec2(p, 0.5)).rgb;\n col = pow(col, vec3(0.9)); // Gamma校正\n col *= (0.6 + 0.6 * texCoord.z); // 简单的高度阴影模拟\n \n // 计算透明度:基于密度的平滑过渡\n float alphaCurve = smoothstep(u_threshMin, u_threshMin + 0.15, density);\n float alpha = alphaCurve * stepSize * 40.0 * u_opacity * (1.0 + 0.5 * texCoord.z); \n \n // 6. Front-to-Back Blending (从前向后混合)\n // accum.rgb += color * alpha * (1.0 - accum.a)\n accColor.rgb += col * alpha * (1.0 - accColor.a);\n accColor.a += alpha * (1.0 - accColor.a);\n }\n tCurrent += stepSize;\n }\n if (accColor.a < 0.01) discard;\n fragColor = accColor;\n}\n`;\n",
94
+ "import { CustomRenderMethodInput } from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { defComputeFs } from '../../fns/glsl/defComputeFs';\nimport { toGlColor } from '../../fns/toGlColor';\nimport { GridDensity, IBaseRenderVo, ICommonRenderVo, IWindRenderVo } from '../../types/gl';\nimport { IGridValueRenderOptions } from '../../types/layerOptions';\nimport { ExTimingLayer } from '../base/ExTimingLayer';\nimport { calculateGridInfo } from '../maplibre-gridWind/utils/calculateGridInfo';\nimport { calculateViewportGridUvBuffer } from '../maplibre-gridWind/utils/calculateViewportGridUv';\nimport { toBoundsCoords } from '../maplibre-gridWind/utils/toBoundsCoords';\nimport { toWebGlSizeByPixel } from '../maplibre-gridWind/utils/toWebGlSizeByPixel';\nimport { getDrawFs } from './drawFs';\nimport { getDrawVs } from './drawVs';\nimport { createNumberSDFTextureInfo, ISDFTextureInfo } from './lib/createNumberTextureInfo';\n\nenum RenderType {\n HALO = 1,\n TEXT = 2,\n}\n\nexport abstract class BaseGridValueLayer<T extends IBaseRenderVo = ICommonRenderVo> extends ExTimingLayer<T> {\n abstract getUniforms(): Record<string, any>;\n\n abstract getComputeVs(): string;\n\n private options: Required<IGridValueRenderOptions> = {\n valueGridDensity: GridDensity.SUPER_DENSE,\n valueGridFilterValue: -9999,\n fontSize: 15,\n fontColor: '#000000',\n fontHaloColor: '#ffffff',\n decimalPlaces: 0,\n maxCharCount: 6,\n halo: 0.2,\n roundWhenNoDecimal: true,\n highlightColor: '#0000ff',\n highlightValue: 0,\n valueScale: 1,\n };\n\n private SHADER_MAP = new Map<\n string,\n {\n feedbackProgramInfo: twgl.ProgramInfo;\n feedback: WebGLTransformFeedback;\n tfBufferInfo: twgl.BufferInfo;\n numInstances: number;\n drawProgramInfo: twgl.ProgramInfo;\n drawVertexArrayInfo: twgl.VertexArrayInfo;\n drawTextures: {\n [key: string]: WebGLTexture;\n };\n numberTextureInfo: ISDFTextureInfo;\n }\n >();\n\n onUnMount(): void {}\n\n getShader(gl: WebGL2RenderingContext, options: CustomRenderMethodInput) {\n const { shaderData } = options;\n\n if (this.SHADER_MAP.has(shaderData.variantName)) {\n return this.SHADER_MAP.get(shaderData.variantName);\n }\n\n // 创建反馈程序\n const numInstances = 100 * 100;\n const feedbackProgramInfo = twgl.createProgramInfo(gl, [this.getComputeVs(), defComputeFs], {\n transformFeedbackVaryings: ['o_outInfo'],\n });\n const tfBufferInfo = twgl.createBufferInfoFromArrays(gl, {\n a_position: { numComponents: 2, data: new Float32Array(numInstances * 2), drawType: gl.DYNAMIC_DRAW },\n o_outInfo: { numComponents: 3, data: new Float32Array(numInstances * 3), drawType: gl.DYNAMIC_DRAW },\n });\n const feedback = twgl.createTransformFeedback(gl, feedbackProgramInfo, tfBufferInfo);\n\n // 创建绘制程序\n const numberTextureInfo = createNumberSDFTextureInfo(gl);\n const drawProgramInfo = this.createProgramInfo(\n 'grid-draw',\n options,\n () => getDrawVs(options, this.maskShaderData.vs),\n () => getDrawFs(options, this.maskShaderData.fs),\n );\n const drawBufferInfo = twgl.createBufferInfoFromArrays(gl, {\n ...twgl.primitives.createXYQuadVertices(),\n gridInfo: { numComponents: 3, buffer: tfBufferInfo.attribs!.o_outInfo.buffer, divisor: 1 },\n });\n const drawVertexArrayInfo = twgl.createVertexArrayInfo(gl, drawProgramInfo, drawBufferInfo);\n const drawTextures = twgl.createTextures(gl, {\n u_texture: {\n src: numberTextureInfo.textureData,\n mag: gl.LINEAR,\n min: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n flipY: 1,\n },\n });\n\n this.SHADER_MAP.set(shaderData.variantName, {\n numberTextureInfo,\n feedbackProgramInfo,\n feedback,\n tfBufferInfo,\n numInstances,\n drawProgramInfo,\n drawVertexArrayInfo,\n drawTextures,\n });\n\n return this.SHADER_MAP.get(shaderData.variantName);\n }\n\n public setOptions(options: IGridValueRenderOptions) {\n this.options = { ...this.options, ...options };\n this.map.triggerRepaint();\n }\n\n onRender(options: CustomRenderMethodInput, wraps: number[]): void {\n if (!this.data || !this.nextData) return;\n if (!this.bounds) return;\n\n const gl = this.gl2;\n\n const shaderInfo = this.getShader(gl, options)!;\n const { feedbackProgramInfo, feedback, tfBufferInfo, numInstances, numberTextureInfo } = shaderInfo;\n const { drawProgramInfo, drawVertexArrayInfo, drawTextures } = shaderInfo;\n const { fontSize, fontColor, fontHaloColor, maxCharCount, decimalPlaces, halo, highlightColor, highlightValue, valueScale } =\n this.options;\n\n // GGPU\n const gridInfo = calculateGridInfo(this.map, this.options.valueGridDensity, {\n [GridDensity.LOOSE]: 12,\n [GridDensity.DENSE]: 16,\n [GridDensity.SUPER_DENSE]: 20,\n });\n const viewportGridUvData = calculateViewportGridUvBuffer(this.map, numInstances, gridInfo.rowCount, gridInfo.colCount);\n gl.bindBuffer(gl.ARRAY_BUFFER, null);\n gl.bindBuffer(gl.ELEMENT_ARRAY_BUFFER, null);\n gl.enable(gl.RASTERIZER_DISCARD);\n gl.useProgram(feedbackProgramInfo.program);\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, feedback);\n gl.beginTransformFeedback(gl.POINTS);\n twgl.setUniformsAndBindTextures(feedbackProgramInfo, {\n ...this.textures,\n ...this.getUniforms(),\n u_bounds: toBoundsCoords(this.bounds),\n u_filter_value: this.options.valueGridFilterValue,\n u_valueScale: valueScale,\n t: this.t,\n });\n twgl.setAttribInfoBufferFromArray(gl, tfBufferInfo.attribs!.a_position, viewportGridUvData.buffer);\n twgl.setBuffersAndAttributes(gl, feedbackProgramInfo, tfBufferInfo);\n twgl.drawBufferInfo(gl, tfBufferInfo, gl.POINTS);\n gl.endTransformFeedback();\n gl.bindTransformFeedback(gl.TRANSFORM_FEEDBACK, null);\n gl.disable(gl.RASTERIZER_DISCARD);\n\n // DRAW\n gl.enable(gl.BLEND);\n gl.blendFuncSeparate(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA, gl.ONE, gl.ONE_MINUS_SRC_ALPHA);\n const charAspectRatio = numberTextureInfo.charWidth / numberTextureInfo.charHeight;\n const cellWidth = fontSize * maxCharCount * charAspectRatio;\n const cellHeight = fontSize;\n const widthNormalize = toWebGlSizeByPixel(this.map, cellWidth);\n const heightNormalize = toWebGlSizeByPixel(this.map, cellHeight);\n const GAMMA_SCALE = 2 * 1.4142;\n const uniforms = {\n bounds: this.bounds,\n u_projection_fallback_matrix: options.defaultProjectionData.fallbackMatrix,\n u_projection_matrix: options.defaultProjectionData.mainMatrix,\n u_projection_tile_mercator_coords: options.defaultProjectionData.tileMercatorCoords,\n u_projection_clipping_plane: options.defaultProjectionData.clippingPlane,\n u_projection_transition: options.defaultProjectionData.projectionTransition,\n u_width: widthNormalize,\n u_height: heightNormalize,\n u_decimalPlaces: decimalPlaces,\n u_roundWhenNoDecimal: this.options.roundWhenNoDecimal,\n u_highlightValue: highlightValue,\n u_highlightColor: toGlColor(highlightColor),\n ...drawTextures,\n ...this.maskUniforms,\n };\n for (const wrap of wraps) {\n twgl.drawObjectList(gl, [\n {\n programInfo: drawProgramInfo,\n vertexArrayInfo: drawVertexArrayInfo,\n uniforms: {\n ...uniforms,\n offset: wrap,\n u_buffer: 0.2,\n u_color: toGlColor(fontHaloColor),\n u_gamma: halo,\n u_renderType: RenderType.HALO,\n },\n instanceCount: viewportGridUvData.list.length,\n },\n {\n programInfo: drawProgramInfo,\n vertexArrayInfo: drawVertexArrayInfo,\n uniforms: {\n ...uniforms,\n offset: wrap,\n u_buffer: 0.65,\n u_color: toGlColor(fontColor),\n u_gamma: GAMMA_SCALE / fontSize,\n u_renderType: RenderType.TEXT,\n },\n instanceCount: viewportGridUvData.list.length,\n },\n ]);\n }\n }\n}\n",
95
+ "import * as maplibregl from 'maplibre-gl';\n\nexport function getDrawFs(options: maplibregl.CustomRenderMethodInput, maskShaderData: string = '') {\n return `#version 300 es\n precision highp float;\n\n ${maskShaderData}\n\n in vec2 v_texcoord;\n in float v_value;\n \n in float v_charCount; // 字符数量\n in float v_textCenterOffset; // 文本居中偏移\n in float v_charWidth; // 字符宽度\n in vec4 v_chars; // 字符数组(前4个:百位、十位、个位、小数点)\n in float v_decimalPart; // 小数位\n in float v_decimalPlaces; // 实际显示的小数位数\n in float v_isNegative; // 是否为负数(1.0表示负数,0.0表示正数)\n\n uniform sampler2D u_texture;\n uniform float u_buffer;\n uniform float u_gamma; \n uniform vec4 u_color;\n uniform float u_highlightValue;\n uniform vec4 u_highlightColor;\n uniform int u_renderType;\n\n out highp vec4 outColor;\n\n #define RENDER_HALO 1\n #define RENDER_TEXT 2\n\n // 根据字符索引获取字符值\n float getCharValue(int pixelCharIndex, float isNegative, vec4 chars, float decimalPart, float decimalPlaces, float absValue) {\n float charValue = -1.0;\n int currentIndex = 0;\n \n // 负号\n if (isNegative > 0.5) {\n if (pixelCharIndex == currentIndex) return 11.0;\n currentIndex++;\n }\n \n // 百位\n if (chars.x > 0.5) {\n if (pixelCharIndex == currentIndex) return chars.x;\n currentIndex++;\n }\n \n // 十位\n if (chars.y > 0.5 || absValue >= 10.0) {\n if (pixelCharIndex == currentIndex) return chars.y;\n currentIndex++;\n }\n \n // 个位\n if (pixelCharIndex == currentIndex) return chars.z;\n currentIndex++;\n \n // 小数点和小数位\n if (chars.w > 0.5) {\n if (pixelCharIndex == currentIndex) return chars.w;\n currentIndex++;\n \n if (decimalPlaces >= 1.0) {\n if (pixelCharIndex == currentIndex) return floor(mod(decimalPart, 10.0));\n currentIndex++;\n }\n if (decimalPlaces >= 2.0) {\n if (pixelCharIndex == currentIndex) return floor(mod(decimalPart / 10.0, 10.0));\n currentIndex++;\n }\n if (decimalPlaces >= 3.0) {\n if (pixelCharIndex == currentIndex) return floor(mod(decimalPart / 100.0, 10.0));\n currentIndex++;\n }\n }\n \n return charValue;\n }\n\n // 计算字符纹理坐标\n vec2 calculateCharTexCoord(float charValue, float charLocalX, float textCoordY) {\n const float CHAR_COUNT = 12.0; // 纹理中字符总数\n float charTexWidth = 1.0 / CHAR_COUNT;\n float charTexStartX = charValue * charTexWidth;\n float charTexX = charTexStartX + charLocalX * charTexWidth;\n \n // 小数点底部对齐\n float isDecimalPoint = step(9.5, charValue) * step(charValue, 10.5);\n float decimalPointYOffset = isDecimalPoint * 0.3;\n float texCoordY = 1.0 - textCoordY + decimalPointYOffset;\n \n return vec2(charTexX, texCoordY);\n }\n\n // 计算SDF alpha值\n float calculateSDFAlpha(float dist, float buffer, float gamma) {\n highp float alpha = smoothstep(buffer - gamma, buffer + gamma, dist);\n if (alpha != alpha) alpha = 0.0; // NaN check\n return clamp(alpha, 0.0, 1.0);\n }\n \n void main() {\n if(checkMask()) discard;\n \n vec2 textAreaCoord = v_texcoord;\n \n // 快速边界检查:如果明显在文本区域外,直接丢弃\n // 使用更宽松的边界(考虑最大字符数:负号+百位+十位+个位+小数点+最多3位小数 = 8)\n float maxTextWidth = 1.0; // 最大文本宽度(归一化后为1.0)\n if (textAreaCoord.x < -0.01 || textAreaCoord.x > maxTextWidth + 0.01 || \n textAreaCoord.y < -0.01 || textAreaCoord.y > 1.01) {\n discard;\n }\n \n // 优化:使用从顶点着色器传递的预计算结果\n // 这些计算已经在顶点着色器中完成,减少了片元着色器的计算量\n float charCount = v_charCount;\n float textCenterOffset = v_textCenterOffset;\n float charWidth = v_charWidth;\n \n // 计算文本坐标\n vec2 textCoord = textAreaCoord - vec2(textCenterOffset * charWidth, 0.0);\n \n // 再次检查是否在实际文本内容区域内\n float textEndX = charCount * charWidth;\n if (textCoord.x < -0.01 || textCoord.x > textEndX + 0.01) {\n discard;\n }\n \n // 计算当前像素对应的字符位置\n int pixelCharIndex = int(floor(textCoord.x / charWidth));\n \n // 获取字符值\n float absValue = abs(v_value);\n float charValue = getCharValue(pixelCharIndex, v_isNegative, v_chars, v_decimalPart, v_decimalPlaces, absValue);\n if (charValue < 0.0) {\n discard;\n }\n \n // 计算当前字符内的相对位置\n float charStartX = float(pixelCharIndex) * charWidth;\n float charLocalX = (textCoord.x - charStartX) / charWidth;\n \n // 计算字符纹理坐标\n vec2 numTexCoord = calculateCharTexCoord(charValue, charLocalX, textCoord.y);\n \n // 确保纹理坐标在有效范围内(避免采样边界外的像素)\n numTexCoord = clamp(numTexCoord, vec2(0.0), vec2(1.0));\n \n // 从纹理中采样SDF值\n vec4 texColor = texture(u_texture, numTexCoord);\n float dist = texColor.r;\n \n // 计算alpha值\n float alpha = calculateSDFAlpha(dist, u_buffer, u_gamma);\n \n if(u_renderType == RENDER_HALO){\n outColor = vec4(u_color.rgb, alpha * u_color.a);\n }else if(u_renderType == RENDER_TEXT){\n float isHighlighted = step(u_highlightValue, v_value); // v_value >= u_highlightValue ? 1.0 : 0.0\n vec4 finalColor = mix(u_color, u_highlightColor, isHighlighted);\n outColor = vec4(finalColor.rgb, alpha * finalColor.a);\n }\n }`;\n}\n",
96
+ "import * as maplibregl from 'maplibre-gl';\n\nexport function getDrawVs(options: maplibregl.CustomRenderMethodInput, maskShaderData: string = '') {\n return `#version 300 es\n ${options.shaderData.vertexShaderPrelude}\n ${options.shaderData.define}\n ${maskShaderData}\n\n in vec2 position;\n in vec2 texcoord;\n in vec3 gridInfo;\n\n uniform float offset;\n uniform float u_width;\n uniform float u_height;\n uniform float u_decimalPlaces; // 小数点后显示几位(0-3),0表示不显示小数点\n uniform bool u_roundWhenNoDecimal; // 不显示小数点时是否四舍五入\n\n out vec2 v_texcoord;\n out float v_value;\n \n out float v_charCount; // 字符数量\n out float v_textCenterOffset; // 文本居中偏移\n out float v_charWidth; // 字符宽度\n out vec4 v_chars; // 字符数组(前4个:百位、十位、个位、小数点)\n out float v_decimalPart; // 小数位(第5个字符)\n out float v_decimalPlaces; // 实际显示的小数位数\n out float v_isNegative; // 是否为负数(1.0表示负数,0.0表示正数)\n\n #define EMPTY_VALUE -9999.0\n\n // 提取整数部分(支持四舍五入)\n float extractIntegerPart(float absValue, float decimalPlaces, bool roundWhenNoDecimal) {\n float isNoDecimal = 1.0 - step(0.5, decimalPlaces);\n float roundFlag = roundWhenNoDecimal ? 1.0 : 0.0;\n float shouldRound = isNoDecimal * roundFlag;\n float roundedValue = round(absValue);\n float flooredValue = floor(absValue);\n return mix(flooredValue, roundedValue, shouldRound);\n }\n\n // 提取小数部分\n float extractDecimalPart(float absValue, float integerPart, float decimalPlaces) {\n if (decimalPlaces > 0.0) {\n float multiplier = pow(10.0, decimalPlaces);\n return floor((absValue - integerPart) * multiplier);\n }\n return 0.0;\n }\n\n // 提取百位、十位、个位\n vec3 extractDigits(float integerPart) {\n float hundreds = floor(integerPart * 0.01);\n float remainder100 = integerPart - hundreds * 100.0;\n float tens = floor(remainder100 * 0.1);\n float ones = remainder100 - tens * 10.0;\n return vec3(hundreds, tens, ones);\n }\n\n // 计算字符数量\n float calculateCharCount(float hundreds, float tens, float integerPart, float decimalPlaces, float isNegative) {\n float hasHundreds = step(0.5, hundreds);\n float hasTens = max(step(0.5, tens), step(9.5, integerPart));\n float baseCharCount = 1.0 + hasTens + hasHundreds;\n float showDecimal = step(0.5, decimalPlaces);\n float decimalCharCount = showDecimal * (1.0 + decimalPlaces);\n return baseCharCount + decimalCharCount + isNegative;\n }\n\n // 计算文本居中偏移和字符宽度\n vec2 calculateTextLayout(float charCount, float maxCharCount) {\n float totalWidth = maxCharCount;\n float textWidth = charCount;\n float textCenterOffset = (totalWidth - textWidth) * 0.5;\n float charWidth = 1.0 / totalWidth;\n return vec2(textCenterOffset, charWidth);\n }\n \n void main() {\n vec2 translationPosition = gridInfo.xy;\n\n float value = gridInfo.z;\n\n if(value == EMPTY_VALUE){\n return;\n }\n\n // 检测是否为负数\n float isNegative = 1.0 - step(0.0, value);\n \n // 使用绝对值进行数值提取\n float absValue = abs(value);\n float decimalPlaces = clamp(u_decimalPlaces, 0.0, 3.0);\n \n // 提取整数部分和小数部分\n float integerPart = extractIntegerPart(absValue, decimalPlaces, u_roundWhenNoDecimal);\n float decimalPart = extractDecimalPart(absValue, integerPart, decimalPlaces);\n \n // 提取百位、十位、个位\n vec3 digits = extractDigits(integerPart);\n float hundreds = digits.x;\n float tens = digits.y;\n float ones = digits.z;\n \n // 计算字符数量\n float charCount = calculateCharCount(hundreds, tens, integerPart, decimalPlaces, isNegative);\n \n // 计算文本布局\n float maxCharCount = 8.0; // 负号+百位+十位+个位+小数点+最多3位小数\n vec2 textLayout = calculateTextLayout(charCount, maxCharCount);\n float textCenterOffset = textLayout.x;\n float charWidth = textLayout.y;\n \n // 将字符数据传递给片元着色器\n // 注意:GLSL 不支持数组作为 varying,所以使用 vec4 传递前4个字符\n float showDecimal = step(0.5, decimalPlaces); // decimalPlaces > 0.0 ? 1.0 : 0.0\n float decimalPoint = showDecimal > 0.5 ? 10.0 : -1.0; // 10.0 是小数点,-1.0 表示不显示\n v_chars = vec4(hundreds, tens, ones, decimalPoint);\n v_decimalPart = decimalPart;\n v_decimalPlaces = decimalPlaces;\n v_isNegative = isNegative;\n v_charCount = charCount;\n v_textCenterOffset = textCenterOffset;\n v_charWidth = charWidth;\n\n mat4 translateMatrix = mat4(1.0, 0.0, 0.0, 0.0,\n 0.0, 1.0, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n translationPosition.x + offset, translationPosition.y, 0.0, 1.0);\n\n mat4 scaleMatrix = mat4(u_width, 0.0, 0.0, 0.0,\n 0.0, u_height, 0.0, 0.0,\n 0.0, 0.0, 1.0, 0.0,\n 0.0, 0.0, 0.0, 1.0);\n\n v_texcoord = texcoord;\n\n float displayValue = value;\n if (decimalPlaces < 0.5 && u_roundWhenNoDecimal) {\n displayValue = isNegative > 0.5 ? -round(absValue) : round(absValue);\n }\n v_value = displayValue;\n \n vec4 v_pos = translateMatrix * scaleMatrix * vec4(vec2(position.x, position.y), 0.0, 1.0);\n gl_Position = projectTile(v_pos.xy);\n setMaskUV(v_pos.xy);\n }`;\n}\n",
97
+ "import TinySDF from '@mapbox/tiny-sdf';\n\ninterface ICreateSDFTextureOptions {\n fontSize: number;\n fontWeight: string;\n fontFamily: string;\n fontStyle: string;\n buffer: number;\n radius: number;\n cutoff: number;\n}\nexport interface ISDFTextureInfo {\n textureData: HTMLCanvasElement;\n charTextureWidth: number;\n charTextureHeight: number;\n charWidth: number;\n charHeight: number;\n}\n\nexport function createNumberSDFTextureInfo(gl: WebGL2RenderingContext): ISDFTextureInfo {\n const fontSize = 256;\n return createSDFTextureInfo(gl, '0123456789.-', {\n fontSize,\n fontWeight: '400',\n fontFamily: 'Menlo',\n fontStyle: 'normal',\n buffer: Math.ceil(fontSize / 8),\n radius: Math.ceil(fontSize / 3),\n cutoff: 0.25,\n });\n}\n\nexport function createSDFTextureInfo(\n gl: WebGL2RenderingContext,\n chars: string,\n options?: ICreateSDFTextureOptions,\n): ISDFTextureInfo {\n const {\n fontSize = 104,\n fontWeight = '400',\n fontFamily = 'Arial',\n fontStyle = 'normal',\n buffer = Math.ceil(fontSize / 8),\n radius = Math.ceil(fontSize / 3),\n cutoff = 0.25,\n } = options || {};\n\n const tinySDF = new TinySDF({\n fontSize,\n buffer,\n radius,\n fontWeight,\n fontStyle,\n fontFamily,\n cutoff,\n });\n\n // 获取所有字符的尺寸,找到最大宽度和高度\n const charCount = chars.length;\n let maxCharWidth = 0;\n let maxCharHeight = 0;\n const glyphs = [];\n for (let i = 0; i < charCount; i++) {\n const char = chars[i];\n const glyph = tinySDF.draw(char);\n glyphs.push(glyph);\n maxCharWidth = Math.max(maxCharWidth, glyph.width);\n maxCharHeight = Math.max(maxCharHeight, glyph.height);\n }\n const charWidth = maxCharWidth;\n const charHeight = maxCharHeight;\n\n // 创建纹理数据(参考 tiny-sdf.html 的 makeRGBAImageData 方法)\n // 使用 Canvas API 更高效地构建纹理数据\n const canvas = document.createElement('canvas');\n canvas.width = charWidth * charCount;\n canvas.height = charHeight;\n const ctx = canvas.getContext('2d')!;\n\n // 将每个字符的 SDF 数据绘制到 canvas 上\n for (let i = 0; i < charCount; i++) {\n const glyph = glyphs[i];\n const startX = i * charWidth;\n const offsetX = Math.floor((charWidth - glyph.width) / 2);\n const offsetY = Math.floor((charHeight - glyph.height) / 2);\n\n // 将 alpha-only 数据转换为 RGBA ImageData\n const rgbaImageData = makeRGBAImageData(ctx, glyph.data, glyph.width, glyph.height);\n ctx.putImageData(rgbaImageData, startX + offsetX, offsetY);\n }\n\n // 提供一个下载纹理的功能,将生成的SDF数字纹理保存为PNG\n // 用于调试/可视化texture内容(直接使用已创建的 canvas)\n (window as any).downloadTextureAsPNG = () => {\n canvas.toBlob((blob: any) => {\n const url = URL.createObjectURL(blob);\n const a = document.createElement('a');\n a.href = url;\n a.download = 'sdf_number_texture.png';\n document.body.appendChild(a);\n a.click();\n document.body.removeChild(a);\n URL.revokeObjectURL(url);\n }, 'image/png');\n };\n // 可在控制台调用: window.downloadTextureAsPNG()\n\n return {\n textureData: canvas,\n charTextureWidth: canvas.width,\n charTextureHeight: canvas.height,\n charWidth,\n charHeight,\n };\n}\n\n// 将 alpha-only 数据转换为 RGBA ImageData(参考 tiny-sdf.html)\nconst makeRGBAImageData = (ctx: CanvasRenderingContext2D, alphaChannel: Uint8ClampedArray, width: number, height: number) => {\n const imageData = ctx.createImageData(width, height);\n for (let i = 0; i < alphaChannel.length; i++) {\n const value = alphaChannel[i];\n imageData.data[4 * i + 0] = value; // R\n imageData.data[4 * i + 1] = value; // G\n imageData.data[4 * i + 2] = value; // B\n imageData.data[4 * i + 3] = 255; // A (不透明)\n }\n return imageData;\n};\n",
98
+ "export function getComputeVsByColor() {\n return `\n #version 300 es\n precision highp float;\n\n in vec2 a_position;\n\n uniform sampler2D u_image0;\n uniform sampler2D u_image1;\n uniform vec2 u_image1_value_range;\n uniform vec2 u_image2_value_range;\n\n uniform float u_valueScale;\n uniform vec4 u_bounds;\n uniform float u_filter_value;\n uniform float t;\n\n out vec3 o_outInfo;\n\n #define EMPTY_VALUE -9999.0\n\n // 数值映射函数\n float map(float value, float inMin, float inMax, float outMin, float outMax) {\n return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n }\n\n void main() {\n float bounds_left = u_bounds[0];\n float bounds_top = u_bounds[1];\n float bounds_right = u_bounds[2];\n float bounds_bottom = u_bounds[3];\n\n // 只显示bound区域内的数据\n if(a_position.x < bounds_left || a_position.x > bounds_right || a_position.y < bounds_top || a_position.y > bounds_bottom){\n o_outInfo = vec3(a_position.x, a_position.y, EMPTY_VALUE);\n return;\n }\n\n // 将采样坐标转为bound区域内的坐标\n float x = map(a_position.x, bounds_left, bounds_right, 0.0, 1.0);\n float y = map(a_position.y, bounds_top, bounds_bottom, 0.0, 1.0);\n vec2 sample_coord = vec2(x, y);\n \n // 采样数值\n vec4 color1 = texture(u_image0, sample_coord);\n vec4 color2 = texture(u_image1, sample_coord);\n float colorR = mix(color1.r, color2.r, t);\n float min_value = mix(u_image1_value_range.x, u_image2_value_range.x, 0.0);\n float max_value = mix(u_image1_value_range.y, u_image2_value_range.y, 0.0);\n float val = colorR * (max_value - min_value) + min_value;\n val = val * u_valueScale;\n\n if(val < u_filter_value){\n o_outInfo = vec3(a_position.x, a_position.y, EMPTY_VALUE);\n return;\n }\n\n o_outInfo = vec3(a_position.x, a_position.y, val);\n }\n `;\n}\n",
99
+ "import { ICommonRenderVo } from '../../types/gl';\nimport { BaseGridValueLayer } from './BaseGridValueLayer';\nimport { getComputeVsByColor } from './computeVsByColor';\n\nexport class GridValueLayer extends BaseGridValueLayer<ICommonRenderVo> {\n getUniforms(): Record<string, any> {\n if (!this.data || !this.nextData) return {};\n return {\n u_image1_value_range: [this.data.minVal, this.data.maxVal],\n u_image2_value_range: [this.nextData.minVal, this.nextData.maxVal],\n };\n }\n\n getComputeVs(): string {\n return getComputeVsByColor();\n }\n}\n",
100
+ "export function getComputeVsByWind() {\n return `\n #version 300 es\n precision highp float;\n\n in vec2 a_position;\n\n uniform sampler2D u_image0;\n uniform sampler2D u_image1;\n uniform vec4 u_image1_value_range; //min_windu, max_windu, min_windv, max_windv\n uniform vec4 u_image2_value_range; //min_windu, max_windu, min_windv, max_windv\n\n uniform float u_valueScale;\n uniform vec4 u_bounds;\n uniform float u_filter_value;\n uniform float t;\n\n out vec3 o_outInfo;\n\n #define EMPTY_VALUE -9999.0\n\n // 数值映射函数\n float map(float value, float inMin, float inMax, float outMin, float outMax) {\n return (value - inMin) * (outMax - outMin) / (inMax - inMin) + outMin;\n }\n\n void main() {\n float bounds_left = u_bounds[0];\n float bounds_top = u_bounds[1];\n float bounds_right = u_bounds[2];\n float bounds_bottom = u_bounds[3];\n\n // 只显示bound区域内的数据\n if(a_position.x < bounds_left || a_position.x > bounds_right || a_position.y < bounds_top || a_position.y > bounds_bottom){\n o_outInfo = vec3(a_position.x, a_position.y, EMPTY_VALUE);\n return;\n }\n\n // 将采样坐标转为bound区域内的坐标\n float x = map(a_position.x, bounds_left, bounds_right, 0.0, 1.0);\n float y = map(a_position.y, bounds_top, bounds_bottom, 0.0, 1.0);\n vec2 sample_coord = vec2(x, y);\n \n // 采样数值\n vec4 color1 = texture(u_image0, sample_coord);\n vec4 color2 = texture(u_image1, sample_coord);\n float colorR = mix(color1.r, color2.r, t);\n float colorG = mix(color1.g, color2.g, t);\n float min_windu = mix(u_image1_value_range.r,u_image2_value_range.r,0.0);\n float max_windu = mix(u_image1_value_range.g,u_image2_value_range.g,0.0);\n float min_windv = mix(u_image1_value_range.b,u_image2_value_range.b,0.0);\n float max_windv = mix(u_image1_value_range.a,u_image2_value_range.a,0.0);\n float windu = colorR * (max_windu - min_windu) + min_windu;\n float windv = colorG * (max_windv - min_windv) + min_windv;\n float winds = sqrt(windu * windu + windv * windv);\n winds = winds * u_valueScale;\n\n if(winds < u_filter_value){\n o_outInfo = vec3(a_position.x, a_position.y, EMPTY_VALUE);\n return;\n }\n\n o_outInfo = vec3(a_position.x, a_position.y, winds);\n }\n `;\n}\n",
101
+ "import { IWindRenderVo } from '../../types/gl';\nimport { BaseGridValueLayer } from './BaseGridValueLayer';\nimport { getComputeVsByWind } from './computeVsByWind';\n\nexport class GridWindValueLayer extends BaseGridValueLayer<IWindRenderVo> {\n getUniforms(): Record<string, any> {\n if (!this.data || !this.nextData) return {};\n return {\n u_image1_value_range: [this.data.minWindu, this.data.maxWindu, this.data.minWindv, this.data.maxWindv],\n u_image2_value_range: [this.nextData.minWindu, this.nextData.maxWindu, this.nextData.minWindv, this.nextData.maxWindv],\n };\n }\n getComputeVs(): string {\n return getComputeVsByWind();\n }\n}\n",
102
+ "import { CustomRenderMethodInput } from 'maplibre-gl';\nimport * as twgl from 'twgl.js';\nimport { Bounds } from '../../types/map';\nimport { ExCustomLayer } from '../base/ExCustomLayer';\nimport { MaskLayer } from './mask-layer';\n\ntype MaskedDataLayerOptions = {\n id: string;\n maskLayer?: MaskLayer;\n};\n\nexport class MaskedDataLayer extends ExCustomLayer {\n maskLayer?: MaskLayer;\n bounds: Bounds = [73.0, 18.0, 135.0, 53.0];\n imageTexture: WebGLTexture | null = null;\n imageLoaded: boolean = false;\n\n constructor(options: MaskedDataLayerOptions) {\n super({ id: options.id });\n this.maskLayer = options.maskLayer;\n }\n\n onMount() {\n const gl = this.gl2;\n\n this.imageTexture = twgl.createTexture(\n gl,\n {\n // src: 'https://electric-oss.oss-cn-hangzhou.aliyuncs.com/public/temp/20260103224219_17942_49.jpg',\n src: 'https://electric-oss.oss-cn-hangzhou.aliyuncs.com/public/temp/20260103224001_17937_49.jpg',\n mag: gl.LINEAR,\n min: gl.LINEAR,\n wrap: gl.CLAMP_TO_EDGE,\n },\n () => {\n this.imageLoaded = true;\n this.map.triggerRepaint(); // 图片加载完后强制重绘\n console.log('Network image loaded successfully.');\n },\n );\n }\n\n onRender(options: CustomRenderMethodInput, wraps: number[]): boolean | void {\n const gl = this.gl;\n const maskTexture = this.maskLayer?.getMaskTexture();\n const renderBounds = this.maskLayer?.getRenderBounds();\n\n const programInfo = this.createProgramInfo(\n 'mask-test',\n options,\n () => this.getVertShader(options),\n () => this.getFragShader(),\n );\n const bufferInfo = this.getGridMeshBufferInfo(gl, this.bounds);\n\n gl.enable(gl.BLEND);\n gl.blendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA);\n gl.useProgram(programInfo.program);\n twgl.setBuffersAndAttributes(gl, programInfo, bufferInfo);\n const uniforms = {\n u_projection_fallback_matrix: options.defaultProjectionData.fallbackMatrix,\n u_projection_matrix: options.defaultProjectionData.mainMatrix,\n u_projection_tile_mercator_coords: options.defaultProjectionData.tileMercatorCoords,\n u_projection_clipping_plane: options.defaultProjectionData.clippingPlane,\n u_projection_transition: options.defaultProjectionData.projectionTransition,\n u_image: this.imageTexture,\n };\n if (maskTexture && renderBounds) {\n Object.assign(uniforms, {\n u_mask: maskTexture,\n u_maskBounds: renderBounds,\n });\n }\n twgl.setUniforms(programInfo, uniforms);\n twgl.drawBufferInfo(gl, bufferInfo, gl.TRIANGLES);\n }\n\n onUnMount() {}\n\n getVertShader(options: CustomRenderMethodInput) {\n return `#version 300 es\n ${options.shaderData.vertexShaderPrelude}\n ${options.shaderData.define}\n\n in vec2 a_pos;\n in vec2 a_uv;\n\n uniform vec4 u_maskBounds;\n\n out vec2 v_uv;\n out vec2 v_maskUV;\n\n void main() {\n v_uv = a_uv;\n\n v_maskUV = (a_pos - u_maskBounds.xy) / (u_maskBounds.zw - u_maskBounds.xy);\n\n gl_Position = projectTile(a_pos);\n }\n `;\n }\n\n getFragShader() {\n return `#version 300 es\n precision highp float;\n uniform sampler2D u_image;\n uniform sampler2D u_mask;\n\n in vec2 v_uv;\n in vec2 v_maskUV;\n out vec4 fColor;\n\n void main() {\n if (v_maskUV.x < 0.0 || v_maskUV.x > 1.0 || v_maskUV.y < 0.0 || v_maskUV.y > 1.0) {\n discard;\n }\n\n float maskVal = texture(u_mask, v_maskUV).r;\n if (maskVal < 0.1) discard; \n \n fColor = texture(u_image, v_uv);\n fColor.a *= 0.85;\n }\n `;\n }\n}\n",
103
+ "import { IFetcher } from 'iweather-lib';\n\nexport abstract class IDataFetchConfig<T extends string = string> {\n public fetchers: Record<T, IFetcher>;\n public mock?: boolean;\n\n constructor(params: { fetchers: Record<T, IFetcher>; mock?: boolean }) {\n this.fetchers = params.fetchers;\n this.mock = params.mock;\n }\n}\n",
104
+ "export interface ITimeBarInfoVo {\n startTime: number;\n endTime: number;\n intervalMinute: number;\n currTime: number;\n}\n\nexport interface IBaseDataReq {\n enable: boolean;\n}\n\nexport abstract class IDataReqOptionsConfig<T = {}, DataReqT = Record<string, IBaseDataReq>, DataResT = Record<string, any>> {\n public abstract enableTimeSync(options: T): boolean;\n\n public abstract getDataReqOptions(options: T): DataReqT;\n\n public abstract getDataResOptions(options: T): DataResT;\n\n public getDefOptions(): Record<string, IBaseDataReq> {\n const reqOptions = this.getDataReqOptions({} as T);\n const resOptions = this.getDataResOptions({} as T);\n\n const defReqOptions = Object.keys(reqOptions as any).reduce<Record<string, IBaseDataReq>>((acc, key) => {\n acc[key] = { enable: false };\n return acc;\n }, {});\n\n const defResOptions = Object.keys(resOptions as any).reduce<Record<string, any>>((acc, key) => {\n acc[key] = undefined;\n return acc;\n }, {});\n\n return {\n ...defReqOptions,\n ...defResOptions,\n };\n }\n}\n",
105
+ "import { ILayerMgr } from '../core/layerMgr';\nimport { IBaseLayerOptions } from '../types/layerOptions';\n\nexport abstract class ILayerMgrConfig {\n private layerMgrMap: Record<string, ILayerMgr> | undefined = undefined;\n\n constructor(public params: { createLayers: () => Record<string, ILayerMgr> }) {}\n\n public getDefLayerOptions(): Record<string, IBaseLayerOptions> {\n const layerMgrMap = this.layerMgrMap || this.params.createLayers();\n\n return Object.keys(layerMgrMap).reduce<Record<string, IBaseLayerOptions>>((acc, key) => {\n acc[key] = { enable: false };\n return acc;\n }, {});\n }\n}\n",
106
+ "import { IProduct } from '../core/product';\nimport { ProductCtx } from '../types/ctx';\nimport { IProductGroupConfig } from '../types/product';\n\nexport abstract class IProductConfig<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object> {\n public productMap: Record<string, IProduct<LayerT, ProductTypeT, ModelTypeT, DataReqT>> = {};\n public products: IProduct<LayerT, ProductTypeT, ModelTypeT, DataReqT>[] = [];\n public groupConfig: IProductGroupConfig[];\n\n constructor(params: { products: IProduct<LayerT, ProductTypeT, ModelTypeT, DataReqT>[]; groupConfig: IProductGroupConfig[] }) {\n params.products.reduce((acc, product) => {\n acc[product.type as any] = product;\n return acc;\n }, this.productMap);\n\n this.groupConfig = params.groupConfig;\n\n this.products = Object.values(this.productMap);\n }\n\n public initCtx(ctx: ProductCtx<LayerT, ProductTypeT, ModelTypeT, DataReqT>) {\n Object.values(this.productMap).forEach(product => {\n product.initCtx(ctx);\n });\n }\n\n public findProduct<P = IProduct<LayerT, ProductTypeT, ModelTypeT, DataReqT>>(type: ProductTypeT): P {\n return this.productMap[type as any] as unknown as P;\n }\n\n public get firstProduct() {\n return Object.values(this.productMap)[0];\n }\n}\n",
107
+ "import { FeatureCollection, Geometry } from 'geojson';\nimport maplibregl from 'maplibre-gl';\nimport { AreaGeoJsonProperties, IAdcodeInfoVo } from '../fns';\nimport { Bounds } from '../types/map';\n\nexport type ICityOption = {\n type: 'province' | 'city' | 'county';\n adcode: string;\n region: number;\n maskTextureOptions: {\n viewportBounds: Bounds;\n };\n};\n\nexport type ICityInfo = ICityOption & {\n maskGeoJson?: FeatureCollection<Geometry, AreaGeoJsonProperties>;\n};\n\nexport abstract class ICityConfig {\n public cityList: ICityOption[];\n public boundsPadding: maplibregl.PaddingOptions;\n public isAddCityMask: boolean;\n public customCityCoordinate: Record<string, [number, number]> = {};\n\n constructor(params: { cityListOptions: ICityOption[]; boundsPadding?: maplibregl.PaddingOptions; isAddCityMask?: boolean }) {\n this.cityList = params.cityListOptions;\n this.boundsPadding = params.boundsPadding || {\n top: 0,\n bottom: 0,\n left: 0,\n right: 0,\n };\n this.isAddCityMask = params.isAddCityMask || false;\n }\n\n findCityInfo(adcodeInfoVo: IAdcodeInfoVo): ICityInfo {\n const { china, province, city, county } = adcodeInfoVo;\n\n const gb = china?.gb || province?.gb || city?.gb || county?.gb;\n\n const maskGeoJson =\n adcodeInfoVo.county?.geojson_boundary ||\n adcodeInfoVo.city?.geojson_boundary ||\n adcodeInfoVo.province?.geojson_boundary ||\n adcodeInfoVo.china?.geojson_boundary;\n\n const cityInfo = this.cityList.find(city => city.adcode === gb)!;\n\n return {\n ...cityInfo,\n maskGeoJson,\n };\n }\n}\n",
108
+ "import { SubscribeMgr } from 'iweather-lib';\nimport { debounce, isEqual, pick } from 'lodash-es';\nimport { ILayerMgr } from '../core/layerMgr';\nimport { IGisCtx } from '../types/ctx';\n\nexport class LayerMgrHub {\n private ctx!: IGisCtx;\n public subscribeMgr: SubscribeMgr = new SubscribeMgr();\n public enabledLayerMgrs: Record<string, ILayerMgr> = {};\n\n public async mount(ctx: IGisCtx) {\n this.ctx = ctx;\n const { gisStore, configStore } = ctx;\n const { map } = ctx.gisStore.getState();\n if (!map) return;\n\n // TODO 需要优化,这里不应该再创建一次allLayerMgrs\n // 重新创建allLayerMgrs\n gisStore.getState().apply({\n type: 'changeValue',\n value: {\n allLayerMgrs: configStore.getState().layerMgrConfig.params.createLayers(),\n },\n });\n\n const { allLayerMgrs } = gisStore.getState();\n\n const { dataReqOptionsConfig } = this.ctx.configStore.getState();\n\n this.subscribeMgr.add(\n this.ctx.gisStore.subscribe(\n state => {\n return {\n dataReqOptions: dataReqOptionsConfig.getDataReqOptions(state),\n allLayerOptopns: state.query.allLayerOptopns(),\n };\n },\n async (state, prevState) => {\n const allLayer = state.allLayerOptopns;\n\n const enabledLayer = gisStore.getState().query.enabledLayerOptopns();\n\n const enabledLayerMgrs = pick(allLayerMgrs, Object.keys(enabledLayer));\n\n // 管理layerMgrs的生命周期\n await Promise.all(\n Object.keys(allLayerMgrs).map(async name => {\n const layer = allLayerMgrs[name];\n const layerOptions = allLayer[name];\n layer.initCtx(ctx, name);\n layer.setEnable(layerOptions.enable);\n if (layer.enable) {\n await layer.mount(layerOptions);\n layer.setLayerOptions(layerOptions);\n } else {\n layer.unmount();\n }\n }),\n );\n\n // 检查是否重新加载数据\n if (!isEqual(state.dataReqOptions, prevState.dataReqOptions)) {\n Object.values(enabledLayerMgrs).forEach(layer => layer.loadData());\n } else {\n Object.values(enabledLayerMgrs).forEach(layer => {\n if (layer.checkIsLoadData()) {\n layer.loadData();\n }\n });\n }\n\n this.enabledLayerMgrs = enabledLayerMgrs;\n\n console.info('[enabled layerMgrs]:', this.enabledLayerMgrs);\n },\n { equalityFn: isEqual, fireImmediately: true },\n ),\n );\n\n // 监听地图移动事件\n const onBoundsChange = debounce(() => {\n Object.values(this.enabledLayerMgrs).forEach(layer => layer.boundsChange(map.getBounds()));\n }, 100);\n\n map.on('moveend', onBoundsChange);\n\n this.subscribeMgr.add(() => {\n map.off('moveend', onBoundsChange);\n });\n }\n\n public onUnmount() {\n this.subscribeMgr.dispose();\n Object.values(this.ctx.gisStore.getState().allLayerMgrs).forEach(layer => layer.unmount());\n }\n}\n",
109
+ "import { SubscribeMgr } from 'iweather-lib';\nimport { isEqual } from 'lodash-es';\nimport { IGisCtx } from '../types/ctx';\nimport { LayerMgrHub } from './hub.layerMgr';\n\nexport class TimeMgrHub {\n private ctx!: IGisCtx;\n public subscribeMgr: SubscribeMgr = new SubscribeMgr();\n\n constructor(private layerMgrHub: LayerMgrHub) {}\n\n public async mount(ctx: IGisCtx) {\n this.ctx = ctx;\n\n this.subscribeMgr.add(\n this.ctx.gisStore.subscribe(\n state => {\n const gisValue = this.ctx.gisStore.getState();\n return {\n layersData: state.layersData,\n productType: state.productType,\n playMode: state.playMode,\n dataReqOptions: this.ctx.configStore.getState().dataReqOptionsConfig.getDataReqOptions(gisValue),\n };\n },\n state => {\n const { productType, playMode } = state;\n\n const { productConfig } = this.ctx.configStore.getState();\n\n const product = productConfig.findProduct(productType!);\n\n const timeBarInfo = product.getTimeBarInfo(this.ctx.gisStore.getState());\n\n this.ctx.gisStore.getState().apply({\n type: 'changeValue',\n value: {\n timeBarInfo,\n currTm: timeBarInfo\n ? playMode === 'timing'\n ? timeBarInfo.timingTimeBar.initTime\n : timeBarInfo.frameTimeBar?.initTime\n : undefined,\n },\n });\n },\n { equalityFn: isEqual, fireImmediately: true },\n ),\n );\n\n // 订阅时间变化\n this.subscribeMgr.add(\n this.ctx.gisStore.subscribe(\n state => state.currTm,\n currTm => Object.values(this.layerMgrHub.enabledLayerMgrs).forEach(layer => layer.timeChange(currTm)),\n { equalityFn: isEqual },\n ),\n );\n\n // 监听devCustomGrayImage\n this.subscribeMgr.add(\n this.ctx.gisStore.subscribe(\n state => state.devCustomGrayImageByMercator,\n devCustomGrayImageByMercator => {\n Object.values(this.layerMgrHub.enabledLayerMgrs).forEach(layer => layer.loadData());\n },\n { equalityFn: isEqual },\n ),\n );\n }\n\n public onUnmount() {\n this.subscribeMgr.dispose();\n }\n}\n",
110
+ "import { clamp } from 'lodash-es';\n\nexport interface IData {\n beginTm: number;\n endTm: number;\n}\n\nfunction normalize(val: number, range: [number, number]) {\n const min = range[0];\n const max = range[1];\n const clampedN = clamp(val, min, max);\n const normalizedValue = (clampedN - min) / (max - min);\n return normalizedValue;\n}\n\nexport class DataFindMgr<P extends IData> {\n public isDestroyed: boolean = false;\n public data: P[] = [];\n public curr:\n | {\n data1: P | undefined;\n data2: P | undefined;\n p: number;\n }\n | undefined = undefined;\n\n setData(data: P[]) {\n this.data = data.sort((e1, e2) => e1.beginTm - e2.beginTm);\n }\n\n addData(data: P[]) {\n this.data = [...this.data, ...data].sort((e1, e2) => e1.beginTm - e2.beginTm);\n }\n\n first() {\n return this.data[0];\n }\n\n find(time: number) {\n const index = this.data.findLastIndex(e => time >= e.beginTm);\n if (index === -1) {\n this.curr = {\n data1: undefined,\n data2: undefined,\n p: 0,\n };\n } else {\n const data1 = this.data[index];\n const data2 = this.data[index + 1];\n const p = normalize(time, [data1.beginTm, data1.endTm]);\n this.curr = { data1, data2, p };\n }\n return this.curr;\n }\n\n public isEmpty() {\n return this.data.length === 0;\n }\n\n public destroy() {\n this.isDestroyed = true;\n this.data = [];\n }\n}\n",
111
+ "import { AbortControllersMgr } from 'iweather-lib';\nimport { LngLatBounds } from 'maplibre-gl';\nimport { IGisCtx } from '../types/ctx';\n\nexport interface IBoundsMaxValue {\n lon: number;\n lat: number;\n value: number;\n}\n\nexport abstract class DataLoaderMgr<DataT = {}, DataResT = {}> {\n protected abortControllersMgr = new AbortControllersMgr();\n\n protected setDataRes(ctx: IGisCtx<any, any, any, any>, dataRes: Partial<DataResT>) {\n ctx.gisStore.getState().apply({ type: 'changeValue', value: dataRes });\n }\n\n protected onBeforeLoadData(ctx: IGisCtx<any, any, any, any>) {\n return;\n }\n\n public async loadData(ctx: IGisCtx<any, any, any, any>): Promise<DataT> {\n this.onBeforeLoadData(ctx);\n const data = await this.onLoadData(ctx);\n const dataRes = await this.onChangeDataRes(ctx, data);\n if (dataRes) {\n this.setDataRes(ctx, dataRes);\n }\n return data;\n }\n\n public abort() {\n this.abortControllersMgr.abort();\n }\n\n public abstract onLoadData(ctx: IGisCtx<any, any, any, any>): Promise<DataT>;\n\n public async onChangeDataRes(ctx: IGisCtx<any, any, any, any>, data: DataT): Promise<Partial<DataResT> | undefined> {\n return;\n }\n\n public async loadMaxValue(ctx: IGisCtx<any, any, any, any>, bounds: LngLatBounds): Promise<IBoundsMaxValue | null> {\n return null;\n }\n}\n",
112
+ "import { AbortControllersMgr, SubscribeMgr } from 'iweather-lib';\nimport { debounce, isEqual } from 'lodash-es';\nimport { LngLatBounds } from 'maplibre-gl';\nimport { IGisValue, ITimingData } from '../store/gisStore';\nimport { IGisCtx } from '../types/ctx';\nimport { IBaseLayerOptions } from '../types/layerOptions';\nimport { PlayStatus } from '../types/map';\nimport { DataFindMgr, IData } from './dataFindMgr';\nimport { DataLoaderMgr, IBoundsMaxValue } from './dataLoaderMgr';\n\nexport interface LayerMgrProps<DataT = any> {\n dataLoaderMgr?: DataLoaderMgr<DataT>;\n}\n\nexport abstract class ILayerMgr<DataT = any, LayerOptionsT extends IBaseLayerOptions = IBaseLayerOptions> {\n public enable: boolean = true;\n public isMounted: boolean = false;\n public abstract onIsLoadData(layerOptions: LayerOptionsT, prevLayerOptions?: LayerOptionsT): boolean;\n public abstract onLayerOptionsChange(layerOptions: LayerOptionsT, prevLayerOptions?: LayerOptionsT): void;\n public abstract onMount(layerOptions: LayerOptionsT): Promise<void>;\n public abstract onUnmount(): void;\n public abstract onTimeChange(time: number): void;\n public abstract onInitData(data: DataT): Promise<void>;\n public abstract onTimingData(data: DataT): ITimingData[];\n public data: DataT | undefined;\n public layerOptions?: LayerOptionsT;\n public prevLayerOptions?: LayerOptionsT;\n public ctx!: IGisCtx;\n public layerName?: string;\n protected subscribeMgr = SubscribeMgr.create();\n private isReload: boolean = false;\n protected abortControllersMgr = new AbortControllersMgr();\n private dataFindMgrs: DataFindMgr<IData>[] = [];\n\n constructor(protected props: LayerMgrProps<DataT>) {}\n\n public initCtx(ctx: IGisCtx, layerName?: string) {\n this.ctx = ctx;\n this.layerName = layerName;\n return this;\n }\n\n public getLayerInfo(layerOptions: LayerOptionsT): string {\n return '';\n }\n\n public get dataLoaderMgr() {\n return this.props.dataLoaderMgr;\n }\n\n public get map() {\n return this.ctx.gisStore.getState().map!;\n }\n\n public getGisValue<T>(): IGisValue<T> {\n return this.ctx.gisStore.getState() as unknown as IGisValue<T>;\n }\n\n public setLayerOptions(layerOptions: LayerOptionsT) {\n this.prevLayerOptions = this.layerOptions;\n\n this.layerOptions = layerOptions;\n\n if (!this.enable) return;\n if (!this.isMounted) return;\n if (!this.map) return;\n if (!this.ctx.gisStore.getState().mapIsLoaded) return;\n if (isEqual(layerOptions, this.prevLayerOptions)) return;\n\n this.onLayerOptionsChange(layerOptions, this.prevLayerOptions);\n }\n\n public checkIsLoadData(): boolean {\n if (!this.layerOptions) return false;\n return this.onIsLoadData(this.layerOptions, this.prevLayerOptions);\n }\n\n public async mount(layerOptions: LayerOptionsT) {\n if (!this.enable) return this;\n if (this.isMounted) return this;\n if (!this.map) return this;\n if (!this.ctx.gisStore.getState().mapIsLoaded) return this;\n await this.onMount(layerOptions);\n this.isMounted = true;\n return this;\n }\n\n public static toLayerId(name: string) {\n return `${name}-layer`;\n }\n\n public toLayerId(name: string, suffix: string = '') {\n if (suffix) {\n return `${name}-${suffix}-layer`;\n }\n return `${name}-layer`;\n }\n\n public toSourceId(name: string) {\n return `${name}-source`;\n }\n\n protected setLayerVisible(id: string, visible?: boolean, isToLayerId = true) {\n const layerId = isToLayerId ? this.toLayerId(id) : id;\n if (this.map && !!this.map.getLayer(layerId)) {\n this.map.setLayoutProperty(layerId, 'visibility', visible ? 'visible' : 'none');\n }\n }\n\n public isLayerVisible(id: string, isToLayerId = true) {\n const layerId = isToLayerId ? this.toLayerId(id) : id;\n return this.map?.getLayoutProperty(layerId, 'visibility') === 'visible';\n }\n\n protected getBeforeLayerId(beforeId?: string) {\n return beforeId && !!this.map.getLayer(beforeId) ? beforeId : undefined;\n }\n\n protected removeLayerAndSource(id: string) {\n this.removeMapLayer(this.toLayerId(id));\n this.removeMapSource(this.toSourceId(id));\n }\n\n protected removeMapLayer(id: string) {\n try {\n if (this.map.getLayer(id)) {\n this.map.removeLayer(id);\n }\n } catch (error) {\n console.error('[removeMapLayer]', error);\n }\n }\n\n protected removeMapSource(id: string) {\n try {\n if (this.map.getSource(id)) {\n this.map.removeSource(id);\n }\n } catch (error) {\n console.error('[removeMapSource]', error);\n }\n }\n\n protected addMapLayer<T>(layer: T, beforeId?: string) {\n this.map.addLayer(layer as any, this.getBeforeLayerId(beforeId));\n return layer;\n }\n\n public unmount() {\n if (!this.isMounted) return;\n this.isMounted = false;\n this.clear();\n this.onUnmount();\n this.clearStoreData();\n this.layerOptions = undefined;\n this.dataLoaderMgr?.abort();\n this.abortControllersMgr.abort();\n this.subscribeMgr.dispose();\n }\n\n public timeChange(time?: number) {\n if (!this.enable) return;\n if (!this.map) return;\n if (!this.isMounted) return;\n\n const currTime = time ?? this.ctx.gisStore.getState().currTm;\n if (currTime) {\n this.onTimeChange(currTime);\n }\n }\n\n public playStateChange(state: PlayStatus) {\n if (!this.enable) return;\n this.onPlayStateChange(state);\n }\n\n public onPlayStateChange(state: PlayStatus): void {}\n\n public saveDataToStore(data: DataT) {\n if (!this.layerName) return;\n const timingData = this.onTimingData(data);\n this.ctx.gisStore.getState().apply({ type: 'setLayersData', name: this.layerName, data: timingData });\n }\n\n public clearStoreData() {\n if (!this.layerName) return;\n this.ctx.gisStore.getState().apply({ type: 'setLayersData', name: this.layerName, data: undefined });\n }\n\n public async initData(data: DataT) {\n if (!this.enable) return;\n if (!this.isMounted) return;\n if (!this.map) return;\n this.data = data;\n this.saveDataToStore(data);\n await this.onInitData(data);\n this.timeChange();\n }\n\n public beforeReloadData() {}\n\n public async loadData() {\n if (!this.enable) return;\n if (!this.isMounted) return;\n if (!this.dataLoaderMgr) return;\n\n this.beforeReloadData();\n\n this.clear();\n\n this.dataLoaderMgr.loadData(this.ctx).then(data => {\n this.initData(data);\n });\n\n if (this.isReload) {\n this.reloadMaxValue();\n }\n\n if (this.isReload === false) {\n this.isReload = true;\n }\n }\n\n public boundsChange(bounds: LngLatBounds) {\n this.reloadMaxValue();\n }\n\n public reloadMaxValue = debounce(async () => {\n if (!this.enable) return;\n if (!this.isMounted) return;\n if (!this.map) return;\n if (!this.dataLoaderMgr) return;\n\n const maxValue = await this.dataLoaderMgr.loadMaxValue(this.ctx, this.map.getBounds());\n if (maxValue) {\n this.onMaxValueChange(maxValue);\n }\n }, 300);\n\n public onMaxValueChange(maxValue: IBoundsMaxValue) {}\n\n public clear() {\n this.onClear();\n this.destroyDataFindMgrs();\n this.timeChange();\n }\n\n public onClear(): void {}\n\n public createDataFindMgr<P extends IData>(): DataFindMgr<P> {\n const dataFindMgr = new DataFindMgr<P>();\n this.dataFindMgrs.push(dataFindMgr);\n return dataFindMgr;\n }\n\n public destroyDataFindMgrs() {\n this.dataFindMgrs.forEach(dataFindMgr => dataFindMgr.destroy());\n }\n\n public setEnable(enable: boolean) {\n this.enable = enable;\n }\n}\n",
113
+ "import { format } from 'date-fns';\nimport { getGisValue } from '../store/defValue';\nimport { IGisStore, IGisStyleOptions, IGisValue } from '../store/gisStore';\nimport { ProductCtx } from '../types/ctx';\nimport { ITimeBarInfo, StepRangeUnit } from '../types/product';\n\nexport interface IGisValueChangedCtx<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object> {\n gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n prevGisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n gisStore: IGisStore<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n}\n\nexport interface IDataReqChangedCtx<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object> {\n dataReqOptions: DataReqT;\n prevDataReqOptions?: DataReqT;\n gisStore: IGisStore<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n}\n\nexport abstract class IProduct<LayerT = object, ProductTypeT = string, ModelTypeT = string, DataReqT = object> {\n public abstract getGroupName(): string[];\n\n public abstract getName(): string;\n\n public abstract getColorPaletteView(): any | null;\n\n public abstract getConfig(): IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n\n public abstract getDisplayName(gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>): string;\n\n public abstract getModelDisplayName(gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>): string;\n\n public abstract getDisplayTime(gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>): string;\n\n public abstract getTimeBarInfo(gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>): ITimeBarInfo | undefined;\n\n public abstract getPublishHourOptions(gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>): number[];\n\n public abstract getPublishMinuteOptions(gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>): number[];\n\n public abstract getStepRangeOptions(gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>): number[];\n\n public abstract getFetchAfterStepRangeOptions(gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>): number[];\n\n public abstract getStepRangeUnit(): StepRangeUnit;\n\n public _ctx?: ProductCtx<LayerT, ProductTypeT, ModelTypeT, DataReqT>;\n\n constructor(public type: ProductTypeT) {}\n\n /**\n * 获取更新GIS值的副作用\n * 在修改参数时会调用该函数,可以返回需要附带修改的其他参数\n * @param updateValue 更新值\n * @param currValue 当前值\n * @returns 更新值\n */\n public getUpdateGisValueEffect(\n updateValue: Partial<IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>>,\n currValue?: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>,\n ): Partial<IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>> | undefined {\n return;\n }\n\n public getDisplayLayerInfos(gisValue: IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>): string[] {\n return [];\n }\n\n public getSubGroupName(): string {\n return '';\n }\n\n public supportedForecastModels(): ModelTypeT[] {\n return [];\n }\n\n public isSupportedMultiModelContrast(): boolean {\n return this.supportedForecastModels().length > 1;\n }\n\n public getDefConfig(params?: {\n gisStyleOptions?: Partial<IGisStyleOptions>;\n layerOptions?: Partial<LayerT>;\n }): IGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT> {\n return getGisValue<LayerT, ProductTypeT, ModelTypeT, DataReqT>(this.ctx, {\n layerOptions: {\n ...params?.layerOptions,\n },\n gisStyleOptions: {\n ...params?.gisStyleOptions,\n },\n });\n }\n\n public initCtx(ctx: ProductCtx<LayerT, ProductTypeT, ModelTypeT, DataReqT>) {\n this._ctx = ctx;\n }\n\n public get ctx() {\n if (!this._ctx) {\n throw new Error('ctx is not initialized');\n }\n return this._ctx;\n }\n\n public formatCurrTime(currTm: number): string | null {\n return format(new Date(currTm), 'yyyy/MM/dd HH:mm');\n }\n\n public formatTimeBar(tm: number) {\n const hours = new Date(tm).getHours();\n return {\n value: format(new Date(tm), 'M/d HH:mm'),\n highlight: hours === 8,\n };\n }\n\n public isNew(): boolean {\n return false;\n }\n}\n",
114
+ "import { Bounds, IMap, ProjectionType } from '../types/map';\n\nexport function mapAction(\n map: IMap,\n op:\n | { type: 'setProjectionType'; projectionType: ProjectionType }\n | { type: 'setShowSky'; showSky?: boolean }\n | { type: 'disableZoom'; isDisable?: boolean }\n | { type: 'disableMove'; isDisable?: boolean }\n | {\n type: 'setBaseState';\n zoom?: number;\n center?: [lng: number, lat: number];\n pitch?: number;\n bearing?: number;\n maxZoom?: number;\n minZoom?: number;\n }\n | { type: 'flyTo'; zoom?: number; center?: [lng: number, lat: number]; pitch?: number; bearing?: number; duration?: number }\n | { type: 'fitBounds'; bounds?: Bounds; duration?: number },\n) {\n // console.info('[mapAction OP]:', op);\n if (!map) return;\n\n switch (op.type) {\n case 'setProjectionType':\n map.setProjection({ type: op.projectionType });\n break;\n case 'setShowSky':\n if (op.showSky) {\n map.setSky({\n 'atmosphere-blend': ['interpolate', ['linear'], ['zoom'], 0, 1, 2, 0, 7, 0],\n });\n map.setLight({ anchor: 'map', position: [1.5, 90, 80] });\n } else {\n map.setSky(undefined as any);\n map.setLight(undefined as any);\n }\n break;\n case 'disableZoom':\n if (op.isDisable) {\n map.scrollZoom.disable();\n } else {\n map.scrollZoom.enable();\n }\n break;\n case 'disableMove':\n if (op.isDisable) {\n map.dragPan.disable();\n } else {\n map.dragPan.enable();\n }\n break;\n case 'setBaseState': {\n op.center !== undefined && map.setCenter(op.center);\n op.zoom !== undefined && map.setZoom(op.zoom);\n op.maxZoom !== undefined && map.setMaxZoom(op.maxZoom);\n op.minZoom !== undefined && map.setMinZoom(op.minZoom);\n op.bearing !== undefined && map.setBearing(op.bearing);\n op.pitch !== undefined && map.setPitch(op.pitch);\n break;\n }\n case 'flyTo':\n if (op.zoom !== undefined && op.center !== undefined && op.pitch !== undefined && op.bearing !== undefined) {\n map.flyTo(\n {\n zoom: op.zoom,\n center: op.center,\n pitch: op.pitch,\n bearing: op.bearing,\n },\n { animate: !!op.duration, duration: op.duration ?? 0 },\n );\n }\n break;\n case 'fitBounds':\n if (op.bounds) {\n map.fitBounds(op.bounds, { animate: !!op.duration, duration: op.duration ?? 0 });\n }\n break;\n }\n}\n",
115
+ "import maplibregl from 'maplibre-gl';\nimport { IGisCtx } from '../types/ctx';\n\nexport function createMap(mapContainer: string | HTMLElement, ctx: IGisCtx) {\n const { center, zoom, pitch, bearing, bounds } = ctx.gisStore.getState();\n\n const map = new maplibregl.Map({\n container: mapContainer,\n style: {\n version: 8,\n glyphs: '/huishang/assets/map/glyphs/{fontstack}/{range}.pbf',\n sources: {},\n layers: [],\n },\n center,\n zoom,\n pitch,\n bearing,\n bounds,\n maxPitch: 80,\n maplibreLogo: false,\n canvasContextAttributes: {\n preserveDrawingBuffer: true,\n },\n });\n\n return map;\n}\n",
116
+ "import mitt, { Emitter } from 'mitt';\nimport { IMapState } from '../types/map';\n\nexport type MapSyncEvent = {\n syncMapMove: {\n fromMapGroup?: string;\n fromMapId: string;\n state: IMapState;\n };\n syncTime: {\n fromMapGroup?: string;\n fromMapId: string;\n currTm: number;\n };\n};\n\nexport const mapSyncEvent: Emitter<MapSyncEvent> = mitt<MapSyncEvent>();\n",
117
+ "import { IMap, IMapState } from '../types/map';\n\nexport function getMapState(map: IMap): IMapState {\n const pitch = map.getPitch();\n const bearing = map.getBearing();\n const bounds = map.getBounds();\n const center = map.getCenter().toArray();\n const zoom = map.getZoom();\n\n return {\n pitch,\n bearing,\n zoom,\n bounds: [\n Number(bounds.getWest().toFixed(6)),\n Number(bounds.getSouth().toFixed(6)),\n Number(bounds.getEast().toFixed(6)),\n Number(bounds.getNorth().toFixed(6)),\n ],\n center,\n };\n}\n",
118
+ "import { IGisCtx } from '../types/ctx';\nimport { getMapState } from './getMapState';\n\n/**\n * 对map进行截图\n * @param gisStore\n * @returns\n */\nexport function mapScreenshotHandler(ctx: IGisCtx) {\n const { gisStore } = ctx;\n const { map } = gisStore.getState();\n if (!map) return;\n\n const listener = () => {\n if (!map) return;\n\n const { enableScreenshot, screenshot } = gisStore.getState();\n const { bounds } = getMapState(map);\n\n if (!bounds) return;\n if (!enableScreenshot) return;\n\n const imageData = map.getCanvas().toDataURL('image/jpeg', 0.5);\n if (screenshot && !screenshot.startsWith('data:image')) {\n console.info('检测截图:', screenshot);\n try {\n const fileNameStr = screenshot.substring(screenshot.lastIndexOf('/') + 1).split('_')[1];\n const urlBoundsStr = fileNameStr.substring(0, fileNameStr.lastIndexOf('.'));\n if (urlBoundsStr === bounds.map(e => e.toFixed(2)).join('|')) {\n console.info('截图未变化,不进行截图修改:', screenshot);\n return;\n }\n } catch (error) {\n console.error('截图解析错误:', screenshot);\n return;\n }\n }\n\n gisStore.getState().apply({ type: 'changeValue', value: { screenshot: imageData } });\n };\n\n map.on('idle', listener);\n return () => {\n map.off('idle', listener);\n };\n}\n",
119
+ "import { IGisCtx } from '../types/ctx';\nimport { getMapState } from './getMapState';\nimport { MapSyncEvent, mapSyncEvent } from './mapEvent';\n\n/**\n * 多个map同步状态\n * @param gisStore\n * @returns\n */\nexport function mapSyncMoveHandler(ctx: IGisCtx) {\n const { gisStore } = ctx;\n const { mapId, map, mapGroup } = gisStore.getState();\n if (!map) return;\n\n let disableMove = false;\n\n const listener = () => {\n if (!map) return;\n if (disableMove) return;\n if (!gisStore.getState().enableMapSync) return;\n mapSyncEvent.emit('syncMapMove', {\n fromMapGroup: mapGroup,\n fromMapId: mapId,\n state: getMapState(map!),\n });\n };\n\n const syncMapMoveListener = (event: MapSyncEvent['syncMapMove']) => {\n if (event.fromMapId === mapId) return;\n if (!event.fromMapGroup || event.fromMapGroup !== mapGroup) return;\n if (!gisStore.getState().enableMapSync) return;\n disableMove = true;\n map!.jumpTo({\n center: event.state.center,\n zoom: event.state.zoom,\n bearing: event.state.bearing,\n pitch: event.state.pitch,\n });\n disableMove = false;\n };\n\n map.on('move', listener);\n mapSyncEvent.on('syncMapMove', syncMapMoveListener);\n\n return () => {\n map.off('move', listener);\n mapSyncEvent.off('syncMapMove', syncMapMoveListener);\n };\n}\n",
120
+ "import { isEqual } from 'lodash-es';\nimport { IGisCtx } from '../types/ctx';\nimport { MapSyncEvent, mapSyncEvent } from './mapEvent';\n\n/**\n * 多个map同步时间\n * @param gisStore\n * @returns\n */\nexport function mapSyncTimeHandler(ctx: IGisCtx) {\n const { gisStore, configStore } = ctx;\n const { mapId, map, mapGroup } = gisStore.getState();\n if (!map) return;\n\n let disableSync = false;\n\n const unsubscribeFun = gisStore.subscribe(\n state => state.currTm,\n currTm => {\n if (disableSync) return;\n if (!gisStore.getState().enableMapSyncTime) return;\n if (!currTm) return;\n mapSyncEvent.emit('syncTime', {\n fromMapGroup: mapGroup,\n fromMapId: mapId,\n currTm,\n });\n },\n { equalityFn: isEqual },\n );\n\n const syncTimeListener = (event: MapSyncEvent['syncTime']) => {\n if (event.fromMapId === mapId) return;\n if (!event.fromMapGroup || event.fromMapGroup !== mapGroup) return;\n if (!gisStore.getState().enableMapSyncTime) return;\n if (!configStore.getState().dataReqOptionsConfig.enableTimeSync(gisStore.getState())) return;\n\n disableSync = true;\n gisStore.getState().apply({ type: 'changeValue', value: { currTm: event.currTm } });\n disableSync = false;\n };\n\n mapSyncEvent.on('syncTime', syncTimeListener);\n\n return () => {\n mapSyncEvent.off('syncTime', syncTimeListener);\n unsubscribeFun();\n };\n}\n",
121
+ "import { debounce } from 'lodash-es';\nimport { IGisCtx } from '../types/ctx';\nimport { getMapState } from './getMapState';\nimport { mapAction } from './mapAction';\n\n/**\n * 将map的状态同步到gisStore中\n * @param gisStore\n * @returns\n */\nexport function syncMapStateToStoreHandler(ctx: IGisCtx) {\n const { gisStore } = ctx;\n const { map } = gisStore.getState();\n if (!map) return;\n\n // resize的时候不要触发idle事件\n let isResize = false;\n const onResizeEndListener = debounce(() => {\n isResize = false;\n }, 1000);\n\n // 状态变更事件\n const onChangeListener = debounce(() => {\n if (isResize) return;\n gisStore.getState().apply({ type: 'changeValue', value: { mapStateToStoreSyncing: true } });\n gisStore.getState().apply({ type: 'changeValue', value: getMapState(map) });\n gisStore.getState().apply({ type: 'changeValue', value: { mapStateToStoreSyncing: false } });\n }, 500);\n map.on('zoomend', onChangeListener);\n map.on('moveend', onChangeListener);\n map.on('pitchend', onChangeListener);\n\n // 当浏览器大小发生变化时,重新设置bounds\n // 否则bounds会发生偏移\n map.on('resize', () => {\n isResize = true;\n mapAction(map, { type: 'fitBounds', bounds: gisStore.getState().bounds });\n onResizeEndListener();\n });\n}\n",
122
+ "import { isEqual } from 'lodash-es';\nimport { IGisCtx } from '../types/ctx';\nimport { mapAction } from './mapAction';\n\n/**\n * 将gisStore的状态同步设置到map中\n * @param gisStore\n * @returns\n */\nexport function syncStoreStateToMapHandler(ctx: IGisCtx) {\n const { gisStore } = ctx;\n const { map } = gisStore.getState();\n\n gisStore.subscribe(\n state => state.projectionType,\n projectionType => {\n if (gisStore.getState().mapStateToStoreSyncing) return;\n mapAction(map!, { type: 'setProjectionType', projectionType });\n },\n { equalityFn: isEqual },\n );\n\n gisStore.subscribe(\n state => state.showSky,\n showSky => {\n if (gisStore.getState().mapStateToStoreSyncing) return;\n mapAction(map!, { type: 'setShowSky', showSky });\n },\n { equalityFn: isEqual },\n );\n\n gisStore.subscribe(\n state => state.disableZoom,\n disableZoom => {\n if (gisStore.getState().mapStateToStoreSyncing) return;\n mapAction(map!, { type: 'disableZoom', isDisable: disableZoom });\n },\n { equalityFn: isEqual },\n );\n\n gisStore.subscribe(\n state => state.bounds,\n bounds => {\n if (gisStore.getState().mapStateToStoreSyncing) return;\n mapAction(map!, { type: 'fitBounds', bounds, duration: 1000 });\n },\n { equalityFn: isEqual },\n );\n}\n",
123
+ "import { IGisCtx } from '../types/ctx';\nimport { IMap } from '../types/map';\nimport { mapAction } from './mapAction';\n\nexport function initMapState(map: IMap, ctx: IGisCtx) {\n const { gisStore } = ctx;\n\n setTimeout(() => {\n map.resize();\n }, 1);\n\n const {\n showSky,\n projectionType,\n disableZoom,\n disableMove,\n boundsPadding,\n bounds,\n maxZoom,\n minZoom,\n mapBackgroundColor,\n renderWorldCopies,\n boundsLockMinZoom,\n } = gisStore.getState();\n\n map.setMaxZoom(maxZoom);\n\n map.setMinZoom(minZoom);\n\n mapAction(map, { type: 'setShowSky', showSky });\n\n mapAction(map, { type: 'disableZoom', isDisable: disableZoom });\n\n mapAction(map, { type: 'disableMove', isDisable: disableMove });\n\n mapAction(map, { type: 'setProjectionType', projectionType });\n\n map.setRenderWorldCopies(renderWorldCopies);\n\n if (bounds) {\n map.fitBounds(bounds, { animate: false, duration: 0, padding: boundsPadding });\n }\n\n if (boundsLockMinZoom && bounds) {\n map.setMinZoom(map.cameraForBounds(bounds, { padding: boundsPadding })?.zoom);\n }\n\n map.setStyle({\n ...map.getStyle(),\n layers: [\n {\n id: 'background',\n type: 'background',\n layout: {\n visibility: 'visible',\n },\n paint: {\n 'background-color': mapBackgroundColor || 'transparent',\n 'background-opacity': 1,\n },\n },\n ],\n });\n}\n",
124
+ "import maplibregl, { LngLat } from 'maplibre-gl';\n\nexport class MarkerMgr {\n private infoMarker: maplibregl.Marker | null = null;\n private infoMarkerEl: HTMLDivElement | null = null;\n\n public static map: Record<string, MarkerMgr> = {};\n\n public static getInstance(id: string) {\n if (!MarkerMgr.map[id]) {\n MarkerMgr.map[id] = new MarkerMgr();\n }\n return MarkerMgr.map[id];\n }\n\n constructor() {\n this.infoMarkerEl = document.createElement('div');\n this.infoMarkerEl.className = 'hidden';\n this.infoMarker = new maplibregl.Marker({ element: this.infoMarkerEl });\n }\n\n public hide(map: maplibregl.Map) {\n try {\n this.infoMarker?.removeClassName('visible');\n this.infoMarker?.addClassName('invisible');\n map.getCanvas().style.cursor = 'grab';\n } catch (error) {\n console.info('MarkerMgr hide error');\n }\n }\n\n public show(map: maplibregl.Map, params: { lngLat: LngLat; html: string }) {\n try {\n this.infoMarker!.setLngLat(params.lngLat).addTo(map);\n this.infoMarker!.removeClassName('invisible');\n this.infoMarker!.addClassName('visible');\n this.infoMarkerEl!.innerHTML = params.html;\n map.getCanvas().style.cursor = 'pointer';\n } catch (error) {\n console.info('MarkerMgr show error');\n }\n }\n\n public setEnable(enable: boolean) {\n if (enable) {\n this.infoMarker!.removeClassName('hidden');\n } else {\n this.infoMarker!.addClassName('hidden');\n }\n }\n}\n",
125
+ "import maplibregl from 'maplibre-gl';\n\nexport class HoverMarker {\n private static timer: NodeJS.Timeout | null = null;\n private static infoMarker: maplibregl.Marker;\n private static infoMarkerEl: HTMLDivElement;\n\n public static hide(map: maplibregl.Map) {\n if (this.timer) clearTimeout(this.timer);\n\n this.timer = setTimeout(() => {\n HoverMarker.infoMarker.removeClassName('marker_visible');\n this.timer = null;\n map.getCanvas().style.cursor = 'grab';\n }, 300);\n }\n\n public static show(map: maplibregl.Map, params: { lng: number; lat: number; html: string }) {\n if (this.timer) clearTimeout(this.timer);\n\n if (!HoverMarker.infoMarker) {\n HoverMarker.infoMarkerEl = document.createElement('div');\n HoverMarker.infoMarkerEl.className = 'marker font-[JinBuTi]';\n HoverMarker.infoMarker = new maplibregl.Marker({ element: HoverMarker.infoMarkerEl });\n }\n\n const { lng, lat } = params;\n this.infoMarker.setLngLat({ lat, lng }).addTo(map).addClassName('marker_visible');\n this.infoMarkerEl.innerHTML = params.html;\n map.getCanvas().style.cursor = 'pointer';\n }\n}\n",
126
+ "import { isEqual } from 'lodash-es';\nimport { IGisCtx } from '../types/ctx';\nimport { mapAction } from './mapAction';\n\nlet idleTimeout: NodeJS.Timeout | null = null;\nlet enable = false;\nlet mapIsAutoRotation = false;\nconst ROTATION_SPEED = 0.1;\n\nfunction run(ctx: IGisCtx) {\n const { gisStore } = ctx;\n const { map } = gisStore.getState();\n if (mapIsAutoRotation && map) {\n const center = map.getCenter();\n map.panTo([center.lng + ROTATION_SPEED, center.lat], { animate: false });\n }\n requestAnimationFrame(() => run(ctx));\n}\n\nexport function mapAutoRotation(ctx: IGisCtx) {\n const { gisStore } = ctx;\n const map = gisStore.getState().map;\n if (!map) throw new Error('map is not found');\n\n // 开始自动旋转\n const startRotation = () => {\n const { autoRotation } = gisStore.getState();\n\n if (!autoRotation) return;\n if (autoRotation.bounds) {\n mapAction(map, { type: 'fitBounds', bounds: autoRotation.bounds, duration: 500 });\n } else if (autoRotation.pos) {\n mapAction(map, { type: 'flyTo', center: autoRotation.pos.center, zoom: autoRotation.pos.zoom, duration: 500 });\n }\n\n setTimeout(() => {\n if (enable) {\n mapIsAutoRotation = true;\n }\n }, 500);\n };\n\n // 停止自动旋转\n const stopRotation = () => {\n if (idleTimeout) clearTimeout(idleTimeout);\n mapIsAutoRotation = false;\n };\n\n // 重置空闲计时器\n const resetIdleTimer = () => {\n const speed = gisStore.getState().autoRotation?.speed;\n if (!speed) return;\n\n if (idleTimeout) clearTimeout(idleTimeout);\n idleTimeout = setTimeout(() => {\n if (enable) {\n startRotation();\n }\n }, speed);\n };\n\n map.on('dragend', resetIdleTimer);\n map.on('mouseup', resetIdleTimer);\n map.on('zoomend', resetIdleTimer);\n map.on('touchend', resetIdleTimer);\n map.on('mousedown', stopRotation);\n map.on('dragstart', stopRotation);\n map.on('touchstart', stopRotation);\n map.on('wheel', stopRotation);\n\n gisStore.subscribe(\n state => state.autoRotation?.enable && state.projectionType === 'globe',\n enableAutoRotation => {\n if (!enableAutoRotation) {\n enable = false;\n stopRotation();\n } else {\n enable = true;\n startRotation();\n }\n },\n { fireImmediately: true, equalityFn: isEqual },\n );\n\n run(ctx);\n}\n"
127
+ ],
128
+ "mappings": "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,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CAAE,EAC5C,CAAE,MAAO,IAAK,MAAO,EAAY,SAAS,CA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",
129
+ "debugId": "F215345DFCB9E2FA64756E2164756E21",
130
+ "names": []
131
+ }