@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,483 @@
1
+ import { Unimplemented } from "@navaramap/core";
2
+ import {
3
+ ModelMaterial as NavaraModelMaterial,
4
+ ModelMesh as NavaraModelMesh,
5
+ Vec3,
6
+ } from "@navaramap/engine";
7
+ import {
8
+ BufferAttribute,
9
+ BufferGeometry,
10
+ Color,
11
+ DataTexture,
12
+ Group,
13
+ Mesh,
14
+ Points,
15
+ MeshPhysicalMaterial,
16
+ MeshStandardMaterial,
17
+ Object3D,
18
+ RGBADepthPacking,
19
+ SkinnedMesh,
20
+ Texture,
21
+ type NormalBufferAttributes,
22
+ PointsMaterial,
23
+ } from "three";
24
+ import invariant from "tiny-invariant";
25
+
26
+ import type { EventContext } from "../event/context";
27
+ import {
28
+ createModelMaterialEnhancer,
29
+ createPntsEnhancer,
30
+ } from "../material/enhancer/model";
31
+ import type { ModelMaterialProps, PntsProps } from "../material/enhancer/model";
32
+ import type { UniformValue } from "../material/types";
33
+ import type { CustomObject3DEventMap } from "../object3DEvent";
34
+
35
+ import {
36
+ getBatchDataTexture,
37
+ initBatchDataTexture,
38
+ initBatchedMaterial,
39
+ updateBatchAttribute,
40
+ type BatchTextureConfig,
41
+ } from "./batchTexture";
42
+ import type { FeatureMesh } from "./featureMesh";
43
+ import type { PickableMesh } from "./pickableMesh";
44
+ import { releaseGeometryArraysAfterUpload } from "./releaseGeometryArrays";
45
+
46
+ export type ModelMaterial = MeshStandardMaterial | MeshPhysicalMaterial;
47
+
48
+ // TODO: Height to adjust the height based on its property.
49
+ export type ModelBatchedAttributeName = "color" | "show" | "opacity";
50
+
51
+ export const MODEL_BATCH_TEXTURE_CONFIG: BatchTextureConfig = {
52
+ rows: ["COLOR_SHOW"],
53
+ batchLength: 0,
54
+ };
55
+
56
+ type ModelMaterialEnhancer = ReturnType<typeof createModelMaterialEnhancer>;
57
+ type PntsMaterialEnhancer = ReturnType<typeof createPntsEnhancer>;
58
+
59
+ export class ModelMesh
60
+ extends Object3D<CustomObject3DEventMap>
61
+ implements FeatureMesh, PickableMesh
62
+ {
63
+ readonly ctx: EventContext;
64
+ /** Enhanced materials with encapsulated state, one per child mesh */
65
+ private _enhancers = new Map<
66
+ Mesh<BufferGeometry<NormalBufferAttributes>, ModelMaterial>,
67
+ ModelMaterialEnhancer
68
+ >();
69
+
70
+ /** Enhanced materials for point cloud objects, one per Points child */
71
+ private _pntsEnhancers = new Map<
72
+ Points<BufferGeometry<NormalBufferAttributes>, PointsMaterial>,
73
+ PntsMaterialEnhancer
74
+ >();
75
+
76
+ // model credit for attribution
77
+ credit: string | undefined;
78
+ batchLength?: number;
79
+
80
+ constructor(
81
+ ctx: EventContext,
82
+ gltfInfo: {
83
+ scene: Group;
84
+ credit?: string;
85
+ },
86
+ m: NavaraModelMesh,
87
+ ) {
88
+ super();
89
+ this.ctx = ctx;
90
+ this.credit = gltfInfo.credit;
91
+ this.batchLength = m.batch_length;
92
+ this.add(gltfInfo.scene);
93
+ this.init(m);
94
+ this.addEventListener("removedFromWorld", () => {
95
+ this.dispose();
96
+ });
97
+ }
98
+
99
+ get water(): boolean {
100
+ for (const enhancer of this._enhancers.values()) {
101
+ // Assume the first enhancer has the common value.
102
+ return enhancer.states().water.useWater;
103
+ }
104
+ return false;
105
+ }
106
+
107
+ set water(v: boolean) {
108
+ for (const enhancer of this._enhancers.values()) {
109
+ enhancer.update({ water: { water: v } });
110
+ }
111
+ }
112
+
113
+ private init(m: NavaraModelMesh) {
114
+ const { buf } = this.ctx;
115
+ const batchIdsData = m.geometry.batch_ids;
116
+ const dataSize = batchIdsData?.size ?? 0;
117
+ // buf.u32 returns a short-lived view into WASM memory; copy to retain it
118
+ // across the traversal below.
119
+ const batchIds = batchIdsData
120
+ ? (buf.u32(batchIdsData.data)?.slice() ?? null)
121
+ : new Uint32Array(dataSize);
122
+
123
+ const meshMaterial = m.material;
124
+ const uniforms = this.ctx.uniforms;
125
+
126
+ const updateProps = this.buildUpdateProps(meshMaterial);
127
+ const modelInitialProps: ModelMaterialProps = {
128
+ ...updateProps,
129
+ water: {
130
+ ...updateProps.water,
131
+ skyEnvMap: uniforms.tSkyEnvMap.value,
132
+ waterNormalMap: uniforms.waterTexture as UniformValue<Texture | null>,
133
+ timeUniform: uniforms.time as UniformValue<number>,
134
+ skyEnvMapUniform: uniforms.tSkyEnvMap as UniformValue<Texture | null>,
135
+ },
136
+ };
137
+
138
+ const geodeticNormal: Vec3 =
139
+ meshMaterial.__internal__?.pointCloudGeodeticNormal ?? new Vec3(0, 0, 0);
140
+ const pntsInitialProps: PntsProps = {
141
+ color: meshMaterial.color ?? 0,
142
+ pointSize: meshMaterial.pointSize ?? 1,
143
+ height: meshMaterial.height ?? 0,
144
+ geodeticNormal,
145
+ divideColor: meshMaterial.__internal__?.pointCloud,
146
+ };
147
+
148
+ this.traverse((object: Object3D) => {
149
+ if (object instanceof Mesh) {
150
+ this._setupMeshNode(
151
+ object,
152
+ meshMaterial,
153
+ batchIds,
154
+ dataSize,
155
+ modelInitialProps,
156
+ );
157
+ this._releaseGeometryArrays(object);
158
+ } else if (object instanceof Points) {
159
+ this._setupPointsNode(object, pntsInitialProps);
160
+ this._releaseGeometryArrays(object);
161
+ }
162
+ });
163
+
164
+ this.visible = meshMaterial.show ?? true;
165
+ }
166
+
167
+ /**
168
+ * Drop the CPU-side typed arrays of a loaded glTF/point-cloud node after its
169
+ * first GPU upload. The GLTFLoader has already computed bounding volumes at
170
+ * parse time (and the point-cloud path assigns them from the WASM AABB), and
171
+ * `_setupMeshNode` has already read `_batchid.array` before this runs, so no
172
+ * CPU read survives the first upload.
173
+ *
174
+ * Skipped for skinned meshes and geometries with morph targets: those keep
175
+ * their CPU arrays for per-frame skinning/morphing on the CPU.
176
+ */
177
+ private _releaseGeometryArrays(node: Mesh | Points) {
178
+ if (node instanceof SkinnedMesh) return;
179
+ const geometry = node.geometry;
180
+ if (!(geometry instanceof BufferGeometry)) return;
181
+ if (
182
+ geometry.morphAttributes &&
183
+ Object.keys(geometry.morphAttributes).length
184
+ )
185
+ return;
186
+ releaseGeometryArraysAfterUpload(geometry);
187
+ }
188
+
189
+ _initBatchedMaterial(
190
+ mesh: Mesh<BufferGeometry<NormalBufferAttributes>, ModelMaterial>,
191
+ ) {
192
+ initBatchedMaterial(mesh.material, MODEL_BATCH_TEXTURE_CONFIG);
193
+ }
194
+
195
+ _initBatchDataTexture(
196
+ mesh: Mesh<BufferGeometry<NormalBufferAttributes>, ModelMaterial>,
197
+ ): void {
198
+ invariant(this.batchLength != null);
199
+
200
+ const config: BatchTextureConfig = {
201
+ ...MODEL_BATCH_TEXTURE_CONFIG,
202
+ batchLength: this.batchLength,
203
+ };
204
+
205
+ initBatchDataTexture(mesh.material, config);
206
+
207
+ // Update the enhancer with the new batchDataTexture
208
+ const texture = this._getBatchDataTexture(mesh);
209
+ const enhancer = this._enhancers.get(mesh);
210
+ if (texture && enhancer) {
211
+ enhancer.update({
212
+ base: { useBatchTexture: true, batchDataTexture: { value: texture } },
213
+ });
214
+ }
215
+ }
216
+
217
+ _getBatchDataTexture(
218
+ mesh: Mesh<BufferGeometry<NormalBufferAttributes>, ModelMaterial>,
219
+ ): DataTexture | undefined {
220
+ return getBatchDataTexture(mesh.material);
221
+ }
222
+
223
+ _updateBatchAttribute(
224
+ mesh: Mesh<BufferGeometry<NormalBufferAttributes>, ModelMaterial>,
225
+ batchId: number,
226
+ attribute: ModelBatchedAttributeName,
227
+ value: number | number[] | boolean,
228
+ ): void {
229
+ const enhancer = this._enhancers.get(mesh);
230
+ if (enhancer) {
231
+ switch (attribute) {
232
+ case "color": {
233
+ // When batch color is first used, enable batchColorEnabled and set material.color to white
234
+ if (!enhancer.states().base.batchColorEnabled) {
235
+ enhancer.update({
236
+ base: { batchColorEnabled: true, color: 0xffffff },
237
+ });
238
+ }
239
+ enhancer.update({ base: { useBatchColorShow: true } });
240
+ break;
241
+ }
242
+ case "show": {
243
+ enhancer.update({ base: { useBatchColorShow: true } });
244
+ break;
245
+ }
246
+ case "opacity": {
247
+ // Opacity is bundled with show in COLOR_SHOW alpha channel
248
+ enhancer.update({ base: { useBatchColorShow: true } });
249
+ break;
250
+ }
251
+ }
252
+ }
253
+
254
+ updateBatchAttribute(mesh.material, batchId, attribute, value, {
255
+ color: mesh.material.color,
256
+ });
257
+ }
258
+
259
+ private _setupMeshNode(
260
+ mesh: Mesh<BufferGeometry<NormalBufferAttributes>, ModelMaterial>,
261
+ meshMaterial: NavaraModelMaterial,
262
+ batchIds: Uint32Array<ArrayBufferLike> | null,
263
+ dataSize: number,
264
+ initialProps: ModelMaterialProps,
265
+ ) {
266
+ if (!batchIds) return;
267
+
268
+ const vertCnt = mesh.geometry.attributes?.position?.count;
269
+
270
+ const attrBatchIds = new Float32Array(vertCnt);
271
+ // B3DM (1.0) uses _batchid; glTF with EXT_mesh_features (1.1) uses _FEATURE_ID_N.
272
+ // Assign _FEATURE_ID_0 to _batchid so the batch texture shader works unchanged.
273
+ // Also accept lowercase _feature_id_0 as a compatibility fallback.
274
+ const attrs = mesh.geometry.attributes;
275
+ const featureIdAttribute =
276
+ attrs?.["_FEATURE_ID_0"] ?? attrs?.["_feature_id_0"];
277
+ if (!attrs?._batchid && featureIdAttribute) {
278
+ // TODO: Support other feature ID semantics such as `_FEATURE_ID_n`.
279
+ // Need to clone, since it might be switch to different feature ID attributes.
280
+ mesh.geometry.setAttribute("_batchid", featureIdAttribute.clone());
281
+ }
282
+ const internalBatchIds = attrs?._batchid?.array;
283
+
284
+ if (internalBatchIds) {
285
+ let i = 0;
286
+ for (const internalBatchId of internalBatchIds) {
287
+ attrBatchIds[i] = batchIds[internalBatchId] ?? 0;
288
+ i++;
289
+ }
290
+ } else {
291
+ for (let i = 0; i < vertCnt; i++) {
292
+ attrBatchIds[i] = batchIds[0];
293
+ }
294
+ }
295
+
296
+ mesh.geometry.setAttribute(
297
+ "batchId",
298
+ new BufferAttribute(attrBatchIds, dataSize),
299
+ );
300
+
301
+ mesh.castShadow = !!meshMaterial.castShadow;
302
+ mesh.receiveShadow = !!meshMaterial.receiveShadow;
303
+
304
+ mesh.material.depthTest = true;
305
+ mesh.material.depthWrite = true;
306
+
307
+ const enhancer = createModelMaterialEnhancer(mesh.material);
308
+ this._enhancers.set(mesh, enhancer);
309
+
310
+ enhancer.mount(initialProps);
311
+
312
+ mesh.material.customProgramCacheKey = () => enhancer.programCacheKey();
313
+ mesh.material.onBeforeCompile = enhancer.transformShader;
314
+
315
+ this._initBatchedMaterial(mesh);
316
+
317
+ this.initDepthMaterial(mesh, enhancer);
318
+
319
+ this.ctx.viewContext.applyShadowMaterial(mesh.material);
320
+ }
321
+
322
+ private _setupPointsNode(
323
+ points: Points<BufferGeometry<NormalBufferAttributes>, PointsMaterial>,
324
+ initialProps: PntsProps,
325
+ ) {
326
+ const enhancer = createPntsEnhancer(points.material);
327
+ this._pntsEnhancers.set(points, enhancer);
328
+
329
+ enhancer.mount(initialProps);
330
+
331
+ points.material.customProgramCacheKey = () => enhancer.programCacheKey();
332
+ points.material.onBeforeCompile = enhancer.transformShader;
333
+ }
334
+
335
+ /**
336
+ * Override a material that is used to generate a shadow map.
337
+ */
338
+ initDepthMaterial(
339
+ mesh: Mesh<BufferGeometry<NormalBufferAttributes>, ModelMaterial>,
340
+ enhancer: ModelMaterialEnhancer,
341
+ ) {
342
+ mesh.customDepthMaterial = mesh.material.clone();
343
+ mesh.customDepthMaterial.needsUpdate = true;
344
+
345
+ mesh.customDepthMaterial.onBeforeCompile = (shader) => {
346
+ enhancer.transformShader(shader);
347
+
348
+ shader.defines ??= {};
349
+ Object.assign(shader.defines, mesh.material.userData?.defines || {});
350
+ shader.defines["USE_SHADOWMAP_DEPTH"] = 1;
351
+ shader.defines["DEPTH_PACKING"] = RGBADepthPacking;
352
+ };
353
+ }
354
+
355
+ _update(material: NavaraModelMaterial, active: boolean) {
356
+ this.visible = (material.show ?? true) && active;
357
+
358
+ // Each enhancer map is populated only for its node type, so empty maps
359
+ // iterate trivially. Running both lets mixed-mode glTFs (POINTS + TRIANGLES)
360
+ // update each node with the right props without a tile-level flag.
361
+ const updateProps = this.buildUpdateProps(material);
362
+ for (const [mesh, enhancer] of this._enhancers) {
363
+ enhancer.update(updateProps);
364
+ mesh.castShadow = !!material.castShadow;
365
+ mesh.receiveShadow = !!material.receiveShadow;
366
+ }
367
+
368
+ const pntsProps: PntsProps = {
369
+ color: material.color,
370
+ pointSize: material.pointSize,
371
+ height: material.height,
372
+ };
373
+ for (const enhancer of this._pntsEnhancers.values()) {
374
+ enhancer.update(pntsProps);
375
+ }
376
+ }
377
+
378
+ /**
379
+ * Build update props from NavaraModelMaterial for enhancer.update().
380
+ */
381
+ private buildUpdateProps(material: NavaraModelMaterial): ModelMaterialProps {
382
+ return {
383
+ base: {
384
+ color: material.color,
385
+ metalness: material.metalness,
386
+ roughness: material.roughness,
387
+ emissiveColor: material.emissiveColor,
388
+ emissiveIntensity: material.emissiveIntensity,
389
+ transparent: material.transparent,
390
+ opacity: material.opacity,
391
+ depthWrite: material.depthWrite,
392
+ effectIdsMask:
393
+ this.ctx.viewContext.selectiveEffectRegistry?.computeMask(
394
+ material.effectIds ?? [],
395
+ ) ?? 0,
396
+ },
397
+ water: {
398
+ water: material.water,
399
+ waterScaleNormal: material.waterScaleNormal,
400
+ waterSpeed: material.waterSpeed,
401
+ shininess: material.shininess,
402
+ specularStrength: material.specularStrength,
403
+ applyWaterNormal: material.applyWaterNormal,
404
+ specular: material.specular,
405
+ ior: material.ior,
406
+ reflectivity: material.reflectivity,
407
+ },
408
+ };
409
+ }
410
+
411
+ traverseMesh(
412
+ callback: (
413
+ m: Mesh<BufferGeometry<NormalBufferAttributes>, ModelMaterial>,
414
+ ) => void,
415
+ ) {
416
+ this.traverse((object: Object3D) => {
417
+ if (!(object instanceof Mesh)) {
418
+ return;
419
+ }
420
+ callback(object);
421
+ });
422
+ }
423
+
424
+ _setFeatureColor(color: Color, m?: ModelMaterial) {
425
+ m?.color.set(color);
426
+ }
427
+
428
+ _getFeatureColor(): Color {
429
+ throw new Unimplemented();
430
+ }
431
+
432
+ _setFeatureShow(visible: boolean): void {
433
+ this.visible = visible;
434
+ }
435
+
436
+ _setFeatureExtrudedHeight(_height: number): void {
437
+ throw new Unimplemented();
438
+ }
439
+
440
+ _setFrustumCulled(culled: boolean): void {
441
+ this.frustumCulled = culled;
442
+ }
443
+
444
+ onBeforePicking(): void {
445
+ this.setPickable(true);
446
+ }
447
+
448
+ onAfterPicking(): void {
449
+ this.setPickable(false);
450
+ }
451
+
452
+ private setPickable(pickable: boolean): void {
453
+ for (const enhancer of this._enhancers.values()) {
454
+ enhancer.update({ base: { pickable } });
455
+ }
456
+ }
457
+
458
+ getRenderable(): Object3D {
459
+ return this;
460
+ }
461
+
462
+ _setFeatureHeight(_height: number) {
463
+ // Height adjustment via batch textures is currently not implemented.
464
+ // This method is intentionally a no-op to avoid breaking existing callers.
465
+ }
466
+
467
+ _setFeatureWidth(_width: number): void {
468
+ // Width is not applicable to 3D models.
469
+ // This method is intentionally a no-op to satisfy the FeatureMesh interface.
470
+ }
471
+
472
+ _setFeatureOpacity(opacity: number): void {
473
+ this.traverseMesh((m) => {
474
+ this._updateBatchAttribute(m, 0, "opacity", opacity);
475
+ });
476
+ }
477
+
478
+ dispose() {
479
+ this.traverseMesh((m) => {
480
+ this.ctx.viewContext.removeShadowMaterial(m.material);
481
+ });
482
+ }
483
+ }
@@ -0,0 +1,55 @@
1
+ import { Unimplemented } from "@navaramap/core";
2
+ import { Object3D, type Vector2 } from "three";
3
+
4
+ /**
5
+ * Contract for an object that participates in GPU picking.
6
+ *
7
+ * Implementers must provide {@link onBeforePicking}, {@link onAfterPicking},
8
+ * and {@link getRenderable}. Register an instance via
9
+ * `ViewContext.registerPickableMesh` so the pick pass can discover it.
10
+ *
11
+ * Navara does NOT rewrite your shaders. While the two hooks are active, your
12
+ * material must output the encoded `batchId` as the flat final color — how
13
+ * that is achieved is your concern. For a turnkey implementation over stock
14
+ * Three.js materials see {@link PickableMeshWrapper}; for `InstancedMesh` see
15
+ * {@link PickableInstancedMeshWrapper}.
16
+ *
17
+ * This class is a loose base: classes that already extend a Three.js type
18
+ * (`Mesh`, `Group`, etc.) may `implement` it instead of `extend`-ing it —
19
+ * {@link isPickableMesh} uses a structural check rather than `instanceof`.
20
+ */
21
+ export class PickableMesh {
22
+ /**
23
+ * Fired immediately before the pick pass renders this entry. Configure
24
+ * your material so the next draw outputs the encoded `batchId` as
25
+ * `gl_FragColor`.
26
+ */
27
+ onBeforePicking(_pickingCoord?: Vector2): void {
28
+ throw new Unimplemented();
29
+ }
30
+
31
+ /** Fired immediately after the pick pass completes. Restore normal rendering. */
32
+ onAfterPicking(): void {
33
+ throw new Unimplemented();
34
+ }
35
+
36
+ /**
37
+ * The Object3D to re-parent into the pick scene for the picking render.
38
+ * The wrapper itself is bookkeeping and is never added to a scene.
39
+ */
40
+ getRenderable(): Object3D {
41
+ throw new Unimplemented();
42
+ }
43
+ }
44
+
45
+ export const isPickableMesh = (v: object): v is PickableMesh => {
46
+ if (typeof v !== "object" || v === null) {
47
+ return false;
48
+ }
49
+ const candidate = v as Record<string, unknown>;
50
+ return (
51
+ typeof candidate.onBeforePicking === "function" &&
52
+ typeof candidate.onAfterPicking === "function" &&
53
+ typeof candidate.getRenderable === "function"
54
+ );
55
+ };