@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
|
@@ -0,0 +1,243 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DelegatedWorkerTasksResult,
|
|
3
|
+
ReconstructableEntity,
|
|
4
|
+
} from "@navaramap/engine";
|
|
5
|
+
import { expect, it, vi } from "vitest";
|
|
6
|
+
|
|
7
|
+
import type { WorkerPoolPromise, WorkerPoolPromises } from "../type";
|
|
8
|
+
|
|
9
|
+
import {
|
|
10
|
+
runDelegatedWorkerTask,
|
|
11
|
+
settleWorkerTask,
|
|
12
|
+
} from "./workerTaskSettlement";
|
|
13
|
+
|
|
14
|
+
const makeCtx = () => ({ workerPoolPromises: new Map() as WorkerPoolPromises });
|
|
15
|
+
|
|
16
|
+
const asPoolPromise = <T>(promise: Promise<T>) =>
|
|
17
|
+
promise as unknown as WorkerPoolPromise<T>;
|
|
18
|
+
|
|
19
|
+
const cancellationError = () => {
|
|
20
|
+
const err = new Error("promise cancelled");
|
|
21
|
+
err.name = "CancellationError";
|
|
22
|
+
return err;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
it("should register the promise, resolve to completed, and unregister", async () => {
|
|
26
|
+
const ctx = makeCtx();
|
|
27
|
+
let resolve!: (v: string) => void;
|
|
28
|
+
const promise = asPoolPromise(new Promise<string>((r) => (resolve = r)));
|
|
29
|
+
|
|
30
|
+
const settling = settleWorkerTask(ctx, "id", promise);
|
|
31
|
+
expect(ctx.workerPoolPromises.get("id")).toBe(promise);
|
|
32
|
+
|
|
33
|
+
resolve("value");
|
|
34
|
+
expect(await settling).toEqual({ status: "completed", value: "value" });
|
|
35
|
+
expect(ctx.workerPoolPromises.size).toBe(0);
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
it("should classify a CancellationError as cancelled, not failed", async () => {
|
|
39
|
+
const ctx = makeCtx();
|
|
40
|
+
let reject!: (e: unknown) => void;
|
|
41
|
+
const promise = asPoolPromise(new Promise<void>((_, r) => (reject = r)));
|
|
42
|
+
|
|
43
|
+
const settling = settleWorkerTask(ctx, "id", promise);
|
|
44
|
+
reject(cancellationError());
|
|
45
|
+
|
|
46
|
+
expect(await settling).toEqual({ status: "cancelled" });
|
|
47
|
+
expect(ctx.workerPoolPromises.size).toBe(0);
|
|
48
|
+
});
|
|
49
|
+
|
|
50
|
+
it("should classify any other rejection as failed with its error", async () => {
|
|
51
|
+
const ctx = makeCtx();
|
|
52
|
+
const error = new Error("worker exploded");
|
|
53
|
+
const settling = settleWorkerTask(
|
|
54
|
+
ctx,
|
|
55
|
+
"id",
|
|
56
|
+
asPoolPromise(Promise.reject(error)),
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
expect(await settling).toEqual({ status: "failed", error });
|
|
60
|
+
expect(ctx.workerPoolPromises.size).toBe(0);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should not delete a map entry that was replaced by a newer task", async () => {
|
|
64
|
+
const ctx = makeCtx();
|
|
65
|
+
let reject!: (e: unknown) => void;
|
|
66
|
+
const promise = asPoolPromise(new Promise<void>((_, r) => (reject = r)));
|
|
67
|
+
const settling = settleWorkerTask(ctx, "id", promise);
|
|
68
|
+
|
|
69
|
+
// A newer task reuses the id while the first one is being cancelled.
|
|
70
|
+
const replacement = asPoolPromise(new Promise<void>(() => {}));
|
|
71
|
+
ctx.workerPoolPromises.set("id", replacement);
|
|
72
|
+
reject(cancellationError());
|
|
73
|
+
|
|
74
|
+
expect(await settling).toEqual({ status: "cancelled" });
|
|
75
|
+
expect(ctx.workerPoolPromises.get("id")).toBe(replacement);
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
const makeDelegatedCtx = () => ({
|
|
79
|
+
workerPoolPromises: new Map() as WorkerPoolPromises,
|
|
80
|
+
workerTaskHandler: {
|
|
81
|
+
triggerWorkerTaskCompleted: vi.fn(),
|
|
82
|
+
triggerWorkerTaskFailed: vi.fn(),
|
|
83
|
+
hasWorkerTask: vi.fn(() => true),
|
|
84
|
+
},
|
|
85
|
+
});
|
|
86
|
+
|
|
87
|
+
const makeBoundary = () => ({
|
|
88
|
+
params: { free: vi.fn() },
|
|
89
|
+
delegator_id: { free: vi.fn() } as unknown as ReconstructableEntity,
|
|
90
|
+
});
|
|
91
|
+
|
|
92
|
+
it("should deliver a completed result and not release the delegator again", async () => {
|
|
93
|
+
const ctx = makeDelegatedCtx();
|
|
94
|
+
const { params, delegator_id } = makeBoundary();
|
|
95
|
+
const result = { built: true } as unknown as DelegatedWorkerTasksResult;
|
|
96
|
+
|
|
97
|
+
await runDelegatedWorkerTask(
|
|
98
|
+
ctx,
|
|
99
|
+
"id",
|
|
100
|
+
1n,
|
|
101
|
+
"test task",
|
|
102
|
+
params,
|
|
103
|
+
delegator_id,
|
|
104
|
+
async (task) => {
|
|
105
|
+
const value = await task.settle(asPoolPromise(Promise.resolve("ok")));
|
|
106
|
+
expect(value).toBe("ok");
|
|
107
|
+
task.complete((id) => {
|
|
108
|
+
expect(id).toBe(delegator_id);
|
|
109
|
+
return result;
|
|
110
|
+
});
|
|
111
|
+
},
|
|
112
|
+
);
|
|
113
|
+
|
|
114
|
+
expect(ctx.workerTaskHandler.triggerWorkerTaskCompleted).toHaveBeenCalledWith(
|
|
115
|
+
1n,
|
|
116
|
+
result,
|
|
117
|
+
);
|
|
118
|
+
expect(ctx.workerTaskHandler.triggerWorkerTaskFailed).not.toHaveBeenCalled();
|
|
119
|
+
expect(params.free).toHaveBeenCalledOnce();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("should release the delegator when the body bails out without completing", async () => {
|
|
123
|
+
const ctx = makeDelegatedCtx();
|
|
124
|
+
const { params, delegator_id } = makeBoundary();
|
|
125
|
+
|
|
126
|
+
await runDelegatedWorkerTask(
|
|
127
|
+
ctx,
|
|
128
|
+
"id",
|
|
129
|
+
1n,
|
|
130
|
+
"test task",
|
|
131
|
+
params,
|
|
132
|
+
delegator_id,
|
|
133
|
+
async () => {
|
|
134
|
+
// Missing input: bail out without completing.
|
|
135
|
+
},
|
|
136
|
+
);
|
|
137
|
+
|
|
138
|
+
expect(ctx.workerTaskHandler.triggerWorkerTaskFailed).toHaveBeenCalledWith(
|
|
139
|
+
delegator_id,
|
|
140
|
+
);
|
|
141
|
+
expect(
|
|
142
|
+
ctx.workerTaskHandler.triggerWorkerTaskCompleted,
|
|
143
|
+
).not.toHaveBeenCalled();
|
|
144
|
+
expect(params.free).toHaveBeenCalledOnce();
|
|
145
|
+
});
|
|
146
|
+
|
|
147
|
+
it("should contain an unexpected body throw and release the delegator", async () => {
|
|
148
|
+
const ctx = makeDelegatedCtx();
|
|
149
|
+
const { params, delegator_id } = makeBoundary();
|
|
150
|
+
const consoleError = vi
|
|
151
|
+
.spyOn(console, "error")
|
|
152
|
+
.mockImplementation(() => undefined);
|
|
153
|
+
|
|
154
|
+
await runDelegatedWorkerTask(
|
|
155
|
+
ctx,
|
|
156
|
+
"id",
|
|
157
|
+
1n,
|
|
158
|
+
"test task",
|
|
159
|
+
params,
|
|
160
|
+
delegator_id,
|
|
161
|
+
async () => {
|
|
162
|
+
throw new Error("boom");
|
|
163
|
+
},
|
|
164
|
+
);
|
|
165
|
+
|
|
166
|
+
expect(consoleError).toHaveBeenCalledOnce();
|
|
167
|
+
expect(ctx.workerTaskHandler.triggerWorkerTaskFailed).toHaveBeenCalledWith(
|
|
168
|
+
delegator_id,
|
|
169
|
+
);
|
|
170
|
+
expect(params.free).toHaveBeenCalledOnce();
|
|
171
|
+
consoleError.mockRestore();
|
|
172
|
+
});
|
|
173
|
+
|
|
174
|
+
it("should log a failed settlement and run onFailed, which can complete instead", async () => {
|
|
175
|
+
const ctx = makeDelegatedCtx();
|
|
176
|
+
const { params, delegator_id } = makeBoundary();
|
|
177
|
+
const empty = { empty: true } as unknown as DelegatedWorkerTasksResult;
|
|
178
|
+
const consoleError = vi
|
|
179
|
+
.spyOn(console, "error")
|
|
180
|
+
.mockImplementation(() => undefined);
|
|
181
|
+
|
|
182
|
+
await runDelegatedWorkerTask(
|
|
183
|
+
ctx,
|
|
184
|
+
"id",
|
|
185
|
+
1n,
|
|
186
|
+
"test task",
|
|
187
|
+
params,
|
|
188
|
+
delegator_id,
|
|
189
|
+
async (task) => {
|
|
190
|
+
const value = await task.settle(
|
|
191
|
+
asPoolPromise(Promise.reject(new Error("worker exploded"))),
|
|
192
|
+
() => task.complete(() => empty),
|
|
193
|
+
);
|
|
194
|
+
expect(value).toBeUndefined();
|
|
195
|
+
},
|
|
196
|
+
);
|
|
197
|
+
|
|
198
|
+
expect(consoleError).toHaveBeenCalledWith(
|
|
199
|
+
"Failed to test task in worker:",
|
|
200
|
+
expect.any(Error),
|
|
201
|
+
);
|
|
202
|
+
// `onFailed` completed the task, so the fallback release must not fire.
|
|
203
|
+
expect(ctx.workerTaskHandler.triggerWorkerTaskCompleted).toHaveBeenCalledWith(
|
|
204
|
+
1n,
|
|
205
|
+
empty,
|
|
206
|
+
);
|
|
207
|
+
expect(ctx.workerTaskHandler.triggerWorkerTaskFailed).not.toHaveBeenCalled();
|
|
208
|
+
consoleError.mockRestore();
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it("should treat a cancellation as a silent release without invoking onFailed", async () => {
|
|
212
|
+
const ctx = makeDelegatedCtx();
|
|
213
|
+
const { params, delegator_id } = makeBoundary();
|
|
214
|
+
const onFailed = vi.fn();
|
|
215
|
+
const consoleError = vi
|
|
216
|
+
.spyOn(console, "error")
|
|
217
|
+
.mockImplementation(() => undefined);
|
|
218
|
+
|
|
219
|
+
await runDelegatedWorkerTask(
|
|
220
|
+
ctx,
|
|
221
|
+
"id",
|
|
222
|
+
1n,
|
|
223
|
+
"test task",
|
|
224
|
+
params,
|
|
225
|
+
delegator_id,
|
|
226
|
+
async (task) => {
|
|
227
|
+
const value = await task.settle(
|
|
228
|
+
asPoolPromise(Promise.reject(cancellationError())),
|
|
229
|
+
onFailed,
|
|
230
|
+
);
|
|
231
|
+
expect(value).toBeUndefined();
|
|
232
|
+
},
|
|
233
|
+
);
|
|
234
|
+
|
|
235
|
+
expect(onFailed).not.toHaveBeenCalled();
|
|
236
|
+
expect(consoleError).not.toHaveBeenCalled();
|
|
237
|
+
// The engine already deleted a cancelled task's delegator, so this release
|
|
238
|
+
// is a no-op on the Rust side — but it must still consume `delegator_id`.
|
|
239
|
+
expect(ctx.workerTaskHandler.triggerWorkerTaskFailed).toHaveBeenCalledWith(
|
|
240
|
+
delegator_id,
|
|
241
|
+
);
|
|
242
|
+
consoleError.mockRestore();
|
|
243
|
+
});
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
DelegatedWorkerTasksResult,
|
|
3
|
+
ReconstructableEntity,
|
|
4
|
+
} from "@navaramap/engine";
|
|
5
|
+
|
|
6
|
+
import type { WorkerPoolPromise } from "../type";
|
|
7
|
+
|
|
8
|
+
import type { EventContext } from "./context";
|
|
9
|
+
|
|
10
|
+
/**
|
|
11
|
+
* How a worker-pool task ended. Cancellation (tile/feature evicted while the
|
|
12
|
+
* task was queued or running) is a routine outcome under camera movement, not
|
|
13
|
+
* an error: it must never surface as a rejection to the event pipeline.
|
|
14
|
+
*/
|
|
15
|
+
export type WorkerTaskSettlement<T> =
|
|
16
|
+
| { status: "completed"; value: T }
|
|
17
|
+
| { status: "cancelled" }
|
|
18
|
+
| { status: "failed"; error: unknown };
|
|
19
|
+
|
|
20
|
+
function isCancellation(err: unknown): boolean {
|
|
21
|
+
return err instanceof Error && err.name === "CancellationError";
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/**
|
|
25
|
+
* Own the workerPoolPromises lifecycle around one pool task: register the
|
|
26
|
+
* promise (so a removal event can cancel it), classify the outcome, and
|
|
27
|
+
* always unregister.
|
|
28
|
+
*/
|
|
29
|
+
export async function settleWorkerTask<T>(
|
|
30
|
+
ctx: Pick<EventContext, "workerPoolPromises">,
|
|
31
|
+
id: string,
|
|
32
|
+
promise: WorkerPoolPromise<T>,
|
|
33
|
+
): Promise<WorkerTaskSettlement<T>> {
|
|
34
|
+
ctx.workerPoolPromises.set(id, promise);
|
|
35
|
+
try {
|
|
36
|
+
return { status: "completed", value: await promise };
|
|
37
|
+
} catch (error) {
|
|
38
|
+
return isCancellation(error)
|
|
39
|
+
? { status: "cancelled" }
|
|
40
|
+
: { status: "failed", error };
|
|
41
|
+
} finally {
|
|
42
|
+
// Only delete our own entry: a new task could in principle reuse the id
|
|
43
|
+
// between a cancel and this continuation.
|
|
44
|
+
if (ctx.workerPoolPromises.get(id) === promise) {
|
|
45
|
+
ctx.workerPoolPromises.delete(id);
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
/** Helpers handed to a delegated-task body by {@link runDelegatedWorkerTask}. */
|
|
51
|
+
export type DelegatedTaskHandle = {
|
|
52
|
+
/**
|
|
53
|
+
* Register + await one pool task via {@link settleWorkerTask} and classify
|
|
54
|
+
* the outcome: the settled value on completion, `undefined` otherwise. A
|
|
55
|
+
* failure is logged (as `Failed to <label> in worker:`) and `onFailed` runs
|
|
56
|
+
* before returning, so a task kind can substitute its own failure
|
|
57
|
+
* completion (e.g. the MVT parse completes with an empty result).
|
|
58
|
+
*/
|
|
59
|
+
settle<T>(
|
|
60
|
+
promise: WorkerPoolPromise<T>,
|
|
61
|
+
onFailed?: () => void,
|
|
62
|
+
): Promise<T | undefined>;
|
|
63
|
+
/**
|
|
64
|
+
* Deliver the task result to the engine. `build` receives ownership of
|
|
65
|
+
* `delegator_id` (the `DelegatedWorkerTasksResult.with*` constructors
|
|
66
|
+
* consume it).
|
|
67
|
+
*/
|
|
68
|
+
complete(
|
|
69
|
+
build: (delegator_id: ReconstructableEntity) => DelegatedWorkerTasksResult,
|
|
70
|
+
): void;
|
|
71
|
+
};
|
|
72
|
+
|
|
73
|
+
/**
|
|
74
|
+
* Shared scaffolding around one delegated worker task: own the wasm-bindgen
|
|
75
|
+
* boundary objects (`params` is freed on every path; `delegator_id` is
|
|
76
|
+
* consumed exactly once) and guarantee the delegator always settles. A body
|
|
77
|
+
* that returns without calling `complete` — worker failure, missing input,
|
|
78
|
+
* buffer registration failure, or an unexpected throw — releases the
|
|
79
|
+
* delegator through `triggerWorkerTaskFailed`; otherwise it would stay
|
|
80
|
+
* Requested forever and permanently occupy one of the engine's pending
|
|
81
|
+
* dispatch slots for its task kind. For a task the engine already cancelled
|
|
82
|
+
* the release is a no-op on the Rust side, so cancellations need no special
|
|
83
|
+
* casing here.
|
|
84
|
+
*/
|
|
85
|
+
export async function runDelegatedWorkerTask<P extends { free(): void }>(
|
|
86
|
+
ctx: Pick<EventContext, "workerPoolPromises" | "workerTaskHandler">,
|
|
87
|
+
id: string,
|
|
88
|
+
bits: bigint,
|
|
89
|
+
label: string,
|
|
90
|
+
params: P,
|
|
91
|
+
delegator_id: ReconstructableEntity,
|
|
92
|
+
body: (task: DelegatedTaskHandle) => Promise<void>,
|
|
93
|
+
): Promise<void> {
|
|
94
|
+
let delegatorSettled = false;
|
|
95
|
+
const task: DelegatedTaskHandle = {
|
|
96
|
+
async settle(promise, onFailed) {
|
|
97
|
+
const settled = await settleWorkerTask(ctx, id, promise);
|
|
98
|
+
if (settled.status === "completed") {
|
|
99
|
+
return settled.value;
|
|
100
|
+
}
|
|
101
|
+
if (settled.status === "failed") {
|
|
102
|
+
console.error(`Failed to ${label} in worker:`, settled.error);
|
|
103
|
+
onFailed?.();
|
|
104
|
+
}
|
|
105
|
+
return undefined;
|
|
106
|
+
},
|
|
107
|
+
complete(build) {
|
|
108
|
+
// Flag before building so a throw inside `build` (after `with*` already
|
|
109
|
+
// consumed `delegator_id`) cannot lead to a double free below.
|
|
110
|
+
delegatorSettled = true;
|
|
111
|
+
ctx.workerTaskHandler.triggerWorkerTaskCompleted(
|
|
112
|
+
bits,
|
|
113
|
+
build(delegator_id),
|
|
114
|
+
);
|
|
115
|
+
},
|
|
116
|
+
};
|
|
117
|
+
try {
|
|
118
|
+
await body(task);
|
|
119
|
+
} catch (error) {
|
|
120
|
+
console.error(`Failed to ${label}:`, error);
|
|
121
|
+
} finally {
|
|
122
|
+
params.free();
|
|
123
|
+
if (!delegatorSettled) {
|
|
124
|
+
// Consumes `delegator_id`.
|
|
125
|
+
ctx.workerTaskHandler.triggerWorkerTaskFailed(delegator_id);
|
|
126
|
+
}
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -0,0 +1,60 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { InMemoryBufferStore } from "./inMemoryBufferStore";
|
|
4
|
+
|
|
5
|
+
describe("InMemoryBufferStore", () => {
|
|
6
|
+
it("tracks totalBytes and count on set/take/delete", () => {
|
|
7
|
+
const store = new InMemoryBufferStore();
|
|
8
|
+
expect(store.totalBytes).toBe(0);
|
|
9
|
+
expect(store.count).toBe(0);
|
|
10
|
+
|
|
11
|
+
const a = new Float32Array(10); // 40 bytes
|
|
12
|
+
store.set(1, a);
|
|
13
|
+
expect(store.totalBytes).toBe(40);
|
|
14
|
+
expect(store.count).toBe(1);
|
|
15
|
+
expect(store.get(1)).toBe(a);
|
|
16
|
+
|
|
17
|
+
const b = new Uint8Array(5); // 5 bytes
|
|
18
|
+
store.set(2, b);
|
|
19
|
+
expect(store.totalBytes).toBe(45);
|
|
20
|
+
expect(store.count).toBe(2);
|
|
21
|
+
|
|
22
|
+
// take returns and removes.
|
|
23
|
+
expect(store.take(1)).toBe(a);
|
|
24
|
+
expect(store.get(1)).toBeUndefined();
|
|
25
|
+
expect(store.totalBytes).toBe(5);
|
|
26
|
+
expect(store.count).toBe(1);
|
|
27
|
+
|
|
28
|
+
store.delete(2);
|
|
29
|
+
expect(store.totalBytes).toBe(0);
|
|
30
|
+
expect(store.count).toBe(0);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("re-accounts bytes when a handle is replaced", () => {
|
|
34
|
+
const store = new InMemoryBufferStore();
|
|
35
|
+
store.set(1, new Uint32Array(10)); // 40 bytes
|
|
36
|
+
expect(store.totalBytes).toBe(40);
|
|
37
|
+
store.set(1, new Uint32Array(2)); // 8 bytes
|
|
38
|
+
expect(store.totalBytes).toBe(8);
|
|
39
|
+
expect(store.count).toBe(1);
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
it("take/delete on a missing handle is a no-op", () => {
|
|
43
|
+
const store = new InMemoryBufferStore();
|
|
44
|
+
store.set(1, new Uint8Array(3));
|
|
45
|
+
expect(store.take(999)).toBeUndefined();
|
|
46
|
+
store.delete(999);
|
|
47
|
+
expect(store.totalBytes).toBe(3);
|
|
48
|
+
expect(store.count).toBe(1);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("clear drops everything", () => {
|
|
52
|
+
const store = new InMemoryBufferStore();
|
|
53
|
+
store.set(1, new Float64Array(4)); // 32 bytes
|
|
54
|
+
store.set(2, new Uint8Array(8));
|
|
55
|
+
store.clear();
|
|
56
|
+
expect(store.totalBytes).toBe(0);
|
|
57
|
+
expect(store.count).toBe(0);
|
|
58
|
+
expect(store.get(1)).toBeUndefined();
|
|
59
|
+
});
|
|
60
|
+
});
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* JS-side companion to the WASM `BufferStore`'s `External` entries: holds the
|
|
3
|
+
* real typed-array bytes for handles that WASM tracks by byte count only,
|
|
4
|
+
* keeping fetched pbf / worker-built geometry out of WASM linear memory (which
|
|
5
|
+
* never shrinks). The lifecycle is Rust-driven — handles are issued by
|
|
6
|
+
* `Core.newExternalBuffer` and evicted via `drainRemovedExternalHandles`, so
|
|
7
|
+
* there is no LRU here.
|
|
8
|
+
*/
|
|
9
|
+
type StoredArray = Uint8Array | Uint32Array | Float32Array | Float64Array;
|
|
10
|
+
|
|
11
|
+
export class InMemoryBufferStore {
|
|
12
|
+
private _map = new Map<number, StoredArray>();
|
|
13
|
+
private _totalBytes = 0;
|
|
14
|
+
|
|
15
|
+
/** Bytes currently held across all entries. */
|
|
16
|
+
get totalBytes(): number {
|
|
17
|
+
return this._totalBytes;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/** Number of entries currently held. */
|
|
21
|
+
get count(): number {
|
|
22
|
+
return this._map.size;
|
|
23
|
+
}
|
|
24
|
+
|
|
25
|
+
/**
|
|
26
|
+
* Store `array` under `handle`. Replacing an existing handle re-accounts its
|
|
27
|
+
* bytes so `totalBytes` never drifts.
|
|
28
|
+
*/
|
|
29
|
+
set(handle: number, array: StoredArray): void {
|
|
30
|
+
const old = this._map.get(handle);
|
|
31
|
+
if (old) {
|
|
32
|
+
this._totalBytes -= old.byteLength;
|
|
33
|
+
}
|
|
34
|
+
this._map.set(handle, array);
|
|
35
|
+
this._totalBytes += array.byteLength;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
/** Read an entry without removing it, or `undefined` if absent. */
|
|
39
|
+
get(handle: number): StoredArray | undefined {
|
|
40
|
+
return this._map.get(handle);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/** Remove and return an entry, transferring ownership to the caller. */
|
|
44
|
+
take(handle: number): StoredArray | undefined {
|
|
45
|
+
const array = this._map.get(handle);
|
|
46
|
+
if (array) {
|
|
47
|
+
this._map.delete(handle);
|
|
48
|
+
this._totalBytes -= array.byteLength;
|
|
49
|
+
}
|
|
50
|
+
return array;
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
/** Drop an entry. A no-op for a handle that is not present. */
|
|
54
|
+
delete(handle: number): void {
|
|
55
|
+
const array = this._map.get(handle);
|
|
56
|
+
if (array) {
|
|
57
|
+
this._map.delete(handle);
|
|
58
|
+
this._totalBytes -= array.byteLength;
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/** Drop every entry (called on view dispose). */
|
|
63
|
+
clear(): void {
|
|
64
|
+
this._map.clear();
|
|
65
|
+
this._totalBytes = 0;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
export * from "./index";
|
|
2
|
+
export { default } from "./index";
|
|
3
|
+
export { DefaultPlugin } from "@navaramap/three_default_plugin";
|
|
4
|
+
export type {
|
|
5
|
+
DefaultDescriptions,
|
|
6
|
+
DefaultMeshDescription,
|
|
7
|
+
DefaultLightDescription,
|
|
8
|
+
DefaultEffectDescription,
|
|
9
|
+
} from "@navaramap/three_default_plugin";
|
|
10
|
+
export * from "@navaramap/three_default_descs";
|
|
11
|
+
export { AttributionPlugin } from "./plugins";
|