@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,134 @@
1
+ import { defaults } from "lodash-es";
2
+ import type { WebGLProgramParametersWithUniforms } from "three";
3
+ import invariant from "tiny-invariant";
4
+
5
+ import type { MaterialEnhancer } from "../../MaterialEnhancer";
6
+
7
+ import {
8
+ AVAILABLE_SHADERS,
9
+ type SupportedMaterial,
10
+ updateMaterialProps,
11
+ } from "./material";
12
+ import { createBaseMutates } from "./mutates";
13
+ import { transformShader } from "./shader";
14
+ import { DEFAULT_BASE_PROPS, DEFAULT_BASE_STATE, updateState } from "./state";
15
+ import type {
16
+ InstancedSpriteBaseMutates,
17
+ InstancedSpriteBaseProps,
18
+ InstancedSpriteBaseState,
19
+ } from "./types";
20
+
21
+ /**
22
+ * Factory function to create an instancedSprite base enhancer.
23
+ *
24
+ * This enhancer handles:
25
+ * - Scale, center, sizeInMeters, offsetDepth
26
+ * - Alpha test for billboard mode
27
+ * - Picking
28
+ * - RTE (Relative-To-Eye) support for high-precision coordinates
29
+ * - Billboard mode with texture array
30
+ *
31
+ * Supports ShaderMaterial with custom instancedSprite shaders.
32
+ *
33
+ * @param material - The Three.js ShaderMaterial to enhance
34
+ */
35
+ export function createInstancedSpriteBaseEnhancer(
36
+ material: SupportedMaterial,
37
+ ): MaterialEnhancer<
38
+ SupportedMaterial,
39
+ InstancedSpriteBaseProps,
40
+ InstancedSpriteBaseState,
41
+ InstancedSpriteBaseMutates,
42
+ typeof AVAILABLE_SHADERS
43
+ > {
44
+ // Internal state - immutable, always replaced as a whole
45
+ let state: InstancedSpriteBaseState | null = null;
46
+ // Internal mutates object (refs are hidden inside)
47
+ let mutates: InstancedSpriteBaseMutates | null = null;
48
+
49
+ return {
50
+ material,
51
+ availableShaders: AVAILABLE_SHADERS,
52
+
53
+ transformShader: (shader: WebGLProgramParametersWithUniforms): void => {
54
+ invariant(
55
+ state && mutates,
56
+ "mount() must be called before transformShader",
57
+ );
58
+ transformShader(shader, state, mutates, material);
59
+ },
60
+
61
+ mount: (props: InstancedSpriteBaseProps): void => {
62
+ const mergedProps = defaults({}, props, DEFAULT_BASE_PROPS);
63
+ // Create initial state with immutable fields from props
64
+ const initialState = {
65
+ ...DEFAULT_BASE_STATE,
66
+ useRTE: mergedProps.useRTE,
67
+ billboard: mergedProps.billboard,
68
+ };
69
+ state = updateState(mergedProps, initialState);
70
+ // Create mutates (refs are created inside with default values)
71
+ mutates = createBaseMutates(
72
+ mergedProps.useRTE,
73
+ mergedProps.billboard,
74
+ mergedProps.rtcCenter,
75
+ );
76
+ mutates.update(state);
77
+
78
+ // Set texture external ref if provided
79
+ if (props.texture) {
80
+ mutates.setTexture(props.texture);
81
+ }
82
+
83
+ updateMaterialProps(material, mergedProps);
84
+ },
85
+
86
+ update: (props: InstancedSpriteBaseProps): void => {
87
+ invariant(state && mutates, "mount() must be called before update");
88
+
89
+ state = updateState(props, state);
90
+ mutates.update(state);
91
+
92
+ if (props.texture) {
93
+ mutates.setTexture(props.texture);
94
+ }
95
+
96
+ updateMaterialProps(material, props);
97
+ },
98
+
99
+ states: (): InstancedSpriteBaseState => {
100
+ invariant(state, "mount() must be called before states");
101
+ return state;
102
+ },
103
+
104
+ mutates: (): InstancedSpriteBaseMutates => {
105
+ invariant(mutates, "mount() must be called before mutates");
106
+ return mutates;
107
+ },
108
+
109
+ programCacheKey: (): string => {
110
+ invariant(state, "mount() must be called before programCacheKey");
111
+ return JSON.stringify({
112
+ useRTE: state.useRTE,
113
+ billboard: state.billboard,
114
+ userDataDefines: material.userData?.defines ?? undefined,
115
+ });
116
+ },
117
+ };
118
+ }
119
+
120
+ // Re-export public types
121
+ export type {
122
+ InstancedSpriteBaseMutates,
123
+ InstancedSpriteBaseProps,
124
+ InstancedSpriteBaseState,
125
+ };
126
+
127
+ // Re-export SupportedMaterial for use by composing enhancers
128
+ export type { SupportedMaterial } from "./material";
129
+
130
+ // Re-export marker types for composing enhancers
131
+ export {
132
+ INSTANCED_SPRITE_BASE_SHADER_MARKERS,
133
+ createInstancedSpriteBaseShaderReplacer,
134
+ } from "./markers";
@@ -0,0 +1,21 @@
1
+ import type { ShaderMarkers } from "../../ShaderReplacer";
2
+ import { createShaderReplacer } from "../../ShaderReplacer";
3
+
4
+ /**
5
+ * Shader markers for the instancedSprite base enhancer.
6
+ * These markers are placed in the shader code to allow composing enhancers to inject their own code.
7
+ */
8
+ export const INSTANCED_SPRITE_BASE_SHADER_MARKERS = {
9
+ vertex: {},
10
+ fragment: {},
11
+ } as const satisfies ShaderMarkers;
12
+
13
+ /**
14
+ * Factory function to create a ShaderReplacer restricted to instancedSprite base markers.
15
+ * Used by composing enhancers to safely modify shaders.
16
+ */
17
+ export function createInstancedSpriteBaseShaderReplacer(source: string) {
18
+ return createShaderReplacer<typeof INSTANCED_SPRITE_BASE_SHADER_MARKERS>(
19
+ source,
20
+ );
21
+ }
@@ -0,0 +1,32 @@
1
+ import { ShaderMaterial } from "three";
2
+
3
+ import type { ShaderName } from "../../MaterialEnhancer";
4
+
5
+ import type { InstancedSpriteBaseProps } from "./types";
6
+
7
+ /**
8
+ * Shaders that the instancedSprite base enhancer supports.
9
+ * InstancedSprites use ShaderMaterial with custom shaders.
10
+ */
11
+ export const AVAILABLE_SHADERS = ["shader"] satisfies ShaderName[];
12
+
13
+ /**
14
+ * Material types that the instancedSprite base enhancer supports.
15
+ */
16
+ export type SupportedMaterial = ShaderMaterial;
17
+
18
+ /**
19
+ * Update material properties that affect the Three.js material directly.
20
+ * These properties are not handled by shader uniforms.
21
+ */
22
+ export function updateMaterialProps(
23
+ material: SupportedMaterial,
24
+ props: InstancedSpriteBaseProps,
25
+ ): void {
26
+ if (props.transparent !== undefined) {
27
+ material.transparent = props.transparent;
28
+ }
29
+ if (props.depthTest !== undefined) {
30
+ material.depthTest = props.depthTest;
31
+ }
32
+ }
@@ -0,0 +1,277 @@
1
+ import { degreeToRadian } from "@navaramap/three_api";
2
+ import { Matrix4, type Texture } from "three";
3
+ import { describe, expect, it, vi } from "vitest";
4
+
5
+ import type { ShaderUniforms } from "../../MaterialEnhancer";
6
+
7
+ import { createBaseMutates } from "./mutates";
8
+ import { DEFAULT_BASE_STATE } from "./state";
9
+ import type { InstancedSpriteBaseState } from "./types";
10
+
11
+ vi.mock("@navaramap/three_api", () => ({
12
+ degreeToRadian: (degree: number) => (degree * Math.PI) / 180,
13
+ }));
14
+
15
+ vi.mock("@navaramap/engine-api", () => ({
16
+ encodePosition: (_x: number, _y: number, _z: number) => ({
17
+ high: { x: 1000, y: 2000, z: 3000 },
18
+ low: { x: 0.5, y: 0.25, z: 0.125 },
19
+ }),
20
+ }));
21
+
22
+ describe("instancedSpriteBaseEnhancer/mutates", () => {
23
+ describe("update syncs refs from state", () => {
24
+ it("should sync core refs from state", () => {
25
+ const state: InstancedSpriteBaseState = {
26
+ ...DEFAULT_BASE_STATE,
27
+ scale: 50,
28
+ center: [0.5, 0.5],
29
+ sizeInMeters: false,
30
+ offsetDepth: false,
31
+ alphaTest: 0.3,
32
+ pickable: true,
33
+ atlasSize: [512, 256] as [number, number],
34
+ };
35
+ const mutates = createBaseMutates(false, false);
36
+ mutates.update(state);
37
+
38
+ const uniforms: ShaderUniforms = {};
39
+ mutates.updateUniforms(uniforms, state);
40
+
41
+ expect(uniforms.uScale?.value).toBe(50);
42
+ expect(uniforms.uCenter?.value.x).toBe(0.5);
43
+ expect(uniforms.uCenter?.value.y).toBe(0.5);
44
+ expect(uniforms.uSizeInMeters?.value).toBe(false);
45
+ expect(uniforms.uOffsetDepth?.value).toBe(false);
46
+ expect(uniforms.uAlphaTest?.value).toBe(0.3);
47
+ expect(uniforms.nvr_uPickable?.value).toBe(1.0);
48
+ expect(uniforms.uAtlasSize?.value.x).toBe(512);
49
+ expect(uniforms.uAtlasSize?.value.y).toBe(256);
50
+ });
51
+ });
52
+
53
+ describe("RTC center", () => {
54
+ it("should initialize uRTCCenter from constructor args", () => {
55
+ const state: InstancedSpriteBaseState = { ...DEFAULT_BASE_STATE };
56
+ const mutates = createBaseMutates(false, false, [10, 20, 30]);
57
+ mutates.update(state);
58
+
59
+ const uniforms: ShaderUniforms = {};
60
+ mutates.updateUniforms(uniforms, state);
61
+
62
+ expect(uniforms.uRTCCenter?.value.x).toBe(10);
63
+ expect(uniforms.uRTCCenter?.value.y).toBe(20);
64
+ expect(uniforms.uRTCCenter?.value.z).toBe(30);
65
+ });
66
+ });
67
+
68
+ describe("billboard texture ref", () => {
69
+ it("should assign uTexture to uniforms when billboard=true", () => {
70
+ const state: InstancedSpriteBaseState = {
71
+ ...DEFAULT_BASE_STATE,
72
+ billboard: true,
73
+ };
74
+ const mutates = createBaseMutates(false, true);
75
+ mutates.update(state);
76
+
77
+ const uniforms: ShaderUniforms = {};
78
+ mutates.updateUniforms(uniforms, state);
79
+
80
+ expect(uniforms.uTexture).toBeDefined();
81
+ expect(uniforms.uTexture?.value).toBeNull();
82
+ });
83
+
84
+ it("should not assign uTexture to uniforms when billboard=false", () => {
85
+ const state: InstancedSpriteBaseState = { ...DEFAULT_BASE_STATE };
86
+ const mutates = createBaseMutates(false, false);
87
+ mutates.update(state);
88
+
89
+ const uniforms: ShaderUniforms = {};
90
+ mutates.updateUniforms(uniforms, state);
91
+
92
+ expect(uniforms.uTexture).toBeUndefined();
93
+ });
94
+
95
+ it("should update uTexture value without replacing uniform ref", () => {
96
+ const state: InstancedSpriteBaseState = {
97
+ ...DEFAULT_BASE_STATE,
98
+ billboard: true,
99
+ };
100
+ const mutates = createBaseMutates(false, true);
101
+ mutates.update(state);
102
+
103
+ const uniforms: ShaderUniforms = {};
104
+ mutates.updateUniforms(uniforms, state);
105
+ const initialTextureUniform = uniforms.uTexture;
106
+ expect(initialTextureUniform).toBeDefined();
107
+
108
+ const nextTexture = {
109
+ image: {
110
+ width: 1,
111
+ height: 1,
112
+ data: new Uint8Array([0, 0, 0, 0]),
113
+ },
114
+ } as unknown as Texture;
115
+
116
+ mutates.setTexture({ value: nextTexture });
117
+
118
+ expect(uniforms.uTexture).toBe(initialTextureUniform);
119
+ expect(uniforms.uTexture?.value).toBe(nextTexture);
120
+ });
121
+ });
122
+
123
+ describe("updateRteUniforms", () => {
124
+ it("should update RTE eye uniforms when useRTE=true", () => {
125
+ const state: InstancedSpriteBaseState = {
126
+ ...DEFAULT_BASE_STATE,
127
+ useRTE: true,
128
+ };
129
+ const mutates = createBaseMutates(true, false);
130
+ mutates.update(state);
131
+
132
+ // Call updateRteUniforms with some camera position
133
+ mutates.updateRteUniforms(1000, 2000, 3000, state);
134
+
135
+ const uniforms: ShaderUniforms = {};
136
+ mutates.updateUniforms(uniforms, state);
137
+
138
+ // encodePosition splits into high/low, verify they are set (not zero)
139
+ const eyeHigh = uniforms.uEyeRTEHigh?.value;
140
+ const eyeLow = uniforms.uEyeRTELow?.value;
141
+ expect(eyeHigh).toBeDefined();
142
+ expect(eyeLow).toBeDefined();
143
+ });
144
+
145
+ it("should do nothing when useRTE=false", () => {
146
+ const state: InstancedSpriteBaseState = { ...DEFAULT_BASE_STATE };
147
+ const mutates = createBaseMutates(false, false);
148
+ mutates.update(state);
149
+
150
+ mutates.updateRteUniforms(1000, 2000, 3000, state);
151
+
152
+ const uniforms: ShaderUniforms = {};
153
+ mutates.updateUniforms(uniforms, state);
154
+
155
+ // Eye uniforms should remain at default (0, 0, 0)
156
+ expect(uniforms.uEyeRTEHigh?.value.x).toBe(0);
157
+ expect(uniforms.uEyeRTEHigh?.value.y).toBe(0);
158
+ expect(uniforms.uEyeRTEHigh?.value.z).toBe(0);
159
+ });
160
+ });
161
+
162
+ describe("updateRtcUniforms", () => {
163
+ it("should transform the RTC center into view space when useRTE=false", () => {
164
+ const state: InstancedSpriteBaseState = { ...DEFAULT_BASE_STATE };
165
+ // RTC center at a large ECEF-scale coordinate.
166
+ const mutates = createBaseMutates(false, false, [6_400_000, 0, 0]);
167
+ mutates.update(state);
168
+
169
+ // View matrix that translates the world by -6,400,000 on X, so the
170
+ // center lands near the origin (small, precise value) in view space.
171
+ const viewInverse = new Matrix4().makeTranslation(-6_400_000, 0, 0);
172
+ mutates.updateRtcUniforms(viewInverse, state);
173
+
174
+ const uniforms: ShaderUniforms = {};
175
+ mutates.updateUniforms(uniforms, state);
176
+
177
+ expect(uniforms.uRTCCenterView?.value.x).toBeCloseTo(0, 3);
178
+ expect(uniforms.uRTCCenterView?.value.y).toBeCloseTo(0, 3);
179
+ expect(uniforms.uRTCCenterView?.value.z).toBeCloseTo(0, 3);
180
+ });
181
+
182
+ it("should do nothing when useRTE=true", () => {
183
+ const state: InstancedSpriteBaseState = {
184
+ ...DEFAULT_BASE_STATE,
185
+ useRTE: true,
186
+ };
187
+ const mutates = createBaseMutates(true, false, [6_400_000, 0, 0]);
188
+ mutates.update(state);
189
+
190
+ mutates.updateRtcUniforms(
191
+ new Matrix4().makeTranslation(-6_400_000, 0, 0),
192
+ state,
193
+ );
194
+
195
+ const uniforms: ShaderUniforms = {};
196
+ mutates.updateUniforms(uniforms, state);
197
+
198
+ // Left at the default; the RTC path is not used under RTE.
199
+ expect(uniforms.uRTCCenterView?.value.x).toBe(0);
200
+ });
201
+ });
202
+
203
+ describe("updateFarPlane", () => {
204
+ it("should update uFarPlane value", () => {
205
+ const state: InstancedSpriteBaseState = { ...DEFAULT_BASE_STATE };
206
+ const mutates = createBaseMutates(false, false);
207
+ mutates.update(state);
208
+
209
+ mutates.updateFarPlane(1000);
210
+
211
+ const uniforms: ShaderUniforms = {};
212
+ mutates.updateUniforms(uniforms, state);
213
+
214
+ expect(uniforms.uFarPlane?.value).toBe(1000);
215
+ });
216
+ });
217
+
218
+ describe("updateFovRad", () => {
219
+ it("should update uFovRad value", () => {
220
+ const state: InstancedSpriteBaseState = { ...DEFAULT_BASE_STATE };
221
+ const mutates = createBaseMutates(false, false);
222
+ mutates.update(state);
223
+
224
+ mutates.updateFovRad(degreeToRadian(75));
225
+
226
+ const uniforms: ShaderUniforms = {};
227
+ mutates.updateUniforms(uniforms, state);
228
+
229
+ expect(uniforms.uFovRad?.value).toBe(degreeToRadian(75));
230
+ });
231
+
232
+ it("should not replace the uniform ref", () => {
233
+ const state: InstancedSpriteBaseState = { ...DEFAULT_BASE_STATE };
234
+ const mutates = createBaseMutates(false, false);
235
+ mutates.update(state);
236
+
237
+ const uniforms: ShaderUniforms = {};
238
+ mutates.updateUniforms(uniforms, state);
239
+ const initialRef = uniforms.uFovRad;
240
+
241
+ mutates.updateFovRad(degreeToRadian(90));
242
+
243
+ expect(uniforms.uFovRad).toBe(initialRef);
244
+ expect(uniforms.uFovRad?.value).toBe(degreeToRadian(90));
245
+ });
246
+ });
247
+
248
+ describe("updateScreenHeightPx", () => {
249
+ it("should update uScreenHeightPx value", () => {
250
+ const state: InstancedSpriteBaseState = { ...DEFAULT_BASE_STATE };
251
+ const mutates = createBaseMutates(false, false);
252
+ mutates.update(state);
253
+
254
+ mutates.updateScreenHeightPx(720);
255
+
256
+ const uniforms: ShaderUniforms = {};
257
+ mutates.updateUniforms(uniforms, state);
258
+
259
+ expect(uniforms.uScreenHeightPx?.value).toBe(720);
260
+ });
261
+
262
+ it("should not replace the uniform ref", () => {
263
+ const state: InstancedSpriteBaseState = { ...DEFAULT_BASE_STATE };
264
+ const mutates = createBaseMutates(false, false);
265
+ mutates.update(state);
266
+
267
+ const uniforms: ShaderUniforms = {};
268
+ mutates.updateUniforms(uniforms, state);
269
+ const initialRef = uniforms.uScreenHeightPx;
270
+
271
+ mutates.updateScreenHeightPx(1440);
272
+
273
+ expect(uniforms.uScreenHeightPx).toBe(initialRef);
274
+ expect(uniforms.uScreenHeightPx?.value).toBe(1440);
275
+ });
276
+ });
277
+ });
@@ -0,0 +1,151 @@
1
+ import { encodePosition } from "@navaramap/engine-api";
2
+ import {
3
+ type Matrix4,
4
+ type Texture,
5
+ Vector2 as ThreeVector2,
6
+ Vector3 as ThreeVector3,
7
+ } from "three";
8
+
9
+ import type { UniformValue } from "../../../types";
10
+
11
+ import type {
12
+ InstancedSpriteBaseMutates,
13
+ InstancedSpriteBaseRefs,
14
+ InstancedSpriteBaseState,
15
+ } from "./types";
16
+
17
+ /**
18
+ * Create mutation functions for the instancedSprite base enhancer.
19
+ * Refs are created internally and captured via closure.
20
+ *
21
+ * @param _useRTE - Whether RTE is enabled (reserved for API consistency)
22
+ * @param billboard - Whether billboard mode is enabled (determines if texture ref is created)
23
+ * @param rtcCenter - The RTC center position [x, y, z]
24
+ */
25
+ export const createBaseMutates = (
26
+ _useRTE: boolean,
27
+ billboard: boolean,
28
+ rtcCenter?: [number, number, number],
29
+ ): InstancedSpriteBaseMutates => {
30
+ const refs: InstancedSpriteBaseRefs = {
31
+ uRTCCenter: {
32
+ value: new ThreeVector3(
33
+ rtcCenter?.[0] ?? 0,
34
+ rtcCenter?.[1] ?? 0,
35
+ rtcCenter?.[2] ?? 0,
36
+ ),
37
+ },
38
+ uRTCCenterView: { value: new ThreeVector3(0, 0, 0) },
39
+ uEyeRTELow: { value: new ThreeVector3(0, 0, 0) },
40
+ uEyeRTEHigh: { value: new ThreeVector3(0, 0, 0) },
41
+ uScale: { value: 100.0 },
42
+ uCenter: { value: new ThreeVector2(0, 0) },
43
+ uSizeInMeters: { value: true },
44
+ uOffsetDepth: { value: true },
45
+ uAlphaTest: { value: 0.0 },
46
+ uFarPlane: { value: 0.0 },
47
+ uAtlasSize: { value: new ThreeVector2(1, 1) },
48
+ nvr_uPickable: { value: 0.0 },
49
+ uEffectIdsMask: { value: 0 },
50
+ uEmissiveColor: { value: new ThreeVector3(0, 0, 0) },
51
+ uEmissiveIntensity: { value: 0 },
52
+ uFovRad: { value: 1.0 },
53
+ uScreenHeightPx: { value: 1080 },
54
+ };
55
+
56
+ // Conditionally create texture ref for billboard mode
57
+ if (billboard) {
58
+ refs.uTexture = { value: null };
59
+ }
60
+
61
+ return {
62
+ update: (state: InstancedSpriteBaseState) => {
63
+ refs.uScale.value = state.scale;
64
+ refs.uCenter.value.set(state.center[0], state.center[1]);
65
+ refs.uSizeInMeters.value = state.sizeInMeters;
66
+ refs.uOffsetDepth.value = state.offsetDepth;
67
+ refs.uAlphaTest.value = state.alphaTest;
68
+ refs.uAtlasSize.value.set(state.atlasSize[0], state.atlasSize[1]);
69
+ refs.nvr_uPickable.value = state.pickable ? 1.0 : 0.0;
70
+ refs.uEffectIdsMask.value = state.effectIdsMask;
71
+ const c = state.emissiveColor;
72
+ refs.uEmissiveColor.value.set(
73
+ ((c >> 16) & 0xff) / 255,
74
+ ((c >> 8) & 0xff) / 255,
75
+ (c & 0xff) / 255,
76
+ );
77
+ refs.uEmissiveIntensity.value = state.emissiveIntensity;
78
+ },
79
+
80
+ updateUniforms: (uniforms) => {
81
+ uniforms.uRTCCenter = refs.uRTCCenter;
82
+ uniforms.uRTCCenterView = refs.uRTCCenterView;
83
+ uniforms.uEyeRTELow = refs.uEyeRTELow;
84
+ uniforms.uEyeRTEHigh = refs.uEyeRTEHigh;
85
+ uniforms.uScale = refs.uScale;
86
+ uniforms.uCenter = refs.uCenter;
87
+ uniforms.uSizeInMeters = refs.uSizeInMeters;
88
+ uniforms.uOffsetDepth = refs.uOffsetDepth;
89
+ uniforms.uAlphaTest = refs.uAlphaTest;
90
+ uniforms.uFarPlane = refs.uFarPlane;
91
+ uniforms.uAtlasSize = refs.uAtlasSize;
92
+ uniforms.uFovRad = refs.uFovRad;
93
+ uniforms.uScreenHeightPx = refs.uScreenHeightPx;
94
+ uniforms.nvr_uPickable = refs.nvr_uPickable;
95
+ uniforms.uEffectIdsMask = refs.uEffectIdsMask;
96
+ uniforms.uEmissiveColor = refs.uEmissiveColor;
97
+ uniforms.uEmissiveIntensity = refs.uEmissiveIntensity;
98
+
99
+ if (refs.uTexture) {
100
+ uniforms.uTexture = refs.uTexture;
101
+ }
102
+ },
103
+
104
+ updateRteUniforms: (
105
+ cameraX: number,
106
+ cameraY: number,
107
+ cameraZ: number,
108
+ state: InstancedSpriteBaseState,
109
+ ) => {
110
+ if (!state.useRTE) return;
111
+ const encoded = encodePosition(cameraX, cameraY, cameraZ);
112
+ refs.uEyeRTELow.value.set(encoded.low.x, encoded.low.y, encoded.low.z);
113
+ refs.uEyeRTEHigh.value.set(
114
+ encoded.high.x,
115
+ encoded.high.y,
116
+ encoded.high.z,
117
+ );
118
+ },
119
+
120
+ updateRtcUniforms: (
121
+ viewMatrix: Matrix4,
122
+ state: InstancedSpriteBaseState,
123
+ ) => {
124
+ if (state.useRTE) return;
125
+ // Transform the RTC center into view space here (JS numbers are float64),
126
+ // so the shader receives a small, precise value instead of doing
127
+ // `viewMatrix * uRTCCenter` where both operands are ~6.4e6 in float32.
128
+ refs.uRTCCenterView.value
129
+ .copy(refs.uRTCCenter.value)
130
+ .applyMatrix4(viewMatrix);
131
+ },
132
+
133
+ updateFarPlane: (far: number) => {
134
+ refs.uFarPlane.value = far;
135
+ },
136
+
137
+ updateFovRad: (fovRad: number) => {
138
+ refs.uFovRad.value = fovRad;
139
+ },
140
+
141
+ updateScreenHeightPx: (height: number) => {
142
+ refs.uScreenHeightPx.value = height;
143
+ },
144
+
145
+ setTexture: (texture: UniformValue<Texture | null>) => {
146
+ if (refs.uTexture) {
147
+ refs.uTexture.value = texture.value;
148
+ }
149
+ },
150
+ };
151
+ };