@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,279 @@
1
+ import type {
2
+ Color as CoreColor,
3
+ ColorMap,
4
+ EventHandler,
5
+ EventManager,
6
+ } from "@navaramap/core";
7
+ import type {
8
+ DelegatedWorkerTasksResult,
9
+ ElevationDecoder,
10
+ ReconstructableEntity,
11
+ ReturnedTransferablePolygonBatchedFeature,
12
+ ReturnedTransferablePolylineBatchedFeature,
13
+ TextureFragmentStatus,
14
+ TransferableMartini,
15
+ TransferableTile,
16
+ VectorTileState,
17
+ } from "@navaramap/engine";
18
+ import type { FontManager } from "@navaramap/font";
19
+ import type { Texture } from "three";
20
+
21
+ import type { ViewEvents } from "..";
22
+ import type { ThreeViewCamera } from "../camera";
23
+ import type { ViewContext } from "../core";
24
+ import type { LayersManager } from "../layersManager";
25
+ import type { TileMesh } from "../mesh/tile";
26
+ import type { Scenes, TexturizedSceneByTileCoordinates } from "../scene";
27
+ import type { TextureOptions } from "../textures";
28
+ import type { TileTextureCompositor } from "../tileTexture";
29
+ import type {
30
+ AbortControllers,
31
+ MeshCache,
32
+ WorkerPoolPromises,
33
+ RenderFlag,
34
+ TileMapByHandle,
35
+ } from "../type";
36
+ import type { CommonUniforms } from "../uniforms";
37
+ import type { TextureSlot } from "../utils";
38
+
39
+ import type { HillshadeContext } from "./HillshadeContext";
40
+
41
+ export type BufferLoader = {
42
+ // The non-removing getters (u8/f32/f64/u32) return short-lived VIEWS into
43
+ // WASM linear memory: consume them immediately and `.slice()` to retain —
44
+ // any WASM call that allocates may grow the memory and detach the view.
45
+ // Never hand their `.buffer` (the whole WASM memory) to another consumer.
46
+ // Consecutive getter calls do not allocate, so earlier views stay valid.
47
+ u8: (handle: number) => Uint8Array | null;
48
+ f32: (handle: number) => Float32Array | null;
49
+ f64: (handle: number) => Float64Array | null;
50
+ u32: (handle: number) => Uint32Array | null;
51
+ // The remove* variants return owned copies (the WASM-side buffer is freed).
52
+ removeU8: (handle: number) => Uint8Array | null;
53
+ removeF32: (handle: number) => Float32Array | null;
54
+ removeF64: (handle: number) => Float64Array | null;
55
+ removeU32: (handle: number) => Uint32Array | null;
56
+ setU8: (handle: number, bits: bigint, bytes: Uint8Array) => void;
57
+ newU8: (bytes: Uint8Array) => number | undefined;
58
+ newU32: (bytes: Uint32Array) => number | undefined;
59
+ newF32: (bytes: Float32Array) => number | undefined;
60
+ newF64: (bytes: Float64Array) => number | undefined;
61
+ // The `adopt*` variants register a JS-owned array in the `InMemoryBufferStore`
62
+ // (zero-copy — the array is kept as-is) and hand WASM a byte-count-only
63
+ // `External` handle, so worker-built geometry never round-trips through WASM
64
+ // linear memory. The getters (u8/f32/...) return it directly; remove* takes it
65
+ // and clears the WASM-side accounting.
66
+ adoptU8: (array: Uint8Array) => number | undefined;
67
+ adoptU32: (array: Uint32Array) => number | undefined;
68
+ adoptF32: (array: Float32Array) => number | undefined;
69
+ adoptF64: (array: Float64Array) => number | undefined;
70
+ /** DataRequester mirror of `adoptU8`: registers an `External` entry under an
71
+ * existing handle and fires the loaded event. Guards on `hasDataRequester`.
72
+ * An `External` entry carries no element type, so this is not typed. */
73
+ setExternal: (handle: number, bits: bigint, array: Uint8Array) => void;
74
+ remove: (handle: number) => void;
75
+ /** Evict handles Rust removed from the WASM `BufferStore` out of the JS-side
76
+ * `InMemoryBufferStore`; called once per frame. */
77
+ drainRemovedExternalHandles: () => void;
78
+ triggerDataRequesterLoaded: (bits: bigint, handle: number) => void;
79
+ triggerDataRequesterFailed: (bits: bigint) => void;
80
+ };
81
+
82
+ export type TextureFragmentHandler = {
83
+ triggerTextureFragmentLoaded: (
84
+ bits: bigint,
85
+ status: TextureFragmentStatus,
86
+ ) => void;
87
+ };
88
+
89
+ export type WorkerTaskHandler = {
90
+ triggerWorkerTaskCompleted: (
91
+ bits: bigint,
92
+ result: DelegatedWorkerTasksResult,
93
+ ) => void;
94
+ /**
95
+ * Release the delegator of a task that ended without a deliverable result.
96
+ * Consumes `delegator_id`; a no-op for a task the engine already cancelled.
97
+ */
98
+ triggerWorkerTaskFailed: (delegator_id: ReconstructableEntity) => void;
99
+ hasWorkerTask: (bits: bigint) => boolean;
100
+ };
101
+
102
+ export type TileHandler = {
103
+ getMartini: (bits: ReconstructableEntity) => TransferableMartini | undefined;
104
+ getTile: (handle: bigint) => TransferableTile | undefined;
105
+ getParentTile: (handle: bigint) => TransferableTile | undefined;
106
+ getTileElevationDecoder: (handle: bigint) => ElevationDecoder | undefined;
107
+ getVectorTileStates: (handle: bigint) => VectorTileState[] | undefined;
108
+ vectorRevision: () => number;
109
+ /** Reports a terrain tile's drape render-target GPU footprint (bytes) so the
110
+ * memory ledger tracks clamp-to-ground vector bakes that scale with terrain
111
+ * subdivision past the vector `maxZoom`. Pass 0 to release on dispose. */
112
+ reportDrapeGpuBytes: (handle: bigint, bytes: number) => void;
113
+ calcMetersPerTexel: (
114
+ tileHandle: bigint,
115
+ textureZoom: number,
116
+ textureWidth: number,
117
+ ) => number;
118
+ };
119
+
120
+ /**
121
+ * Handler for accessing individual Globe properties from WASM.
122
+ * This provides a reference-based interface instead of copying the entire Globe object.
123
+ */
124
+ export type GlobeHandler = {
125
+ getTransparent: () => boolean | undefined;
126
+ getMaxSse: () => number | undefined;
127
+ getSegments: () => number | undefined;
128
+ getColor: () => CoreColor | undefined;
129
+ getHideUnderground: () => boolean | undefined;
130
+ getUseNormal: () => boolean | undefined;
131
+ getOpacity: () => number | undefined;
132
+ getWireframe: () => boolean | undefined;
133
+ getElevationColormap: () => Float32Array | undefined;
134
+ setTransparent: (value: boolean) => void;
135
+ setMaxSse: (value: number) => void;
136
+ setSegments: (value: number) => void;
137
+ setColor: (value: CoreColor) => void;
138
+ setHideUnderground: (value: boolean) => void;
139
+ setUseNormal: (value: boolean) => void;
140
+ setOpacity: (value: number) => void;
141
+ setWireframe: (value: boolean) => void;
142
+ setElevationColormap: (value: ColorMap) => void;
143
+ };
144
+
145
+ export type FeatureHandler = {
146
+ getTransferablePolygonBatchedFeature: (
147
+ bits: bigint,
148
+ ) => ReturnedTransferablePolygonBatchedFeature | undefined;
149
+ getTransferablePolylineBatchedFeature: (
150
+ bits: bigint,
151
+ ) => ReturnedTransferablePolylineBatchedFeature | undefined;
152
+ markFeatureIsRendered: (
153
+ type: "point" | "polyline" | "polygon" | "model",
154
+ bits: bigint,
155
+ ) => void;
156
+ /** Reports a rendered feature's actual measured GPU byte size so the memory
157
+ * ledger replaces its payload-based estimate. Feature kinds the engine has
158
+ * no owner lookup for are a no-op (currently wired: 3D Tiles models, whose
159
+ * post-glTF/Draco-decode size undercounts otherwise). */
160
+ reportFeatureGpuBytes: (bits: bigint, bytes: number) => void;
161
+ readAllBatchedProperties(
162
+ bits: bigint,
163
+ callback: (
164
+ batchIdx: number,
165
+ batchId: number,
166
+ properties?: Record<string, unknown>,
167
+ ) => void,
168
+ ): void;
169
+ readFilteredBatchedProperties(
170
+ bits: bigint,
171
+ keys: string[],
172
+ callback: (batchIdx: number, batchId: number, filtered?: unknown[]) => void,
173
+ ): void;
174
+ };
175
+
176
+ export type MeshHandler = {
177
+ setTileMeshPrepared: (handle: bigint) => void;
178
+ };
179
+
180
+ export type LayerHandler = {
181
+ getLayerIndex: (layerId: string) => number | undefined;
182
+ };
183
+
184
+ type EventContextArgs = {
185
+ eventManager: EventManager;
186
+ scenes: Scenes;
187
+ camera: ThreeViewCamera;
188
+ meshes: MeshCache;
189
+ abortControllers: AbortControllers;
190
+ buf: BufferLoader;
191
+ texFragment: TextureFragmentHandler;
192
+ tileHandler: TileHandler;
193
+ workerTaskHandler: WorkerTaskHandler;
194
+ meshHandler: MeshHandler;
195
+ featureHandler: FeatureHandler;
196
+ loadedTexs: Map<string, Texture>;
197
+ workerPoolPromises: WorkerPoolPromises;
198
+ uniforms: CommonUniforms;
199
+ texturizedSceneByTileCoordinates: TexturizedSceneByTileCoordinates;
200
+ tileTextureCompositor: TileTextureCompositor;
201
+ tileMapByHandle: TileMapByHandle;
202
+ textureOptions: TextureOptions;
203
+ renderFlag: RenderFlag;
204
+ viewEvents: EventHandler<ViewEvents>;
205
+ layersManager: LayersManager;
206
+ viewContext: ViewContext;
207
+ layerHandler?: LayerHandler;
208
+ fontManager?: FontManager;
209
+ textureFragmentIndex?: Map<string, Set<TextureSlot>>;
210
+ tileMeshToFragmentIds?: Map<TileMesh, Set<string>>;
211
+ hillshadeContext?: HillshadeContext;
212
+ };
213
+
214
+ /**
215
+ * EventContext bundles all the shared state needed to process engine events
216
+ * and propagate them into each processor.
217
+ */
218
+ export class EventContext {
219
+ readonly eventManager: EventManager;
220
+ readonly scenes: Scenes;
221
+ readonly camera: ThreeViewCamera;
222
+ readonly meshes: MeshCache;
223
+ readonly abortControllers: AbortControllers;
224
+ readonly buf: BufferLoader;
225
+ readonly texFragment: TextureFragmentHandler;
226
+ readonly tileHandler: TileHandler;
227
+ readonly workerTaskHandler: WorkerTaskHandler;
228
+ readonly meshHandler: MeshHandler;
229
+ readonly featureHandler: FeatureHandler;
230
+ readonly loadedTexs: Map<string, Texture>;
231
+ readonly workerPoolPromises: WorkerPoolPromises;
232
+ readonly uniforms: CommonUniforms;
233
+ readonly texturizedSceneByTileCoordinates: TexturizedSceneByTileCoordinates;
234
+ readonly tileTextureCompositor: TileTextureCompositor;
235
+ readonly tileMapByHandle: TileMapByHandle;
236
+ readonly textureOptions: TextureOptions;
237
+ readonly renderFlag: RenderFlag;
238
+ readonly viewEvents: EventHandler<ViewEvents>;
239
+ readonly layersManager: LayersManager;
240
+ readonly viewContext: ViewContext;
241
+ readonly layerHandler?: LayerHandler;
242
+ readonly fontManager?: FontManager;
243
+ readonly textureFragmentIndex?: Map<string, Set<TextureSlot>>;
244
+ readonly tileMeshToFragmentIds?: Map<TileMesh, Set<string>>;
245
+ readonly hillshadeContext?: HillshadeContext;
246
+
247
+ updatedAt = 0;
248
+
249
+ constructor(args: EventContextArgs) {
250
+ this.eventManager = args.eventManager;
251
+ this.scenes = args.scenes;
252
+ this.camera = args.camera;
253
+ this.meshes = args.meshes;
254
+ this.abortControllers = args.abortControllers;
255
+ this.buf = args.buf;
256
+ this.texFragment = args.texFragment;
257
+ this.tileHandler = args.tileHandler;
258
+ this.workerTaskHandler = args.workerTaskHandler;
259
+ this.meshHandler = args.meshHandler;
260
+ this.featureHandler = args.featureHandler;
261
+ this.loadedTexs = args.loadedTexs;
262
+ this.workerPoolPromises = args.workerPoolPromises;
263
+ this.uniforms = args.uniforms;
264
+ this.texturizedSceneByTileCoordinates =
265
+ args.texturizedSceneByTileCoordinates;
266
+ this.tileTextureCompositor = args.tileTextureCompositor;
267
+ this.tileMapByHandle = args.tileMapByHandle;
268
+ this.textureOptions = args.textureOptions;
269
+ this.renderFlag = args.renderFlag;
270
+ this.viewEvents = args.viewEvents;
271
+ this.layersManager = args.layersManager;
272
+ this.viewContext = args.viewContext;
273
+ this.layerHandler = args.layerHandler;
274
+ this.fontManager = args.fontManager;
275
+ this.textureFragmentIndex = args.textureFragmentIndex;
276
+ this.tileMeshToFragmentIds = args.tileMeshToFragmentIds;
277
+ this.hillshadeContext = args.hillshadeContext;
278
+ }
279
+ }
@@ -0,0 +1,357 @@
1
+ import type { TileHandle } from "@navaramap/core";
2
+ import { generate_id_from_entity } from "@navaramap/core";
3
+ import {
4
+ type RenderableFeatureAddedEvent,
5
+ type RenderableFeature,
6
+ RenderableFeatureChangedEvent,
7
+ } from "@navaramap/engine";
8
+ import { Mesh, Sprite, Object3D, Scene } from "three";
9
+
10
+ import {
11
+ BatchedSdfTextMesh,
12
+ InstancedSpriteMesh,
13
+ ModelMesh,
14
+ PolygonMesh,
15
+ PolylineMesh,
16
+ } from "../mesh";
17
+ import { FEATURE_RENDER_ORDER } from "../renderOrder";
18
+ import type { Scenes } from "../scene";
19
+
20
+ import type { EventContext } from "./context";
21
+ import {
22
+ handleFeatureCreatedEventByLayerId,
23
+ handleFeatureUpdatedEventByLayerId,
24
+ handleFeatureVisibilityChangedEventByLayerId,
25
+ } from "./featureEvent";
26
+ import { renderBillboard, processBillboardChanged } from "./features/billboard";
27
+ import { renderModel, processModelChanged } from "./features/model";
28
+ import { sumModelGpuBytes } from "./features/modelGpuBytes";
29
+ import { renderPoint, processPointChanged } from "./features/point";
30
+ import { renderPolygon, processPolygonChanged } from "./features/polygon";
31
+ import {
32
+ renderPolygonOutline,
33
+ processPolygonOutlineChanged,
34
+ } from "./features/polygonOutline";
35
+ import { renderPolyline, processPolylineChanged } from "./features/polyline";
36
+ import { renderText, processTextChanged } from "./features/text";
37
+
38
+ import { setTransform } from ".";
39
+
40
+ /**
41
+ * Choose the render scene for a non-draped feature based on its material.
42
+ *
43
+ * Sprites (billboards/points) and SDF text configured with `depthTest: false`
44
+ * are meant to render always-on-top. Left in the MRT scene they draw before the
45
+ * depth-based post-processing effects (aerial perspective, clouds, ssao,
46
+ * atmosphere), which sample the depth buffer — where these features wrote
47
+ * nothing — and composite over them, painting them out. Route them into the
48
+ * transparent scene, which TransparentPassEffectDesc renders (clear=false)
49
+ * after those effects. Every other non-draped feature stays in the MRT scene.
50
+ *
51
+ * The material comes straight from the engine event (the source of truth): text
52
+ * applies its Three material asynchronously (behind font preparation), so the
53
+ * live mesh material can lag behind the intended `depthTest`.
54
+ */
55
+ function overlayScene(
56
+ material: { depthTest?: boolean } | undefined,
57
+ scenes: Scenes,
58
+ ): Scene {
59
+ return material?.depthTest === false ? scenes.transparent : scenes.mrt;
60
+ }
61
+
62
+ export function renderFeature(
63
+ ctx: EventContext,
64
+ f: RenderableFeature,
65
+ tileHandle: TileHandle | undefined,
66
+ layerId: string,
67
+ ): Promise<Mesh | Sprite | Object3D | undefined> | undefined {
68
+ if (f.point) {
69
+ return renderPoint(ctx, f.point);
70
+ }
71
+ if (f.billboard) {
72
+ return renderBillboard(ctx, f.billboard);
73
+ }
74
+ if (f.model) {
75
+ return renderModel(ctx, f.model);
76
+ }
77
+ if (f.polyline) {
78
+ return renderPolyline(ctx, f.polyline);
79
+ }
80
+ if (f.polygon) {
81
+ return renderPolygon(ctx, f.polygon, tileHandle, layerId);
82
+ }
83
+ if (f.text) {
84
+ return renderText(ctx, f.text, layerId);
85
+ }
86
+ }
87
+
88
+ // Define whether the feature uses web worker internally.
89
+ // - `model` feature uses Web worker internally to parse glTF and its compression.
90
+ export const checkFeatureParallel = (feature: RenderableFeature): boolean => {
91
+ const { model } = feature;
92
+ return !!model;
93
+ };
94
+
95
+ export async function processRenderableFeatureAdded(
96
+ ctx: EventContext,
97
+ ev: RenderableFeatureAddedEvent,
98
+ ) {
99
+ const {
100
+ scenes,
101
+ meshes,
102
+ texturizedSceneByTileCoordinates,
103
+ featureHandler,
104
+ viewEvents,
105
+ layersManager,
106
+ viewContext,
107
+ updatedAt,
108
+ layerHandler,
109
+ } = ctx;
110
+ const id = generate_id_from_entity(ev);
111
+ const feature = ev.feature;
112
+
113
+ const { point, billboard, text, polyline, polygon, model } = feature;
114
+
115
+ const overscaledTileHandle = ev.overscaled_tile_handle;
116
+
117
+ const tileHandle = overscaledTileHandle?.handle;
118
+
119
+ const featureLayerId = ev.layer_id;
120
+
121
+ const useParallel = checkFeatureParallel(feature);
122
+
123
+ if (useParallel) {
124
+ // Start parallel process
125
+ viewContext.concurrencyManager.increment();
126
+ }
127
+
128
+ const obj = await renderFeature(ctx, feature, tileHandle, featureLayerId)
129
+ ?.then((r) => {
130
+ const type = (() => {
131
+ if (point || billboard || text) return "point";
132
+ else if (model) return "model";
133
+ else if (polyline) return "polyline";
134
+ else if (polygon) return "polygon";
135
+ })();
136
+ if (type) {
137
+ featureHandler.markFeatureIsRendered(type, ev.bits);
138
+ }
139
+ // The glTF/Draco decode happened on the JS side, so report the actual
140
+ // decoded GPU size back to the ledger (its compressed-payload estimate
141
+ // undercounts Draco content). Draco decode inflates geometry markedly.
142
+ if (model && r) {
143
+ featureHandler.reportFeatureGpuBytes(ev.bits, sumModelGpuBytes(r));
144
+ }
145
+ // The billboard image atlas (CPU pixel buffer + GPU texture) is
146
+ // allocated and grown lazily on the JS side as images load, so the
147
+ // mesh reports its measured footprint whenever it changes; the ledger
148
+ // folds it into the owning vector tile's cost. Capture `bits` as a
149
+ // plain number now: the reporter fires long after this WASM event
150
+ // object is freed (async image packs), and a deferred `ev.bits` read
151
+ // would throw "null pointer passed to rust".
152
+ if (billboard && r instanceof InstancedSpriteMesh) {
153
+ const featureBits = ev.bits;
154
+ r.setAtlasBytesReporter((bytes) =>
155
+ featureHandler.reportFeatureGpuBytes(featureBits, bytes),
156
+ );
157
+ }
158
+ return r;
159
+ })
160
+ .finally(() => {
161
+ if (useParallel) {
162
+ // End parallel process
163
+ viewContext.concurrencyManager.decrement();
164
+ }
165
+ });
166
+
167
+ if (!obj) return;
168
+
169
+ // Sprite should be handled by mesh itself.
170
+ const transform = (polyline ?? polygon ?? model)?.transform;
171
+ if (transform) {
172
+ setTransform(obj, transform);
173
+ }
174
+
175
+ obj.renderOrder = FEATURE_RENDER_ORDER;
176
+
177
+ // Add to MRT scene if not draped (draped features render to texturized scene)
178
+ const isDraped =
179
+ (obj instanceof PolygonMesh && obj.clampToGround) ||
180
+ (obj instanceof PolylineMesh && obj.draped);
181
+ if (!isDraped) {
182
+ const material = point?.material ?? billboard?.material ?? text?.material;
183
+ overlayScene(material, scenes).add(obj);
184
+ }
185
+
186
+ meshes.set(id, obj);
187
+
188
+ if (isDraped && tileHandle) {
189
+ // Insert the bakeable draped mesh into the per-tile cache now (it is fully built at
190
+ // this point). Readiness/ancestor-fallback is decided entirely on the Rust side from
191
+ // the ECS lifecycle, so no `scene_ready` is reported. Insert even when invisible —
192
+ // the offscreen bake skips invisible meshes.
193
+ const layerIndex = layerHandler?.getLayerIndex(featureLayerId);
194
+ // Timing: the layer may have been removed before this event; skip the insert then (the
195
+ // mesh object still exists, it just won't be baked for this layer).
196
+ if (layerIndex != null) {
197
+ texturizedSceneByTileCoordinates.add(
198
+ tileHandle,
199
+ featureLayerId,
200
+ obj as Mesh,
201
+ layerIndex,
202
+ );
203
+ }
204
+ obj.addEventListener("removedFromWorld", () => {
205
+ texturizedSceneByTileCoordinates.removeMesh(
206
+ tileHandle,
207
+ featureLayerId,
208
+ obj as Mesh,
209
+ );
210
+ });
211
+ obj.addEventListener("needsUpdate", () => {
212
+ texturizedSceneByTileCoordinates.markDirty(tileHandle, featureLayerId);
213
+ });
214
+ }
215
+
216
+ if (obj instanceof PolygonMesh && polygon && polygon.outline_geometry) {
217
+ const outline = await renderPolygonOutline(ctx, polygon);
218
+ outline.renderOrder = FEATURE_RENDER_ORDER;
219
+ scenes.mrt.add(outline);
220
+
221
+ obj.outline = outline;
222
+
223
+ obj.addEventListener("removedFromWorld", () => {
224
+ obj.outline?.clear();
225
+ obj.outline?.removeFromParent();
226
+ });
227
+ }
228
+
229
+ handleFeatureCreatedEventByLayerId(
230
+ featureHandler,
231
+ obj,
232
+ viewEvents,
233
+ layersManager,
234
+ featureLayerId,
235
+ ev.bits,
236
+ );
237
+ if (obj.visible) {
238
+ handleFeatureUpdatedEventByLayerId(
239
+ viewEvents,
240
+ layersManager,
241
+ featureLayerId,
242
+ ev.bits,
243
+ updatedAt,
244
+ );
245
+ }
246
+ }
247
+
248
+ export async function processRenderableFeatureChanged(
249
+ ctx: EventContext,
250
+ ev: RenderableFeatureChangedEvent,
251
+ ) {
252
+ const {
253
+ scenes,
254
+ meshes,
255
+ texturizedSceneByTileCoordinates,
256
+ viewEvents,
257
+ layersManager,
258
+ updatedAt,
259
+ } = ctx;
260
+ const id = generate_id_from_entity(ev);
261
+ const obj = meshes.get(id);
262
+ if (!obj) return;
263
+
264
+ const layerId = ev.layer_id;
265
+
266
+ const overscaledTileHandle = ev.overscaled_tile_handle;
267
+ const tileHandle = overscaledTileHandle?.handle;
268
+
269
+ const { point, billboard, text, polyline, polygon, model } = ev.feature;
270
+
271
+ const active =
272
+ (point ?? billboard ?? text ?? polyline ?? polygon ?? model)?.active ??
273
+ true;
274
+
275
+ // Capture visibility before material updates to detect changes
276
+ const prevVisible = obj.visible;
277
+
278
+ if (obj instanceof InstancedSpriteMesh && point) {
279
+ processPointChanged(obj, point, active);
280
+ }
281
+ if (obj instanceof InstancedSpriteMesh && billboard) {
282
+ await processBillboardChanged(obj, billboard, active);
283
+ }
284
+
285
+ if (obj instanceof BatchedSdfTextMesh && text) {
286
+ await processTextChanged(obj, text, active);
287
+ }
288
+
289
+ // `depthTest` may have flipped at runtime, changing which scene a sprite or
290
+ // text feature belongs to (transparent for always-on-top overlays, MRT
291
+ // otherwise). Re-route based on the incoming material; Three's `add()`
292
+ // reparents safely, and the guard keeps draped/model/polygon/polyline
293
+ // features untouched.
294
+ if (obj instanceof InstancedSpriteMesh || obj instanceof BatchedSdfTextMesh) {
295
+ const material = point?.material ?? billboard?.material ?? text?.material;
296
+ const target = overlayScene(material, scenes);
297
+ if (obj.parent !== target) {
298
+ target.add(obj);
299
+ ctx.renderFlag.forceUpdate = true;
300
+ }
301
+ }
302
+ if (obj instanceof ModelMesh && model) {
303
+ processModelChanged(obj, model, active);
304
+ }
305
+ if (obj instanceof PolylineMesh && polyline) {
306
+ processPolylineChanged(obj, polyline, active);
307
+ }
308
+ if (obj instanceof PolygonMesh && polygon) {
309
+ processPolygonChanged(obj, polygon, active, tileHandle);
310
+
311
+ if (obj.outline) {
312
+ processPolygonOutlineChanged(obj.outline, polygon, active);
313
+ }
314
+ }
315
+
316
+ // A draped feature's material/visibility changed: bump the layer scene's revision so the
317
+ // consuming TileMesh re-bakes (invisible meshes stay in the scene and are skipped at bake).
318
+ // Cache membership is owned by CREATE / `removedFromWorld`; a runtime `clampToGround` flip
319
+ // is not handled here (rare — the flag is set once at mesh init).
320
+ if (
321
+ ((obj instanceof PolygonMesh && obj.clampToGround) ||
322
+ (obj instanceof PolylineMesh && obj.draped)) &&
323
+ tileHandle
324
+ ) {
325
+ texturizedSceneByTileCoordinates.markDirty(tileHandle, layerId);
326
+ }
327
+
328
+ // Emit visibility changed event if visibility actually changed after material updates
329
+ if (prevVisible !== obj.visible) {
330
+ handleFeatureVisibilityChangedEventByLayerId(
331
+ layersManager,
332
+ layerId,
333
+ ev.bits,
334
+ obj.visible,
335
+ );
336
+ }
337
+
338
+ // Point, billboard and text should be handled by their mesh.
339
+ const transform = (polyline ?? polygon ?? model)?.transform;
340
+
341
+ // This should be handled after the asynchronous process to avoid a conflict.
342
+ if (transform) {
343
+ setTransform(obj, transform);
344
+ }
345
+
346
+ obj.updateMatrix();
347
+
348
+ if (obj.visible) {
349
+ handleFeatureUpdatedEventByLayerId(
350
+ viewEvents,
351
+ layersManager,
352
+ layerId,
353
+ ev.bits,
354
+ updatedAt,
355
+ );
356
+ }
357
+ }