@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.
- package/LICENSE +8 -0
- package/dist/assets/atmosphere/README.md +1 -0
- package/dist/assets/atmosphere/higher_order_scattering.bin +0 -0
- package/dist/assets/atmosphere/higher_order_scattering.exr +0 -0
- package/dist/assets/atmosphere/irradiance.bin +0 -0
- package/dist/assets/atmosphere/irradiance.exr +0 -0
- package/dist/assets/atmosphere/scattering.bin +0 -0
- package/dist/assets/atmosphere/scattering.exr +0 -0
- package/dist/assets/atmosphere/single_mie_scattering.bin +0 -0
- package/dist/assets/atmosphere/single_mie_scattering.exr +0 -0
- package/dist/assets/atmosphere/stars.bin +0 -0
- package/dist/assets/atmosphere/transmittance.bin +0 -0
- package/dist/assets/atmosphere/transmittance.exr +0 -0
- package/dist/assets/cloud/README.md +1 -0
- package/dist/assets/cloud/local_weather.png +0 -0
- package/dist/assets/cloud/shape.bin +1 -0
- package/dist/assets/cloud/shape_detail.bin +1 -0
- package/dist/assets/cloud/turbulence.png +0 -0
- package/dist/assets/fontWorker-CEJEfRpb.js +2 -0
- package/dist/assets/fontWorker-CEJEfRpb.js.map +1 -0
- package/dist/assets/index-BUB-ijMO.js +12 -0
- package/dist/assets/index-BUB-ijMO.js.map +1 -0
- package/dist/assets/navara_wasm_font_worker_bg-665OLxjy.wasm +0 -0
- package/dist/assets/navara_wasm_worker_bg-BXhKC5bE.wasm +0 -0
- package/dist/assets/noise/README.md +1 -0
- package/dist/assets/noise/stbn.bin +0 -0
- package/dist/assets/water/README.md +3 -0
- package/dist/assets/water/waternormals.jpg +0 -0
- package/dist/index.d.ts +10114 -0
- package/dist/index.js +34481 -0
- package/dist/index.js.map +1 -0
- package/dist/index.umd.cjs +6345 -0
- package/dist/index.umd.cjs.map +1 -0
- package/package.json +95 -0
- package/src/Color.ts +111 -0
- package/src/ShadowMapViewers.ts +49 -0
- package/src/atmosphere.test.ts +76 -0
- package/src/atmosphere.ts +364 -0
- package/src/bufferView.ts +90 -0
- package/src/camera.ts +182 -0
- package/src/concurrency.ts +15 -0
- package/src/constants/assets.ts +30 -0
- package/src/constants/decoder.ts +7 -0
- package/src/constants/index.ts +2 -0
- package/src/core/BaseDesc.ts +142 -0
- package/src/core/BaseHandle.ts +126 -0
- package/src/core/DescRegistry.ts +88 -0
- package/src/core/EffectDesc.ts +343 -0
- package/src/core/EffectDescRegistry.ts +31 -0
- package/src/core/InstancedMeshDesc.ts +413 -0
- package/src/core/LightDesc.ts +216 -0
- package/src/core/LightDescRegistry.ts +32 -0
- package/src/core/MeshDesc.ts +457 -0
- package/src/core/MeshDescRegistry.ts +32 -0
- package/src/core/MeshDescWithSelectiveEffect.ts +129 -0
- package/src/core/Registries.ts +59 -0
- package/src/core/SelectiveEffectRegistry.ts +90 -0
- package/src/core/ViewContext.ts +235 -0
- package/src/core/errors.ts +16 -0
- package/src/core/index.ts +50 -0
- package/src/device.ts +414 -0
- package/src/effects/CustomEffectPass.ts +28 -0
- package/src/effects/copy.ts +10 -0
- package/src/effects/effect.ts +87 -0
- package/src/effects/index.ts +4 -0
- package/src/effects/render.ts +10 -0
- package/src/evaluations/FeatureEvaluator.ts +529 -0
- package/src/evaluations/index.ts +1 -0
- package/src/event/HillshadeContext.test.ts +232 -0
- package/src/event/HillshadeContext.ts +299 -0
- package/src/event/context.ts +279 -0
- package/src/event/feature.ts +357 -0
- package/src/event/featureEvent.ts +81 -0
- package/src/event/features/billboard.ts +30 -0
- package/src/event/features/model.ts +192 -0
- package/src/event/features/modelGpuBytes.test.ts +69 -0
- package/src/event/features/modelGpuBytes.ts +87 -0
- package/src/event/features/point.ts +25 -0
- package/src/event/features/polygon.ts +23 -0
- package/src/event/features/polygonOutline.ts +19 -0
- package/src/event/features/polyline.ts +19 -0
- package/src/event/features/text.ts +71 -0
- package/src/event/hillshade.test.ts +842 -0
- package/src/event/hillshade.ts +588 -0
- package/src/event/index.ts +700 -0
- package/src/event/loaders.ts +53 -0
- package/src/event/tile.ts +19 -0
- package/src/event/worker.ts +999 -0
- package/src/event/workerTaskSettlement.test.ts +243 -0
- package/src/event/workerTaskSettlement.ts +128 -0
- package/src/inMemoryBufferStore.test.ts +60 -0
- package/src/inMemoryBufferStore.ts +67 -0
- package/src/index.iife.ts +11 -0
- package/src/index.ts +2556 -0
- package/src/input.ts +144 -0
- package/src/layer.ts +183 -0
- package/src/layers/effect/FinalCopyEffectDesc.ts +29 -0
- package/src/layers/effect/MRTPassEffectDesc.ts +105 -0
- package/src/layers/effect/README.md +9 -0
- package/src/layers/effect/SelectiveEffectDesc.ts +113 -0
- package/src/layers/effect/SkyEnvMapEffectDesc.ts +58 -0
- package/src/layers/effect/TransparentPassEffectDesc.ts +62 -0
- package/src/layers/effect/index.ts +5 -0
- package/src/layers/index.ts +1 -0
- package/src/layersManager.ts +63 -0
- package/src/light.ts +15 -0
- package/src/loaders/AbortableImageLoader.ts +203 -0
- package/src/loaders/AbortableTextureLoader.ts +74 -0
- package/src/loaders/index.ts +5 -0
- package/src/material/enhancer/DESIGN.md +300 -0
- package/src/material/enhancer/MaterialEnhancer.ts +112 -0
- package/src/material/enhancer/ShaderReplacer.test.ts +114 -0
- package/src/material/enhancer/ShaderReplacer.ts +97 -0
- package/src/material/enhancer/batchTexture.ts +8 -0
- package/src/material/enhancer/index.ts +46 -0
- package/src/material/enhancer/instancedSprite/index.ts +7 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/index.test.ts +214 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/index.ts +134 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/markers.ts +21 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/material.ts +32 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/mutates.test.ts +277 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/mutates.ts +151 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/shader.test.ts +114 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/shader.ts +49 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/state.test.ts +82 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/state.ts +80 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteBaseEnhancer/types.ts +146 -0
- package/src/material/enhancer/instancedSprite/instancedSpriteMaterialEnhancer.ts +105 -0
- package/src/material/enhancer/model/index.ts +25 -0
- package/src/material/enhancer/model/modelBaseEnhancer/index.test.ts +74 -0
- package/src/material/enhancer/model/modelBaseEnhancer/index.ts +110 -0
- package/src/material/enhancer/model/modelBaseEnhancer/markers.ts +27 -0
- package/src/material/enhancer/model/modelBaseEnhancer/material.test.ts +66 -0
- package/src/material/enhancer/model/modelBaseEnhancer/material.ts +44 -0
- package/src/material/enhancer/model/modelBaseEnhancer/mutates.test.ts +84 -0
- package/src/material/enhancer/model/modelBaseEnhancer/mutates.ts +47 -0
- package/src/material/enhancer/model/modelBaseEnhancer/shader.test.ts +24 -0
- package/src/material/enhancer/model/modelBaseEnhancer/shader.ts +162 -0
- package/src/material/enhancer/model/modelBaseEnhancer/state.test.ts +103 -0
- package/src/material/enhancer/model/modelBaseEnhancer/state.ts +52 -0
- package/src/material/enhancer/model/modelBaseEnhancer/types.ts +89 -0
- package/src/material/enhancer/model/modelMaterialEnhancer.ts +91 -0
- package/src/material/enhancer/model/modelWaterEnhancer/index.test.ts +71 -0
- package/src/material/enhancer/model/modelWaterEnhancer/index.ts +175 -0
- package/src/material/enhancer/model/modelWaterEnhancer/material.test.ts +48 -0
- package/src/material/enhancer/model/modelWaterEnhancer/material.ts +25 -0
- package/src/material/enhancer/model/modelWaterEnhancer/mutates.test.ts +89 -0
- package/src/material/enhancer/model/modelWaterEnhancer/mutates.ts +89 -0
- package/src/material/enhancer/model/modelWaterEnhancer/shader.test.ts +34 -0
- package/src/material/enhancer/model/modelWaterEnhancer/shader.ts +111 -0
- package/src/material/enhancer/model/modelWaterEnhancer/state.test.ts +105 -0
- package/src/material/enhancer/model/modelWaterEnhancer/state.ts +59 -0
- package/src/material/enhancer/model/modelWaterEnhancer/types.ts +141 -0
- package/src/material/enhancer/model/pntsEnhancer/index.test.ts +96 -0
- package/src/material/enhancer/model/pntsEnhancer/index.ts +82 -0
- package/src/material/enhancer/model/pntsEnhancer/markers.ts +6 -0
- package/src/material/enhancer/model/pntsEnhancer/material.test.ts +37 -0
- package/src/material/enhancer/model/pntsEnhancer/material.ts +21 -0
- package/src/material/enhancer/model/pntsEnhancer/mutates.test.ts +80 -0
- package/src/material/enhancer/model/pntsEnhancer/mutates.ts +29 -0
- package/src/material/enhancer/model/pntsEnhancer/shader.test.ts +32 -0
- package/src/material/enhancer/model/pntsEnhancer/shader.ts +56 -0
- package/src/material/enhancer/model/pntsEnhancer/state.test.ts +87 -0
- package/src/material/enhancer/model/pntsEnhancer/state.ts +29 -0
- package/src/material/enhancer/model/pntsEnhancer/types.ts +38 -0
- package/src/material/enhancer/polygon/index.ts +22 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/index.test.ts +101 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/index.ts +130 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/markers.ts +23 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/material.test.ts +19 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/material.ts +38 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/mutates.test.ts +75 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/mutates.ts +122 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/shader.test.ts +25 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/shader.ts +249 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/state.test.ts +102 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/state.ts +92 -0
- package/src/material/enhancer/polygon/polygonBaseEnhancer/types.ts +150 -0
- package/src/material/enhancer/polygon/polygonMaterialEnhancer.ts +97 -0
- package/src/material/enhancer/polygon/polygonWaterEnhancer/index.test.ts +72 -0
- package/src/material/enhancer/polygon/polygonWaterEnhancer/index.ts +164 -0
- package/src/material/enhancer/polygon/polygonWaterEnhancer/material.test.ts +48 -0
- package/src/material/enhancer/polygon/polygonWaterEnhancer/material.ts +35 -0
- package/src/material/enhancer/polygon/polygonWaterEnhancer/mutates.ts +61 -0
- package/src/material/enhancer/polygon/polygonWaterEnhancer/shader.test.ts +34 -0
- package/src/material/enhancer/polygon/polygonWaterEnhancer/shader.ts +96 -0
- package/src/material/enhancer/polygon/polygonWaterEnhancer/state.test.ts +98 -0
- package/src/material/enhancer/polygon/polygonWaterEnhancer/state.ts +57 -0
- package/src/material/enhancer/polygon/polygonWaterEnhancer/types.ts +115 -0
- package/src/material/enhancer/polyline/index.ts +7 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/index.test.ts +157 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/index.ts +154 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/markers.ts +19 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/material.test.ts +42 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/material.ts +38 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/mutates.test.ts +120 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/mutates.ts +169 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/shader.test.ts +67 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/shader.ts +75 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/state.test.ts +55 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/state.ts +91 -0
- package/src/material/enhancer/polyline/polylineBaseEnhancer/types.ts +170 -0
- package/src/material/enhancer/polyline/polylineMaterialEnhancer.ts +102 -0
- package/src/material/enhancer/sdfText/index.ts +7 -0
- package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/index.ts +125 -0
- package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/markers.ts +19 -0
- package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/material.test.ts +35 -0
- package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/material.ts +32 -0
- package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/mutates.test.ts +381 -0
- package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/mutates.ts +232 -0
- package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/shader.ts +36 -0
- package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/state.test.ts +118 -0
- package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/state.ts +107 -0
- package/src/material/enhancer/sdfText/sdfTextBaseEnhancer/types.ts +184 -0
- package/src/material/enhancer/sdfText/sdfTextMaterialEnhancer.ts +100 -0
- package/src/material/enhancer/shadowMap/index.ts +7 -0
- package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/index.ts +97 -0
- package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/markers.ts +10 -0
- package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/material.ts +31 -0
- package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/mutates.ts +8 -0
- package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/shader.test.ts +17 -0
- package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/shader.ts +53 -0
- package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/state.ts +17 -0
- package/src/material/enhancer/shadowMap/shadowMapDepthEnhancer/types.ts +26 -0
- package/src/material/enhancer/test-utils/shaderCompatibility.ts +124 -0
- package/src/material/enhancer/tileComposite/compose.test.ts +95 -0
- package/src/material/enhancer/tileComposite/compose.ts +112 -0
- package/src/material/enhancer/tileComposite/index.ts +23 -0
- package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/index.ts +11 -0
- package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/mutates.ts +132 -0
- package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/shader.ts +245 -0
- package/src/material/enhancer/tileComposite/tileCompositeBaseEnhancer/types.ts +43 -0
- package/src/material/enhancer/tileComposite/tileElevationHeatmapEnhancer/index.ts +29 -0
- package/src/material/enhancer/tileComposite/tileElevationHeatmapEnhancer/mutates.ts +68 -0
- package/src/material/enhancer/tileComposite/tileElevationHeatmapEnhancer/shader.ts +24 -0
- package/src/material/enhancer/tileComposite/tileHillshadeEnhancer/index.ts +29 -0
- package/src/material/enhancer/tileComposite/tileHillshadeEnhancer/mutates.ts +34 -0
- package/src/material/enhancer/tileComposite/tileHillshadeEnhancer/shader.ts +36 -0
- package/src/material/enhancer/tileComposite/tileWaterEnhancer/index.ts +23 -0
- package/src/material/enhancer/tileComposite/tileWaterEnhancer/mutates.ts +23 -0
- package/src/material/enhancer/tileComposite/tileWaterEnhancer/shader.ts +8 -0
- package/src/material/enhancer/tileComposite/tileWatermaskEnhancer/index.ts +23 -0
- package/src/material/enhancer/tileComposite/tileWatermaskEnhancer/mutates.ts +34 -0
- package/src/material/enhancer/tileComposite/tileWatermaskEnhancer/shader.ts +13 -0
- package/src/material/enhancer/tileComposite/types.ts +58 -0
- package/src/material/index.ts +3 -0
- package/src/material/macro/index.ts +1 -0
- package/src/material/macro/tileShader.test.ts +136 -0
- package/src/material/macro/tileShader.ts +287 -0
- package/src/material/overrideMaterialsForMRT.ts +439 -0
- package/src/material/selectiveEffectMaterialSetup.test.ts +52 -0
- package/src/material/selectiveEffectMaterialSetup.ts +53 -0
- package/src/material/types/index.ts +1 -0
- package/src/material/types/uniform.ts +1 -0
- package/src/mesh/DrapedMesh.ts +101 -0
- package/src/mesh/batchTexture.test.ts +646 -0
- package/src/mesh/batchTexture.ts +437 -0
- package/src/mesh/batchedFeature.ts +186 -0
- package/src/mesh/batchedSdfText.ts +484 -0
- package/src/mesh/featureMesh.ts +43 -0
- package/src/mesh/index.ts +16 -0
- package/src/mesh/instanced.ts +117 -0
- package/src/mesh/model.ts +483 -0
- package/src/mesh/pickableMesh.ts +55 -0
- package/src/mesh/pickableMeshWrapper.ts +529 -0
- package/src/mesh/polygon.ts +699 -0
- package/src/mesh/polygonOutline.ts +393 -0
- package/src/mesh/polyline.ts +523 -0
- package/src/mesh/releaseGeometryArrays.ts +57 -0
- package/src/mesh/rtcRteHelper.ts +211 -0
- package/src/mesh/sdfText.test.ts +200 -0
- package/src/mesh/sdfText.ts +1019 -0
- package/src/mesh/sprite/billboardAtlas.test.ts +177 -0
- package/src/mesh/sprite/billboardAtlas.ts +210 -0
- package/src/mesh/sprite/billboardAtlasImageLoader.ts +29 -0
- package/src/mesh/sprite/index.ts +1 -0
- package/src/mesh/sprite/instancedSprite.ts +694 -0
- package/src/mesh/tile.test.ts +393 -0
- package/src/mesh/tile.ts +1790 -0
- package/src/object3DEvent.ts +6 -0
- package/src/orchestrators/RenderPassOrchestrator.ts +147 -0
- package/src/orchestrators/index.ts +1 -0
- package/src/passes/AllDepthCopyPass.ts +165 -0
- package/src/passes/CustomRenderPass.ts +279 -0
- package/src/passes/NormalCopyPass.ts +125 -0
- package/src/passes/RenderTargetCopyPass.ts +91 -0
- package/src/passes/SkyEnvMapPass.ts +58 -0
- package/src/passes/index.ts +5 -0
- package/src/pick/pickHelper.ts +273 -0
- package/src/pick/pickTerrain.ts +254 -0
- package/src/plugins/AttributionPlugin/AttributionPlugin.test.ts +210 -0
- package/src/plugins/AttributionPlugin/attribution.test.ts +225 -0
- package/src/plugins/AttributionPlugin/attribution.ts +355 -0
- package/src/plugins/AttributionPlugin/attributionStyles.ts +163 -0
- package/src/plugins/AttributionPlugin/index.ts +702 -0
- package/src/plugins/index.ts +1 -0
- package/src/quality.ts +1 -0
- package/src/renderOrder.ts +3 -0
- package/src/scene.test.ts +164 -0
- package/src/scene.ts +127 -0
- package/src/shaders/index.ts +1 -0
- package/src/solar.test.ts +81 -0
- package/src/solar.ts +101 -0
- package/src/source.ts +80 -0
- package/src/stats.ts +102 -0
- package/src/tasks/computeVertexNormalsAsync.ts +15 -0
- package/src/tasks/constructPolygonBatchedFeature.ts +34 -0
- package/src/tasks/constructPolylineBatchedFeature.ts +27 -0
- package/src/tasks/constructQuantizedMeshTerrainMesh.ts +24 -0
- package/src/tasks/constructTerrainMesh.ts +25 -0
- package/src/tasks/getImageDataFromBlob.ts +13 -0
- package/src/tasks/getImageDataFromImageBitmap.ts +12 -0
- package/src/tasks/parseMvtTile.ts +22 -0
- package/src/tasks/queueTask.ts +19 -0
- package/src/tasks/toCreasedNormalsAsync.ts +18 -0
- package/src/tasks/upsampleQuantizedMeshTerrainMesh.ts +44 -0
- package/src/tasks/upsampleTerrainMesh.ts +39 -0
- package/src/texture.ts +19 -0
- package/src/textures.ts +13 -0
- package/src/tileTexture/CompositeShader.snapshot.test.ts +59 -0
- package/src/tileTexture/CompositeShader.test.ts +168 -0
- package/src/tileTexture/CompositeShader.ts +53 -0
- package/src/tileTexture/SlotPlanner.test.ts +105 -0
- package/src/tileTexture/SlotPlanner.ts +102 -0
- package/src/tileTexture/TileTextureCache.test.ts +227 -0
- package/src/tileTexture/TileTextureCache.ts +192 -0
- package/src/tileTexture/TileTextureCompositor.test.ts +260 -0
- package/src/tileTexture/TileTextureCompositor.ts +421 -0
- package/src/tileTexture/__snapshots__/CompositeShader.snapshot.test.ts.snap +2649 -0
- package/src/tileTexture/index.ts +8 -0
- package/src/tileTexture/types.ts +150 -0
- package/src/type/index.ts +261 -0
- package/src/uniforms.ts +20 -0
- package/src/utils/arraysEqual.ts +9 -0
- package/src/utils/blendModes.ts +80 -0
- package/src/utils/geometry.ts +53 -0
- package/src/utils/hillshadeNormalMapGenerator.ts +193 -0
- package/src/utils/index.ts +8 -0
- package/src/utils/object.test.ts +14 -0
- package/src/utils/object.ts +7 -0
- package/src/utils/replacer.test.ts +42 -0
- package/src/utils/replacer.ts +89 -0
- package/src/utils/screen.ts +29 -0
- package/src/utils/textureFragmentIndex.test.ts +224 -0
- package/src/utils/textureFragmentIndex.ts +97 -0
- package/src/utils/worker.ts +3 -0
- package/src/vite-env.d.ts +2 -0
- package/src/worker/index.ts +13 -0
- package/src/worker/tasks/computeVertexNormals.ts +15 -0
- 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,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
|
+
}
|