@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,529 @@
1
+ import BATCHID_TO_COLOR from "@shaders/glsl/chunks/pick.glsl";
2
+ import {
3
+ BufferGeometry,
4
+ InstancedBufferAttribute,
5
+ InstancedMesh,
6
+ Material,
7
+ Mesh,
8
+ Object3D,
9
+ ShaderMaterial,
10
+ type Vector2,
11
+ type WebGLProgramParametersWithUniforms,
12
+ } from "three";
13
+
14
+ import type { ViewContext } from "../core/ViewContext";
15
+
16
+ import { PickableMesh } from "./pickableMesh";
17
+
18
+ /**
19
+ * Picking uniform declarations injected into fragment shaders.
20
+ */
21
+ const PICKING_UNIFORMS_DECL = /* glsl */ `
22
+ uniform float nvr_uPickable;
23
+ uniform float nvr_uBatchId;
24
+
25
+ ${BATCHID_TO_COLOR}
26
+ `;
27
+
28
+ /**
29
+ * Picking override block: when pickable, output batchId-encoded color.
30
+ * This block must be placed at the very end of main(), after all other
31
+ * gl_FragColor assignments, so it overrides the final output.
32
+ */
33
+ const PICKING_OVERRIDE = /* glsl */ `
34
+ if (nvr_uPickable > 0.0) {
35
+ gl_FragColor = vec4(nvr_batchIdToColor(nvr_uBatchId), 1.0);
36
+ }
37
+ `;
38
+
39
+ /**
40
+ * Inject picking shader support into a standard Three.js material
41
+ * via onBeforeCompile.
42
+ *
43
+ * Standard materials (MeshBasicMaterial, MeshLambertMaterial, etc.) always
44
+ * contain `#include <dithering_fragment>` as the last meaningful chunk
45
+ * before main() closes. Picking code is injected right after it.
46
+ */
47
+ function injectPickingShader(
48
+ shader: WebGLProgramParametersWithUniforms,
49
+ refs: { nvr_uPickable: { value: number }; nvr_uBatchId: { value: number } },
50
+ ): void {
51
+ shader.uniforms.nvr_uPickable = refs.nvr_uPickable;
52
+ shader.uniforms.nvr_uBatchId = refs.nvr_uBatchId;
53
+
54
+ shader.fragmentShader = shader.fragmentShader.replace(
55
+ "void main() {",
56
+ `${PICKING_UNIFORMS_DECL}\nvoid main() {`,
57
+ );
58
+
59
+ shader.fragmentShader = shader.fragmentShader.replace(
60
+ "#include <dithering_fragment>",
61
+ `#include <dithering_fragment>\n${PICKING_OVERRIDE}`,
62
+ );
63
+ }
64
+
65
+ /**
66
+ * Inject picking shader support for instanced meshes.
67
+ *
68
+ * Uses a per-instance `batchId` attribute passed as a varying to the fragment
69
+ * shader. When pickable, the fragment shader outputs the batchId-encoded color.
70
+ */
71
+ function injectInstancedPickingShader(
72
+ shader: WebGLProgramParametersWithUniforms,
73
+ refs: { nvr_uPickable: { value: number } },
74
+ ): void {
75
+ shader.uniforms.nvr_uPickable = refs.nvr_uPickable;
76
+
77
+ // Vertex shader: declare batchId attribute and pass as varying
78
+ shader.vertexShader = shader.vertexShader.replace(
79
+ "void main() {",
80
+ `
81
+ attribute float batchId;
82
+ varying float nvr_vBatchId;
83
+
84
+ void main() {
85
+ nvr_vBatchId = batchId;
86
+ `,
87
+ );
88
+
89
+ // Fragment shader: inject uniforms, varying, and picking override
90
+ shader.fragmentShader = shader.fragmentShader.replace(
91
+ "void main() {",
92
+ `
93
+ uniform float nvr_uPickable;
94
+ varying float nvr_vBatchId;
95
+
96
+ ${BATCHID_TO_COLOR}
97
+
98
+ void main() {
99
+ `,
100
+ );
101
+
102
+ shader.fragmentShader = shader.fragmentShader.replace(
103
+ "#include <dithering_fragment>",
104
+ `#include <dithering_fragment>
105
+
106
+ if (nvr_uPickable > 0.0) {
107
+ gl_FragColor = vec4(nvr_batchIdToColor(nvr_vBatchId), 1.0);
108
+ }
109
+ `,
110
+ );
111
+ }
112
+
113
+ /**
114
+ * Directly inject picking shader code into a ShaderMaterial's source strings.
115
+ *
116
+ * For ShaderMaterial (and its subclasses like LineMaterial), modifying the
117
+ * shader source directly is more reliable than `onBeforeCompile` because:
118
+ * 1. Other code may set onBeforeCompile (e.g. RTE injection for LineMaterial)
119
+ * 2. MRT overrides already modify material.fragmentShader directly
120
+ * 3. The material source is the ground truth for ShaderMaterial compilation
121
+ *
122
+ * The picking override is injected before the last closing brace of main()
123
+ * so it runs after all other gl_FragColor assignments.
124
+ */
125
+ function injectPickingIntoShaderMaterial(
126
+ material: ShaderMaterial,
127
+ refs: { nvr_uPickable: { value: number }; nvr_uBatchId: { value: number } },
128
+ ): void {
129
+ // Add uniforms to the material's uniform map
130
+ material.uniforms.nvr_uPickable = refs.nvr_uPickable;
131
+ material.uniforms.nvr_uBatchId = refs.nvr_uBatchId;
132
+
133
+ // Inject uniform declarations before void main()
134
+ material.fragmentShader = material.fragmentShader.replace(
135
+ "void main() {",
136
+ `${PICKING_UNIFORMS_DECL}\nvoid main() {`,
137
+ );
138
+
139
+ // Inject picking override before the last closing brace of main().
140
+ // Custom materials (ShaderMaterial, LineMaterial) don't have
141
+ // #include <dithering_fragment>, so we target the last `}` instead.
142
+ const lastBrace = material.fragmentShader.lastIndexOf("}");
143
+ material.fragmentShader =
144
+ material.fragmentShader.slice(0, lastBrace) +
145
+ PICKING_OVERRIDE +
146
+ material.fragmentShader.slice(lastBrace);
147
+
148
+ material.needsUpdate = true;
149
+ }
150
+
151
+ /**
152
+ * Turnkey {@link PickableMesh} implementation for stock Three.js materials.
153
+ *
154
+ * Traverses the wrapped Object3D and injects picking shader code into every
155
+ * child `Mesh`'s material: `onBeforeCompile` for standard materials, direct
156
+ * source mutation for `ShaderMaterial`. During the pick pass the fragment
157
+ * shader outputs a batchId-encoded color, bypassing lighting/tonemapping.
158
+ *
159
+ * Apply this explicitly, don't rely on the framework to
160
+ * wrap your mesh for you. If you have a custom shader and don't want shader
161
+ * injection, implement {@link PickableMesh} yourself instead of using this
162
+ * class.
163
+ */
164
+ export class PickableMeshWrapper extends Object3D implements PickableMesh {
165
+ public readonly batchId: number;
166
+ private refs: {
167
+ nvr_uPickable: { value: number };
168
+ nvr_uBatchId: { value: number };
169
+ };
170
+ /** Materials that already have picking shaders installed. */
171
+ private injectedMaterials = new WeakSet<Material>();
172
+
173
+ constructor(
174
+ public object: Object3D,
175
+ ctx: ViewContext,
176
+ ) {
177
+ super();
178
+ this.batchId = ctx.genGlobalBatchId() ?? 0;
179
+ this.refs = {
180
+ nvr_uPickable: { value: 0 },
181
+ nvr_uBatchId: { value: this.batchId },
182
+ };
183
+ this.setupShaders();
184
+ }
185
+
186
+ /**
187
+ * Re-scan the wrapped object and inject picking into any materials that
188
+ * appeared since the last pass (e.g. after a layer swapped its material).
189
+ * Preserves the existing `batchId` and skips materials already injected.
190
+ */
191
+ syncMaterials(): void {
192
+ this.setupShaders();
193
+ }
194
+
195
+ private setupShaders(): void {
196
+ const refs = this.refs;
197
+ this.object.traverse((child) => {
198
+ if (!(child instanceof Mesh)) return;
199
+
200
+ const materials = Array.isArray(child.material)
201
+ ? child.material
202
+ : [child.material];
203
+
204
+ materials.forEach((m) => {
205
+ if (!(m instanceof Material)) return;
206
+ if (this.injectedMaterials.has(m)) return;
207
+ // For ShaderMaterial (includes LineMaterial), inject directly into
208
+ // the shader source. This is more reliable than onBeforeCompile
209
+ // because ShaderMaterial sources may already be modified by MRT
210
+ // overrides and RTE injection.
211
+ if (m instanceof ShaderMaterial) {
212
+ injectPickingIntoShaderMaterial(m, refs);
213
+ this.injectedMaterials.add(m);
214
+ return;
215
+ }
216
+ // For standard materials, use onBeforeCompile
217
+ const prevOnBeforeCompile = m.onBeforeCompile;
218
+ const prevCacheKey = m.customProgramCacheKey?.bind(m);
219
+ m.onBeforeCompile = (shader, renderer) => {
220
+ prevOnBeforeCompile?.call(m, shader, renderer);
221
+ injectPickingShader(shader, refs);
222
+ };
223
+ m.customProgramCacheKey = () =>
224
+ (prevCacheKey?.() ?? "") + "_nvr_pickable";
225
+ m.needsUpdate = true;
226
+ this.injectedMaterials.add(m);
227
+ });
228
+ });
229
+ }
230
+
231
+ onBeforePicking(_pickingCoord?: Vector2): void {
232
+ this.refs.nvr_uPickable.value = 1;
233
+ }
234
+
235
+ onAfterPicking(): void {
236
+ this.refs.nvr_uPickable.value = 0;
237
+ }
238
+
239
+ getRenderable(): Object3D {
240
+ return this.object;
241
+ }
242
+ }
243
+
244
+ /**
245
+ * Turnkey {@link PickableMesh} implementation for `InstancedMesh`.
246
+ *
247
+ * Adds a per-instance `batchId` attribute and injects picking shader code.
248
+ * During the pick pass each instance renders with its unique batchId color.
249
+ *
250
+ * The wrapper owns the batchId array; callers drive instance lifecycle via
251
+ * {@link addInstance}, {@link removeInstanceAt}, {@link clearInstances},
252
+ * {@link replaceAll}, and {@link syncMesh} (after a buffer grow).
253
+ */
254
+ export class PickableInstancedMeshWrapper
255
+ extends Object3D
256
+ implements PickableMesh
257
+ {
258
+ public batchIds: number[];
259
+ private refs: { nvr_uPickable: { value: number } };
260
+ private batchIdAttr: InstancedBufferAttribute | null = null;
261
+ /** Set of materials that already have picking shaders installed. */
262
+ private injectedMaterials = new WeakSet<Material>();
263
+
264
+ constructor(
265
+ public mesh: InstancedMesh,
266
+ initialCount: number,
267
+ private ctx: ViewContext,
268
+ ) {
269
+ super();
270
+ this.batchIds = Array.from(
271
+ { length: initialCount },
272
+ () => ctx.genGlobalBatchId() ?? 0,
273
+ );
274
+ this.refs = { nvr_uPickable: { value: 0 } };
275
+ this.setupBatchIdAttribute();
276
+ this.setupShader();
277
+ }
278
+
279
+ /** Allocate a batchId for a new instance and extend the attribute. */
280
+ addInstance(): number {
281
+ const id = this.ctx.genGlobalBatchId() ?? 0;
282
+ this.batchIds.push(id);
283
+ this.setupBatchIdAttribute();
284
+ return id;
285
+ }
286
+
287
+ /** Remove an instance by index (swap-with-last, O(1)). */
288
+ removeInstanceAt(index: number): void {
289
+ const last = this.batchIds.length - 1;
290
+ if (index < 0 || index > last) return;
291
+ if (index !== last) this.batchIds[index] = this.batchIds[last];
292
+ this.batchIds.pop();
293
+ this.setupBatchIdAttribute();
294
+ }
295
+
296
+ /** Drop all instance batchIds. */
297
+ clearInstances(): void {
298
+ this.batchIds = [];
299
+ this.setupBatchIdAttribute();
300
+ }
301
+
302
+ /** Regenerate `count` fresh batchIds and refresh the attribute. */
303
+ replaceAll(count: number): number[] {
304
+ this.batchIds = Array.from(
305
+ { length: count },
306
+ () => this.ctx.genGlobalBatchId() ?? 0,
307
+ );
308
+ this.setupBatchIdAttribute();
309
+ return this.batchIds;
310
+ }
311
+
312
+ /** Re-attach bookkeeping after the underlying `InstancedMesh` was replaced. */
313
+ syncMesh(mesh: InstancedMesh): void {
314
+ this.mesh = mesh;
315
+ this.batchIdAttr = null;
316
+ this.setupBatchIdAttribute();
317
+ this.setupShader();
318
+ }
319
+
320
+ /** Create/update the per-instance batchId attribute on the geometry. */
321
+ private setupBatchIdAttribute(): void {
322
+ const count = this.mesh.instanceMatrix.count;
323
+ const len = Math.min(this.batchIds.length, count);
324
+
325
+ if (this.batchIdAttr && this.batchIdAttr.array.length >= count) {
326
+ // Reuse existing buffer — zero out then fill
327
+ const arr = this.batchIdAttr.array as Float32Array;
328
+ arr.fill(0);
329
+ for (let i = 0; i < len; i++) {
330
+ arr[i] = this.batchIds[i] ?? 0;
331
+ }
332
+ this.batchIdAttr.needsUpdate = true;
333
+ } else {
334
+ // First call or buffer too small — allocate new attribute
335
+ const data = new Float32Array(count);
336
+ for (let i = 0; i < len; i++) {
337
+ data[i] = this.batchIds[i] ?? 0;
338
+ }
339
+ this.batchIdAttr = new InstancedBufferAttribute(data, 1);
340
+ this.mesh.geometry.setAttribute("batchId", this.batchIdAttr);
341
+ }
342
+ }
343
+
344
+ /** Install picking shader hooks on materials that haven't been injected yet. */
345
+ private setupShader(): void {
346
+ const materials = Array.isArray(this.mesh.material)
347
+ ? this.mesh.material
348
+ : [this.mesh.material];
349
+
350
+ const refs = this.refs;
351
+
352
+ for (const mat of materials) {
353
+ if (!(mat instanceof Material)) continue;
354
+ if (this.injectedMaterials.has(mat)) continue;
355
+
356
+ const prevOnBeforeCompile = mat.onBeforeCompile;
357
+ const prevCacheKey = mat.customProgramCacheKey?.bind(mat);
358
+
359
+ mat.onBeforeCompile = (shader, renderer) => {
360
+ prevOnBeforeCompile?.call(mat, shader, renderer);
361
+ injectInstancedPickingShader(shader, refs);
362
+ };
363
+ // Ensure Three.js treats this as a distinct shader program
364
+ mat.customProgramCacheKey = () =>
365
+ (prevCacheKey?.() ?? "") + "_nvr_instanced_pickable";
366
+ // Force shader recompilation
367
+ mat.needsUpdate = true;
368
+
369
+ this.injectedMaterials.add(mat);
370
+ }
371
+ }
372
+
373
+ onBeforePicking(_pickingCoord?: Vector2): void {
374
+ this.refs.nvr_uPickable.value = 1;
375
+ }
376
+
377
+ onAfterPicking(): void {
378
+ this.refs.nvr_uPickable.value = 0;
379
+ }
380
+
381
+ getRenderable(): Object3D {
382
+ return this.mesh;
383
+ }
384
+ }
385
+
386
+ /**
387
+ * Turnkey {@link PickableMesh} implementation for a group of sibling
388
+ * `InstancedMesh`es that share one logical per-instance identity.
389
+ *
390
+ * Used for instanced GLTF models: a single source model has multiple sub-meshes
391
+ * (one `InstancedMesh` per node), each with its own geometry and material.
392
+ * Every instance `i` represents one full model, so all sub-meshes at slot `i`
393
+ * share the same `batchId`. Picking any sub-mesh of a given instance resolves
394
+ * to the same id.
395
+ *
396
+ * The wrapper owns a single `batchIds` array, installs a synchronized
397
+ * `batchId` `InstancedBufferAttribute` on every sub-mesh geometry, and injects
398
+ * the instanced picking shader into every sub-mesh material.
399
+ */
400
+ export class PickableMultiInstancedMeshWrapper
401
+ extends Object3D
402
+ implements PickableMesh
403
+ {
404
+ public batchIds: number[];
405
+ private refs: { nvr_uPickable: { value: number } };
406
+ // Keyed by BufferGeometry, not InstancedMesh: sub-meshes loaded from a GLTF
407
+ // commonly share a geometry, and `batchId` lives on the geometry. Keying by
408
+ // mesh would let a later `geometry.setAttribute("batchId", ...)` silently
409
+ // overwrite the earlier mesh's cached attribute, so updates would mutate
410
+ // a stale object and picking would read outdated ids.
411
+ private attrs = new Map<BufferGeometry, InstancedBufferAttribute>();
412
+ private injectedMaterials = new WeakSet<Material>();
413
+
414
+ constructor(
415
+ public root: Object3D,
416
+ public meshes: InstancedMesh[],
417
+ initialCount: number,
418
+ private ctx: ViewContext,
419
+ ) {
420
+ super();
421
+ this.batchIds = Array.from(
422
+ { length: initialCount },
423
+ () => ctx.genGlobalBatchId() ?? 0,
424
+ );
425
+ this.refs = { nvr_uPickable: { value: 0 } };
426
+ this.setupBatchIdAttributes();
427
+ this.setupShaders();
428
+ }
429
+
430
+ addInstance(): number {
431
+ const id = this.ctx.genGlobalBatchId() ?? 0;
432
+ this.batchIds.push(id);
433
+ this.setupBatchIdAttributes();
434
+ return id;
435
+ }
436
+
437
+ removeInstanceAt(index: number): void {
438
+ const last = this.batchIds.length - 1;
439
+ if (index < 0 || index > last) return;
440
+ if (index !== last) this.batchIds[index] = this.batchIds[last];
441
+ this.batchIds.pop();
442
+ this.setupBatchIdAttributes();
443
+ }
444
+
445
+ clearInstances(): void {
446
+ this.batchIds = [];
447
+ this.setupBatchIdAttributes();
448
+ }
449
+
450
+ replaceAll(count: number): number[] {
451
+ this.batchIds = Array.from(
452
+ { length: count },
453
+ () => this.ctx.genGlobalBatchId() ?? 0,
454
+ );
455
+ this.setupBatchIdAttributes();
456
+ return this.batchIds;
457
+ }
458
+
459
+ /** Re-attach bookkeeping after the underlying sub-meshes were replaced. */
460
+ syncMeshes(meshes: InstancedMesh[]): void {
461
+ this.meshes = meshes;
462
+ this.attrs.clear();
463
+ this.setupBatchIdAttributes();
464
+ this.setupShaders();
465
+ }
466
+
467
+ private setupBatchIdAttributes(): void {
468
+ const seen = new Set<BufferGeometry>();
469
+ for (const mesh of this.meshes) {
470
+ const geometry = mesh.geometry;
471
+ if (seen.has(geometry)) continue;
472
+ seen.add(geometry);
473
+
474
+ const count = mesh.instanceMatrix.count;
475
+ const len = Math.min(this.batchIds.length, count);
476
+ let attr = this.attrs.get(geometry);
477
+ if (attr && attr.array.length >= count) {
478
+ const arr = attr.array as Float32Array;
479
+ arr.fill(0);
480
+ for (let i = 0; i < len; i++) arr[i] = this.batchIds[i] ?? 0;
481
+ attr.needsUpdate = true;
482
+ } else {
483
+ const data = new Float32Array(count);
484
+ for (let i = 0; i < len; i++) data[i] = this.batchIds[i] ?? 0;
485
+ attr = new InstancedBufferAttribute(data, 1);
486
+ geometry.setAttribute("batchId", attr);
487
+ this.attrs.set(geometry, attr);
488
+ }
489
+ }
490
+ }
491
+
492
+ private setupShaders(): void {
493
+ const refs = this.refs;
494
+ for (const mesh of this.meshes) {
495
+ const materials = Array.isArray(mesh.material)
496
+ ? mesh.material
497
+ : [mesh.material];
498
+ for (const mat of materials) {
499
+ if (!(mat instanceof Material)) continue;
500
+ if (this.injectedMaterials.has(mat)) continue;
501
+
502
+ const prevOnBeforeCompile = mat.onBeforeCompile;
503
+ const prevCacheKey = mat.customProgramCacheKey?.bind(mat);
504
+
505
+ mat.onBeforeCompile = (shader, renderer) => {
506
+ prevOnBeforeCompile?.call(mat, shader, renderer);
507
+ injectInstancedPickingShader(shader, refs);
508
+ };
509
+ mat.customProgramCacheKey = () =>
510
+ (prevCacheKey?.() ?? "") + "_nvr_instanced_pickable";
511
+ mat.needsUpdate = true;
512
+
513
+ this.injectedMaterials.add(mat);
514
+ }
515
+ }
516
+ }
517
+
518
+ onBeforePicking(_pickingCoord?: Vector2): void {
519
+ this.refs.nvr_uPickable.value = 1;
520
+ }
521
+
522
+ onAfterPicking(): void {
523
+ this.refs.nvr_uPickable.value = 0;
524
+ }
525
+
526
+ getRenderable(): Object3D {
527
+ return this.root;
528
+ }
529
+ }