@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,232 @@
1
+ import { describe, it, expect, beforeEach } from "vitest";
2
+
3
+ import { HillshadeContext } from "./HillshadeContext";
4
+ import type { HillshadeConfig } from "./HillshadeContext";
5
+
6
+ describe("HillshadeContext", () => {
7
+ let context: HillshadeContext;
8
+ const mockConfig: HillshadeConfig = {
9
+ rgbScaler: [1, 1, 1],
10
+ boundary: 0,
11
+ minOffset: 0,
12
+ maxOffset: 0,
13
+ epsilon: 1.0,
14
+ offset: 0,
15
+ };
16
+
17
+ beforeEach(() => {
18
+ context = new HillshadeContext();
19
+ });
20
+
21
+ describe("pendingEdges management", () => {
22
+ it("allows multiple edges for same entity", () => {
23
+ const entityId = "tile_1";
24
+ const edge0 = new Uint8Array([1, 2, 3, 4]);
25
+ const edge1 = new Uint8Array([5, 6, 7, 8]);
26
+
27
+ const pending = new Map<number, Uint8Array>();
28
+ pending.set(0, edge0);
29
+ pending.set(1, edge1);
30
+ context.pendingEdges.set(entityId, pending);
31
+
32
+ const stored = context.pendingEdges.get(entityId);
33
+ expect(stored).toBeDefined();
34
+ expect(stored?.size).toBe(2);
35
+ expect(stored?.get(0)).toBe(edge0);
36
+ expect(stored?.get(1)).toBe(edge1);
37
+ });
38
+
39
+ it("overwrites pending edge for same direction", () => {
40
+ const entityId = "tile_1";
41
+ const oldEdge = new Uint8Array([1, 2, 3, 4]);
42
+ const newEdge = new Uint8Array([5, 6, 7, 8]);
43
+
44
+ const pending = new Map<number, Uint8Array>();
45
+ pending.set(0, oldEdge);
46
+ context.pendingEdges.set(entityId, pending);
47
+
48
+ // Overwrite with new edge
49
+ pending.set(0, newEdge);
50
+
51
+ const stored = context.pendingEdges.get(entityId);
52
+ expect(stored).toBeDefined();
53
+ expect(stored?.get(0)).toBe(newEdge);
54
+ expect(stored?.get(0)).not.toBe(oldEdge);
55
+ });
56
+ });
57
+
58
+ describe("tempDemTextures lifecycle", () => {
59
+ it("stores and retrieves temp DEM entry", () => {
60
+ const entityId = "tile_1";
61
+ const originalHandle = 42;
62
+
63
+ context.storeTempDem(entityId, originalHandle, 6, 1.0, mockConfig);
64
+
65
+ const entry = context.getTempDem(entityId);
66
+ expect(entry).toBeDefined();
67
+ expect(entry?.originalHandle).toBe(originalHandle);
68
+ expect(entry?.paddedSize).toBe(6);
69
+ expect(entry?.metersPerTexel).toBe(1.0);
70
+ expect(entry?.receivedEdges.size).toBe(0);
71
+ });
72
+
73
+ it("initializes with empty receivedEdges set and receivedEdgeData map", () => {
74
+ const entityId = "tile_1";
75
+
76
+ context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
77
+
78
+ const entry = context.getTempDem(entityId);
79
+ expect(entry).toBeDefined();
80
+ expect(entry?.receivedEdges).toBeInstanceOf(Set);
81
+ expect(entry?.receivedEdges.size).toBe(0);
82
+ expect(entry?.receivedEdgeData).toBeInstanceOf(Map);
83
+ expect(entry?.receivedEdgeData.size).toBe(0);
84
+ });
85
+
86
+ it("stores edge data via storeEdgeData", () => {
87
+ const entityId = "tile_1";
88
+ context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
89
+
90
+ const edgeBytes = new Uint8Array([1, 2, 3, 4]);
91
+ context.storeEdgeData(entityId, 0, edgeBytes);
92
+
93
+ const entry = context.getTempDem(entityId);
94
+ expect(entry?.receivedEdgeData.get(0)).toBe(edgeBytes);
95
+ });
96
+
97
+ it("tracks edge reception", () => {
98
+ const entityId = "tile_1";
99
+
100
+ context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
101
+
102
+ expect(context.markEdgeReceived(entityId, 0)).toBe(false); // 1/4
103
+ expect(context.markEdgeReceived(entityId, 1)).toBe(false); // 2/4
104
+ expect(context.markEdgeReceived(entityId, 2)).toBe(false); // 3/4
105
+ expect(context.markEdgeReceived(entityId, 3)).toBe(true); // 4/4 - all received
106
+
107
+ const entry = context.getTempDem(entityId);
108
+ expect(entry).toBeDefined();
109
+ expect(entry?.receivedEdges.size).toBe(4);
110
+ });
111
+
112
+ it("handles duplicate edge reception", () => {
113
+ const entityId = "tile_1";
114
+
115
+ context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
116
+
117
+ expect(context.markEdgeReceived(entityId, 0)).toBe(false);
118
+ expect(context.markEdgeReceived(entityId, 0)).toBe(false); // Duplicate
119
+ expect(context.markEdgeReceived(entityId, 0)).toBe(false); // Duplicate
120
+
121
+ const entry = context.getTempDem(entityId);
122
+ expect(entry).toBeDefined();
123
+ expect(entry?.receivedEdges.size).toBe(1); // Still only 1 edge
124
+ });
125
+
126
+ it("clears temp DEM entry", () => {
127
+ const entityId = "tile_1";
128
+
129
+ context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
130
+ expect(context.getTempDem(entityId)).toBeDefined();
131
+
132
+ context.clearTempDem(entityId);
133
+
134
+ expect(context.getTempDem(entityId)).toBeUndefined();
135
+ });
136
+
137
+ it("replaces existing temp DEM when storing new one", () => {
138
+ const entityId = "tile_1";
139
+
140
+ context.storeTempDem(entityId, 10, 6, 1.0, mockConfig);
141
+ context.markEdgeReceived(entityId, 0);
142
+
143
+ // Store new DEM (replaces old one)
144
+ context.storeTempDem(entityId, 20, 6, 2.0, mockConfig);
145
+
146
+ const entry = context.getTempDem(entityId);
147
+ expect(entry).toBeDefined();
148
+ expect(entry?.originalHandle).toBe(20);
149
+ expect(entry?.metersPerTexel).toBe(2.0);
150
+ expect(entry?.receivedEdges.size).toBe(0); // Reset
151
+ });
152
+ });
153
+
154
+ describe("edge-driven lifecycle integration", () => {
155
+ it("scenario: all edges arrive before texture creation", () => {
156
+ const entityId = "tile_1";
157
+
158
+ const pending = new Map<number, Uint8Array>();
159
+ pending.set(0, new Uint8Array([1, 2, 3, 4]));
160
+ pending.set(1, new Uint8Array([5, 6, 7, 8]));
161
+ pending.set(2, new Uint8Array([9, 10, 11, 12]));
162
+ pending.set(3, new Uint8Array([13, 14, 15, 16]));
163
+ context.pendingEdges.set(entityId, pending);
164
+
165
+ context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
166
+
167
+ context.markEdgeReceived(entityId, 0);
168
+ context.markEdgeReceived(entityId, 1);
169
+ context.markEdgeReceived(entityId, 2);
170
+ const allReceived = context.markEdgeReceived(entityId, 3);
171
+
172
+ expect(allReceived).toBe(true);
173
+ const finalEntry = context.getTempDem(entityId);
174
+ expect(finalEntry).toBeDefined();
175
+ expect(finalEntry?.receivedEdges.size).toBe(4);
176
+
177
+ context.clearTempDem(entityId);
178
+ expect(context.getTempDem(entityId)).toBeUndefined();
179
+ });
180
+
181
+ it("scenario: edges arrive after texture, then all cleared", () => {
182
+ const entityId = "tile_1";
183
+
184
+ context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
185
+
186
+ expect(context.markEdgeReceived(entityId, 0)).toBe(false);
187
+ expect(context.markEdgeReceived(entityId, 1)).toBe(false);
188
+ expect(context.markEdgeReceived(entityId, 2)).toBe(false);
189
+ expect(context.markEdgeReceived(entityId, 3)).toBe(true);
190
+
191
+ context.clearTempDem(entityId);
192
+ expect(context.getTempDem(entityId)).toBeUndefined();
193
+ });
194
+
195
+ it("scenario: late edge arrives after temp DEM cleared", () => {
196
+ const entityId = "tile_1";
197
+
198
+ context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
199
+
200
+ context.markEdgeReceived(entityId, 0);
201
+ context.markEdgeReceived(entityId, 1);
202
+ context.markEdgeReceived(entityId, 2);
203
+ context.markEdgeReceived(entityId, 3);
204
+
205
+ context.clearTempDem(entityId);
206
+
207
+ const result = context.markEdgeReceived(entityId, 0);
208
+ expect(result).toBe(false); // No temp DEM exists
209
+ });
210
+
211
+ it("scenario: mixed order (some pending, some after)", () => {
212
+ const entityId = "tile_1";
213
+
214
+ const pending = new Map<number, Uint8Array>();
215
+ pending.set(0, new Uint8Array([1, 2, 3, 4]));
216
+ pending.set(2, new Uint8Array([9, 10, 11, 12]));
217
+ context.pendingEdges.set(entityId, pending);
218
+
219
+ context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
220
+
221
+ context.markEdgeReceived(entityId, 0);
222
+ context.markEdgeReceived(entityId, 2);
223
+
224
+ expect(context.markEdgeReceived(entityId, 1)).toBe(false);
225
+ expect(context.markEdgeReceived(entityId, 3)).toBe(true);
226
+
227
+ const mixedEntry = context.getTempDem(entityId);
228
+ expect(mixedEntry).toBeDefined();
229
+ expect(mixedEntry?.receivedEdges.size).toBe(4);
230
+ });
231
+ });
232
+ });
@@ -0,0 +1,299 @@
1
+ import type { Texture } from "three";
2
+ import {
3
+ ClampToEdgeWrapping,
4
+ DataTexture,
5
+ LinearFilter,
6
+ NearestFilter,
7
+ NoColorSpace,
8
+ RGBAFormat,
9
+ RGBFormat,
10
+ UnsignedByteType,
11
+ WebGLRenderTarget,
12
+ } from "three";
13
+
14
+ import type { ViewContext } from "../core";
15
+ import { HillshadeNormalMapGenerator } from "../utils/hillshadeNormalMapGenerator";
16
+
17
+ import type { TileHandler } from "./context";
18
+
19
+ /**
20
+ * Hillshade decoder configuration from Rust
21
+ */
22
+ export type HillshadeConfig = {
23
+ rgbScaler: [number, number, number]; // vec3: [R, G, B] scalers
24
+ boundary: number;
25
+ minOffset: number;
26
+ maxOffset: number;
27
+ epsilon: number;
28
+ offset: number;
29
+ };
30
+
31
+ /**
32
+ * Temporary DEM state while waiting for edge updates.
33
+ * Stores only the WASM buffer handle and received edge strips — NOT the full padded DEM.
34
+ * The padded DEM is reconstructed transiently on each edge arrival, then discarded.
35
+ */
36
+ type TempDemEntry = {
37
+ originalHandle: number;
38
+ paddedSize: number;
39
+ receivedEdges: Set<number>;
40
+ receivedEdgeData: Map<number, Uint8Array>;
41
+ metersPerTexel: number;
42
+ hillshadeConfig: HillshadeConfig;
43
+ };
44
+
45
+ /**
46
+ * Context for managing hillshade-related state and resources
47
+ * Centralizes all hillshade processing state to avoid scattered global variables
48
+ */
49
+ export class HillshadeContext {
50
+ /** Shared normal map generator for offline rendering */
51
+ private normalMapGenerator: HillshadeNormalMapGenerator | null = null;
52
+
53
+ /** Scale factor for normal map RenderTarget dimensions (1.0 = full res, 0.5 = half res for mobile) */
54
+ normalMapScale = 1.0;
55
+
56
+ /** Pending edge updates that arrived before the main texture was created */
57
+ readonly pendingEdges = new Map<string, Map<number, Uint8Array>>();
58
+
59
+ /**
60
+ * Temporary storage for DEM reconstruction state while waiting for edge updates.
61
+ * entityId → { originalHandle, paddedSize, receivedEdges, receivedEdgeData, ... }
62
+ */
63
+ readonly tempDemTextures = new Map<string, TempDemEntry>();
64
+
65
+ /**
66
+ * RenderTarget pool for normal map generation
67
+ * One RenderTarget per entity to avoid GPU→CPU→GPU round-trip
68
+ * Similar to texturizedSceneRenderTargets in tile.ts
69
+ */
70
+ private renderTargets = new Map<string, WebGLRenderTarget>();
71
+
72
+ /**
73
+ * Get or create the normal map generator
74
+ * @param viewContext - ViewContext to get the renderer from
75
+ */
76
+ getOrCreateGenerator(viewContext: ViewContext): HillshadeNormalMapGenerator {
77
+ if (!this.normalMapGenerator) {
78
+ const renderer = viewContext.getRenderer();
79
+ this.normalMapGenerator = new HillshadeNormalMapGenerator(renderer);
80
+ }
81
+ return this.normalMapGenerator;
82
+ }
83
+
84
+ /**
85
+ * Get hillshade decoder config from tile
86
+ * @param tileHandler - TileHandler to query WASM
87
+ * @param tileHandle - Tile handle to get elevation decoder from
88
+ */
89
+ getHillshadeConfig(
90
+ tileHandler: TileHandler,
91
+ tileHandle: bigint,
92
+ ): HillshadeConfig {
93
+ const decoder = tileHandler.getTileElevationDecoder(tileHandle);
94
+
95
+ if (decoder) {
96
+ return {
97
+ rgbScaler: [decoder.r_scaler, decoder.g_scaler, decoder.b_scaler],
98
+ boundary: decoder.boundary,
99
+ minOffset: decoder.min_offset,
100
+ maxOffset: decoder.max_offset,
101
+ epsilon: decoder.epsilon,
102
+ offset: decoder.offset,
103
+ };
104
+ } else {
105
+ // Fallback to Terrarium defaults if no decoder found
106
+ return {
107
+ rgbScaler: [256, 1, 1 / 256],
108
+ boundary: 0,
109
+ minOffset: 0,
110
+ maxOffset: 0,
111
+ epsilon: 1.0,
112
+ offset: -32768,
113
+ };
114
+ }
115
+ }
116
+
117
+ /**
118
+ * Get or create a RenderTarget for the given entity
119
+ * Reuses existing RenderTarget if size matches, creates new one otherwise
120
+ * @private
121
+ */
122
+ private getOrCreateRenderTarget(
123
+ entityId: string,
124
+ width: number,
125
+ height: number,
126
+ ): WebGLRenderTarget {
127
+ let rt = this.renderTargets.get(entityId);
128
+
129
+ // Check if size matches (different zoom levels may have different sizes)
130
+ if (rt && (rt.width !== width || rt.height !== height)) {
131
+ rt.dispose();
132
+ rt = undefined;
133
+ }
134
+
135
+ if (!rt) {
136
+ rt = new WebGLRenderTarget(width, height, {
137
+ format: RGBFormat,
138
+ type: UnsignedByteType,
139
+ minFilter: LinearFilter,
140
+ magFilter: LinearFilter,
141
+ wrapS: ClampToEdgeWrapping,
142
+ wrapT: ClampToEdgeWrapping,
143
+ colorSpace: NoColorSpace,
144
+ generateMipmaps: false,
145
+ });
146
+ this.renderTargets.set(entityId, rt);
147
+ }
148
+
149
+ return rt;
150
+ }
151
+
152
+ /**
153
+ * Generate normal map texture from DEM data
154
+ * Creates a transient DataTexture for GPU upload, renders to RenderTarget, then frees the DEM texture.
155
+ * @param entityId - Entity ID for RenderTarget lookup/creation
156
+ * @param viewContext - ViewContext to get the renderer from
157
+ * @param demData - Padded DEM pixel data (CPU only, not GPU-resident)
158
+ * @param paddedSize - Width/height of the padded DEM (square)
159
+ * @param metersPerTexel - Meters per texel for normal calculation
160
+ * @param hillshadeConfig - Hillshade decoder configuration
161
+ * @param contentWidth - Content width (without padding)
162
+ * @param contentHeight - Content height (without padding)
163
+ * @returns Normal map texture (references RenderTarget.texture directly)
164
+ */
165
+ generateNormalMap(
166
+ entityId: string,
167
+ viewContext: ViewContext,
168
+ demData: Uint8Array,
169
+ paddedSize: number,
170
+ metersPerTexel: number,
171
+ hillshadeConfig: HillshadeConfig,
172
+ contentWidth: number,
173
+ contentHeight: number,
174
+ ): Texture {
175
+ const renderTarget = this.getOrCreateRenderTarget(
176
+ entityId,
177
+ Math.max(1, Math.round(contentWidth * this.normalMapScale)),
178
+ Math.max(1, Math.round(contentHeight * this.normalMapScale)),
179
+ );
180
+
181
+ // Create a transient DataTexture for GPU upload, render, then dispose immediately
182
+ const demTexture = new DataTexture(
183
+ demData,
184
+ paddedSize,
185
+ paddedSize,
186
+ RGBAFormat,
187
+ UnsignedByteType,
188
+ );
189
+ demTexture.colorSpace = NoColorSpace;
190
+ demTexture.minFilter = NearestFilter;
191
+ demTexture.magFilter = NearestFilter;
192
+ demTexture.needsUpdate = true;
193
+
194
+ const generator = this.getOrCreateGenerator(viewContext);
195
+ generator.renderToTarget(
196
+ renderTarget,
197
+ demTexture,
198
+ metersPerTexel,
199
+ hillshadeConfig,
200
+ );
201
+
202
+ demTexture.dispose();
203
+
204
+ return renderTarget.texture;
205
+ }
206
+
207
+ /**
208
+ * Clear RenderTarget for the given entity
209
+ */
210
+ clearRenderTarget(entityId: string): void {
211
+ const rt = this.renderTargets.get(entityId);
212
+ if (rt) {
213
+ rt.dispose();
214
+ this.renderTargets.delete(entityId);
215
+ }
216
+ }
217
+
218
+ /**
219
+ * Store temporary DEM entry (WASM handle + metadata) for edge updates.
220
+ * Does NOT store the full padded DEM — only the handle needed to re-read on demand.
221
+ */
222
+ storeTempDem(
223
+ entityId: string,
224
+ originalHandle: number,
225
+ paddedSize: number,
226
+ metersPerTexel: number,
227
+ hillshadeConfig: HillshadeConfig,
228
+ ): void {
229
+ this.tempDemTextures.set(entityId, {
230
+ originalHandle,
231
+ paddedSize,
232
+ receivedEdges: new Set(),
233
+ receivedEdgeData: new Map(),
234
+ metersPerTexel,
235
+ hillshadeConfig,
236
+ });
237
+ }
238
+
239
+ /**
240
+ * Store an edge pixel strip for later padded DEM reconstruction.
241
+ */
242
+ storeEdgeData(
243
+ entityId: string,
244
+ edgeDirection: number,
245
+ edgeBytes: Uint8Array,
246
+ ): void {
247
+ const entry = this.tempDemTextures.get(entityId);
248
+ if (entry) {
249
+ entry.receivedEdgeData.set(edgeDirection, edgeBytes);
250
+ }
251
+ }
252
+
253
+ /**
254
+ * Get temporary DEM texture entry
255
+ */
256
+ getTempDem(entityId: string): TempDemEntry | undefined {
257
+ return this.tempDemTextures.get(entityId);
258
+ }
259
+
260
+ /**
261
+ * Mark an edge as received for a temporary DEM
262
+ * @returns true if all 4 edges have been received
263
+ */
264
+ markEdgeReceived(entityId: string, edgeDirection: number): boolean {
265
+ const entry = this.tempDemTextures.get(entityId);
266
+ if (!entry) return false;
267
+
268
+ entry.receivedEdges.add(edgeDirection);
269
+ return entry.receivedEdges.size >= 4; // All 4 edges received
270
+ }
271
+
272
+ /**
273
+ * Clear temporary DEM data
274
+ */
275
+ clearTempDem(entityId: string): void {
276
+ this.tempDemTextures.delete(entityId);
277
+ }
278
+
279
+ /**
280
+ * Cleanup all resources
281
+ * Should be called on view disposal
282
+ */
283
+ dispose(): void {
284
+ this.tempDemTextures.clear();
285
+ this.pendingEdges.clear();
286
+
287
+ // Dispose all RenderTargets
288
+ for (const rt of this.renderTargets.values()) {
289
+ rt.dispose();
290
+ }
291
+ this.renderTargets.clear();
292
+
293
+ // Dispose generator
294
+ if (this.normalMapGenerator) {
295
+ this.normalMapGenerator.dispose();
296
+ this.normalMapGenerator = null;
297
+ }
298
+ }
299
+ }