@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,67 @@
1
+ import FlatPolylineFragShader from "@shaders/glsl/flatPolyline.frag.glsl";
2
+ import FlatPolylineVertShader from "@shaders/glsl/flatPolyline.vert.glsl";
3
+ import PolylineFragShader from "@shaders/glsl/polyline.frag.glsl";
4
+ import PolylineVertShader from "@shaders/glsl/polyline.vert.glsl";
5
+ import { describe, it, expect } from "vitest";
6
+
7
+ import { createPolylineBaseEnhancer, type SupportedMaterial } from ".";
8
+
9
+ describe("polylineBaseEnhancer shader selection", () => {
10
+ it("should use FlatPolyline shaders when isTexturized is true", () => {
11
+ const material = {
12
+ type: "ShaderMaterial",
13
+ userData: {},
14
+ } as unknown as SupportedMaterial;
15
+
16
+ const enhancer = createPolylineBaseEnhancer(material);
17
+
18
+ // Mount with isTexturized = true
19
+ enhancer.mount({
20
+ isTexturized: true,
21
+ });
22
+
23
+ // Create a mock shader object
24
+ const shader = {
25
+ vertexShader: "",
26
+ fragmentShader: "",
27
+ uniforms: {},
28
+ defines: {},
29
+ };
30
+
31
+ // Transform the shader
32
+ enhancer.transformShader(shader as any);
33
+
34
+ // Verify that FlatPolyline shaders are used
35
+ expect(shader.vertexShader).toBe(FlatPolylineVertShader);
36
+ expect(shader.fragmentShader).toBe(FlatPolylineFragShader);
37
+ });
38
+
39
+ it("should use PolylineFragShader when isTexturized is false", () => {
40
+ const material = {
41
+ type: "ShaderMaterial",
42
+ userData: {},
43
+ } as unknown as SupportedMaterial;
44
+
45
+ const enhancer = createPolylineBaseEnhancer(material);
46
+
47
+ // Mount with isTexturized = false
48
+ enhancer.mount({
49
+ isTexturized: false,
50
+ });
51
+
52
+ // Create a mock shader object
53
+ const shader = {
54
+ vertexShader: "",
55
+ fragmentShader: "",
56
+ uniforms: {},
57
+ defines: {},
58
+ };
59
+
60
+ // Transform the shader
61
+ enhancer.transformShader(shader as any);
62
+
63
+ // Verify that PolylineVertShader and PolylineFragShader are used
64
+ expect(shader.vertexShader).toBe(PolylineVertShader);
65
+ expect(shader.fragmentShader).toContain(PolylineFragShader);
66
+ });
67
+ });
@@ -0,0 +1,75 @@
1
+ import FlatPolylineFragShader from "@shaders/glsl/flatPolyline.frag.glsl";
2
+ import FlatPolylineVertShader from "@shaders/glsl/flatPolyline.vert.glsl";
3
+ import PolylineFragShader from "@shaders/glsl/polyline.frag.glsl";
4
+ import PolylineVertShader from "@shaders/glsl/polyline.vert.glsl";
5
+ import { packing } from "@takram/three-geospatial/shaders";
6
+ import type { WebGLProgramParametersWithUniforms } from "three";
7
+
8
+ import type { SupportedMaterial } from "./material";
9
+ import type { PolylineBaseMutates, PolylineBaseState } from "./types";
10
+
11
+ /**
12
+ * Select appropriate shaders based on polyline state.
13
+ *
14
+ * @param isTexturized - Whether the polyline is rendered as flat texturized tile
15
+ * @returns Object with vertexShader and fragmentShader code
16
+ */
17
+ const selectShaders = (
18
+ isTexturized: boolean,
19
+ ): { vertexShader: string; fragmentShader: string } => {
20
+ if (isTexturized) {
21
+ // Flat polyline for texturized tile rendering
22
+ return {
23
+ vertexShader: FlatPolylineVertShader,
24
+ fragmentShader: FlatPolylineFragShader,
25
+ };
26
+ }
27
+
28
+ // 3D polyline for globe rendering
29
+ const fragmentShader = `${packing}\n` + PolylineFragShader;
30
+
31
+ return {
32
+ vertexShader: PolylineVertShader,
33
+ fragmentShader,
34
+ };
35
+ };
36
+
37
+ /**
38
+ * Transform shader with polyline base modifications.
39
+ *
40
+ * For polylines, the shaders are already provided as custom GLSL (polyline.vert.glsl, polyline.frag.glsl).
41
+ * This function primarily handles uniform assignment via mutates.updateUniforms().
42
+ *
43
+ * The shader transformation is minimal because:
44
+ * 1. Polyline shaders are custom ShaderMaterial shaders (not built-in Three.js shaders)
45
+ * 2. The shader code already contains all necessary features (RTE, batch texture, picking, etc.)
46
+ * 3. Features are controlled via #define flags set in onBeforeCompile (see PolylineMesh.initMaterial)
47
+ */
48
+ export const transformShader = (
49
+ shader: WebGLProgramParametersWithUniforms,
50
+ state: PolylineBaseState,
51
+ mutates: PolylineBaseMutates,
52
+ material: SupportedMaterial,
53
+ ): void => {
54
+ // Select and set shaders based on state
55
+ const shaders = selectShaders(state.isTexturized);
56
+ shader.vertexShader = shaders.vertexShader;
57
+ shader.fragmentShader = shaders.fragmentShader;
58
+
59
+ // Set shader defines based on state
60
+ shader.defines ??= {};
61
+
62
+ if (state.useRTE) {
63
+ shader.defines.USE_RTE = true;
64
+ }
65
+
66
+ shader.defines.USE_SELECTIVE_EFFECT = 1;
67
+
68
+ // Merge defines from material.userData.defines (includes batch texture defines)
69
+ if (material.userData.defines) {
70
+ Object.assign(shader.defines, material.userData.defines);
71
+ }
72
+
73
+ // Assign uniform refs to shader.uniforms via mutates
74
+ mutates.updateUniforms(shader.uniforms, state);
75
+ };
@@ -0,0 +1,55 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import { DEFAULT_BASE_STATE, updateState } from "./state";
4
+ import type { PolylineBaseProps } from "./types";
5
+
6
+ describe("polylineBaseEnhancer/state", () => {
7
+ describe("updateState", () => {
8
+ it("should initialize state from props with defaults", () => {
9
+ const props: PolylineBaseProps = {
10
+ color: 0xff0000,
11
+ width: 2,
12
+ };
13
+
14
+ const state = updateState(props, DEFAULT_BASE_STATE);
15
+
16
+ expect(state.width).toBe(2);
17
+ expect(state.useRTE).toBe(false);
18
+ expect(state.pickable).toBe(false);
19
+ });
20
+
21
+ it("should update minMaxHeight from props", () => {
22
+ const props: PolylineBaseProps = {
23
+ minMaxHeight: [100, 200],
24
+ };
25
+
26
+ const state = updateState(props, DEFAULT_BASE_STATE);
27
+
28
+ expect(state.minMaxHeight).toEqual([100, 200]);
29
+ });
30
+
31
+ it("should update width from props", () => {
32
+ const props: PolylineBaseProps = {
33
+ width: 5,
34
+ };
35
+
36
+ const state = updateState(props, DEFAULT_BASE_STATE);
37
+
38
+ expect(state.width).toBe(5);
39
+ });
40
+
41
+ it("should update batch flags from props", () => {
42
+ const props: PolylineBaseProps = {
43
+ batchColorEnabled: true,
44
+ useBatchTexture: true,
45
+ useBatchColorShow: true,
46
+ };
47
+
48
+ const state = updateState(props, DEFAULT_BASE_STATE);
49
+
50
+ expect(state.batchColorEnabled).toBe(true);
51
+ expect(state.useBatchTexture).toBe(true);
52
+ expect(state.useBatchColorShow).toBe(true);
53
+ });
54
+ });
55
+ });
@@ -0,0 +1,91 @@
1
+ import type { PolylineBaseProps, PolylineBaseState } from "./types";
2
+
3
+ export const DEFAULT_BASE_PROPS: Required<
4
+ Omit<
5
+ PolylineBaseProps,
6
+ | "batchDataTexture"
7
+ | "minMaxHeight"
8
+ | "viewportAndPixelRatio"
9
+ | "frustumNearFar"
10
+ | "frustumRatio"
11
+ >
12
+ > = {
13
+ color: 0xffffff,
14
+ transparent: false,
15
+ opacity: 1.0,
16
+ depthWrite: true,
17
+ addHeight: 0,
18
+ width: 1,
19
+ maxWidth: 1000,
20
+ isTexturized: false,
21
+ pickable: false,
22
+ effectIdsMask: 0,
23
+ emissiveColor: 0,
24
+ emissiveIntensity: 0,
25
+ useRTE: false,
26
+ batchColorEnabled: false,
27
+ useBatchTexture: false,
28
+ useBatchColorShow: false,
29
+ useBatchHeight: false,
30
+ useBatchLineWidth: false,
31
+ };
32
+
33
+ /** Default state derived from DEFAULT_BASE_PROPS */
34
+ export const DEFAULT_BASE_STATE: PolylineBaseState = {
35
+ useRTE: DEFAULT_BASE_PROPS.useRTE,
36
+ isTexturized: DEFAULT_BASE_PROPS.isTexturized,
37
+ pickable: DEFAULT_BASE_PROPS.pickable,
38
+ effectIdsMask: DEFAULT_BASE_PROPS.effectIdsMask,
39
+ emissiveColor: DEFAULT_BASE_PROPS.emissiveColor,
40
+ emissiveIntensity: DEFAULT_BASE_PROPS.emissiveIntensity,
41
+ minMaxHeight: [0, 0],
42
+ addHeight: DEFAULT_BASE_PROPS.addHeight,
43
+ width: DEFAULT_BASE_PROPS.width,
44
+ maxWidth: DEFAULT_BASE_PROPS.maxWidth,
45
+ color: DEFAULT_BASE_PROPS.color,
46
+ batchColorEnabled: DEFAULT_BASE_PROPS.batchColorEnabled,
47
+ useBatchTexture: DEFAULT_BASE_PROPS.useBatchTexture,
48
+ useBatchColorShow: DEFAULT_BASE_PROPS.useBatchColorShow,
49
+ useBatchHeight: DEFAULT_BASE_PROPS.useBatchHeight,
50
+ useBatchLineWidth: DEFAULT_BASE_PROPS.useBatchLineWidth,
51
+ };
52
+
53
+ /**
54
+ * Update immutable state from props.
55
+ * Props override currentState values; missing props fall back to currentState.
56
+ * Pass DEFAULT_BASE_STATE as currentState for initial mount.
57
+ *
58
+ * @param props - The props to apply
59
+ * @param currentState - The current state to use as fallback (use DEFAULT_BASE_STATE for mount)
60
+ */
61
+ export const updateState = (
62
+ props: PolylineBaseProps,
63
+ currentState: PolylineBaseState,
64
+ ): PolylineBaseState => {
65
+ const isTexturized = props.isTexturized ?? currentState.isTexturized;
66
+
67
+ return {
68
+ // RTE cannot change after mount - always preserve current value
69
+ useRTE: currentState.useRTE,
70
+ isTexturized,
71
+ pickable: props.pickable ?? currentState.pickable,
72
+ effectIdsMask: props.effectIdsMask ?? currentState.effectIdsMask,
73
+ emissiveColor: props.emissiveColor ?? currentState.emissiveColor,
74
+ emissiveIntensity:
75
+ props.emissiveIntensity ?? currentState.emissiveIntensity,
76
+ minMaxHeight: props.minMaxHeight ?? currentState.minMaxHeight,
77
+ addHeight: props.addHeight ?? currentState.addHeight,
78
+ width: props.width ?? currentState.width,
79
+ maxWidth: props.maxWidth ?? currentState.maxWidth,
80
+ color: props.color ?? currentState.color,
81
+ // Batch flags can only transition from false to true, never back
82
+ batchColorEnabled:
83
+ currentState.batchColorEnabled || !!props.batchColorEnabled,
84
+ useBatchTexture: currentState.useBatchTexture || !!props.useBatchTexture,
85
+ useBatchColorShow:
86
+ currentState.useBatchColorShow || !!props.useBatchColorShow,
87
+ useBatchHeight: currentState.useBatchHeight || !!props.useBatchHeight,
88
+ useBatchLineWidth:
89
+ currentState.useBatchLineWidth || !!props.useBatchLineWidth,
90
+ };
91
+ };
@@ -0,0 +1,170 @@
1
+ import type { Color, Matrix4, Texture, Vector2, Vector3 } from "three";
2
+
3
+ import type { UniformValue } from "../../../types";
4
+ import type { BatchTextureFlags } from "../../batchTexture";
5
+ import type { Mutates } from "../../MaterialEnhancer";
6
+
7
+ type PolylineBatchTextureFlags = Required<
8
+ Omit<BatchTextureFlags, "useBatchExtrudedHeight" | "useBatchSize">
9
+ >;
10
+
11
+ /**
12
+ * Props for the polyline base enhancer.
13
+ */
14
+ export type PolylineBaseProps = {
15
+ // Basic material props
16
+ color?: number;
17
+
18
+ transparent?: boolean;
19
+ opacity?: number;
20
+ depthWrite?: boolean;
21
+
22
+ // Height/width
23
+ minMaxHeight?: [number, number];
24
+ addHeight?: number;
25
+ width?: number;
26
+ maxWidth?: number;
27
+
28
+ isTexturized?: boolean;
29
+
30
+ // Picking
31
+ pickable?: boolean;
32
+
33
+ // SelectiveEffect
34
+ effectIdsMask?: number;
35
+ emissiveColor?: number;
36
+ emissiveIntensity?: number;
37
+
38
+ // External uniforms (passed from CommonUniforms)
39
+ // Note: These use tuple types matching CommonUniforms, not Three.js Vector types
40
+ viewportAndPixelRatio?: {
41
+ value: [x: number, y: number, z: number] | undefined | null;
42
+ };
43
+ frustumNearFar?: { value: [x: number, y: number] | undefined | null };
44
+ frustumRatio?: {
45
+ value: [x: number, y: number, z: number, w: number] | undefined | null;
46
+ };
47
+
48
+ // Batch texture
49
+ batchDataTexture?: UniformValue<Texture | null>;
50
+
51
+ // Batch texture state flags - track when batch attributes are being used
52
+ batchColorEnabled?: boolean;
53
+
54
+ // RTE (Relative To Eye) support
55
+ useRTE?: boolean;
56
+ } & Partial<PolylineBatchTextureFlags>;
57
+
58
+ /**
59
+ * Immutable state for the polyline base enhancer.
60
+ * This state is always replaced as a whole (never mutated).
61
+ * Returned directly via states() - refresh after updates.
62
+ */
63
+ export type PolylineBaseState = Readonly<
64
+ {
65
+ useRTE: boolean;
66
+ isTexturized: boolean;
67
+ pickable: boolean;
68
+ effectIdsMask: number;
69
+ emissiveColor: number;
70
+ emissiveIntensity: number;
71
+ minMaxHeight: [number, number];
72
+ addHeight: number;
73
+ width: number;
74
+ maxWidth: number;
75
+ color: number;
76
+ // Batch texture state - when true, material.color is white and colors come from batch texture
77
+ batchColorEnabled: boolean;
78
+ } & PolylineBatchTextureFlags
79
+ >;
80
+
81
+ /**
82
+ * Mutable references (uniforms) for the polyline base enhancer.
83
+ *
84
+ * These are shared references with shader.uniforms and can be mutated directly
85
+ * for efficient GPU uniform updates without shader recompilation.
86
+ * Internal type - not exposed externally.
87
+ */
88
+ export type PolylineBaseRefs = {
89
+ // Core uniforms
90
+ minMaxHeightAndWidth: UniformValue<[number, number, number]>;
91
+ maxWidth: UniformValue<number>;
92
+ uAddHeight: UniformValue<number>;
93
+ color: UniformValue<Color>;
94
+ nvr_uPickable: UniformValue<number>;
95
+ uEffectIdsMask: UniformValue<number>;
96
+ uEmissiveColor: UniformValue<Vector3>;
97
+ uEmissiveIntensity: UniformValue<number>;
98
+ nvr_uPickingCoord: UniformValue<Vector2>;
99
+
100
+ // Optional uniforms
101
+ batchDataTexture?: UniformValue<Texture | null>;
102
+
103
+ // External shared uniforms (references passed from CommonUniforms)
104
+ // Note: These use tuple types matching CommonUniforms, not Three.js Vector types
105
+ viewportAndPixelRatio?: {
106
+ value: [x: number, y: number, z: number] | undefined | null;
107
+ };
108
+ frustumNearFar?: { value: [x: number, y: number] | undefined | null };
109
+ frustumRatio?: {
110
+ value: [x: number, y: number, z: number, w: number] | undefined | null;
111
+ };
112
+
113
+ // RTE uniforms (only present if useRTE is true)
114
+ modelViewMatrixRTE?: UniformValue<Matrix4>;
115
+ u_cameraPositionHigh?: UniformValue<Vector3>;
116
+ u_cameraPositionLow?: UniformValue<Vector3>;
117
+ };
118
+
119
+ export type PolylineBaseUniforms = Partial<PolylineBaseRefs>;
120
+
121
+ /**
122
+ * Mutation functions for the polyline base enhancer.
123
+ * Includes `update(state)` to sync refs from state, plus additional methods.
124
+ */
125
+ export type PolylineBaseMutates = Mutates<
126
+ PolylineBaseState,
127
+ PolylineBaseUniforms,
128
+ {
129
+ /**
130
+ * Update RTE (Relative-To-Eye) uniforms for high-precision rendering.
131
+ * Call this per-frame to update the model-view matrix and camera position.
132
+ * Does nothing if RTE is not enabled.
133
+ *
134
+ * @param modelViewMatrixRTE - The model-view matrix in RTE coordinates
135
+ * @param cameraPositionHigh - High-precision component of camera position
136
+ * @param cameraPositionLow - Low-precision component of camera position
137
+ * @param state - PolylineBaseState
138
+ */
139
+ updateRteUniforms: (
140
+ modelViewMatrixRTE: Matrix4,
141
+ cameraPositionHigh: Vector3,
142
+ cameraPositionLow: Vector3,
143
+ state: PolylineBaseState,
144
+ ) => void;
145
+ /**
146
+ * Set the batch data texture ref.
147
+ * This is needed because batchDataTexture is an external ref passed via props.
148
+ */
149
+ setBatchDataTexture: (texture: UniformValue<Texture | null>) => void;
150
+ /**
151
+ * Set the picking coordinate.
152
+ * This is needed to update the picking coordinate uniform.
153
+ */
154
+ setPickingCoord: (coord: Vector2) => void;
155
+ /**
156
+ * Set external uniform references shared across materials.
157
+ * These are typically passed from CommonUniforms and should be set once during mount.
158
+ */
159
+ setExternalRefs: (externalRefs: {
160
+ batchDataTexture?: UniformValue<Texture | null>;
161
+ viewportAndPixelRatio?: {
162
+ value: [x: number, y: number, z: number] | undefined | null;
163
+ };
164
+ frustumNearFar?: { value: [x: number, y: number] | undefined | null };
165
+ frustumRatio?: {
166
+ value: [x: number, y: number, z: number, w: number] | undefined | null;
167
+ };
168
+ }) => void;
169
+ }
170
+ >;
@@ -0,0 +1,102 @@
1
+ /**
2
+ * Polyline Material Enhancer - Currently just the Base enhancer
3
+ *
4
+ * This module provides polyline material functionality using the base enhancer.
5
+ * Unlike polygon materials which have water effects, polyline materials currently
6
+ * only need the base functionality.
7
+ */
8
+
9
+ import type { MaterialEnhancer } from "../MaterialEnhancer";
10
+
11
+ import {
12
+ createPolylineBaseEnhancer,
13
+ type PolylineBaseMutates,
14
+ type PolylineBaseProps,
15
+ type PolylineBaseState,
16
+ type SupportedMaterial,
17
+ } from "./polylineBaseEnhancer";
18
+
19
+ /**
20
+ * Props for the polyline material enhancer.
21
+ * Currently just wraps the base props, but structured for future composition.
22
+ */
23
+ export type PolylineMaterialProps = {
24
+ base?: PolylineBaseProps;
25
+ };
26
+
27
+ // Shaders this enhancer supports (custom ShaderMaterial via the "shader" shader name)
28
+ const AVAILABLE_SHADERS = ["shader"] as const;
29
+ type AVAILABLE_SHADERS = typeof AVAILABLE_SHADERS;
30
+
31
+ /**
32
+ * Factory function to create the polyline material enhancer.
33
+ *
34
+ * This creates a new enhancer instance with its own internal state.
35
+ *
36
+ * @param material - The Three.js ShaderMaterial to enhance
37
+ *
38
+ * @example
39
+ * ```typescript
40
+ * const material = new ShaderMaterial();
41
+ * const enhancer = createPolylineMaterialEnhancer(material);
42
+ *
43
+ * // Mount with base props
44
+ * enhancer.mount({
45
+ * base: { color: 0xff0000, width: 2, useRTE: true },
46
+ * });
47
+ *
48
+ * // Get state directly via states() - refresh after updates
49
+ * const state = enhancer.states();
50
+ *
51
+ * // Update RTE uniforms per-frame via mutates()
52
+ * if (state.useRTE) {
53
+ * const mutates = enhancer.mutates();
54
+ * mutates.updateRteUniforms(modelViewMatrix, cameraHigh, cameraLow, state);
55
+ * }
56
+ *
57
+ * // Update props (then call states() again to get fresh state)
58
+ * enhancer.update({ base: { width: 3 } });
59
+ *
60
+ * // Use transformShader for onBeforeCompile
61
+ * material.onBeforeCompile = enhancer.transformShader;
62
+ * ```
63
+ */
64
+ export function createPolylineMaterialEnhancer(
65
+ material: SupportedMaterial,
66
+ ): MaterialEnhancer<
67
+ SupportedMaterial,
68
+ PolylineMaterialProps,
69
+ PolylineBaseState,
70
+ PolylineBaseMutates,
71
+ AVAILABLE_SHADERS
72
+ > {
73
+ const baseEnhancer = createPolylineBaseEnhancer(material);
74
+
75
+ return {
76
+ material,
77
+ availableShaders: AVAILABLE_SHADERS,
78
+
79
+ transformShader: (shader) => {
80
+ baseEnhancer.transformShader(shader);
81
+ },
82
+
83
+ mount: (props) => {
84
+ baseEnhancer.mount(props.base ?? {});
85
+ },
86
+
87
+ update: (props) => {
88
+ if (props.base) {
89
+ baseEnhancer.update(props.base);
90
+ }
91
+ },
92
+
93
+ states: () => baseEnhancer.states(),
94
+
95
+ mutates: () => baseEnhancer.mutates(),
96
+
97
+ programCacheKey: () => baseEnhancer.programCacheKey(),
98
+ };
99
+ }
100
+
101
+ // Re-export types for convenience
102
+ export type { PolylineBaseMutates, PolylineBaseProps, PolylineBaseState };
@@ -0,0 +1,7 @@
1
+ export { createSdfTextMaterialEnhancer } from "./sdfTextMaterialEnhancer";
2
+ export type {
3
+ SdfTextBaseMutates,
4
+ SdfTextBaseProps,
5
+ SdfTextBaseState,
6
+ SdfTextMaterialProps,
7
+ } from "./sdfTextMaterialEnhancer";
@@ -0,0 +1,125 @@
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
+ SdfTextBaseMutates,
17
+ SdfTextBaseProps,
18
+ SdfTextBaseState,
19
+ } from "./types";
20
+
21
+ /**
22
+ * Factory function to create an sdfText base enhancer.
23
+ *
24
+ * This enhancer handles:
25
+ * - Text color, font size, centering
26
+ * - Outline (width, color, opacity)
27
+ * - Background quad (color, border)
28
+ * - Height offset, depth offset
29
+ * - Picking
30
+ * - RTE (Relative-To-Eye) support for high-precision coordinates
31
+ * - Billboard scaling by distance
32
+ * - SDF atlas texture management
33
+ *
34
+ * Supports ShaderMaterial with custom sdfText shaders.
35
+ *
36
+ * @param material - The Three.js ShaderMaterial to enhance
37
+ */
38
+ export function createSdfTextBaseEnhancer(
39
+ material: SupportedMaterial,
40
+ ): MaterialEnhancer<
41
+ SupportedMaterial,
42
+ SdfTextBaseProps,
43
+ SdfTextBaseState,
44
+ SdfTextBaseMutates,
45
+ typeof AVAILABLE_SHADERS
46
+ > {
47
+ // Internal state - immutable, always replaced as a whole
48
+ let state: SdfTextBaseState | null = null;
49
+ // Internal mutates object (refs are hidden inside)
50
+ let mutates: SdfTextBaseMutates | null = null;
51
+
52
+ return {
53
+ material,
54
+ availableShaders: AVAILABLE_SHADERS,
55
+
56
+ transformShader: (shader: WebGLProgramParametersWithUniforms): void => {
57
+ invariant(
58
+ state && mutates,
59
+ "mount() must be called before transformShader",
60
+ );
61
+ transformShader(shader, state, mutates);
62
+ },
63
+
64
+ mount: (props: SdfTextBaseProps): void => {
65
+ const mergedProps = defaults({}, props, DEFAULT_BASE_PROPS);
66
+ // Create initial state with immutable fields from props
67
+ const initialState = {
68
+ ...DEFAULT_BASE_STATE,
69
+ useRTE: mergedProps.useRTE,
70
+ useMsdf: mergedProps.useMsdf,
71
+ };
72
+ state = updateState(mergedProps, initialState);
73
+ // Create mutates (refs are created inside with default values)
74
+ mutates = createBaseMutates(mergedProps.useRTE, mergedProps.rtcCenter);
75
+ mutates.update(state);
76
+
77
+ // Set atlas texture external ref if provided
78
+ if (props.atlasTexture) {
79
+ mutates.setAtlasTexture(props.atlasTexture);
80
+ }
81
+
82
+ updateMaterialProps(material, mergedProps);
83
+ },
84
+
85
+ update: (props: SdfTextBaseProps): void => {
86
+ invariant(state && mutates, "mount() must be called before update");
87
+
88
+ state = updateState(props, state);
89
+ mutates.update(state);
90
+
91
+ if (props.atlasTexture) {
92
+ mutates.setAtlasTexture(props.atlasTexture);
93
+ }
94
+
95
+ updateMaterialProps(material, props);
96
+ },
97
+
98
+ states: (): SdfTextBaseState => {
99
+ invariant(state, "mount() must be called before states");
100
+ return state;
101
+ },
102
+
103
+ mutates: (): SdfTextBaseMutates => {
104
+ invariant(mutates, "mount() must be called before mutates");
105
+ return mutates;
106
+ },
107
+
108
+ programCacheKey: (): string => {
109
+ invariant(state, "mount() must be called before programCacheKey");
110
+ return JSON.stringify({ useRTE: state.useRTE, useMsdf: state.useMsdf });
111
+ },
112
+ };
113
+ }
114
+
115
+ // Re-export public types
116
+ export type { SdfTextBaseMutates, SdfTextBaseProps, SdfTextBaseState };
117
+
118
+ // Re-export SupportedMaterial for use by composing enhancers
119
+ export type { SupportedMaterial } from "./material";
120
+
121
+ // Re-export marker types for composing enhancers
122
+ export {
123
+ SDF_TEXT_BASE_SHADER_MARKERS,
124
+ createSdfTextBaseShaderReplacer,
125
+ } from "./markers";