@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,243 @@
1
+ import type {
2
+ DelegatedWorkerTasksResult,
3
+ ReconstructableEntity,
4
+ } from "@navaramap/engine";
5
+ import { expect, it, vi } from "vitest";
6
+
7
+ import type { WorkerPoolPromise, WorkerPoolPromises } from "../type";
8
+
9
+ import {
10
+ runDelegatedWorkerTask,
11
+ settleWorkerTask,
12
+ } from "./workerTaskSettlement";
13
+
14
+ const makeCtx = () => ({ workerPoolPromises: new Map() as WorkerPoolPromises });
15
+
16
+ const asPoolPromise = <T>(promise: Promise<T>) =>
17
+ promise as unknown as WorkerPoolPromise<T>;
18
+
19
+ const cancellationError = () => {
20
+ const err = new Error("promise cancelled");
21
+ err.name = "CancellationError";
22
+ return err;
23
+ };
24
+
25
+ it("should register the promise, resolve to completed, and unregister", async () => {
26
+ const ctx = makeCtx();
27
+ let resolve!: (v: string) => void;
28
+ const promise = asPoolPromise(new Promise<string>((r) => (resolve = r)));
29
+
30
+ const settling = settleWorkerTask(ctx, "id", promise);
31
+ expect(ctx.workerPoolPromises.get("id")).toBe(promise);
32
+
33
+ resolve("value");
34
+ expect(await settling).toEqual({ status: "completed", value: "value" });
35
+ expect(ctx.workerPoolPromises.size).toBe(0);
36
+ });
37
+
38
+ it("should classify a CancellationError as cancelled, not failed", async () => {
39
+ const ctx = makeCtx();
40
+ let reject!: (e: unknown) => void;
41
+ const promise = asPoolPromise(new Promise<void>((_, r) => (reject = r)));
42
+
43
+ const settling = settleWorkerTask(ctx, "id", promise);
44
+ reject(cancellationError());
45
+
46
+ expect(await settling).toEqual({ status: "cancelled" });
47
+ expect(ctx.workerPoolPromises.size).toBe(0);
48
+ });
49
+
50
+ it("should classify any other rejection as failed with its error", async () => {
51
+ const ctx = makeCtx();
52
+ const error = new Error("worker exploded");
53
+ const settling = settleWorkerTask(
54
+ ctx,
55
+ "id",
56
+ asPoolPromise(Promise.reject(error)),
57
+ );
58
+
59
+ expect(await settling).toEqual({ status: "failed", error });
60
+ expect(ctx.workerPoolPromises.size).toBe(0);
61
+ });
62
+
63
+ it("should not delete a map entry that was replaced by a newer task", async () => {
64
+ const ctx = makeCtx();
65
+ let reject!: (e: unknown) => void;
66
+ const promise = asPoolPromise(new Promise<void>((_, r) => (reject = r)));
67
+ const settling = settleWorkerTask(ctx, "id", promise);
68
+
69
+ // A newer task reuses the id while the first one is being cancelled.
70
+ const replacement = asPoolPromise(new Promise<void>(() => {}));
71
+ ctx.workerPoolPromises.set("id", replacement);
72
+ reject(cancellationError());
73
+
74
+ expect(await settling).toEqual({ status: "cancelled" });
75
+ expect(ctx.workerPoolPromises.get("id")).toBe(replacement);
76
+ });
77
+
78
+ const makeDelegatedCtx = () => ({
79
+ workerPoolPromises: new Map() as WorkerPoolPromises,
80
+ workerTaskHandler: {
81
+ triggerWorkerTaskCompleted: vi.fn(),
82
+ triggerWorkerTaskFailed: vi.fn(),
83
+ hasWorkerTask: vi.fn(() => true),
84
+ },
85
+ });
86
+
87
+ const makeBoundary = () => ({
88
+ params: { free: vi.fn() },
89
+ delegator_id: { free: vi.fn() } as unknown as ReconstructableEntity,
90
+ });
91
+
92
+ it("should deliver a completed result and not release the delegator again", async () => {
93
+ const ctx = makeDelegatedCtx();
94
+ const { params, delegator_id } = makeBoundary();
95
+ const result = { built: true } as unknown as DelegatedWorkerTasksResult;
96
+
97
+ await runDelegatedWorkerTask(
98
+ ctx,
99
+ "id",
100
+ 1n,
101
+ "test task",
102
+ params,
103
+ delegator_id,
104
+ async (task) => {
105
+ const value = await task.settle(asPoolPromise(Promise.resolve("ok")));
106
+ expect(value).toBe("ok");
107
+ task.complete((id) => {
108
+ expect(id).toBe(delegator_id);
109
+ return result;
110
+ });
111
+ },
112
+ );
113
+
114
+ expect(ctx.workerTaskHandler.triggerWorkerTaskCompleted).toHaveBeenCalledWith(
115
+ 1n,
116
+ result,
117
+ );
118
+ expect(ctx.workerTaskHandler.triggerWorkerTaskFailed).not.toHaveBeenCalled();
119
+ expect(params.free).toHaveBeenCalledOnce();
120
+ });
121
+
122
+ it("should release the delegator when the body bails out without completing", async () => {
123
+ const ctx = makeDelegatedCtx();
124
+ const { params, delegator_id } = makeBoundary();
125
+
126
+ await runDelegatedWorkerTask(
127
+ ctx,
128
+ "id",
129
+ 1n,
130
+ "test task",
131
+ params,
132
+ delegator_id,
133
+ async () => {
134
+ // Missing input: bail out without completing.
135
+ },
136
+ );
137
+
138
+ expect(ctx.workerTaskHandler.triggerWorkerTaskFailed).toHaveBeenCalledWith(
139
+ delegator_id,
140
+ );
141
+ expect(
142
+ ctx.workerTaskHandler.triggerWorkerTaskCompleted,
143
+ ).not.toHaveBeenCalled();
144
+ expect(params.free).toHaveBeenCalledOnce();
145
+ });
146
+
147
+ it("should contain an unexpected body throw and release the delegator", async () => {
148
+ const ctx = makeDelegatedCtx();
149
+ const { params, delegator_id } = makeBoundary();
150
+ const consoleError = vi
151
+ .spyOn(console, "error")
152
+ .mockImplementation(() => undefined);
153
+
154
+ await runDelegatedWorkerTask(
155
+ ctx,
156
+ "id",
157
+ 1n,
158
+ "test task",
159
+ params,
160
+ delegator_id,
161
+ async () => {
162
+ throw new Error("boom");
163
+ },
164
+ );
165
+
166
+ expect(consoleError).toHaveBeenCalledOnce();
167
+ expect(ctx.workerTaskHandler.triggerWorkerTaskFailed).toHaveBeenCalledWith(
168
+ delegator_id,
169
+ );
170
+ expect(params.free).toHaveBeenCalledOnce();
171
+ consoleError.mockRestore();
172
+ });
173
+
174
+ it("should log a failed settlement and run onFailed, which can complete instead", async () => {
175
+ const ctx = makeDelegatedCtx();
176
+ const { params, delegator_id } = makeBoundary();
177
+ const empty = { empty: true } as unknown as DelegatedWorkerTasksResult;
178
+ const consoleError = vi
179
+ .spyOn(console, "error")
180
+ .mockImplementation(() => undefined);
181
+
182
+ await runDelegatedWorkerTask(
183
+ ctx,
184
+ "id",
185
+ 1n,
186
+ "test task",
187
+ params,
188
+ delegator_id,
189
+ async (task) => {
190
+ const value = await task.settle(
191
+ asPoolPromise(Promise.reject(new Error("worker exploded"))),
192
+ () => task.complete(() => empty),
193
+ );
194
+ expect(value).toBeUndefined();
195
+ },
196
+ );
197
+
198
+ expect(consoleError).toHaveBeenCalledWith(
199
+ "Failed to test task in worker:",
200
+ expect.any(Error),
201
+ );
202
+ // `onFailed` completed the task, so the fallback release must not fire.
203
+ expect(ctx.workerTaskHandler.triggerWorkerTaskCompleted).toHaveBeenCalledWith(
204
+ 1n,
205
+ empty,
206
+ );
207
+ expect(ctx.workerTaskHandler.triggerWorkerTaskFailed).not.toHaveBeenCalled();
208
+ consoleError.mockRestore();
209
+ });
210
+
211
+ it("should treat a cancellation as a silent release without invoking onFailed", async () => {
212
+ const ctx = makeDelegatedCtx();
213
+ const { params, delegator_id } = makeBoundary();
214
+ const onFailed = vi.fn();
215
+ const consoleError = vi
216
+ .spyOn(console, "error")
217
+ .mockImplementation(() => undefined);
218
+
219
+ await runDelegatedWorkerTask(
220
+ ctx,
221
+ "id",
222
+ 1n,
223
+ "test task",
224
+ params,
225
+ delegator_id,
226
+ async (task) => {
227
+ const value = await task.settle(
228
+ asPoolPromise(Promise.reject(cancellationError())),
229
+ onFailed,
230
+ );
231
+ expect(value).toBeUndefined();
232
+ },
233
+ );
234
+
235
+ expect(onFailed).not.toHaveBeenCalled();
236
+ expect(consoleError).not.toHaveBeenCalled();
237
+ // The engine already deleted a cancelled task's delegator, so this release
238
+ // is a no-op on the Rust side — but it must still consume `delegator_id`.
239
+ expect(ctx.workerTaskHandler.triggerWorkerTaskFailed).toHaveBeenCalledWith(
240
+ delegator_id,
241
+ );
242
+ consoleError.mockRestore();
243
+ });
@@ -0,0 +1,128 @@
1
+ import type {
2
+ DelegatedWorkerTasksResult,
3
+ ReconstructableEntity,
4
+ } from "@navaramap/engine";
5
+
6
+ import type { WorkerPoolPromise } from "../type";
7
+
8
+ import type { EventContext } from "./context";
9
+
10
+ /**
11
+ * How a worker-pool task ended. Cancellation (tile/feature evicted while the
12
+ * task was queued or running) is a routine outcome under camera movement, not
13
+ * an error: it must never surface as a rejection to the event pipeline.
14
+ */
15
+ export type WorkerTaskSettlement<T> =
16
+ | { status: "completed"; value: T }
17
+ | { status: "cancelled" }
18
+ | { status: "failed"; error: unknown };
19
+
20
+ function isCancellation(err: unknown): boolean {
21
+ return err instanceof Error && err.name === "CancellationError";
22
+ }
23
+
24
+ /**
25
+ * Own the workerPoolPromises lifecycle around one pool task: register the
26
+ * promise (so a removal event can cancel it), classify the outcome, and
27
+ * always unregister.
28
+ */
29
+ export async function settleWorkerTask<T>(
30
+ ctx: Pick<EventContext, "workerPoolPromises">,
31
+ id: string,
32
+ promise: WorkerPoolPromise<T>,
33
+ ): Promise<WorkerTaskSettlement<T>> {
34
+ ctx.workerPoolPromises.set(id, promise);
35
+ try {
36
+ return { status: "completed", value: await promise };
37
+ } catch (error) {
38
+ return isCancellation(error)
39
+ ? { status: "cancelled" }
40
+ : { status: "failed", error };
41
+ } finally {
42
+ // Only delete our own entry: a new task could in principle reuse the id
43
+ // between a cancel and this continuation.
44
+ if (ctx.workerPoolPromises.get(id) === promise) {
45
+ ctx.workerPoolPromises.delete(id);
46
+ }
47
+ }
48
+ }
49
+
50
+ /** Helpers handed to a delegated-task body by {@link runDelegatedWorkerTask}. */
51
+ export type DelegatedTaskHandle = {
52
+ /**
53
+ * Register + await one pool task via {@link settleWorkerTask} and classify
54
+ * the outcome: the settled value on completion, `undefined` otherwise. A
55
+ * failure is logged (as `Failed to <label> in worker:`) and `onFailed` runs
56
+ * before returning, so a task kind can substitute its own failure
57
+ * completion (e.g. the MVT parse completes with an empty result).
58
+ */
59
+ settle<T>(
60
+ promise: WorkerPoolPromise<T>,
61
+ onFailed?: () => void,
62
+ ): Promise<T | undefined>;
63
+ /**
64
+ * Deliver the task result to the engine. `build` receives ownership of
65
+ * `delegator_id` (the `DelegatedWorkerTasksResult.with*` constructors
66
+ * consume it).
67
+ */
68
+ complete(
69
+ build: (delegator_id: ReconstructableEntity) => DelegatedWorkerTasksResult,
70
+ ): void;
71
+ };
72
+
73
+ /**
74
+ * Shared scaffolding around one delegated worker task: own the wasm-bindgen
75
+ * boundary objects (`params` is freed on every path; `delegator_id` is
76
+ * consumed exactly once) and guarantee the delegator always settles. A body
77
+ * that returns without calling `complete` — worker failure, missing input,
78
+ * buffer registration failure, or an unexpected throw — releases the
79
+ * delegator through `triggerWorkerTaskFailed`; otherwise it would stay
80
+ * Requested forever and permanently occupy one of the engine's pending
81
+ * dispatch slots for its task kind. For a task the engine already cancelled
82
+ * the release is a no-op on the Rust side, so cancellations need no special
83
+ * casing here.
84
+ */
85
+ export async function runDelegatedWorkerTask<P extends { free(): void }>(
86
+ ctx: Pick<EventContext, "workerPoolPromises" | "workerTaskHandler">,
87
+ id: string,
88
+ bits: bigint,
89
+ label: string,
90
+ params: P,
91
+ delegator_id: ReconstructableEntity,
92
+ body: (task: DelegatedTaskHandle) => Promise<void>,
93
+ ): Promise<void> {
94
+ let delegatorSettled = false;
95
+ const task: DelegatedTaskHandle = {
96
+ async settle(promise, onFailed) {
97
+ const settled = await settleWorkerTask(ctx, id, promise);
98
+ if (settled.status === "completed") {
99
+ return settled.value;
100
+ }
101
+ if (settled.status === "failed") {
102
+ console.error(`Failed to ${label} in worker:`, settled.error);
103
+ onFailed?.();
104
+ }
105
+ return undefined;
106
+ },
107
+ complete(build) {
108
+ // Flag before building so a throw inside `build` (after `with*` already
109
+ // consumed `delegator_id`) cannot lead to a double free below.
110
+ delegatorSettled = true;
111
+ ctx.workerTaskHandler.triggerWorkerTaskCompleted(
112
+ bits,
113
+ build(delegator_id),
114
+ );
115
+ },
116
+ };
117
+ try {
118
+ await body(task);
119
+ } catch (error) {
120
+ console.error(`Failed to ${label}:`, error);
121
+ } finally {
122
+ params.free();
123
+ if (!delegatorSettled) {
124
+ // Consumes `delegator_id`.
125
+ ctx.workerTaskHandler.triggerWorkerTaskFailed(delegator_id);
126
+ }
127
+ }
128
+ }
@@ -0,0 +1,60 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { InMemoryBufferStore } from "./inMemoryBufferStore";
4
+
5
+ describe("InMemoryBufferStore", () => {
6
+ it("tracks totalBytes and count on set/take/delete", () => {
7
+ const store = new InMemoryBufferStore();
8
+ expect(store.totalBytes).toBe(0);
9
+ expect(store.count).toBe(0);
10
+
11
+ const a = new Float32Array(10); // 40 bytes
12
+ store.set(1, a);
13
+ expect(store.totalBytes).toBe(40);
14
+ expect(store.count).toBe(1);
15
+ expect(store.get(1)).toBe(a);
16
+
17
+ const b = new Uint8Array(5); // 5 bytes
18
+ store.set(2, b);
19
+ expect(store.totalBytes).toBe(45);
20
+ expect(store.count).toBe(2);
21
+
22
+ // take returns and removes.
23
+ expect(store.take(1)).toBe(a);
24
+ expect(store.get(1)).toBeUndefined();
25
+ expect(store.totalBytes).toBe(5);
26
+ expect(store.count).toBe(1);
27
+
28
+ store.delete(2);
29
+ expect(store.totalBytes).toBe(0);
30
+ expect(store.count).toBe(0);
31
+ });
32
+
33
+ it("re-accounts bytes when a handle is replaced", () => {
34
+ const store = new InMemoryBufferStore();
35
+ store.set(1, new Uint32Array(10)); // 40 bytes
36
+ expect(store.totalBytes).toBe(40);
37
+ store.set(1, new Uint32Array(2)); // 8 bytes
38
+ expect(store.totalBytes).toBe(8);
39
+ expect(store.count).toBe(1);
40
+ });
41
+
42
+ it("take/delete on a missing handle is a no-op", () => {
43
+ const store = new InMemoryBufferStore();
44
+ store.set(1, new Uint8Array(3));
45
+ expect(store.take(999)).toBeUndefined();
46
+ store.delete(999);
47
+ expect(store.totalBytes).toBe(3);
48
+ expect(store.count).toBe(1);
49
+ });
50
+
51
+ it("clear drops everything", () => {
52
+ const store = new InMemoryBufferStore();
53
+ store.set(1, new Float64Array(4)); // 32 bytes
54
+ store.set(2, new Uint8Array(8));
55
+ store.clear();
56
+ expect(store.totalBytes).toBe(0);
57
+ expect(store.count).toBe(0);
58
+ expect(store.get(1)).toBeUndefined();
59
+ });
60
+ });
@@ -0,0 +1,67 @@
1
+ /**
2
+ * JS-side companion to the WASM `BufferStore`'s `External` entries: holds the
3
+ * real typed-array bytes for handles that WASM tracks by byte count only,
4
+ * keeping fetched pbf / worker-built geometry out of WASM linear memory (which
5
+ * never shrinks). The lifecycle is Rust-driven — handles are issued by
6
+ * `Core.newExternalBuffer` and evicted via `drainRemovedExternalHandles`, so
7
+ * there is no LRU here.
8
+ */
9
+ type StoredArray = Uint8Array | Uint32Array | Float32Array | Float64Array;
10
+
11
+ export class InMemoryBufferStore {
12
+ private _map = new Map<number, StoredArray>();
13
+ private _totalBytes = 0;
14
+
15
+ /** Bytes currently held across all entries. */
16
+ get totalBytes(): number {
17
+ return this._totalBytes;
18
+ }
19
+
20
+ /** Number of entries currently held. */
21
+ get count(): number {
22
+ return this._map.size;
23
+ }
24
+
25
+ /**
26
+ * Store `array` under `handle`. Replacing an existing handle re-accounts its
27
+ * bytes so `totalBytes` never drifts.
28
+ */
29
+ set(handle: number, array: StoredArray): void {
30
+ const old = this._map.get(handle);
31
+ if (old) {
32
+ this._totalBytes -= old.byteLength;
33
+ }
34
+ this._map.set(handle, array);
35
+ this._totalBytes += array.byteLength;
36
+ }
37
+
38
+ /** Read an entry without removing it, or `undefined` if absent. */
39
+ get(handle: number): StoredArray | undefined {
40
+ return this._map.get(handle);
41
+ }
42
+
43
+ /** Remove and return an entry, transferring ownership to the caller. */
44
+ take(handle: number): StoredArray | undefined {
45
+ const array = this._map.get(handle);
46
+ if (array) {
47
+ this._map.delete(handle);
48
+ this._totalBytes -= array.byteLength;
49
+ }
50
+ return array;
51
+ }
52
+
53
+ /** Drop an entry. A no-op for a handle that is not present. */
54
+ delete(handle: number): void {
55
+ const array = this._map.get(handle);
56
+ if (array) {
57
+ this._map.delete(handle);
58
+ this._totalBytes -= array.byteLength;
59
+ }
60
+ }
61
+
62
+ /** Drop every entry (called on view dispose). */
63
+ clear(): void {
64
+ this._map.clear();
65
+ this._totalBytes = 0;
66
+ }
67
+ }
@@ -0,0 +1,11 @@
1
+ export * from "./index";
2
+ export { default } from "./index";
3
+ export { DefaultPlugin } from "@navaramap/three_default_plugin";
4
+ export type {
5
+ DefaultDescriptions,
6
+ DefaultMeshDescription,
7
+ DefaultLightDescription,
8
+ DefaultEffectDescription,
9
+ } from "@navaramap/three_default_plugin";
10
+ export * from "@navaramap/three_default_descs";
11
+ export { AttributionPlugin } from "./plugins";