@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/device.ts ADDED
@@ -0,0 +1,414 @@
1
+ /**
2
+ * Device detection and adaptive quality utilities for mobile optimization.
3
+ */
4
+ import type { NormalizeWASMClass } from "@navaramap/core";
5
+ import type { DynamicSse as EngineDynamicSse } from "@navaramap/engine";
6
+
7
+ /** Cached result of mobile device detection */
8
+ let cachedIsMobile: boolean | undefined;
9
+
10
+ /** Keywords to detect mobile devices from user agent string */
11
+ const MOBILE_KEYWORDS = [
12
+ "android",
13
+ "webos",
14
+ "iphone",
15
+ "ipad",
16
+ "ipod",
17
+ "blackberry",
18
+ "windows phone",
19
+ "opera mini",
20
+ "mobile",
21
+ ];
22
+
23
+ /**
24
+ * Detects if the current device is a mobile device.
25
+ * Uses user agent and touch capability heuristics.
26
+ * Result is memoized since it doesn't change during runtime.
27
+ */
28
+ export function isMobileDevice(): boolean {
29
+ if (cachedIsMobile !== undefined) return cachedIsMobile;
30
+
31
+ if (typeof navigator === "undefined") {
32
+ cachedIsMobile = false;
33
+ return false;
34
+ }
35
+
36
+ // Check user agent for mobile indicators
37
+ const userAgent = navigator.userAgent.toLowerCase();
38
+ const isMobileUA = MOBILE_KEYWORDS.some((keyword) =>
39
+ userAgent.includes(keyword),
40
+ );
41
+
42
+ // Also check for touch capability + small screen as fallback
43
+ const hasTouch = "ontouchstart" in window || navigator.maxTouchPoints > 0;
44
+ const isSmallScreen = window.innerWidth <= 768;
45
+
46
+ cachedIsMobile = isMobileUA || (hasTouch && isSmallScreen);
47
+ return cachedIsMobile;
48
+ }
49
+
50
+ /** Maximum pixel ratio for mobile devices to balance quality vs performance */
51
+ const MOBILE_MAX_PIXEL_RATIO = 1.0;
52
+
53
+ export type DevicePixelRatioOptions = {
54
+ /** User-specified pixel ratio override (takes precedence over all other settings) */
55
+ override?: number;
56
+ /** Enable mobile optimization to cap pixel ratio on mobile devices */
57
+ mobileOptimization?: boolean;
58
+ };
59
+
60
+ export const MB = 1024 * 1024;
61
+
62
+ /** Per-worker WASM heap floor: below a warmed worker's baseline, the pool
63
+ * would recycle-thrash, so budgets never go under this. */
64
+ const WORKER_HEAP_FLOOR_BYTES = 64 * MB;
65
+ const WORKER_HEAP_CAP_DESKTOP = 256 * MB;
66
+ /** Mobile workers pin at the floor: capping heap growth here frees real RAM
67
+ * headroom, which is what justifies the larger mobile tile-cache budget. */
68
+ const WORKER_HEAP_CAP_MOBILE = 64 * MB;
69
+ const FONT_BUDGET_DESKTOP = 128 * MB;
70
+ const FONT_BUDGET_MOBILE = 64 * MB;
71
+ /** In-flight fetch caps (per tile pipeline): a camera move on mobile must
72
+ * not burst 50 simultaneous decodes into a memory-constrained process. */
73
+ const MAX_PENDING_REQUESTS_DESKTOP = 50;
74
+ /** Mobile reporting >= 4GB of device memory. */
75
+ const MAX_PENDING_REQUESTS_MOBILE = 16;
76
+ /** Low-end or unknown mobile (iOS Safari has no deviceMemory). */
77
+ const MAX_PENDING_REQUESTS_MOBILE_LOW = 8;
78
+
79
+ /** Desktop budget cap; also the fallback when deviceMemory is unavailable. */
80
+ const DESKTOP_MAX_CACHE_BYTES = 2048 * MB;
81
+ /** Mobile budget for devices reporting >= 4GB of memory — and for devices not
82
+ * reporting it at all: iOS Safari never exposes `deviceMemory`, and modern
83
+ * iPhones/iPads have 4-8GB of RAM, so treating "unreported" as conservative
84
+ * would starve exactly the devices this budget matters most for. */
85
+ const MOBILE_CACHE_BYTES_HIGH = 512 * MB - WORKER_HEAP_CAP_MOBILE;
86
+ /** Conservative budget for devices explicitly reporting < 4GB (low-end Android). */
87
+ const MOBILE_CACHE_BYTES_LOW = 256 * MB - WORKER_HEAP_CAP_MOBILE;
88
+
89
+ type NavigatorWithDeviceMemory = Navigator & { deviceMemory?: number };
90
+
91
+ export type DefaultCacheBytesInputs = {
92
+ /** Override mobile detection (defaults to `isMobileDevice()`). */
93
+ isMobile?: boolean;
94
+ /** Override the reported device memory in GB (defaults to `navigator.deviceMemory`; Chrome-only, spec-clamped to [0.5, 8]). */
95
+ deviceMemoryGB?: number;
96
+ };
97
+
98
+ /**
99
+ * Default tile-cache memory budget (`Options.cacheBytes`) for the current
100
+ * device. Desktop: a quarter of the reported device memory, capped at 2GB.
101
+ * Mobile: 512MB unless the device explicitly reports < 4GB (then 256MB) —
102
+ * "unreported" counts as the 512MB tier because iOS Safari never exposes
103
+ * `navigator.deviceMemory` while modern iPhones/iPads have 4-8GB of RAM.
104
+ */
105
+ export function getDefaultCacheBytes(inputs?: DefaultCacheBytesInputs): number {
106
+ const isMobile = inputs?.isMobile ?? isMobileDevice();
107
+ const deviceMemoryGB =
108
+ inputs?.deviceMemoryGB ??
109
+ (typeof navigator === "undefined"
110
+ ? undefined
111
+ : (navigator as NavigatorWithDeviceMemory).deviceMemory);
112
+
113
+ if (isMobile) {
114
+ return deviceMemoryGB === undefined || deviceMemoryGB >= 4
115
+ ? MOBILE_CACHE_BYTES_HIGH
116
+ : MOBILE_CACHE_BYTES_LOW;
117
+ }
118
+
119
+ if (deviceMemoryGB === undefined) {
120
+ return DESKTOP_MAX_CACHE_BYTES;
121
+ }
122
+ return Math.min((deviceMemoryGB * 1024 * MB) / 4, DESKTOP_MAX_CACHE_BYTES);
123
+ }
124
+
125
+ /**
126
+ * Per-tile GPU byte estimates the WASM memory ledger cannot compute itself,
127
+ * because the composite-atlas / render-target dimensions live on the JS side.
128
+ * Passed to `Core.setMemoryCostHints` in `init()`. Bytes are `w*h*4` (RGBA),
129
+ * with a mipmap factor applied only where the Rust default applies one (raster
130
+ * textures), matching `navara_memory::CostHints::default`.
131
+ */
132
+ export type MemoryCostHints = {
133
+ /** Composite-atlas cost per tile. */
134
+ atlasTileBytes: number;
135
+ /** Raster texture cost per fragment. */
136
+ rasterTileBytes: number;
137
+ };
138
+
139
+ export type MemoryCostHintsInputs = {
140
+ /** Override mobile detection (defaults to `isMobileDevice()`). */
141
+ isMobile?: boolean;
142
+ };
143
+
144
+ const ATLAS_SIZE_DESKTOP = 512;
145
+ const ATLAS_SIZE_MOBILE = 512;
146
+ /** The MRT composite atlas has three RGBA attachments (color, attr, normal). */
147
+ const ATLAS_ATTACHMENTS = 3;
148
+ /** Raster tiles are 256² RGBA. Mipmaps add ~1/3, matching the Rust default. */
149
+ const RASTER_TILE_SIZE = 256;
150
+ const RASTER_MIPMAP_NUMERATOR = 133;
151
+ const RASTER_MIPMAP_DENOMINATOR = 100;
152
+
153
+ /** Composite-atlas side length for this device — the single source of truth
154
+ * shared by the compositor allocation (`TileTextureCompositor`) and the cost
155
+ * hints below, so the ledger's per-tile estimate always matches reality. */
156
+ export function getCompositeAtlasSize(isMobile: boolean): number {
157
+ return isMobile ? ATLAS_SIZE_MOBILE : ATLAS_SIZE_DESKTOP;
158
+ }
159
+
160
+ /**
161
+ * GPU cost hints for the memory ledger, matching the actual allocation sizes.
162
+ * The composite atlas is 512² on both desktop and mobile (see
163
+ * `getCompositeAtlasSize`), so with three MRT attachments each tile costs
164
+ * ~3MB — the ledger must match reality or the map settles far too coarse.
165
+ */
166
+ export function getDefaultMemoryCostHints(
167
+ inputs?: MemoryCostHintsInputs,
168
+ ): MemoryCostHints {
169
+ const isMobile = inputs?.isMobile ?? isMobileDevice();
170
+ const atlasSize = getCompositeAtlasSize(isMobile);
171
+ return {
172
+ atlasTileBytes: atlasSize * atlasSize * 4 * ATLAS_ATTACHMENTS,
173
+ rasterTileBytes: Math.round(
174
+ (RASTER_TILE_SIZE * RASTER_TILE_SIZE * 4 * RASTER_MIPMAP_NUMERATOR) /
175
+ RASTER_MIPMAP_DENOMINATOR,
176
+ ),
177
+ };
178
+ }
179
+
180
+ /**
181
+ * Device-wide memory budgets, derived together so the main-thread tile cache,
182
+ * the tile-worker pool, and the font worker share one view of the device's
183
+ * memory instead of three independent constants.
184
+ */
185
+ export type MemoryBudgets = {
186
+ /** Main-thread tile-cache budget (same as `getDefaultCacheBytes`). */
187
+ cacheBytes: number;
188
+ /** WASM heap budget per tile worker; the pool recycles a worker above it. */
189
+ maxWorkerHeapBytes: number;
190
+ /** Font-worker cache budget (font data + atlas pixels; caps further growth). */
191
+ fontBudgetBytes: number;
192
+ /** In-flight data fetch cap per tile pipeline; lower on mobile to shrink
193
+ * the decode/upload burst on camera moves. */
194
+ maxPendingRequests: number;
195
+ /** Resting SSE multiplier (far tiles always this much coarser; >1 on
196
+ * mobile shrinks the working set from the start). */
197
+ sseMultiplierMin: number;
198
+ /** Ceiling the memory-pressure SSE degrade may rise to; larger on mobile. */
199
+ sseMultiplierMax: number;
200
+ };
201
+
202
+ export type DefaultMemoryBudgetsInputs = DefaultCacheBytesInputs & {
203
+ /** Number of tile workers in the pool. */
204
+ poolSize: number;
205
+ };
206
+
207
+ /**
208
+ * Default memory budgets for the current device. The tile-worker share is a
209
+ * quarter (desktop) or an eighth (mobile) of the reported device memory,
210
+ * split across the pool and clamped to [64MB, 256MB desktop / 64MB mobile]
211
+ * per worker (mobile workers pin at the floor) — on an 8GB desktop with an
212
+ * 8-worker pool this matches the
213
+ * historical fixed values exactly; low-memory devices shrink together.
214
+ * Browsers without `navigator.deviceMemory` fall back to the caps.
215
+ */
216
+ export function getDefaultMemoryBudgets(
217
+ inputs: DefaultMemoryBudgetsInputs,
218
+ ): MemoryBudgets {
219
+ const isMobile = inputs.isMobile ?? isMobileDevice();
220
+ const deviceMemoryGB =
221
+ inputs.deviceMemoryGB ??
222
+ (typeof navigator === "undefined"
223
+ ? undefined
224
+ : (navigator as NavigatorWithDeviceMemory).deviceMemory);
225
+ const poolSize = Math.max(1, inputs.poolSize);
226
+
227
+ const perWorkerCap = isMobile
228
+ ? WORKER_HEAP_CAP_MOBILE
229
+ : WORKER_HEAP_CAP_DESKTOP;
230
+ let maxWorkerHeapBytes = perWorkerCap;
231
+ if (deviceMemoryGB !== undefined) {
232
+ const workerShare = (deviceMemoryGB * 1024 * MB) / (isMobile ? 8 : 4);
233
+ maxWorkerHeapBytes = Math.min(
234
+ Math.max(
235
+ Math.floor(workerShare / poolSize / MB) * MB,
236
+ WORKER_HEAP_FLOOR_BYTES,
237
+ ),
238
+ perWorkerCap,
239
+ );
240
+ }
241
+
242
+ let fontBudgetBytes = isMobile ? FONT_BUDGET_MOBILE : FONT_BUDGET_DESKTOP;
243
+ if (deviceMemoryGB !== undefined && deviceMemoryGB < 4) {
244
+ fontBudgetBytes /= 2;
245
+ }
246
+
247
+ // Same shape as `getDefaultCacheBytes`: only mobiles reporting >= 4GB get
248
+ // the higher cap; unknown deviceMemory (iOS Safari) stays conservative.
249
+ let maxPendingRequests = MAX_PENDING_REQUESTS_DESKTOP;
250
+ if (isMobile) {
251
+ maxPendingRequests =
252
+ deviceMemoryGB !== undefined && deviceMemoryGB >= 4
253
+ ? MAX_PENDING_REQUESTS_MOBILE
254
+ : MAX_PENDING_REQUESTS_MOBILE_LOW;
255
+ }
256
+
257
+ const sse = getDefaultSseMultiplierRange({ isMobile, deviceMemoryGB });
258
+
259
+ return {
260
+ cacheBytes: getDefaultCacheBytes({ isMobile, deviceMemoryGB }),
261
+ maxWorkerHeapBytes,
262
+ fontBudgetBytes,
263
+ maxPendingRequests,
264
+ sseMultiplierMin: sse.min,
265
+ sseMultiplierMax: sse.max,
266
+ };
267
+ }
268
+
269
+ export type SseMultiplierRange = { min: number; max: number };
270
+
271
+ /**
272
+ * Default memory-pressure SSE multiplier range for the current device.
273
+ * Desktop rests at 1.0 (no base degrade). Mobile keeps a resting base >1 so
274
+ * far tiles are always coarser, and a higher ceiling so the pressure degrade
275
+ * can shed more of the visible set before the tab is killed.
276
+ */
277
+ export function getDefaultSseMultiplierRange(
278
+ inputs?: DefaultCacheBytesInputs,
279
+ ): SseMultiplierRange {
280
+ const isMobile = inputs?.isMobile ?? isMobileDevice();
281
+ const deviceMemoryGB =
282
+ inputs?.deviceMemoryGB ??
283
+ (typeof navigator === "undefined"
284
+ ? undefined
285
+ : (navigator as NavigatorWithDeviceMemory).deviceMemory);
286
+
287
+ if (!isMobile) return { min: 1.0, max: 16.0 };
288
+ // Only mobiles reporting >= 4GB get the lighter mobile preset; unknown
289
+ // deviceMemory (iOS Safari) stays on the more aggressive one.
290
+ return deviceMemoryGB !== undefined && deviceMemoryGB >= 4
291
+ ? { min: 4.0, max: 32.0 }
292
+ : { min: 8.0, max: 64.0 };
293
+ }
294
+
295
+ /**
296
+ * LOD fog settings: a distance-based screen-space-error relaxation used by
297
+ * the tile traversals (far tiles tolerate a larger error and stay coarser,
298
+ * near tiles keep full resolution). This never affects visual fog rendering.
299
+ */
300
+ export type LodFogSettings = {
301
+ enabled: boolean;
302
+ /** Distance scale of the relaxation ramp (2.0e-4 ≈ 63% strength at 5km). */
303
+ density: number;
304
+ /** Maximum SSE relaxation (in pixels) at far distance. */
305
+ sseFactor: number;
306
+ };
307
+
308
+ /** Engine default (matches the Rust-side startup values). */
309
+ export const LOD_FOG_DESKTOP: LodFogSettings = {
310
+ enabled: true,
311
+ density: 2.0e-4,
312
+ sseFactor: 2.0,
313
+ };
314
+ /** Desktop reporting < 4GB device memory: slightly coarser far tiles. */
315
+ export const LOD_FOG_DESKTOP_LOW_MEMORY: LodFogSettings = {
316
+ enabled: true,
317
+ density: 2.5e-4,
318
+ sseFactor: 3.0,
319
+ };
320
+ /** Mobile with >= 4GB device memory. */
321
+ export const LOD_FOG_MOBILE: LodFogSettings = {
322
+ enabled: true,
323
+ density: 1.0e-2,
324
+ sseFactor: 6.0,
325
+ };
326
+ /** Low-memory or unknown mobile (iOS Safari has no deviceMemory): far
327
+ * scenery runs markedly coarser to keep the working set small. */
328
+ export const LOD_FOG_MOBILE_LOW_MEMORY: LodFogSettings = {
329
+ enabled: true,
330
+ density: 1.0e-1,
331
+ sseFactor: 12.0,
332
+ };
333
+
334
+ /**
335
+ * Default LOD fog settings for the current device, scaled by the reported
336
+ * device memory: low-memory devices get a stronger distance-based LOD
337
+ * degrade so the tile working set stays small.
338
+ */
339
+ export function getDefaultLodFog(
340
+ inputs?: DefaultCacheBytesInputs,
341
+ ): LodFogSettings {
342
+ const isMobile = inputs?.isMobile ?? isMobileDevice();
343
+ const deviceMemoryGB =
344
+ inputs?.deviceMemoryGB ??
345
+ (typeof navigator === "undefined"
346
+ ? undefined
347
+ : (navigator as NavigatorWithDeviceMemory).deviceMemory);
348
+
349
+ if (isMobile) {
350
+ return deviceMemoryGB !== undefined && deviceMemoryGB >= 4
351
+ ? LOD_FOG_MOBILE
352
+ : LOD_FOG_MOBILE_LOW_MEMORY;
353
+ }
354
+ return deviceMemoryGB !== undefined && deviceMemoryGB < 4
355
+ ? LOD_FOG_DESKTOP_LOW_MEMORY
356
+ : LOD_FOG_DESKTOP;
357
+ }
358
+
359
+ /**
360
+ * Dynamic screen-space-error settings (CesiumJS `dynamicScreenSpaceError`
361
+ * equivalent): tilted, street-level horizon views tolerate a larger error for
362
+ * far tiles. Zero effect looking straight down; fades out as the camera
363
+ * climbs past `maxHeight` meters. Never affects visual rendering, only tile
364
+ * LOD selection.
365
+ *
366
+ * Plain-object shape derived from the engine's `DynamicSse` class per the
367
+ * WASM API policy (the class itself is constructed internally and consumed by
368
+ * `Core.setDynamicSse`; see the field docs there).
369
+ */
370
+ export type DynamicSseSettings = Required<NormalizeWASMClass<EngineDynamicSse>>;
371
+
372
+ /**
373
+ * Engine default (matches the Rust-side startup values / CesiumJS defaults).
374
+ * Ref: https://github.com/CesiumGS/cesium/blob/9e93c9b6aa44a8a490f5ed9aa175a7e92348aaa2/packages/engine/Source/Scene/Cesium3DTileset.js#L433-L521
375
+ */
376
+ export const DYNAMIC_SSE_DEFAULT: DynamicSseSettings = {
377
+ enabled: true,
378
+ density: 2.0e-4,
379
+ sseFactor: 24.0,
380
+ heightFalloff: 0.25,
381
+ minHeight: 0,
382
+ maxHeight: 8000,
383
+ };
384
+
385
+ /** Default dynamic-SSE settings (device-independent for now). */
386
+ export function getDefaultDynamicSse(): DynamicSseSettings {
387
+ return DYNAMIC_SSE_DEFAULT;
388
+ }
389
+
390
+ /**
391
+ * Gets an appropriate pixel ratio for the current device.
392
+ * Caps the ratio on mobile devices only when mobileOptimization is enabled.
393
+ *
394
+ * @param options - Configuration options for pixel ratio
395
+ * @returns Pixel ratio appropriate for the device
396
+ */
397
+ export function getDevicePixelRatio(options?: DevicePixelRatioOptions): number {
398
+ if (typeof options?.override === "number") {
399
+ return options.override;
400
+ }
401
+
402
+ if (typeof window === "undefined") {
403
+ return 1;
404
+ }
405
+
406
+ const deviceRatio = window.devicePixelRatio ?? 1;
407
+
408
+ // Only cap pixel ratio on mobile when mobileOptimization is enabled
409
+ if (options?.mobileOptimization && isMobileDevice()) {
410
+ return Math.min(deviceRatio, MOBILE_MAX_PIXEL_RATIO);
411
+ }
412
+
413
+ return deviceRatio;
414
+ }
@@ -0,0 +1,28 @@
1
+ import { EffectPass } from "postprocessing";
2
+ import type { DepthPackingStrategies, Texture } from "three";
3
+
4
+ export class CustomEffectPass extends EffectPass {
5
+ private customDepthTexture: Texture | null = null;
6
+ private customDepthPacking: DepthPackingStrategies | undefined;
7
+
8
+ /**
9
+ * Override setDepthTexture to use custom depth texture if provided.
10
+ */
11
+ setDepthTexture(): void {
12
+ if (this.customDepthTexture) {
13
+ super.setDepthTexture(this.customDepthTexture, this.customDepthPacking);
14
+ }
15
+ }
16
+
17
+ setCustomDepthTexture(
18
+ texture: Texture | null,
19
+ depthPacking?: DepthPackingStrategies,
20
+ ): void {
21
+ this.customDepthTexture = texture;
22
+ this.customDepthPacking = depthPacking;
23
+ }
24
+
25
+ getCustomDepthTexture(): Texture | null {
26
+ return this.customDepthTexture;
27
+ }
28
+ }
@@ -0,0 +1,10 @@
1
+ import { CopyPass as PostProcessingCopyPass } from "postprocessing";
2
+
3
+ export class CopyPass extends PostProcessingCopyPass {
4
+ get visible() {
5
+ return this.enabled;
6
+ }
7
+ set visible(v: boolean) {
8
+ this.enabled = v;
9
+ }
10
+ }
@@ -0,0 +1,87 @@
1
+ import { EventHandler, type BaseEventMap } from "@navaramap/core";
2
+ import {
3
+ EffectPass,
4
+ Effect as PostProcessingEffect,
5
+ Pass as PostProcessingPass,
6
+ } from "postprocessing";
7
+ import type { Camera } from "three";
8
+
9
+ export type EffectOptions = {
10
+ enabled?: boolean;
11
+ };
12
+
13
+ export const DEFAULT_EFFECT_OPTIONS: Required<EffectOptions> = {
14
+ enabled: false,
15
+ };
16
+
17
+ export type EffectEvents = {
18
+ needsUpdate: () => void;
19
+ };
20
+
21
+ export class Pass<
22
+ P extends PostProcessingPass,
23
+ E extends PostProcessingEffect | unknown,
24
+ O extends EffectOptions = EffectOptions,
25
+ BaseEv extends BaseEventMap = BaseEventMap,
26
+ Ev extends BaseEventMap & EffectEvents = BaseEv & EffectEvents,
27
+ > extends EventHandler<Ev> {
28
+ rawPass: P;
29
+ rawEffect: E;
30
+ protected options: O;
31
+
32
+ constructor(pass: P, effect: E, options?: O) {
33
+ super();
34
+
35
+ this.rawPass = pass;
36
+ this.rawEffect = effect;
37
+
38
+ this.options = { ...(options ?? {}) } as O;
39
+
40
+ this.enabled = this.options.enabled ?? DEFAULT_EFFECT_OPTIONS.enabled;
41
+
42
+ this.onMounted();
43
+ }
44
+
45
+ get raw() {
46
+ return this.rawPass;
47
+ }
48
+
49
+ get enabled() {
50
+ return this.options.enabled ?? DEFAULT_EFFECT_OPTIONS.enabled;
51
+ }
52
+ set enabled(v: boolean) {
53
+ this.options.enabled = v;
54
+ this.rawPass.enabled = v;
55
+
56
+ this.emit(
57
+ "needsUpdate",
58
+ // I'm not sure why we need this cast, but it is necessary actually.
59
+ ...([] as Parameters<Ev["needsUpdate"]>),
60
+ );
61
+ }
62
+
63
+ get visible() {
64
+ return this.enabled;
65
+ }
66
+ set visible(v: boolean) {
67
+ this.enabled = v;
68
+ }
69
+
70
+ protected onMounted() {}
71
+
72
+ dispose() {
73
+ this.rawPass.dispose();
74
+ }
75
+ }
76
+
77
+ export class Effect<
78
+ E extends PostProcessingEffect,
79
+ O extends EffectOptions = EffectOptions,
80
+ Ev extends EffectEvents = EffectEvents,
81
+ > extends Pass<EffectPass, E, O, Ev> {
82
+ constructor(camera: Camera, effect: E, options?: O) {
83
+ const pass = new EffectPass(camera, effect);
84
+
85
+ super(pass, effect, options);
86
+ }
87
+ }
@@ -0,0 +1,4 @@
1
+ export * from "./effect";
2
+ export * from "./CustomEffectPass";
3
+ export * from "./render";
4
+ export * from "./copy";
@@ -0,0 +1,10 @@
1
+ import { RenderPass as PostProcessingRenderPass } from "postprocessing";
2
+
3
+ export class RenderPass extends PostProcessingRenderPass {
4
+ get visible() {
5
+ return this.enabled;
6
+ }
7
+ set visible(v: boolean) {
8
+ this.enabled = v;
9
+ }
10
+ }