@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,130 @@
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 { AVAILABLE_SHADERS, type SupportedMaterial } from "./material";
8
+ import { updateMaterialProps } from "./material";
9
+ import { createBaseMutates } from "./mutates";
10
+ import { transformShader } from "./shader";
11
+ import { DEFAULT_BASE_PROPS, DEFAULT_BASE_STATE, updateState } from "./state";
12
+ import type {
13
+ PolygonBaseMutates,
14
+ PolygonBaseProps,
15
+ PolygonBaseState,
16
+ } from "./types";
17
+
18
+ /**
19
+ * Factory function to create a polygon base enhancer.
20
+ *
21
+ * This enhancer handles:
22
+ * - Basic material properties (color, opacity, wireframe)
23
+ * - Height and extrusion
24
+ * - Clamp to ground
25
+ * - Picking
26
+ * - Reflectivity
27
+ * - RTE support
28
+ *
29
+ * Supports Lambert materials.
30
+ *
31
+ * @param material - The Three.js material to enhance
32
+ */
33
+ export function createPolygonBaseEnhancer(
34
+ material: SupportedMaterial,
35
+ ): MaterialEnhancer<
36
+ SupportedMaterial,
37
+ PolygonBaseProps,
38
+ PolygonBaseState,
39
+ PolygonBaseMutates,
40
+ typeof AVAILABLE_SHADERS
41
+ > {
42
+ // Internal state - immutable, always replaced as a whole
43
+ let state: PolygonBaseState | null = null;
44
+ // Internal mutates object (refs are hidden inside)
45
+ let mutates: PolygonBaseMutates | null = null;
46
+
47
+ return {
48
+ material,
49
+ availableShaders: AVAILABLE_SHADERS,
50
+
51
+ transformShader: (shader: WebGLProgramParametersWithUniforms): void => {
52
+ invariant(
53
+ state && mutates,
54
+ "mount() must be called before transformShader",
55
+ );
56
+ transformShader(shader, state, mutates, material);
57
+ },
58
+
59
+ mount: (props: PolygonBaseProps): void => {
60
+ const mergedProps = defaults({}, props, DEFAULT_BASE_PROPS);
61
+ // Create initial state with useRTE from props (useRTE can't change after mount)
62
+ const initialState = {
63
+ ...DEFAULT_BASE_STATE,
64
+ useRTE: mergedProps.useRTE,
65
+ };
66
+ state = updateState(mergedProps, initialState);
67
+ // Create mutates (refs are created inside with default values)
68
+ mutates = createBaseMutates(mergedProps.useRTE);
69
+ mutates.update(state);
70
+ // Handle external refs that are passed through props
71
+ if (props.batchDataTexture) {
72
+ mutates.setBatchDataTexture(props.batchDataTexture);
73
+ }
74
+ if (props.globeNormalTexture) {
75
+ mutates.setGlobeNormalTexture(props.globeNormalTexture);
76
+ }
77
+ updateMaterialProps(material, mergedProps);
78
+ },
79
+
80
+ update: (props: PolygonBaseProps): void => {
81
+ invariant(state && mutates, "mount() must be called before update");
82
+ state = updateState(props, state);
83
+ mutates.update(state);
84
+ // Handle external refs that are passed through props
85
+ if (props.batchDataTexture) {
86
+ mutates.setBatchDataTexture(props.batchDataTexture);
87
+ }
88
+ if (props.globeNormalTexture) {
89
+ mutates.setGlobeNormalTexture(props.globeNormalTexture);
90
+ }
91
+ updateMaterialProps(material, props);
92
+ },
93
+
94
+ states: (): PolygonBaseState => {
95
+ invariant(state, "mount() must be called before states");
96
+ return state;
97
+ },
98
+
99
+ mutates: (): PolygonBaseMutates => {
100
+ invariant(mutates, "mount() must be called before mutates");
101
+ return mutates;
102
+ },
103
+
104
+ programCacheKey: (): string => {
105
+ invariant(state, "mount() must be called before programCacheKey");
106
+ // Return cache key based on state that affects shader defines
107
+ return JSON.stringify({
108
+ useBatchTexture: state.useBatchTexture,
109
+ useBatchColorShow: state.useBatchColorShow,
110
+ useBatchHeight: state.useBatchHeight,
111
+ useBatchExtrudedHeight: state.useBatchExtrudedHeight,
112
+ isTexturized: state.isTexturized,
113
+ clampToGround: state.clampToGround,
114
+ useRTE: state.useRTE,
115
+ });
116
+ },
117
+ };
118
+ }
119
+
120
+ // Re-export public types
121
+ export type { PolygonBaseMutates, PolygonBaseProps, PolygonBaseState };
122
+
123
+ // Re-export SupportedMaterial for use by water enhancer
124
+ export type { SupportedMaterial } from "./material";
125
+
126
+ // Re-export marker types for composing enhancers
127
+ export {
128
+ POLYGON_BASE_SHADER_MARKERS,
129
+ createPolygonBaseShaderReplacer,
130
+ } from "./markers";
@@ -0,0 +1,23 @@
1
+ import { type ShaderMarkers, createShaderReplacer } from "../../ShaderReplacer";
2
+
3
+ export const POLYGON_BASE_SHADER_MARKERS = {
4
+ vertex: {},
5
+ fragment: {
6
+ /** Start of polygon uniform declarations. */
7
+ UNIFORM_START: "// NVR_POLYGON_BASE_UNIFORM_START",
8
+ /** End of polygon uniform declarations. */
9
+ UNIFORM_END: "// NVR_POLYGON_BASE_UNIFORM_END",
10
+ /** Start of normal computation block. */
11
+ NORMAL_START: "// NVR_POLYGON_BASE_NORMAL_START",
12
+ /** End of normal computation block. */
13
+ NORMAL_END: "// NVR_POLYGON_BASE_NORMAL_END",
14
+ /** Start of the final normal assignment block (used for MRT output). */
15
+ FINAL_NORMAL_START: "// NVR_POLYGON_BASE_FINAL_NORMAL_START",
16
+ /** End of the final normal assignment block (used for MRT output). */
17
+ FINAL_NORMAL_END: "// NVR_POLYGON_BASE_FINAL_NORMAL_END",
18
+ },
19
+ } as const satisfies ShaderMarkers;
20
+
21
+ export function createPolygonBaseShaderReplacer(source: string) {
22
+ return createShaderReplacer<typeof POLYGON_BASE_SHADER_MARKERS>(source);
23
+ }
@@ -0,0 +1,19 @@
1
+ import { MeshLambertMaterial } from "three";
2
+ import { describe, expect, it } from "vitest";
3
+
4
+ import { updateMaterialProps } from "./material";
5
+
6
+ describe("polygonBaseEnhancer/material", () => {
7
+ describe("updateMaterialProps", () => {
8
+ it("should not update properties when props are undefined", () => {
9
+ const material = new MeshLambertMaterial();
10
+ material.color.set(0xff0000);
11
+ material.opacity = 0.5;
12
+
13
+ // Empty props should not change anything
14
+ updateMaterialProps(material, {});
15
+ expect(material.color.getHex()).toBe(0xff0000);
16
+ expect(material.opacity).toBe(0.5);
17
+ });
18
+ });
19
+ });
@@ -0,0 +1,38 @@
1
+ import type { MaterialsFromShaders, ShaderName } from "../../MaterialEnhancer";
2
+
3
+ import type { PolygonBaseProps } from "./types";
4
+
5
+ // Shaders this enhancer supports
6
+ export const AVAILABLE_SHADERS = ["lambert"] satisfies ShaderName[];
7
+ export type SupportedMaterial = MaterialsFromShaders<typeof AVAILABLE_SHADERS>;
8
+
9
+ /**
10
+ * Update Three.js material properties from props and state.
11
+ * Side effect function - mutates material directly.
12
+ */
13
+ export const updateMaterialProps = (
14
+ material: SupportedMaterial,
15
+ props: PolygonBaseProps,
16
+ ): void => {
17
+ if (props.color !== undefined) {
18
+ material.color.set(props.color);
19
+ }
20
+ if (props.opacity !== undefined) {
21
+ material.opacity = props.opacity;
22
+ }
23
+ if (props.transparent !== undefined) {
24
+ material.transparent = props.transparent;
25
+ }
26
+ if (props.wireframe !== undefined) {
27
+ material.wireframe = props.wireframe;
28
+ }
29
+ if (props.emissiveColor !== undefined) {
30
+ material.emissive.set(props.emissiveColor);
31
+ }
32
+ if (props.emissiveIntensity !== undefined) {
33
+ material.emissiveIntensity = props.emissiveIntensity;
34
+ }
35
+ if (props.reflectivity !== undefined) {
36
+ material.reflectivity = props.reflectivity;
37
+ }
38
+ };
@@ -0,0 +1,75 @@
1
+ import { describe, expect, it } from "vitest";
2
+
3
+ import type { ShaderUniforms } from "../../MaterialEnhancer";
4
+
5
+ import { createBaseMutates } from "./mutates";
6
+ import { DEFAULT_BASE_STATE } from "./state";
7
+ import type { PolygonBaseState } from "./types";
8
+
9
+ describe("polygonBaseEnhancer/mutates", () => {
10
+ describe("RTE uniforms", () => {
11
+ it("should assign RTE refs to shader.uniforms when useRTE=true", () => {
12
+ const state: PolygonBaseState = { ...DEFAULT_BASE_STATE, useRTE: true };
13
+ const mutates = createBaseMutates(true);
14
+ mutates.update(state);
15
+
16
+ const uniforms: ShaderUniforms = {};
17
+ mutates.updateUniforms(uniforms, state);
18
+
19
+ expect(uniforms.modelViewMatrixRTE).toBeDefined();
20
+ expect(uniforms.u_cameraPositionHigh).toBeDefined();
21
+ expect(uniforms.u_cameraPositionLow).toBeDefined();
22
+ });
23
+
24
+ it("should not assign RTE refs to shader.uniforms when useRTE=false", () => {
25
+ const state: PolygonBaseState = { ...DEFAULT_BASE_STATE, useRTE: false };
26
+ const mutates = createBaseMutates(false);
27
+ mutates.update(state);
28
+
29
+ const uniforms: ShaderUniforms = {};
30
+ mutates.updateUniforms(uniforms, state);
31
+
32
+ expect(uniforms.modelViewMatrixRTE).toBeUndefined();
33
+ expect(uniforms.u_cameraPositionHigh).toBeUndefined();
34
+ expect(uniforms.u_cameraPositionLow).toBeUndefined();
35
+ });
36
+ });
37
+
38
+ describe("update syncs refs from state", () => {
39
+ it("should sync core refs from state", () => {
40
+ const state: PolygonBaseState = {
41
+ ...DEFAULT_BASE_STATE,
42
+ pickable: true,
43
+ clampToGround: true,
44
+ addHeight: 10,
45
+ addExtrudedHeight: 20,
46
+ minMaxHeight: [5, 50],
47
+ };
48
+ const mutates = createBaseMutates(false);
49
+ mutates.update(state);
50
+
51
+ const uniforms: ShaderUniforms = {};
52
+ mutates.updateUniforms(uniforms, state);
53
+
54
+ expect(uniforms.nvr_uPickable?.value).toBe(1);
55
+ expect(uniforms.uClampToGround?.value).toBe(true);
56
+ expect(uniforms.uAddHeight?.value).toBe(10);
57
+ expect(uniforms.uAddExtrudedHeight?.value).toBe(20);
58
+ expect(uniforms.uMinMaxHeight?.value).toEqual([5, 50]);
59
+ });
60
+
61
+ it("should sync uEmissiveIntensity ref from state", () => {
62
+ const state: PolygonBaseState = {
63
+ ...DEFAULT_BASE_STATE,
64
+ emissiveIntensity: 0.3,
65
+ };
66
+ const mutates = createBaseMutates(false);
67
+ mutates.update(state);
68
+
69
+ const uniforms: ShaderUniforms = {};
70
+ mutates.updateUniforms(uniforms, state);
71
+
72
+ expect(uniforms.uEmissiveIntensity?.value).toBe(0.3);
73
+ });
74
+ });
75
+ });
@@ -0,0 +1,122 @@
1
+ import type { Matrix4, Texture, Vector3 } from "three";
2
+ import { Matrix4 as ThreeMatrix4, Vector3 as ThreeVector3 } from "three";
3
+
4
+ import type { UniformValue } from "../../../types";
5
+
6
+ import type {
7
+ PolygonBaseMutates,
8
+ PolygonBaseRefs,
9
+ PolygonBaseState,
10
+ } from "./types";
11
+
12
+ /**
13
+ * Default refs with initial values.
14
+ * These are cloned in createBaseMutates and synced from state via update().
15
+ */
16
+ const DEFAULT_BASE_REFS: PolygonBaseRefs = {
17
+ uMinMaxHeight: { value: undefined },
18
+ uAddExtrudedHeight: { value: 0 },
19
+ uAddHeight: { value: 0 },
20
+ uClampToGround: { value: false },
21
+ nvr_uPickable: { value: 0 },
22
+ uEffectIdsMask: { value: 0 },
23
+ uEmissiveIntensity: { value: 0 },
24
+ uIsTexturized: { value: false },
25
+ reflectivity: { value: 0 },
26
+ roughness: { value: 0 },
27
+ };
28
+
29
+ /**
30
+ * Create mutation functions for the polygon base enhancer.
31
+ * Refs are created internally and captured via closure.
32
+ *
33
+ * @param useRTE - Whether RTE is enabled (determines if RTE refs are created)
34
+ */
35
+ export const createBaseMutates = (useRTE: boolean): PolygonBaseMutates => {
36
+ // Clone defaults so each enhancer instance gets independent ref objects
37
+ const refs = structuredClone(DEFAULT_BASE_REFS) as PolygonBaseRefs;
38
+
39
+ // Conditionally create RTE refs (useRTE can't change after mount)
40
+ if (useRTE) {
41
+ refs.modelViewMatrixRTE = { value: new ThreeMatrix4() };
42
+ refs.u_cameraPositionHigh = { value: new ThreeVector3() };
43
+ refs.u_cameraPositionLow = { value: new ThreeVector3() };
44
+ }
45
+
46
+ return {
47
+ update: (state) => {
48
+ // Sync refs from state
49
+ refs.uMinMaxHeight.value = state.minMaxHeight;
50
+ refs.uAddExtrudedHeight.value = state.addExtrudedHeight;
51
+ refs.uAddHeight.value = state.addHeight;
52
+ refs.uClampToGround.value = state.clampToGround;
53
+ refs.nvr_uPickable.value = state.pickable ? 1 : 0;
54
+ refs.uEffectIdsMask.value = state.effectIdsMask;
55
+ refs.uEmissiveIntensity.value = state.emissiveIntensity;
56
+ refs.uIsTexturized.value = state.isTexturized;
57
+ refs.reflectivity.value = state.reflectivity;
58
+ refs.roughness.value = state.roughness;
59
+ },
60
+ updateUniforms: (uniforms, state) => {
61
+ // Assign core uniform refs to shader.uniforms
62
+ if (refs.uGlobeNormal) {
63
+ uniforms.uGlobeNormal = refs.uGlobeNormal;
64
+ }
65
+ uniforms.nvr_uPickable = refs.nvr_uPickable;
66
+ uniforms.uEffectIdsMask = refs.uEffectIdsMask;
67
+ uniforms.uEmissiveIntensity = refs.uEmissiveIntensity;
68
+ uniforms.reflectivity = refs.reflectivity;
69
+ uniforms.roughness = refs.roughness;
70
+
71
+ // RTE uniforms
72
+ if (
73
+ state.useRTE &&
74
+ refs.modelViewMatrixRTE &&
75
+ refs.u_cameraPositionHigh &&
76
+ refs.u_cameraPositionLow
77
+ ) {
78
+ uniforms.u_cameraPositionHigh = refs.u_cameraPositionHigh;
79
+ uniforms.u_cameraPositionLow = refs.u_cameraPositionLow;
80
+ uniforms.modelViewMatrixRTE = refs.modelViewMatrixRTE;
81
+ }
82
+
83
+ // Height uniforms
84
+ if (refs.uMinMaxHeight.value) {
85
+ uniforms.uMinMaxHeight = refs.uMinMaxHeight;
86
+ }
87
+ uniforms.uAddExtrudedHeight = refs.uAddExtrudedHeight;
88
+ uniforms.uAddHeight = refs.uAddHeight;
89
+ uniforms.uClampToGround = refs.uClampToGround;
90
+
91
+ // Batch texture
92
+ if (refs.batchDataTexture) {
93
+ uniforms.batchDataTexture = refs.batchDataTexture;
94
+ }
95
+
96
+ uniforms.uIsTexturized = refs.uIsTexturized;
97
+ },
98
+ setBatchDataTexture: (texture: UniformValue<Texture | null>): void => {
99
+ refs.batchDataTexture = texture;
100
+ },
101
+ setGlobeNormalTexture: (texture: UniformValue<Texture | null>): void => {
102
+ refs.uGlobeNormal = texture;
103
+ },
104
+ updateRteUniforms: (
105
+ modelViewMatrixRTE: Matrix4,
106
+ cameraPositionHigh: Vector3,
107
+ cameraPositionLow: Vector3,
108
+ state: PolygonBaseState,
109
+ ): void => {
110
+ if (!state.useRTE) return;
111
+ if (refs.modelViewMatrixRTE) {
112
+ refs.modelViewMatrixRTE.value.copy(modelViewMatrixRTE);
113
+ }
114
+ if (refs.u_cameraPositionHigh) {
115
+ refs.u_cameraPositionHigh.value.copy(cameraPositionHigh);
116
+ }
117
+ if (refs.u_cameraPositionLow) {
118
+ refs.u_cameraPositionLow.value.copy(cameraPositionLow);
119
+ }
120
+ },
121
+ };
122
+ };
@@ -0,0 +1,25 @@
1
+ import { testShaderCompatibility } from "../../test-utils/shaderCompatibility";
2
+
3
+ import { POLYGON_BASE_SHADER_MARKERS } from "./markers";
4
+
5
+ import { createPolygonBaseEnhancer, type SupportedMaterial } from ".";
6
+
7
+ testShaderCompatibility(
8
+ "polygonBaseEnhancer",
9
+ (material) => createPolygonBaseEnhancer(material as SupportedMaterial),
10
+ [
11
+ {
12
+ name: "With RTE",
13
+ props: {
14
+ useRTE: true,
15
+ },
16
+ },
17
+ {
18
+ name: "Without RTE",
19
+ props: {
20
+ useRTE: false,
21
+ },
22
+ },
23
+ ],
24
+ POLYGON_BASE_SHADER_MARKERS,
25
+ );
@@ -0,0 +1,249 @@
1
+ import BatchTextureParsVertex from "@shaders/glsl/chunks/batch_texture_pars_vertex.glsl";
2
+ import BatchTextureVertex from "@shaders/glsl/chunks/batch_texture_vertex.glsl";
3
+ import BranchFreeTernary from "@shaders/glsl/chunks/branchFreeTernary.glsl";
4
+ import ExtrudedHeightParsVertex from "@shaders/glsl/chunks/extruded_height_pars_vertex.glsl";
5
+ import ExtrudedHeightVertex from "@shaders/glsl/chunks/extruded_height_vertex.glsl";
6
+ import HeightParsVertex from "@shaders/glsl/chunks/height_pars_vertex.glsl";
7
+ import HeightVertex from "@shaders/glsl/chunks/height_vertex.glsl";
8
+ import Pick from "@shaders/glsl/chunks/pick.glsl";
9
+ import ProjectVertexRte from "@shaders/glsl/chunks/project_vertex_rte.glsl";
10
+ import RteParsVertex from "@shaders/glsl/chunks/rte_pars_vertex.glsl";
11
+ import RteVertex from "@shaders/glsl/chunks/rte_vertex.glsl";
12
+ import ShadowMapDepthFragment from "@shaders/glsl/chunks/shadowmap_depth_fragment.glsl";
13
+ import ShadowMapDepthParsFragment from "@shaders/glsl/chunks/shadowmap_depth_pars_fragment.glsl";
14
+ import ShadowMapDepthParsVertex from "@shaders/glsl/chunks/shadowmap_depth_pars_vertex.glsl";
15
+ import ShadowMapDepthVertex from "@shaders/glsl/chunks/shadowmap_depth_vertex.glsl";
16
+ import ShowFragment from "@shaders/glsl/chunks/show_fragment.glsl";
17
+ import ShowParsFragment from "@shaders/glsl/chunks/show_pars_fragment.glsl";
18
+ import ShowParsVertex from "@shaders/glsl/chunks/show_pars_vertex.glsl";
19
+ import SpecularParsFragment from "@shaders/glsl/chunks/spucular_pars_fragment.glsl";
20
+ import { ShaderChunk } from "three";
21
+ import type { WebGLProgramParametersWithUniforms } from "three";
22
+
23
+ import { createReplacer } from "../../../../utils";
24
+
25
+ import { POLYGON_BASE_SHADER_MARKERS } from "./markers";
26
+ import type { SupportedMaterial } from "./material";
27
+ import type { PolygonBaseMutates, PolygonBaseState } from "./types";
28
+
29
+ /**
30
+ * Transform shader with core polygon modifications.
31
+ * Uniform assignment is handled by mutates.updateUniforms().
32
+ */
33
+ export const transformShader = (
34
+ shader: WebGLProgramParametersWithUniforms,
35
+ state: PolygonBaseState,
36
+ mutates: PolygonBaseMutates,
37
+ material: SupportedMaterial,
38
+ ): void => {
39
+ const { useRTE } = state;
40
+
41
+ // Set core shader defines
42
+ shader.defines ??= {};
43
+ shader.defines.USE_ROUGHNESS = 1;
44
+ shader.defines.USE_SELECTIVE_EFFECT = 1;
45
+
46
+ // TODO: Handle batch texture defines in safe way.
47
+ // Merge defines from material.userData.defines (includes batch texture row defines)
48
+ // This is important for batch texture functionality which sets defines like:
49
+ // - BATCHED_TEXTURE_ROW_COLOR_SHOW, BATCHED_TEXTURE_ROW_HEIGHT, etc.
50
+ // - USE_BATCH_TEXTURE, USE_BATCH_COLOR_SHOW, USE_BATCH_HEIGHT, etc.
51
+ if (material.userData.defines) {
52
+ Object.assign(shader.defines, material.userData.defines);
53
+ }
54
+
55
+ // Assign uniform refs to shader.uniforms via mutates
56
+ mutates.updateUniforms(shader.uniforms, state);
57
+
58
+ // Transform vertex shader
59
+ shader.vertexShader = createReplacer(shader.vertexShader)
60
+ .replace(
61
+ "#include <common>",
62
+ `
63
+ #include <common>
64
+ #include <packing>
65
+
66
+ in float attrBatchId;
67
+ in vec4 scaleNormalAndCap;
68
+
69
+ uniform vec2 uMinMaxHeight;
70
+ out float nvr_vBatchId;
71
+
72
+ ${useRTE ? RteParsVertex : ""}
73
+ ${ShowParsVertex}
74
+ ${ExtrudedHeightParsVertex}
75
+ ${HeightParsVertex}
76
+ ${BatchTextureParsVertex}
77
+
78
+ ${BranchFreeTernary}
79
+
80
+ ${ShadowMapDepthParsVertex}
81
+
82
+ varying vec3 vPosition;
83
+ `,
84
+ )
85
+ .replace(
86
+ "#include <begin_vertex>",
87
+ `
88
+ ${useRTE ? RteVertex : "#include <begin_vertex>"}
89
+
90
+ ${ExtrudedHeightVertex}
91
+ ${HeightVertex}
92
+ ${BatchTextureVertex}
93
+
94
+ transformed.xyz += scaleNormalAndCap.xyz * nvr_branchFreeTernary(
95
+ scaleNormalAndCap.w == 0.0,
96
+ uMinMaxHeight.x + addHeight,
97
+ uMinMaxHeight.y + addExtrudedHeight
98
+ );
99
+
100
+ // Use the original GlobalBatchId for picking, not the batch_index
101
+ nvr_vBatchId = attrBatchId;
102
+ `,
103
+ )
104
+ .replace(
105
+ "#include <clipping_planes_vertex>",
106
+ `
107
+ #include <clipping_planes_vertex>
108
+ ${ShadowMapDepthVertex}
109
+ `,
110
+ )
111
+ .replaceWithCondition("#include <project_vertex>", ProjectVertexRte, useRTE)
112
+ .replaceWithCondition(
113
+ "#include <envmap_vertex>",
114
+ `
115
+ #include <envmap_vertex>
116
+
117
+ vPosition = absTransformed.xyz;
118
+ vViewPosition = -absMvPosition.xyz;
119
+ `,
120
+ useRTE,
121
+ )
122
+ .replaceWithCondition(
123
+ "#include <worldpos_vertex>",
124
+ createReplacer(ShaderChunk.worldpos_vertex).replace(
125
+ "vec4 worldPosition = vec4( transformed, 1.0 );",
126
+ "vec4 worldPosition = vec4( absTransformed, 1.0 );",
127
+ ).source,
128
+ useRTE,
129
+ )
130
+ .replaceWithCondition(
131
+ "#include <envmap_vertex>",
132
+ `
133
+ #include <envmap_vertex>
134
+
135
+ vPosition = (modelMatrix * vec4(transformed, 1.0)).xyz;
136
+ `,
137
+ !useRTE,
138
+ ).source;
139
+
140
+ // Transform fragment shader
141
+ shader.fragmentShader = createReplacer(shader.fragmentShader)
142
+ .replace(
143
+ "#include <common>",
144
+ `
145
+ #include <common>
146
+ #include <packing>
147
+ `,
148
+ )
149
+ .replace(
150
+ "uniform vec3 diffuse;",
151
+ `
152
+ ${POLYGON_BASE_SHADER_MARKERS.fragment.UNIFORM_START}
153
+ uniform vec3 diffuse;
154
+ uniform bool uClampToGround;
155
+ uniform sampler2D uGlobeNormal;
156
+ uniform float nvr_uPickable;
157
+ // uEffectIdsMask is declared by overrideMaterialsForMRT (#ifdef USE_SELECTIVE_EFFECT block)
158
+ uniform bool uIsTexturized;
159
+ ${POLYGON_BASE_SHADER_MARKERS.fragment.UNIFORM_END}
160
+
161
+ in float nvr_vBatchId;
162
+
163
+ ${ShowParsFragment}
164
+
165
+ ${Pick}
166
+
167
+ ${ShadowMapDepthParsFragment}
168
+ `,
169
+ )
170
+ .replace(
171
+ "#include <lights_lambert_pars_fragment>",
172
+ `
173
+ #include <lights_lambert_pars_fragment>
174
+
175
+ ${SpecularParsFragment}
176
+ `,
177
+ )
178
+ .replace(
179
+ "void main() {",
180
+ `
181
+ void main() {
182
+ ${ShowFragment}
183
+ ${ShadowMapDepthFragment}
184
+ `,
185
+ )
186
+ .replace(
187
+ "#include <color_fragment>",
188
+ `
189
+ #include <color_fragment>
190
+
191
+ #ifdef USE_BATCH_COLOR_SHOW
192
+ diffuseColor.a *= nvr_vOpacity;
193
+ #endif
194
+ `,
195
+ )
196
+ .replace(
197
+ "#include <normal_fragment_maps>",
198
+ `
199
+ ${POLYGON_BASE_SHADER_MARKERS.fragment.NORMAL_START}
200
+
201
+ vec3 origNormal = vec3(normal);
202
+ vec3 specular;
203
+
204
+ if(uClampToGround) {
205
+ vec2 uv = gl_FragCoord.xy / vec2(textureSize(uGlobeNormal, 0));
206
+ vec3 mapN = unpackVec2ToNormal(texture2D( uGlobeNormal, uv ).xy);
207
+ normal = normalize( mapN );
208
+ } else {
209
+ #include <normal_fragment_maps>
210
+ }
211
+
212
+ ${POLYGON_BASE_SHADER_MARKERS.fragment.NORMAL_END}
213
+ `,
214
+ )
215
+ .replace(
216
+ "vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;",
217
+ `
218
+ vec3 outgoingLight;
219
+ if(uClampToGround) {
220
+ // Without lighting
221
+ outgoingLight = diffuseColor.xyz;
222
+ } else {
223
+ outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;
224
+ if(!uIsTexturized) {
225
+ outgoingLight += specular;
226
+ }
227
+ }
228
+ `,
229
+ )
230
+ .replace(
231
+ "#include <dithering_fragment>",
232
+ `
233
+ #include <dithering_fragment>
234
+ if (nvr_uPickable > 0.0 && diffuseColor.a > 0.0) {
235
+ vec3 pickColor = nvr_batchIdToColor(nvr_vBatchId);
236
+ gl_FragColor = vec4(pickColor.xyz, 1.0);
237
+ }
238
+ `,
239
+ )
240
+ .replace(
241
+ "normalBuffer = vec4(packNormalToVec2(normal), reflectivity, roughnessFactor);",
242
+ `
243
+ ${POLYGON_BASE_SHADER_MARKERS.fragment.FINAL_NORMAL_START}
244
+ vec3 finalNormal = origNormal;
245
+ ${POLYGON_BASE_SHADER_MARKERS.fragment.FINAL_NORMAL_END}
246
+ normalBuffer = vec4(packNormalToVec2(finalNormal), reflectivity, roughnessFactor);
247
+ `,
248
+ ).source;
249
+ };