@navaramap/three 0.0.0

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 (350) hide show
  1. package/LICENSE +8 -0
  2. package/dist/assets/atmosphere/README.md +1 -0
  3. package/dist/assets/atmosphere/higher_order_scattering.bin +0 -0
  4. package/dist/assets/atmosphere/higher_order_scattering.exr +0 -0
  5. package/dist/assets/atmosphere/irradiance.bin +0 -0
  6. package/dist/assets/atmosphere/irradiance.exr +0 -0
  7. package/dist/assets/atmosphere/scattering.bin +0 -0
  8. package/dist/assets/atmosphere/scattering.exr +0 -0
  9. package/dist/assets/atmosphere/single_mie_scattering.bin +0 -0
  10. package/dist/assets/atmosphere/single_mie_scattering.exr +0 -0
  11. package/dist/assets/atmosphere/stars.bin +0 -0
  12. package/dist/assets/atmosphere/transmittance.bin +0 -0
  13. package/dist/assets/atmosphere/transmittance.exr +0 -0
  14. package/dist/assets/cloud/README.md +1 -0
  15. package/dist/assets/cloud/local_weather.png +0 -0
  16. package/dist/assets/cloud/shape.bin +1 -0
  17. package/dist/assets/cloud/shape_detail.bin +1 -0
  18. package/dist/assets/cloud/turbulence.png +0 -0
  19. package/dist/assets/fontWorker-CEJEfRpb.js +2 -0
  20. package/dist/assets/fontWorker-CEJEfRpb.js.map +1 -0
  21. package/dist/assets/index-BUB-ijMO.js +12 -0
  22. package/dist/assets/index-BUB-ijMO.js.map +1 -0
  23. package/dist/assets/navara_wasm_font_worker_bg-665OLxjy.wasm +0 -0
  24. package/dist/assets/navara_wasm_worker_bg-BXhKC5bE.wasm +0 -0
  25. package/dist/assets/noise/README.md +1 -0
  26. package/dist/assets/noise/stbn.bin +0 -0
  27. package/dist/assets/water/README.md +3 -0
  28. package/dist/assets/water/waternormals.jpg +0 -0
  29. package/dist/index.d.ts +10114 -0
  30. package/dist/index.js +34481 -0
  31. package/dist/index.js.map +1 -0
  32. package/dist/index.umd.cjs +6345 -0
  33. package/dist/index.umd.cjs.map +1 -0
  34. package/package.json +95 -0
  35. package/src/Color.ts +111 -0
  36. package/src/ShadowMapViewers.ts +49 -0
  37. package/src/atmosphere.test.ts +76 -0
  38. package/src/atmosphere.ts +364 -0
  39. package/src/bufferView.ts +90 -0
  40. package/src/camera.ts +182 -0
  41. package/src/concurrency.ts +15 -0
  42. package/src/constants/assets.ts +30 -0
  43. package/src/constants/decoder.ts +7 -0
  44. package/src/constants/index.ts +2 -0
  45. package/src/core/BaseDesc.ts +142 -0
  46. package/src/core/BaseHandle.ts +126 -0
  47. package/src/core/DescRegistry.ts +88 -0
  48. package/src/core/EffectDesc.ts +343 -0
  49. package/src/core/EffectDescRegistry.ts +31 -0
  50. package/src/core/InstancedMeshDesc.ts +413 -0
  51. package/src/core/LightDesc.ts +216 -0
  52. package/src/core/LightDescRegistry.ts +32 -0
  53. package/src/core/MeshDesc.ts +457 -0
  54. package/src/core/MeshDescRegistry.ts +32 -0
  55. package/src/core/MeshDescWithSelectiveEffect.ts +129 -0
  56. package/src/core/Registries.ts +59 -0
  57. package/src/core/SelectiveEffectRegistry.ts +90 -0
  58. package/src/core/ViewContext.ts +235 -0
  59. package/src/core/errors.ts +16 -0
  60. package/src/core/index.ts +50 -0
  61. package/src/device.ts +414 -0
  62. package/src/effects/CustomEffectPass.ts +28 -0
  63. package/src/effects/copy.ts +10 -0
  64. package/src/effects/effect.ts +87 -0
  65. package/src/effects/index.ts +4 -0
  66. package/src/effects/render.ts +10 -0
  67. package/src/evaluations/FeatureEvaluator.ts +529 -0
  68. package/src/evaluations/index.ts +1 -0
  69. package/src/event/HillshadeContext.test.ts +232 -0
  70. package/src/event/HillshadeContext.ts +299 -0
  71. package/src/event/context.ts +279 -0
  72. package/src/event/feature.ts +357 -0
  73. package/src/event/featureEvent.ts +81 -0
  74. package/src/event/features/billboard.ts +30 -0
  75. package/src/event/features/model.ts +192 -0
  76. package/src/event/features/modelGpuBytes.test.ts +69 -0
  77. package/src/event/features/modelGpuBytes.ts +87 -0
  78. package/src/event/features/point.ts +25 -0
  79. package/src/event/features/polygon.ts +23 -0
  80. package/src/event/features/polygonOutline.ts +19 -0
  81. package/src/event/features/polyline.ts +19 -0
  82. package/src/event/features/text.ts +71 -0
  83. package/src/event/hillshade.test.ts +842 -0
  84. package/src/event/hillshade.ts +588 -0
  85. package/src/event/index.ts +700 -0
  86. package/src/event/loaders.ts +53 -0
  87. package/src/event/tile.ts +19 -0
  88. package/src/event/worker.ts +999 -0
  89. package/src/event/workerTaskSettlement.test.ts +243 -0
  90. package/src/event/workerTaskSettlement.ts +128 -0
  91. package/src/inMemoryBufferStore.test.ts +60 -0
  92. package/src/inMemoryBufferStore.ts +67 -0
  93. package/src/index.iife.ts +11 -0
  94. package/src/index.ts +2556 -0
  95. package/src/input.ts +144 -0
  96. package/src/layer.ts +183 -0
  97. package/src/layers/effect/FinalCopyEffectDesc.ts +29 -0
  98. package/src/layers/effect/MRTPassEffectDesc.ts +105 -0
  99. package/src/layers/effect/README.md +9 -0
  100. package/src/layers/effect/SelectiveEffectDesc.ts +113 -0
  101. package/src/layers/effect/SkyEnvMapEffectDesc.ts +58 -0
  102. package/src/layers/effect/TransparentPassEffectDesc.ts +62 -0
  103. package/src/layers/effect/index.ts +5 -0
  104. package/src/layers/index.ts +1 -0
  105. package/src/layersManager.ts +63 -0
  106. package/src/light.ts +15 -0
  107. package/src/loaders/AbortableImageLoader.ts +203 -0
  108. package/src/loaders/AbortableTextureLoader.ts +74 -0
  109. package/src/loaders/index.ts +5 -0
  110. package/src/material/enhancer/DESIGN.md +300 -0
  111. package/src/material/enhancer/MaterialEnhancer.ts +112 -0
  112. package/src/material/enhancer/ShaderReplacer.test.ts +114 -0
  113. package/src/material/enhancer/ShaderReplacer.ts +97 -0
  114. package/src/material/enhancer/batchTexture.ts +8 -0
  115. package/src/material/enhancer/index.ts +46 -0
  116. package/src/material/enhancer/instancedSprite/index.ts +7 -0
  117. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/index.test.ts +214 -0
  118. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/index.ts +134 -0
  119. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/markers.ts +21 -0
  120. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/material.ts +32 -0
  121. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/mutates.test.ts +277 -0
  122. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/mutates.ts +151 -0
  123. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/shader.test.ts +114 -0
  124. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/shader.ts +49 -0
  125. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/state.test.ts +82 -0
  126. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/state.ts +80 -0
  127. package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/types.ts +146 -0
  128. package/src/material/enhancer/instancedSprite/instancedSpriteMaterialEnhancer.ts +105 -0
  129. package/src/material/enhancer/model/index.ts +25 -0
  130. package/src/material/enhancer/model/modelBaseEnhancer/index.test.ts +74 -0
  131. package/src/material/enhancer/model/modelBaseEnhancer/index.ts +110 -0
  132. package/src/material/enhancer/model/modelBaseEnhancer/markers.ts +27 -0
  133. package/src/material/enhancer/model/modelBaseEnhancer/material.test.ts +66 -0
  134. package/src/material/enhancer/model/modelBaseEnhancer/material.ts +44 -0
  135. package/src/material/enhancer/model/modelBaseEnhancer/mutates.test.ts +84 -0
  136. package/src/material/enhancer/model/modelBaseEnhancer/mutates.ts +47 -0
  137. package/src/material/enhancer/model/modelBaseEnhancer/shader.test.ts +24 -0
  138. package/src/material/enhancer/model/modelBaseEnhancer/shader.ts +162 -0
  139. package/src/material/enhancer/model/modelBaseEnhancer/state.test.ts +103 -0
  140. package/src/material/enhancer/model/modelBaseEnhancer/state.ts +52 -0
  141. package/src/material/enhancer/model/modelBaseEnhancer/types.ts +89 -0
  142. package/src/material/enhancer/model/modelMaterialEnhancer.ts +91 -0
  143. package/src/material/enhancer/model/modelWaterEnhancer/index.test.ts +71 -0
  144. package/src/material/enhancer/model/modelWaterEnhancer/index.ts +175 -0
  145. package/src/material/enhancer/model/modelWaterEnhancer/material.test.ts +48 -0
  146. package/src/material/enhancer/model/modelWaterEnhancer/material.ts +25 -0
  147. package/src/material/enhancer/model/modelWaterEnhancer/mutates.test.ts +89 -0
  148. package/src/material/enhancer/model/modelWaterEnhancer/mutates.ts +89 -0
  149. package/src/material/enhancer/model/modelWaterEnhancer/shader.test.ts +34 -0
  150. package/src/material/enhancer/model/modelWaterEnhancer/shader.ts +111 -0
  151. package/src/material/enhancer/model/modelWaterEnhancer/state.test.ts +105 -0
  152. package/src/material/enhancer/model/modelWaterEnhancer/state.ts +59 -0
  153. package/src/material/enhancer/model/modelWaterEnhancer/types.ts +141 -0
  154. package/src/material/enhancer/model/pntsEnhancer/index.test.ts +96 -0
  155. package/src/material/enhancer/model/pntsEnhancer/index.ts +82 -0
  156. package/src/material/enhancer/model/pntsEnhancer/markers.ts +6 -0
  157. package/src/material/enhancer/model/pntsEnhancer/material.test.ts +37 -0
  158. package/src/material/enhancer/model/pntsEnhancer/material.ts +21 -0
  159. package/src/material/enhancer/model/pntsEnhancer/mutates.test.ts +80 -0
  160. package/src/material/enhancer/model/pntsEnhancer/mutates.ts +29 -0
  161. package/src/material/enhancer/model/pntsEnhancer/shader.test.ts +32 -0
  162. package/src/material/enhancer/model/pntsEnhancer/shader.ts +56 -0
  163. package/src/material/enhancer/model/pntsEnhancer/state.test.ts +87 -0
  164. package/src/material/enhancer/model/pntsEnhancer/state.ts +29 -0
  165. package/src/material/enhancer/model/pntsEnhancer/types.ts +38 -0
  166. package/src/material/enhancer/polygon/index.ts +22 -0
  167. package/src/material/enhancer/polygon/polygonBaseEnhancer/index.test.ts +101 -0
  168. package/src/material/enhancer/polygon/polygonBaseEnhancer/index.ts +130 -0
  169. package/src/material/enhancer/polygon/polygonBaseEnhancer/markers.ts +23 -0
  170. package/src/material/enhancer/polygon/polygonBaseEnhancer/material.test.ts +19 -0
  171. package/src/material/enhancer/polygon/polygonBaseEnhancer/material.ts +38 -0
  172. package/src/material/enhancer/polygon/polygonBaseEnhancer/mutates.test.ts +75 -0
  173. package/src/material/enhancer/polygon/polygonBaseEnhancer/mutates.ts +122 -0
  174. package/src/material/enhancer/polygon/polygonBaseEnhancer/shader.test.ts +25 -0
  175. package/src/material/enhancer/polygon/polygonBaseEnhancer/shader.ts +249 -0
  176. package/src/material/enhancer/polygon/polygonBaseEnhancer/state.test.ts +102 -0
  177. package/src/material/enhancer/polygon/polygonBaseEnhancer/state.ts +92 -0
  178. package/src/material/enhancer/polygon/polygonBaseEnhancer/types.ts +150 -0
  179. package/src/material/enhancer/polygon/polygonMaterialEnhancer.ts +97 -0
  180. package/src/material/enhancer/polygon/polygonWaterEnhancer/index.test.ts +72 -0
  181. package/src/material/enhancer/polygon/polygonWaterEnhancer/index.ts +164 -0
  182. package/src/material/enhancer/polygon/polygonWaterEnhancer/material.test.ts +48 -0
  183. package/src/material/enhancer/polygon/polygonWaterEnhancer/material.ts +35 -0
  184. package/src/material/enhancer/polygon/polygonWaterEnhancer/mutates.ts +61 -0
  185. package/src/material/enhancer/polygon/polygonWaterEnhancer/shader.test.ts +34 -0
  186. package/src/material/enhancer/polygon/polygonWaterEnhancer/shader.ts +96 -0
  187. package/src/material/enhancer/polygon/polygonWaterEnhancer/state.test.ts +98 -0
  188. package/src/material/enhancer/polygon/polygonWaterEnhancer/state.ts +57 -0
  189. package/src/material/enhancer/polygon/polygonWaterEnhancer/types.ts +115 -0
  190. package/src/material/enhancer/polyline/index.ts +7 -0
  191. package/src/material/enhancer/polyline/polylineBaseEnhancer/index.test.ts +157 -0
  192. package/src/material/enhancer/polyline/polylineBaseEnhancer/index.ts +154 -0
  193. package/src/material/enhancer/polyline/polylineBaseEnhancer/markers.ts +19 -0
  194. package/src/material/enhancer/polyline/polylineBaseEnhancer/material.test.ts +42 -0
  195. package/src/material/enhancer/polyline/polylineBaseEnhancer/material.ts +38 -0
  196. package/src/material/enhancer/polyline/polylineBaseEnhancer/mutates.test.ts +120 -0
  197. package/src/material/enhancer/polyline/polylineBaseEnhancer/mutates.ts +169 -0
  198. package/src/material/enhancer/polyline/polylineBaseEnhancer/shader.test.ts +67 -0
  199. package/src/material/enhancer/polyline/polylineBaseEnhancer/shader.ts +75 -0
  200. package/src/material/enhancer/polyline/polylineBaseEnhancer/state.test.ts +55 -0
  201. package/src/material/enhancer/polyline/polylineBaseEnhancer/state.ts +91 -0
  202. package/src/material/enhancer/polyline/polylineBaseEnhancer/types.ts +170 -0
  203. package/src/material/enhancer/polyline/polylineMaterialEnhancer.ts +102 -0
  204. package/src/material/enhancer/sdfText/index.ts +7 -0
  205. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/index.ts +125 -0
  206. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/markers.ts +19 -0
  207. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/material.test.ts +35 -0
  208. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/material.ts +32 -0
  209. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/mutates.test.ts +381 -0
  210. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/mutates.ts +232 -0
  211. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/shader.ts +36 -0
  212. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/state.test.ts +118 -0
  213. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/state.ts +107 -0
  214. package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/types.ts +184 -0
  215. package/src/material/enhancer/sdfText/sdfTextMaterialEnhancer.ts +100 -0
  216. package/src/material/enhancer/shadowMap/index.ts +7 -0
  217. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/index.ts +97 -0
  218. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/markers.ts +10 -0
  219. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/material.ts +31 -0
  220. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/mutates.ts +8 -0
  221. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/shader.test.ts +17 -0
  222. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/shader.ts +53 -0
  223. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/state.ts +17 -0
  224. package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/types.ts +26 -0
  225. package/src/material/enhancer/test-utils/shaderCompatibility.ts +124 -0
  226. package/src/material/enhancer/tileComposite/compose.test.ts +95 -0
  227. package/src/material/enhancer/tileComposite/compose.ts +112 -0
  228. package/src/material/enhancer/tileComposite/index.ts +23 -0
  229. package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/index.ts +11 -0
  230. package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/mutates.ts +132 -0
  231. package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/shader.ts +245 -0
  232. package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/types.ts +43 -0
  233. package/src/material/enhancer/tileComposite/tileElevationHeatmapEnhancer/index.ts +29 -0
  234. package/src/material/enhancer/tileComposite/tileElevationHeatmapEnhancer/mutates.ts +68 -0
  235. package/src/material/enhancer/tileComposite/tileElevationHeatmapEnhancer/shader.ts +24 -0
  236. package/src/material/enhancer/tileComposite/tileHillshadeEnhancer/index.ts +29 -0
  237. package/src/material/enhancer/tileComposite/tileHillshadeEnhancer/mutates.ts +34 -0
  238. package/src/material/enhancer/tileComposite/tileHillshadeEnhancer/shader.ts +36 -0
  239. package/src/material/enhancer/tileComposite/tileWaterEnhancer/index.ts +23 -0
  240. package/src/material/enhancer/tileComposite/tileWaterEnhancer/mutates.ts +23 -0
  241. package/src/material/enhancer/tileComposite/tileWaterEnhancer/shader.ts +8 -0
  242. package/src/material/enhancer/tileComposite/tileWatermaskEnhancer/index.ts +23 -0
  243. package/src/material/enhancer/tileComposite/tileWatermaskEnhancer/mutates.ts +34 -0
  244. package/src/material/enhancer/tileComposite/tileWatermaskEnhancer/shader.ts +13 -0
  245. package/src/material/enhancer/tileComposite/types.ts +58 -0
  246. package/src/material/index.ts +3 -0
  247. package/src/material/macro/index.ts +1 -0
  248. package/src/material/macro/tileShader.test.ts +136 -0
  249. package/src/material/macro/tileShader.ts +287 -0
  250. package/src/material/overrideMaterialsForMRT.ts +439 -0
  251. package/src/material/selectiveEffectMaterialSetup.test.ts +52 -0
  252. package/src/material/selectiveEffectMaterialSetup.ts +53 -0
  253. package/src/material/types/index.ts +1 -0
  254. package/src/material/types/uniform.ts +1 -0
  255. package/src/mesh/DrapedMesh.ts +101 -0
  256. package/src/mesh/batchTexture.test.ts +646 -0
  257. package/src/mesh/batchTexture.ts +437 -0
  258. package/src/mesh/batchedFeature.ts +186 -0
  259. package/src/mesh/batchedSdfText.ts +484 -0
  260. package/src/mesh/featureMesh.ts +43 -0
  261. package/src/mesh/index.ts +16 -0
  262. package/src/mesh/instanced.ts +117 -0
  263. package/src/mesh/model.ts +483 -0
  264. package/src/mesh/pickableMesh.ts +55 -0
  265. package/src/mesh/pickableMeshWrapper.ts +529 -0
  266. package/src/mesh/polygon.ts +699 -0
  267. package/src/mesh/polygonOutline.ts +393 -0
  268. package/src/mesh/polyline.ts +523 -0
  269. package/src/mesh/releaseGeometryArrays.ts +57 -0
  270. package/src/mesh/rtcRteHelper.ts +211 -0
  271. package/src/mesh/sdfText.test.ts +200 -0
  272. package/src/mesh/sdfText.ts +1019 -0
  273. package/src/mesh/sprite/billboardAtlas.test.ts +177 -0
  274. package/src/mesh/sprite/billboardAtlas.ts +210 -0
  275. package/src/mesh/sprite/billboardAtlasImageLoader.ts +29 -0
  276. package/src/mesh/sprite/index.ts +1 -0
  277. package/src/mesh/sprite/instancedSprite.ts +694 -0
  278. package/src/mesh/tile.test.ts +393 -0
  279. package/src/mesh/tile.ts +1790 -0
  280. package/src/object3DEvent.ts +6 -0
  281. package/src/orchestrators/RenderPassOrchestrator.ts +147 -0
  282. package/src/orchestrators/index.ts +1 -0
  283. package/src/passes/AllDepthCopyPass.ts +165 -0
  284. package/src/passes/CustomRenderPass.ts +279 -0
  285. package/src/passes/NormalCopyPass.ts +125 -0
  286. package/src/passes/RenderTargetCopyPass.ts +91 -0
  287. package/src/passes/SkyEnvMapPass.ts +58 -0
  288. package/src/passes/index.ts +5 -0
  289. package/src/pick/pickHelper.ts +273 -0
  290. package/src/pick/pickTerrain.ts +254 -0
  291. package/src/plugins/AttributionPlugin/AttributionPlugin.test.ts +210 -0
  292. package/src/plugins/AttributionPlugin/attribution.test.ts +225 -0
  293. package/src/plugins/AttributionPlugin/attribution.ts +355 -0
  294. package/src/plugins/AttributionPlugin/attributionStyles.ts +163 -0
  295. package/src/plugins/AttributionPlugin/index.ts +702 -0
  296. package/src/plugins/index.ts +1 -0
  297. package/src/quality.ts +1 -0
  298. package/src/renderOrder.ts +3 -0
  299. package/src/scene.test.ts +164 -0
  300. package/src/scene.ts +127 -0
  301. package/src/shaders/index.ts +1 -0
  302. package/src/solar.test.ts +81 -0
  303. package/src/solar.ts +101 -0
  304. package/src/source.ts +80 -0
  305. package/src/stats.ts +102 -0
  306. package/src/tasks/computeVertexNormalsAsync.ts +15 -0
  307. package/src/tasks/constructPolygonBatchedFeature.ts +34 -0
  308. package/src/tasks/constructPolylineBatchedFeature.ts +27 -0
  309. package/src/tasks/constructQuantizedMeshTerrainMesh.ts +24 -0
  310. package/src/tasks/constructTerrainMesh.ts +25 -0
  311. package/src/tasks/getImageDataFromBlob.ts +13 -0
  312. package/src/tasks/getImageDataFromImageBitmap.ts +12 -0
  313. package/src/tasks/parseMvtTile.ts +22 -0
  314. package/src/tasks/queueTask.ts +19 -0
  315. package/src/tasks/toCreasedNormalsAsync.ts +18 -0
  316. package/src/tasks/upsampleQuantizedMeshTerrainMesh.ts +44 -0
  317. package/src/tasks/upsampleTerrainMesh.ts +39 -0
  318. package/src/texture.ts +19 -0
  319. package/src/textures.ts +13 -0
  320. package/src/tileTexture/CompositeShader.snapshot.test.ts +59 -0
  321. package/src/tileTexture/CompositeShader.test.ts +168 -0
  322. package/src/tileTexture/CompositeShader.ts +53 -0
  323. package/src/tileTexture/SlotPlanner.test.ts +105 -0
  324. package/src/tileTexture/SlotPlanner.ts +102 -0
  325. package/src/tileTexture/TileTextureCache.test.ts +227 -0
  326. package/src/tileTexture/TileTextureCache.ts +192 -0
  327. package/src/tileTexture/TileTextureCompositor.test.ts +260 -0
  328. package/src/tileTexture/TileTextureCompositor.ts +421 -0
  329. package/src/tileTexture/__snapshots__/CompositeShader.snapshot.test.ts.snap +2649 -0
  330. package/src/tileTexture/index.ts +8 -0
  331. package/src/tileTexture/types.ts +150 -0
  332. package/src/type/index.ts +261 -0
  333. package/src/uniforms.ts +20 -0
  334. package/src/utils/arraysEqual.ts +9 -0
  335. package/src/utils/blendModes.ts +80 -0
  336. package/src/utils/geometry.ts +53 -0
  337. package/src/utils/hillshadeNormalMapGenerator.ts +193 -0
  338. package/src/utils/index.ts +8 -0
  339. package/src/utils/object.test.ts +14 -0
  340. package/src/utils/object.ts +7 -0
  341. package/src/utils/replacer.test.ts +42 -0
  342. package/src/utils/replacer.ts +89 -0
  343. package/src/utils/screen.ts +29 -0
  344. package/src/utils/textureFragmentIndex.test.ts +224 -0
  345. package/src/utils/textureFragmentIndex.ts +97 -0
  346. package/src/utils/worker.ts +3 -0
  347. package/src/vite-env.d.ts +2 -0
  348. package/src/worker/index.ts +13 -0
  349. package/src/worker/tasks/computeVertexNormals.ts +15 -0
  350. package/src/worker/tasks/toCreasedNormals.ts +22 -0
@@ -0,0 +1,355 @@
1
+ /**
2
+ * Attribution data model and framework-agnostic helpers.
3
+ *
4
+ * This module imports **nothing from the engine (WASM)**, so the pure logic
5
+ * (type guards, zoom-band matching, HTML sanitization) is unit-testable without
6
+ * loading it. The `AttributionPlugin` class composes these.
7
+ */
8
+
9
+ /**
10
+ * A single zoom-banded child credit under a top-level source. The band
11
+ * `[minZoom, maxZoom]` is matched against the current camera zoom; an omitted
12
+ * bound is unbounded on that side.
13
+ */
14
+ export type AttributionChild = {
15
+ /** Attribution / credit text. May contain partial `<a>` links. */
16
+ attribution: string;
17
+ /** Inclusive lower zoom bound. Unbounded when omitted. */
18
+ minZoom?: number;
19
+ /** Inclusive upper zoom bound. Unbounded when omitted. */
20
+ maxZoom?: number;
21
+ };
22
+
23
+ /**
24
+ * A top-level source (provider). It may carry zoom-banded child credits
25
+ * (`children`), a mandated `logo`, and dynamic per-layer credits linked via
26
+ * `creditLayerId`.
27
+ */
28
+ export type AttributionSource = {
29
+ /** Top-level source / provider name. */
30
+ attribution: string;
31
+ /** Optional link for the source name, rendered as an `<a>`. */
32
+ attributionUrl?: string;
33
+ /**
34
+ * Optional logo image URL. When set, the logo is shown in an always-visible
35
+ * frame in the bottom-left corner, independent of the popover's open state —
36
+ * as required for contractually-mandated marks (Google, Cesium ion, etc.).
37
+ * The logo is linked only when {@link logoUrl} is set; otherwise it is a plain
38
+ * image (e.g. a mark that must be shown but not turned into a link).
39
+ */
40
+ logo?: string;
41
+ /**
42
+ * Optional click target for the {@link logo}, opened in a new tab. Kept
43
+ * separate from {@link attributionUrl} (the title's link) so a provider can
44
+ * require the logo be shown without linking it, or point the logo somewhere
45
+ * other than the title. Has no effect unless {@link logo} is also set.
46
+ */
47
+ logoUrl?: string;
48
+ /** Zoom-banded child credits, filtered by current camera zoom. */
49
+ children?: AttributionChild[];
50
+ /**
51
+ * Optional id (`layer.id`) of the tracked layer whose per-feature credits are
52
+ * nested under this source. Named `creditLayerId` rather than `layerId`
53
+ * because "layer" alone is ambiguous in this project. A plain string (not a
54
+ * `Layer`) keeps `attribution.ts` engine-free.
55
+ */
56
+ creditLayerId?: string;
57
+ };
58
+
59
+ /**
60
+ * Customizable colors for the attribution UI. Every field is optional; an unset
61
+ * field keeps the built-in default. Applied as CSS custom properties, so
62
+ * {@link AttributionPlugin.setStyle} can re-theme live (e.g. light ⇄ dark)
63
+ * without rebuilding the DOM.
64
+ */
65
+ export type AttributionStyle = {
66
+ /** Source title text color. */
67
+ titleColor?: string;
68
+ /** Link (`<a>`) and info-icon color. */
69
+ linkColor?: string;
70
+ /** Bullet (list marker) color. */
71
+ listStyleColor?: string;
72
+ /** Body text color. */
73
+ textColor?: string;
74
+ /** Nested sub-credit text color. */
75
+ nestedTextColor?: string;
76
+ /** Popover and trigger background color. */
77
+ backgroundColor?: string;
78
+ /** Header divider (border) color — useful for dark themes. */
79
+ borderColor?: string;
80
+ };
81
+
82
+ /** A raw HTML credit with partial links, rendered as-is (after sanitization). */
83
+ export type AttributionHtml = {
84
+ /** Credit HTML containing partial `<a>` links. */
85
+ attributionHtml: string;
86
+ };
87
+
88
+ /** An attribution entry: either a structured source or a raw HTML credit. */
89
+ export type AttributionItem = AttributionSource | AttributionHtml;
90
+
91
+ /** Type guard distinguishing a raw HTML credit from a structured source. */
92
+ export function isAttributionHtml(
93
+ item: AttributionItem,
94
+ ): item is AttributionHtml {
95
+ return "attributionHtml" in item;
96
+ }
97
+
98
+ /**
99
+ * Stable identity of an item for deduplication: everything that affects how it
100
+ * renders. Sources that differ in `creditLayerId` or `children` produce
101
+ * different keys, so distinct per-layer / zoom-banded credits are preserved.
102
+ */
103
+ export function attributionItemKey(item: AttributionItem): string {
104
+ if (isAttributionHtml(item)) {
105
+ return JSON.stringify(["html", item.attributionHtml]);
106
+ }
107
+ // Explicit, ordered field list so JSON.stringify yields a collision-free key.
108
+ return JSON.stringify([
109
+ "src",
110
+ item.attribution,
111
+ item.attributionUrl ?? null,
112
+ item.logo ?? null,
113
+ item.logoUrl ?? null,
114
+ item.creditLayerId ?? null,
115
+ (item.children ?? []).map((c) => [
116
+ c.attribution,
117
+ c.minZoom ?? null,
118
+ c.maxZoom ?? null,
119
+ ]),
120
+ ]);
121
+ }
122
+
123
+ /**
124
+ * Drop exact-duplicate entries, preserving first-seen order. Two items are
125
+ * duplicates only when they would render identically (same text, link, logo,
126
+ * tracked layer, and zoom-banded children).
127
+ *
128
+ * Callers often list several distinct data sources that happen to share one
129
+ * credit (e.g. multiple Overture themes); without this the same line would
130
+ * render once per source.
131
+ */
132
+ export function dedupeAttributionItems(
133
+ items: AttributionItem[],
134
+ ): AttributionItem[] {
135
+ const seen = new Set<string>();
136
+ const result: AttributionItem[] = [];
137
+ for (const item of items) {
138
+ const key = attributionItemKey(item);
139
+ if (seen.has(key)) continue;
140
+ seen.add(key);
141
+ result.push(item);
142
+ }
143
+ return result;
144
+ }
145
+
146
+ /**
147
+ * Aggregate `;`-separated credit strings (e.g. a 3D-tile's `asset.copyright`)
148
+ * into a deduplicated list, ordered by frequency (desc) with a deterministic
149
+ * code-point tie-break, so the order is stable across updates and environments.
150
+ *
151
+ * The `;` split is **HTML-aware** (see {@link splitCredits}): a `;` inside an
152
+ * `<a href>` or an HTML entity is never treated as a delimiter, so attribution
153
+ * URLs and links are preserved verbatim — a license notice must not be altered.
154
+ */
155
+ export function aggregateCredits(creditStrings: Iterable<string>): string[] {
156
+ const counts = new Map<string, number>();
157
+ for (const raw of creditStrings) {
158
+ for (const credit of splitCredits(raw)) {
159
+ counts.set(credit, (counts.get(credit) ?? 0) + 1);
160
+ }
161
+ }
162
+ return Array.from(counts.entries())
163
+ .sort((a, b) => b[1] - a[1] || (a[0] < b[0] ? -1 : a[0] > b[0] ? 1 : 0))
164
+ .map(([credit]) => credit);
165
+ }
166
+
167
+ /** Escape text so it round-trips faithfully back through HTML parsing. */
168
+ function escapeHtmlText(text: string): string {
169
+ return text
170
+ .replace(/&/g, "&amp;")
171
+ .replace(/</g, "&lt;")
172
+ .replace(/>/g, "&gt;");
173
+ }
174
+
175
+ /**
176
+ * Split a raw credit on the `;` delimiter (the glTF / Cesium `asset.copyright`
177
+ * convention) **without breaking HTML**. The string is parsed first, so a `;`
178
+ * inside an `<a href>` or an HTML entity is not a delimiter and links / URLs
179
+ * stay intact. Each returned segment is a trimmed HTML string (empties
180
+ * dropped); plain-text segments are escaped so they survive re-parsing.
181
+ *
182
+ * Note: a literal `;` in plain (non-HTML) text is still a delimiter — the
183
+ * convention can't represent a credit that itself contains an unescaped `;`.
184
+ */
185
+ function splitCredits(raw: string): string[] {
186
+ const doc = new DOMParser().parseFromString(raw, "text/html");
187
+ const segments: string[] = [];
188
+ let current = "";
189
+ const flush = (): void => {
190
+ const trimmed = current.trim();
191
+ if (trimmed) segments.push(trimmed);
192
+ current = "";
193
+ };
194
+ const walk = (parent: Node): void => {
195
+ parent.childNodes.forEach((node) => {
196
+ if (node instanceof Text) {
197
+ const parts = (node.textContent ?? "").split(";");
198
+ parts.forEach((part, i) => {
199
+ if (i > 0) flush();
200
+ current += escapeHtmlText(part);
201
+ });
202
+ return;
203
+ }
204
+ if (node instanceof HTMLAnchorElement) {
205
+ // Keep `<a>` atomic so a `;` inside its href/text isn't a delimiter.
206
+ current += node.outerHTML;
207
+ return;
208
+ }
209
+ if (node instanceof Element) {
210
+ // Other tags are dropped by the sanitizer anyway — recurse into their
211
+ // children so a `;` inside still splits and the tag doesn't end up in
212
+ // the dedup key.
213
+ walk(node);
214
+ }
215
+ });
216
+ };
217
+ walk(doc.body);
218
+ flush();
219
+ return segments;
220
+ }
221
+
222
+ /**
223
+ * Whether a child credit applies at the given integer zoom level. A missing
224
+ * bound is unbounded on that side; a missing level (undef) matches everything.
225
+ */
226
+ export function matchesZoom(
227
+ child: AttributionChild,
228
+ level: number | undefined,
229
+ ): boolean {
230
+ if (level === undefined) return true;
231
+ if (child.minZoom !== undefined && level < child.minZoom) return false;
232
+ if (child.maxZoom !== undefined && level > child.maxZoom) return false;
233
+ return true;
234
+ }
235
+
236
+ /**
237
+ * Returns `href` if it points to a safe location (http / https / mailto, or a
238
+ * relative URL), otherwise `undefined`. Blocks code-executing schemes such as
239
+ * `javascript:` and `data:` to prevent XSS via attribution links.
240
+ */
241
+ export function safeHref(href: string): string | undefined {
242
+ let url: URL;
243
+ try {
244
+ // A fixed base resolves relative URLs; only the scheme matters here.
245
+ url = new URL(href, "http://localhost/");
246
+ } catch {
247
+ return undefined;
248
+ }
249
+ if (
250
+ url.protocol === "http:" ||
251
+ url.protocol === "https:" ||
252
+ url.protocol === "mailto:"
253
+ ) {
254
+ return href;
255
+ }
256
+ return undefined;
257
+ }
258
+
259
+ /**
260
+ * Create an `<a>` for an already-validated safe href with the standard
261
+ * external-link attributes. Centralizes `target`/`rel` so no call site forgets
262
+ * them. Pass `text` to set the visible label (omit to fill children manually).
263
+ */
264
+ export function createSafeAnchor(
265
+ href: string,
266
+ text?: string,
267
+ ): HTMLAnchorElement {
268
+ const anchor = document.createElement("a");
269
+ anchor.href = href;
270
+ anchor.target = "_blank";
271
+ anchor.rel = "noopener noreferrer";
272
+ if (text !== undefined) anchor.textContent = text;
273
+ return anchor;
274
+ }
275
+
276
+ /**
277
+ * Append a credit HTML string to `target`, allowing only `<a href>` elements
278
+ * with a safe scheme. Other tags (and unsafe links) are dropped while keeping
279
+ * their (sanitized) text content. Surviving links get `target="_blank"` and
280
+ * `rel="noopener noreferrer"`. Bare `http(s)` URLs in text are auto-linked too,
281
+ * so an official notice can be pasted verbatim without hand-wrapping its URL.
282
+ */
283
+ export function appendSanitizedHtml(target: Node, html: string): void {
284
+ // Parse without a wrapper element: a wrapper would be closed early by a
285
+ // stray `</span>` in the input, dropping the nodes parsed after it (and thus
286
+ // silently omitting credits). Sanitizing the whole body keeps every node.
287
+ const doc = new DOMParser().parseFromString(html, "text/html");
288
+ appendSanitizedChildren(target, doc.body);
289
+ }
290
+
291
+ function appendSanitizedChildren(
292
+ target: Node,
293
+ source: Node,
294
+ autolink = true,
295
+ ): void {
296
+ source.childNodes.forEach((node) => {
297
+ if (node instanceof Text) {
298
+ // Inside an existing `<a>`, emit plain text — never nest a link.
299
+ if (autolink) appendTextWithLinks(target, node.textContent ?? "");
300
+ else target.appendChild(document.createTextNode(node.textContent ?? ""));
301
+ return;
302
+ }
303
+ if (node instanceof HTMLAnchorElement) {
304
+ const raw = node.getAttribute("href");
305
+ const href = raw ? safeHref(raw) : undefined;
306
+ if (!href) {
307
+ // Unsafe / missing href: drop the link, keep its text.
308
+ appendSanitizedChildren(target, node, autolink);
309
+ return;
310
+ }
311
+ const anchor = createSafeAnchor(href);
312
+ appendSanitizedChildren(anchor, node, false);
313
+ target.appendChild(anchor);
314
+ return;
315
+ }
316
+ if (node instanceof Element) {
317
+ // Drop the tag, keep its sanitized contents.
318
+ appendSanitizedChildren(target, node, autolink);
319
+ }
320
+ });
321
+ }
322
+
323
+ /** Matches an explicit http(s) URL, used to auto-link bare URLs in credit text. */
324
+ const BARE_URL_PATTERN = /https?:\/\/[^\s]+/g;
325
+ /** Trailing punctuation kept outside an auto-linked URL (e.g. a closing paren). */
326
+ const TRAILING_PUNCTUATION = /[.,;:!?)\]}'"]+$/;
327
+
328
+ /**
329
+ * Append `text` to `target`, turning bare http(s) URLs into links. This lets an
330
+ * attribution be pasted verbatim (no hand-inserted `<a>`, which would itself
331
+ * edit the notice) while its URL stays both faithful and clickable: the URL
332
+ * text is preserved exactly and only trailing sentence punctuation is left out.
333
+ */
334
+ function appendTextWithLinks(target: Node, text: string): void {
335
+ let lastIndex = 0;
336
+ for (const match of text.matchAll(BARE_URL_PATTERN)) {
337
+ const start = match.index ?? 0;
338
+ let url = match[0];
339
+ const trailing = url.match(TRAILING_PUNCTUATION);
340
+ if (trailing) url = url.slice(0, url.length - trailing[0].length);
341
+ if (start > lastIndex) {
342
+ target.appendChild(document.createTextNode(text.slice(lastIndex, start)));
343
+ }
344
+ const href = safeHref(url);
345
+ if (href) {
346
+ target.appendChild(createSafeAnchor(href, url));
347
+ } else {
348
+ target.appendChild(document.createTextNode(url));
349
+ }
350
+ lastIndex = start + url.length;
351
+ }
352
+ if (lastIndex < text.length) {
353
+ target.appendChild(document.createTextNode(text.slice(lastIndex)));
354
+ }
355
+ }
@@ -0,0 +1,163 @@
1
+ /**
2
+ * Presentation constants for {@link AttributionPlugin}: the shared `<style>`
3
+ * element id, the ⓘ trigger icon markup, and the popover CSS. Extracted so the
4
+ * bulky CSS string doesn't dominate the plugin class file.
5
+ */
6
+
7
+ /** Shared `<style>` element id; reference-counted by the plugin. */
8
+ export const STYLE_ELEMENT_ID = "navara-attribution-styles";
9
+
10
+ /**
11
+ * ⓘ trigger icon as a markup string, inserted via `innerHTML` so the icon can
12
+ * be swapped in one place. `currentColor` makes it follow the button's color.
13
+ */
14
+ export const SVG_ICON_HTML = `<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 24 24" fill="none" aria-hidden="true">
15
+ <circle cx="12" cy="12" r="10.5" stroke="currentColor" stroke-width="2" />
16
+ <circle cx="12" cy="8" r="1" fill="currentColor" />
17
+ <rect x="11" y="11" width="2" height="6" rx="1" fill="currentColor" />
18
+ </svg>`;
19
+
20
+ export const STYLE_TEXT = `
21
+ .navara-attr-dock {
22
+ position: fixed;
23
+ right: 8px;
24
+ bottom: 8px;
25
+ z-index: 1000;
26
+ display: flex;
27
+ flex-direction: column;
28
+ align-items: flex-end;
29
+ gap: 10px;
30
+ font-family: system-ui, sans-serif;
31
+ }
32
+ .navara-attr-dock--left {
33
+ right: auto;
34
+ left: 8px;
35
+ align-items: flex-start;
36
+ }
37
+ .navara-attr-logoframe {
38
+ position: fixed;
39
+ left: 8px;
40
+ bottom: 8px;
41
+ z-index: 1000;
42
+ display: flex;
43
+ align-items: center;
44
+ gap: 8px;
45
+ }
46
+ /* Bottom-left mode: the ⓘ trigger (24px) occupies the far-left corner, so the
47
+ logo frame starts to its right, keeping the two in a single row. */
48
+ .navara-attr-logoframe--left {
49
+ left: 40px;
50
+ }
51
+ .navara-attr-logo {
52
+ height: 24px;
53
+ width: auto;
54
+ display: block;
55
+ user-select: none;
56
+ }
57
+ .navara-attr-toggle {
58
+ width: 24px;
59
+ height: 24px;
60
+ min-width: 24px;
61
+ padding: 0;
62
+ border-radius: 50%;
63
+ cursor: pointer;
64
+ background: var(--nvr-attr-bg, rgba(252, 253, 254, 0.92));
65
+ border: 1px solid var(--nvr-attr-border, rgba(0, 0, 0, 0.1));
66
+ box-shadow: 0 2px 8px rgba(20, 24, 28, 0.16);
67
+ display: flex;
68
+ align-items: center;
69
+ justify-content: center;
70
+ color: var(--nvr-attr-link, #3a6595);
71
+ }
72
+ .navara-attr-toggle svg {
73
+ width: 16px;
74
+ height: 16px;
75
+ display: block;
76
+ }
77
+ .navara-attr-card {
78
+ width: 280px;
79
+ max-width: calc(100vw - 16px);
80
+ max-height: 340px;
81
+ overflow-y: auto;
82
+ background: var(--nvr-attr-bg, rgba(252, 253, 254, 0.96));
83
+ border-radius: 14px;
84
+ box-shadow: 0 10px 30px rgba(20, 24, 28, 0.16);
85
+ color: var(--nvr-attr-text, #1b1f24);
86
+ }
87
+ .navara-attr-card[hidden] {
88
+ display: none;
89
+ }
90
+ /* display:flex on these beats the UA [hidden] rule, so hide explicitly. */
91
+ .navara-attr-dock[hidden],
92
+ .navara-attr-logoframe[hidden] {
93
+ display: none;
94
+ }
95
+ .navara-attr-head {
96
+ display: flex;
97
+ justify-content: space-between;
98
+ align-items: center;
99
+ padding: 12px;
100
+ border-bottom: 1px solid var(--nvr-attr-border, rgba(0, 0, 0, 0.08));
101
+ }
102
+ .navara-attr-head h3 {
103
+ margin: 0;
104
+ font-size: 13.5px;
105
+ font-weight: 600;
106
+ color: var(--nvr-attr-title, inherit);
107
+ }
108
+ .navara-attr-close {
109
+ background: transparent;
110
+ border: none;
111
+ cursor: pointer;
112
+ font-size: 15px;
113
+ line-height: 1;
114
+ color: var(--nvr-attr-nested, rgba(27, 31, 36, 0.64));
115
+ padding: 2px 4px;
116
+ }
117
+ .navara-attr-list {
118
+ list-style: none;
119
+ margin: 0;
120
+ padding: 12px;
121
+ }
122
+ .navara-attr-item + .navara-attr-item {
123
+ margin-top: 15px;
124
+ }
125
+ .navara-attr-name {
126
+ display: flex;
127
+ gap: 8px;
128
+ font-size: 13px;
129
+ font-weight: 500;
130
+ overflow-wrap: anywhere;
131
+ word-break: break-word;
132
+ }
133
+ .navara-attr-bullet {
134
+ width: 5px;
135
+ height: 5px;
136
+ border-radius: 50%;
137
+ background: var(--nvr-attr-bullet, #3a6595);
138
+ flex: none;
139
+ margin-top: 6px;
140
+ }
141
+ .navara-attr-related {
142
+ list-style: none;
143
+ margin: 5px 0 0 13px;
144
+ padding: 0;
145
+ display: flex;
146
+ flex-direction: column;
147
+ gap: 5px;
148
+ }
149
+ .navara-attr-related li {
150
+ font-size: 12px;
151
+ color: var(--nvr-attr-nested, rgba(27, 31, 36, 0.64));
152
+ line-height: 1.5;
153
+ overflow-wrap: anywhere;
154
+ word-break: break-word;
155
+ }
156
+ .navara-attr-card a {
157
+ color: var(--nvr-attr-link, #3a6595);
158
+ text-decoration: none;
159
+ }
160
+ .navara-attr-card a:hover {
161
+ text-decoration: underline;
162
+ }
163
+ `;