@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
package/src/input.ts ADDED
@@ -0,0 +1,144 @@
1
+ import type { Core } from "@navaramap/engine";
2
+
3
+ // TODO: Need to think about how to propagate these event to worker.
4
+ export function registerInputEvents(
5
+ core: Core,
6
+ element: HTMLElement,
7
+ getTerrainDistance?: () => number | null,
8
+ ): () => void {
9
+ let mouseEvent:
10
+ | {
11
+ type: "mousedown" | "mouseup";
12
+ button: number;
13
+ }
14
+ | undefined;
15
+
16
+ let lastTerrainDistance: number | undefined;
17
+
18
+ const mousedown = (event: MouseEvent) => {
19
+ mouseEvent = {
20
+ type: "mousedown",
21
+ button: event.button,
22
+ };
23
+ const terrainDistance = getTerrainDistance?.() ?? undefined;
24
+ lastTerrainDistance = terrainDistance;
25
+ core.input({ ...mouseEvent, terrain_distance: terrainDistance });
26
+ };
27
+ const mouseup = () => {
28
+ core.input({
29
+ ...(mouseEvent ?? {}),
30
+ type: "mouseup",
31
+ });
32
+ mouseEvent = undefined;
33
+ };
34
+
35
+ const mousemove = (event: MouseEvent) => {
36
+ const width = element.clientWidth;
37
+ const height = element.clientHeight;
38
+ const aspectRatio = width / height;
39
+ core.input({
40
+ type: "mousemove",
41
+ x: (event.clientX / width) * aspectRatio,
42
+ y: event.clientY / height,
43
+ });
44
+ };
45
+
46
+ const touchstart = (event: TouchEvent) => {
47
+ event.preventDefault();
48
+
49
+ lastTerrainDistance = getTerrainDistance?.() ?? undefined;
50
+ for (const touch of event.changedTouches) {
51
+ core.input({
52
+ type: "touchstart",
53
+ x: touch.clientX,
54
+ y: touch.clientY,
55
+ id: touch.identifier,
56
+ terrain_distance: lastTerrainDistance,
57
+ });
58
+ }
59
+ };
60
+
61
+ const touchend = (event: TouchEvent) => {
62
+ event.preventDefault();
63
+
64
+ for (const touch of event.changedTouches) {
65
+ core.input({
66
+ type: "touchend",
67
+ x: touch.clientX,
68
+ y: touch.clientY,
69
+ id: touch.identifier,
70
+ });
71
+ }
72
+ };
73
+
74
+ const touchmove = (event: TouchEvent) => {
75
+ event.preventDefault();
76
+
77
+ for (const touch of event.changedTouches) {
78
+ core.input({
79
+ type: "touchmove",
80
+ x: touch.clientX,
81
+ y: touch.clientY,
82
+ id: touch.identifier,
83
+ });
84
+ }
85
+ };
86
+
87
+ const wheel = (event: WheelEvent) => {
88
+ lastTerrainDistance = getTerrainDistance?.() ?? undefined;
89
+ core.input({
90
+ type: "wheel",
91
+ x: event.deltaX,
92
+ y: event.deltaY,
93
+ terrain_distance: lastTerrainDistance,
94
+ });
95
+ };
96
+
97
+ const keydown = (event: KeyboardEvent) => {
98
+ core.input({
99
+ type: "keydown",
100
+ key_code: event.code,
101
+ key: event.key,
102
+ });
103
+ };
104
+
105
+ const keyup = (event: KeyboardEvent) => {
106
+ core.input({
107
+ type: "keyup",
108
+ key_code: event?.code,
109
+ key: event?.key,
110
+ });
111
+ };
112
+ // This is used to emit a key up event without any params.
113
+ const keyupEmpty = () => {
114
+ core.input({
115
+ type: "keyup",
116
+ });
117
+ };
118
+
119
+ element.addEventListener("mousedown", mousedown);
120
+ element.addEventListener("mouseup", mouseup);
121
+ element.addEventListener("mouseleave", mouseup);
122
+ element.addEventListener("mouseleave", keyupEmpty);
123
+ element.addEventListener("mousemove", mousemove);
124
+ element.addEventListener("touchstart", touchstart);
125
+ element.addEventListener("touchend", touchend);
126
+ element.addEventListener("touchmove", touchmove);
127
+ element.addEventListener("wheel", wheel);
128
+ document.addEventListener("keydown", keydown);
129
+ document.addEventListener("keyup", keyup);
130
+
131
+ return () => {
132
+ element.removeEventListener("mousedown", mousedown);
133
+ element.removeEventListener("mouseup", mouseup);
134
+ element.removeEventListener("mouseleave", mouseup);
135
+ element.removeEventListener("mouseleave", keyupEmpty);
136
+ element.removeEventListener("mousemove", mousemove);
137
+ element.removeEventListener("touchstart", touchstart);
138
+ element.removeEventListener("touchend", touchend);
139
+ element.removeEventListener("touchmove", touchmove);
140
+ element.removeEventListener("wheel", wheel);
141
+ document.removeEventListener("keydown", keydown);
142
+ document.removeEventListener("keyup", keyup);
143
+ };
144
+ }
package/src/layer.ts ADDED
@@ -0,0 +1,183 @@
1
+ import { EventHandler, type FeatureSetId } from "@navaramap/core";
2
+ import type { Core } from "@navaramap/engine";
3
+
4
+ import { FeatureEvaluator } from "./evaluations";
5
+ import { Source } from "./source";
6
+ import type { LayerDescription } from "./type";
7
+
8
+ export type FeatureCreatedParams = {
9
+ featureSetId: FeatureSetId;
10
+ evaluator: FeatureEvaluator;
11
+ credit?: string;
12
+ };
13
+
14
+ export type FeatureUpdatedParams = {
15
+ featureSetId: FeatureSetId;
16
+ evaluator: FeatureEvaluator;
17
+ updatedAt: number;
18
+ };
19
+
20
+ export type FeatureVisibilityChangedParams = {
21
+ featureSetId: FeatureSetId;
22
+ visible: boolean;
23
+ };
24
+
25
+ export type FeatureRemovedParams = {
26
+ featureSetId: FeatureSetId;
27
+ };
28
+
29
+ /**
30
+ * Events emitted by Layer. Subscribe using `layer.on(eventName, callback)`.
31
+ */
32
+ export type LayerEvent = {
33
+ /** Emitted when a new feature is created in this layer. */
34
+ featureCreated: (params: FeatureCreatedParams) => void;
35
+ /** Emitted when a feature in this layer is updated. */
36
+ featureUpdated: (params: FeatureUpdatedParams) => void;
37
+ /** Emitted when a feature's visibility changes. */
38
+ featureVisibilityChanged: (params: FeatureVisibilityChangedParams) => void;
39
+ /** Emitted when a feature is removed from this layer. */
40
+ featureRemoved: (params: FeatureRemovedParams) => void;
41
+ /** Emitted when the layer is deleted. */
42
+ deleted: () => void;
43
+ };
44
+
45
+ /**
46
+ * A handle to control a resource layer (e.g., imagery, terrain, GeoJSON, 3D Tiles) after it has been added to the scene.
47
+ * Returned by `ThreeView.addLayer()` when adding resource layers (not mesh, light, or effect descriptors).
48
+ *
49
+ * Resource layers are data-driven layers that load and display geographic data from external sources.
50
+ * Use this handle to update layer configuration or delete the layer.
51
+ *
52
+ * @example
53
+ * ```typescript
54
+ * // Add a GeoJSON layer
55
+ * const geoJsonLayer = view.addLayer({
56
+ * type: "geojson",
57
+ * data: {
58
+ * url: "https://example.com/data.geojson",
59
+ * },
60
+ * point: { color: 0xff0000 }
61
+ * });
62
+ *
63
+ * // Update the layer configuration
64
+ * geoJsonLayer.update({ point: { color: 0x00ff00 } });
65
+ *
66
+ * // Listen to feature events
67
+ * geoJsonLayer.on("featureCreated", ({ evaluator }) => {
68
+ * console.log("Feature created:", evaluator);
69
+ * });
70
+ *
71
+ * // Delete the layer
72
+ * geoJsonLayer.delete();
73
+ * ```
74
+ */
75
+ export class Layer extends EventHandler<LayerEvent> {
76
+ /** The unique identifier of this layer. */
77
+ id: string;
78
+ private core: Core;
79
+ private featureEvaluators: Map<FeatureSetId, FeatureEvaluator> = new Map<
80
+ FeatureSetId,
81
+ FeatureEvaluator
82
+ >();
83
+ private needUpdate = false;
84
+ private convertColors?: (obj: unknown) => unknown;
85
+
86
+ constructor(
87
+ id: string,
88
+ core: Core,
89
+ convertColors?: (obj: unknown) => unknown,
90
+ ) {
91
+ super();
92
+
93
+ this.id = id;
94
+ this.core = core;
95
+ this.convertColors = convertColors;
96
+ }
97
+
98
+ /**
99
+ * Register a feature evaluator with this layer
100
+ * @internal Used by the event system
101
+ */
102
+ _registerFeatureEvaluator(
103
+ featureSetId: FeatureSetId,
104
+ evaluator: FeatureEvaluator,
105
+ ) {
106
+ this.featureEvaluators.set(featureSetId, evaluator);
107
+ }
108
+
109
+ /**
110
+ * Get a feature evaluator by ID
111
+ * @internal Used by the event system
112
+ */
113
+ _getFeatureEvaluator(
114
+ featureSetId: FeatureSetId,
115
+ ): FeatureEvaluator | undefined {
116
+ return this.featureEvaluators.get(featureSetId);
117
+ }
118
+
119
+ /**
120
+ * Unregister a feature evaluator from this layer
121
+ * @internal Used by the event system
122
+ */
123
+ _unregisterFeatureEvaluator(featureSetId: FeatureSetId) {
124
+ this.featureEvaluators.delete(featureSetId);
125
+ }
126
+
127
+ /**
128
+ * Process feature updates for all registered features
129
+ * @internal Used by the animation loop
130
+ */
131
+ _processFeatureUpdates(updatedAt: number) {
132
+ if (!this.needUpdate) {
133
+ return false;
134
+ }
135
+ this.needUpdate = false;
136
+
137
+ // Process all evaluators with the registered callbacks
138
+ for (const evaluator of this.featureEvaluators.values()) {
139
+ this.emit("featureUpdated", {
140
+ featureSetId: evaluator.id,
141
+ evaluator,
142
+ updatedAt,
143
+ });
144
+ }
145
+
146
+ return true;
147
+ }
148
+
149
+ /**
150
+ * Marks the layer for update on the next frame.
151
+ * Call this when you need to trigger `featureUpdated` events.
152
+ */
153
+ forceUpdate() {
154
+ this.needUpdate = true;
155
+ }
156
+
157
+ /**
158
+ * Updates the layer configuration.
159
+ * The entire configuration is replaced with the new values.
160
+ * @param l - New layer configuration
161
+ */
162
+ update(l: LayerDescription) {
163
+ const normalized =
164
+ "source" in l && l.source instanceof Source
165
+ ? { ...l, source: l.source.id }
166
+ : l;
167
+ // Convert Color objects to numbers if converter is provided
168
+ const processedLayer = this.convertColors
169
+ ? (this.convertColors(normalized) as LayerDescription)
170
+ : normalized;
171
+ this.core.updateLayer(this.id, processedLayer);
172
+ }
173
+
174
+ /**
175
+ * Removes the layer from the scene and disposes its resources.
176
+ * Emits the "deleted" event before cleanup.
177
+ * After calling this, the layer should no longer be used.
178
+ */
179
+ delete() {
180
+ this.core.deleteLayer(this.id);
181
+ this.emit("deleted");
182
+ }
183
+ }
@@ -0,0 +1,29 @@
1
+ import {
2
+ EffectDesc,
3
+ type EffectConfig,
4
+ type EffectUpdate,
5
+ } from "../../core/EffectDesc";
6
+ import { CopyPass } from "../../effects";
7
+
8
+ type Description = {
9
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
10
+ final?: {};
11
+ };
12
+
13
+ export type FinalCopyPassConfig = Description & EffectConfig;
14
+
15
+ export type FinalCopyPassUpdate = Description & EffectUpdate;
16
+
17
+ export class FinalCopyEffectDesc extends EffectDesc<
18
+ FinalCopyPassConfig,
19
+ FinalCopyPassUpdate,
20
+ CopyPass
21
+ > {
22
+ static key = "final";
23
+
24
+ createPass() {
25
+ const pass = new CopyPass();
26
+
27
+ return pass;
28
+ }
29
+ }
@@ -0,0 +1,105 @@
1
+ import type { DepthPackingStrategies, Texture } from "three";
2
+ import invariant from "tiny-invariant";
3
+
4
+ import {
5
+ EffectDesc,
6
+ type EffectConfig,
7
+ type EffectUpdate,
8
+ } from "../../core/EffectDesc";
9
+ import type { ViewContext } from "../../core/ViewContext";
10
+ import type ThreeView from "../../index";
11
+ import { CustomRenderPass } from "../../passes";
12
+
13
+ type Description = {
14
+ mrt?: {
15
+ debugNormal?: boolean;
16
+ };
17
+ };
18
+
19
+ export type MRTPassConfig = Description & EffectConfig;
20
+
21
+ export type MRTPassUpdate = Description & EffectUpdate;
22
+
23
+ export class MRTPassEffectDesc extends EffectDesc<
24
+ MRTPassConfig,
25
+ MRTPassUpdate,
26
+ CustomRenderPass
27
+ > {
28
+ static key = "mrt";
29
+ // No insertAfter/Before - this is typically the first pass
30
+
31
+ private config: MRTPassConfig;
32
+
33
+ constructor(view: ThreeView, ctx: ViewContext, config: MRTPassConfig) {
34
+ super(view, ctx, config);
35
+ this.config = config;
36
+ }
37
+
38
+ createPass(): CustomRenderPass {
39
+ // Create render pass for MRT scene
40
+ const scenes = this.ctx.scenes;
41
+ const camera = this.view.camera.raw;
42
+
43
+ invariant(this.view.globe);
44
+
45
+ const pass = new CustomRenderPass(
46
+ scenes,
47
+ camera,
48
+ this.ctx.getInputBuffer(),
49
+ this.view.globe,
50
+ {
51
+ debugNormal: !!this.config.mrt?.debugNormal,
52
+ },
53
+ );
54
+
55
+ return pass;
56
+ }
57
+
58
+ get normalBuffer(): Texture | undefined {
59
+ return this.raw?.gbufferRenderTarget.textures[1];
60
+ }
61
+
62
+ get effectIdsBuffer(): Texture | undefined {
63
+ return this.raw?.gbufferRenderTarget.textures[2];
64
+ }
65
+
66
+ get emissiveBuffer(): Texture | undefined {
67
+ return this.raw?.gbufferRenderTarget.textures[3];
68
+ }
69
+
70
+ get depthBuffer(): Texture | undefined {
71
+ return this.raw?.allDepthCopyPass.texture;
72
+ }
73
+
74
+ get depthBufferPacking(): DepthPackingStrategies | undefined {
75
+ return this.raw?.allDepthCopyPass.depthPacking;
76
+ }
77
+
78
+ get globeNormalBuffer(): Texture | undefined {
79
+ return this.raw?.globeNormalCopyPass.texture;
80
+ }
81
+
82
+ get globeDepthBuffer(): Texture | undefined {
83
+ return this.raw?.globeDepthCopyPass.texture;
84
+ }
85
+
86
+ get globeDepthBufferPacking(): DepthPackingStrategies | undefined {
87
+ return this.raw?.globeDepthCopyPass.depthPacking;
88
+ }
89
+
90
+ onUpdateConfig(updates: MRTPassUpdate): void {
91
+ super.onUpdateConfig(updates);
92
+
93
+ if (!this._instance) return;
94
+
95
+ Object.assign(this.config, updates);
96
+
97
+ if (updates.mrt?.debugNormal !== undefined) {
98
+ // TODO: Support
99
+ }
100
+ }
101
+
102
+ onDestroy(): void {
103
+ super.onDestroy();
104
+ }
105
+ }
@@ -0,0 +1,9 @@
1
+ # Core Effect Descriptors
2
+
3
+ This module contains only core effect descriptors that are tightly coupled with the
4
+ internal rendering pipeline (MRT passes, transparent pass, final copy, selective
5
+ effects).
6
+
7
+ Independent, self-contained effect descriptors should be implemented as external
8
+ packages (e.g., `@navaramap/three_default_descs`) using the public
9
+ `EffectDesc` API and registered via plugins.
@@ -0,0 +1,113 @@
1
+ import { OrthographicCamera, PlaneGeometry, type Texture } from "three";
2
+
3
+ import {
4
+ EffectDesc,
5
+ type EffectConfig,
6
+ type EffectUpdate,
7
+ } from "../../core/EffectDesc";
8
+ import type { ViewContext } from "../../core/ViewContext";
9
+ import type ThreeView from "../../index";
10
+
11
+ import type { MRTPassEffectDesc } from "./MRTPassEffectDesc";
12
+
13
+ // Base configuration for selective effect descriptors
14
+ export type SelectiveEffectConfig = {
15
+ selectiveEffect?: true;
16
+ } & EffectConfig;
17
+
18
+ export type SelectiveEffectUpdate = EffectUpdate;
19
+
20
+ /**
21
+ * Create fullscreen rendering infrastructure for selective effect passes.
22
+ */
23
+ export function createFullscreenQuad(): {
24
+ camera: OrthographicCamera;
25
+ geometry: PlaneGeometry;
26
+ } {
27
+ return {
28
+ camera: new OrthographicCamera(-1, 1, 1, -1, 0, 1),
29
+ geometry: new PlaneGeometry(2, 2),
30
+ };
31
+ }
32
+
33
+ /**
34
+ * Base class for buffer-based selective effect descriptors (Bloom, Outline, etc.).
35
+ *
36
+ * Manages effect key registration, EffectIds Buffer slot allocation, and
37
+ * provides MRT buffer accessors for subclass passes.
38
+ *
39
+ * Subclasses implement {@link createPass}.
40
+ */
41
+ export abstract class SelectiveEffectDesc<
42
+ Config extends SelectiveEffectConfig = SelectiveEffectConfig,
43
+ UpdateConfig extends SelectiveEffectUpdate = SelectiveEffectUpdate,
44
+ > extends EffectDesc<Config, UpdateConfig> {
45
+ protected config: Config;
46
+
47
+ constructor(view: ThreeView, ctx: ViewContext, config: Config) {
48
+ super(view, ctx, config);
49
+ this.config = config;
50
+ }
51
+
52
+ // ---------------------------------------------------------------------------
53
+ // Public API for Pass classes
54
+ // ---------------------------------------------------------------------------
55
+
56
+ /** ViewContext for accessing scenes, renderer, registry, etc. */
57
+ public get viewContext(): ViewContext {
58
+ return this.ctx;
59
+ }
60
+
61
+ /** Layer configuration (typed per subclass). */
62
+ public get layerConfig(): Config {
63
+ return this.config;
64
+ }
65
+
66
+ // ---------------------------------------------------------------------------
67
+ // Lifecycle
68
+ // ---------------------------------------------------------------------------
69
+
70
+ onCreate(): void {
71
+ const registry = this.ctx.selectiveEffectRegistry;
72
+ if (!registry) {
73
+ throw new Error(
74
+ "SelectiveEffectRegistry not initialized. Ensure MRTPassEffectDesc is added before selective effect descriptors.",
75
+ );
76
+ }
77
+
78
+ // Allocate a slot bit in the EffectIds Buffer
79
+ registry.registerSlot(this.id);
80
+
81
+ super.onCreate();
82
+ }
83
+
84
+ onDestroy(): void {
85
+ const registry = this.ctx.selectiveEffectRegistry;
86
+
87
+ // Release slot bit in the EffectIds Buffer
88
+ registry?.unregisterSlot(this.id);
89
+
90
+ super.onDestroy();
91
+ }
92
+
93
+ // ---------------------------------------------------------------------------
94
+ // Buffer accessors — used by subclass passes to read MRT data
95
+ // ---------------------------------------------------------------------------
96
+
97
+ /** Emissive RGB buffer (MRT attachment[3]). */
98
+ public getEmissiveBuffer(): Texture | null {
99
+ const mrtDesc = this.find<MRTPassEffectDesc>("mrt");
100
+ return mrtDesc?.emissiveBuffer ?? null;
101
+ }
102
+
103
+ /** EffectIds bitmask buffer (MRT attachment[2]). NearestFilter, discrete data. */
104
+ public getEffectIdsBuffer(): Texture | null {
105
+ const mrtDesc = this.find<MRTPassEffectDesc>("mrt");
106
+ return mrtDesc?.effectIdsBuffer ?? null;
107
+ }
108
+
109
+ /** Slot bit index for this effect instance in the EffectIds Buffer. -1 if unregistered. */
110
+ public getEffectSlot(): number {
111
+ return this.ctx.selectiveEffectRegistry?.getSlot(this.id) ?? -1;
112
+ }
113
+ }
@@ -0,0 +1,58 @@
1
+ import {
2
+ EffectDesc,
3
+ type EffectConfig,
4
+ type EffectUpdate,
5
+ } from "../../core/EffectDesc";
6
+ import type { ViewContext } from "../../core/ViewContext";
7
+ import type ThreeView from "../../index";
8
+ import { SkyEnvMapPass } from "../../passes";
9
+
10
+ type Description = {
11
+ skyEnvMap?: {
12
+ resolution?: number;
13
+ };
14
+ };
15
+
16
+ export type SkyEnvMapPassConfig = Description & EffectConfig;
17
+
18
+ export type SkyEnvMapPassUpdate = Description & EffectUpdate;
19
+
20
+ export class SkyEnvMapEffectDesc extends EffectDesc<
21
+ SkyEnvMapPassConfig,
22
+ SkyEnvMapPassUpdate,
23
+ SkyEnvMapPass
24
+ > {
25
+ static key = "skyEnvMap";
26
+ static insertBefore = ["mrt"];
27
+
28
+ private config: SkyEnvMapPassConfig;
29
+
30
+ constructor(view: ThreeView, ctx: ViewContext, config: SkyEnvMapPassConfig) {
31
+ super(view, ctx, config);
32
+ this.config = config;
33
+ }
34
+
35
+ createPass(): SkyEnvMapPass {
36
+ const scenes = this.ctx.scenes;
37
+ const camera = this.view.camera.raw;
38
+
39
+ const resolution = this.config.skyEnvMap?.resolution ?? 256;
40
+
41
+ const pass = new SkyEnvMapPass(scenes, camera, resolution);
42
+
43
+ return pass;
44
+ }
45
+
46
+ onUpdateConfig(updates: SkyEnvMapPassUpdate): void {
47
+ super.onUpdateConfig(updates);
48
+
49
+ if (!this._instance) return;
50
+
51
+ Object.assign(this.config, updates);
52
+
53
+ if (updates.skyEnvMap?.resolution !== undefined) {
54
+ // Would need to recreate the pass to change resolution
55
+ // For now, resolution is set at creation time only
56
+ }
57
+ }
58
+ }
@@ -0,0 +1,62 @@
1
+ import { Group, Scene } from "three";
2
+
3
+ import {
4
+ EffectDesc,
5
+ type EffectConfig,
6
+ type EffectUpdate,
7
+ } from "../../core/EffectDesc";
8
+ import { RenderPass } from "../../effects";
9
+
10
+ type Description = {
11
+ // eslint-disable-next-line @typescript-eslint/no-empty-object-type
12
+ transparent?: {};
13
+ };
14
+
15
+ export type TransparentPassConfig = Description & EffectConfig;
16
+
17
+ export type TransparentPassUpdate = Description & EffectUpdate;
18
+
19
+ export class TransparentPassEffectDesc extends EffectDesc<
20
+ TransparentPassConfig,
21
+ TransparentPassUpdate,
22
+ RenderPass
23
+ > {
24
+ static key = "transparent";
25
+ static insertAfter = ["ssao", "clouds", "atmosphere", "mrt"];
26
+
27
+ light = new Group();
28
+ lightsSyncMap = new Map();
29
+
30
+ createPass(): RenderPass {
31
+ // Create render pass for transparent objects
32
+ const scene = new Scene();
33
+ scene.add(this.light);
34
+ scene.add(this.ctx.scenes.transparent);
35
+
36
+ const camera = this.view.camera.raw;
37
+
38
+ const pass = new RenderPass(scene, camera);
39
+ pass.clear = false;
40
+
41
+ this.ctx.scenes.light.addEventListener("childadded", ({ child }) => {
42
+ const cloned = child.clone(true);
43
+ this.lightsSyncMap.set(child.id, cloned);
44
+ this.light.add(cloned);
45
+ });
46
+ this.ctx.scenes.light.addEventListener("childremoved", ({ child }) => {
47
+ this.light.remove(this.lightsSyncMap.get(child.id));
48
+ this.lightsSyncMap.delete(child.id);
49
+ });
50
+
51
+ return pass;
52
+ }
53
+
54
+ update(_time: number): void {
55
+ // Sync lights
56
+ let i = 0;
57
+ for (const child of this.ctx.scenes.light.children) {
58
+ this.light.children[i].copy(child, true);
59
+ i++;
60
+ }
61
+ }
62
+ }