@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,279 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
Color as CoreColor,
|
|
3
|
+
ColorMap,
|
|
4
|
+
EventHandler,
|
|
5
|
+
EventManager,
|
|
6
|
+
} from "@navaramap/core";
|
|
7
|
+
import type {
|
|
8
|
+
DelegatedWorkerTasksResult,
|
|
9
|
+
ElevationDecoder,
|
|
10
|
+
ReconstructableEntity,
|
|
11
|
+
ReturnedTransferablePolygonBatchedFeature,
|
|
12
|
+
ReturnedTransferablePolylineBatchedFeature,
|
|
13
|
+
TextureFragmentStatus,
|
|
14
|
+
TransferableMartini,
|
|
15
|
+
TransferableTile,
|
|
16
|
+
VectorTileState,
|
|
17
|
+
} from "@navaramap/engine";
|
|
18
|
+
import type { FontManager } from "@navaramap/font";
|
|
19
|
+
import type { Texture } from "three";
|
|
20
|
+
|
|
21
|
+
import type { ViewEvents } from "..";
|
|
22
|
+
import type { ThreeViewCamera } from "../camera";
|
|
23
|
+
import type { ViewContext } from "../core";
|
|
24
|
+
import type { LayersManager } from "../layersManager";
|
|
25
|
+
import type { TileMesh } from "../mesh/tile";
|
|
26
|
+
import type { Scenes, TexturizedSceneByTileCoordinates } from "../scene";
|
|
27
|
+
import type { TextureOptions } from "../textures";
|
|
28
|
+
import type { TileTextureCompositor } from "../tileTexture";
|
|
29
|
+
import type {
|
|
30
|
+
AbortControllers,
|
|
31
|
+
MeshCache,
|
|
32
|
+
WorkerPoolPromises,
|
|
33
|
+
RenderFlag,
|
|
34
|
+
TileMapByHandle,
|
|
35
|
+
} from "../type";
|
|
36
|
+
import type { CommonUniforms } from "../uniforms";
|
|
37
|
+
import type { TextureSlot } from "../utils";
|
|
38
|
+
|
|
39
|
+
import type { HillshadeContext } from "./HillshadeContext";
|
|
40
|
+
|
|
41
|
+
export type BufferLoader = {
|
|
42
|
+
// The non-removing getters (u8/f32/f64/u32) return short-lived VIEWS into
|
|
43
|
+
// WASM linear memory: consume them immediately and `.slice()` to retain —
|
|
44
|
+
// any WASM call that allocates may grow the memory and detach the view.
|
|
45
|
+
// Never hand their `.buffer` (the whole WASM memory) to another consumer.
|
|
46
|
+
// Consecutive getter calls do not allocate, so earlier views stay valid.
|
|
47
|
+
u8: (handle: number) => Uint8Array | null;
|
|
48
|
+
f32: (handle: number) => Float32Array | null;
|
|
49
|
+
f64: (handle: number) => Float64Array | null;
|
|
50
|
+
u32: (handle: number) => Uint32Array | null;
|
|
51
|
+
// The remove* variants return owned copies (the WASM-side buffer is freed).
|
|
52
|
+
removeU8: (handle: number) => Uint8Array | null;
|
|
53
|
+
removeF32: (handle: number) => Float32Array | null;
|
|
54
|
+
removeF64: (handle: number) => Float64Array | null;
|
|
55
|
+
removeU32: (handle: number) => Uint32Array | null;
|
|
56
|
+
setU8: (handle: number, bits: bigint, bytes: Uint8Array) => void;
|
|
57
|
+
newU8: (bytes: Uint8Array) => number | undefined;
|
|
58
|
+
newU32: (bytes: Uint32Array) => number | undefined;
|
|
59
|
+
newF32: (bytes: Float32Array) => number | undefined;
|
|
60
|
+
newF64: (bytes: Float64Array) => number | undefined;
|
|
61
|
+
// The `adopt*` variants register a JS-owned array in the `InMemoryBufferStore`
|
|
62
|
+
// (zero-copy — the array is kept as-is) and hand WASM a byte-count-only
|
|
63
|
+
// `External` handle, so worker-built geometry never round-trips through WASM
|
|
64
|
+
// linear memory. The getters (u8/f32/...) return it directly; remove* takes it
|
|
65
|
+
// and clears the WASM-side accounting.
|
|
66
|
+
adoptU8: (array: Uint8Array) => number | undefined;
|
|
67
|
+
adoptU32: (array: Uint32Array) => number | undefined;
|
|
68
|
+
adoptF32: (array: Float32Array) => number | undefined;
|
|
69
|
+
adoptF64: (array: Float64Array) => number | undefined;
|
|
70
|
+
/** DataRequester mirror of `adoptU8`: registers an `External` entry under an
|
|
71
|
+
* existing handle and fires the loaded event. Guards on `hasDataRequester`.
|
|
72
|
+
* An `External` entry carries no element type, so this is not typed. */
|
|
73
|
+
setExternal: (handle: number, bits: bigint, array: Uint8Array) => void;
|
|
74
|
+
remove: (handle: number) => void;
|
|
75
|
+
/** Evict handles Rust removed from the WASM `BufferStore` out of the JS-side
|
|
76
|
+
* `InMemoryBufferStore`; called once per frame. */
|
|
77
|
+
drainRemovedExternalHandles: () => void;
|
|
78
|
+
triggerDataRequesterLoaded: (bits: bigint, handle: number) => void;
|
|
79
|
+
triggerDataRequesterFailed: (bits: bigint) => void;
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
export type TextureFragmentHandler = {
|
|
83
|
+
triggerTextureFragmentLoaded: (
|
|
84
|
+
bits: bigint,
|
|
85
|
+
status: TextureFragmentStatus,
|
|
86
|
+
) => void;
|
|
87
|
+
};
|
|
88
|
+
|
|
89
|
+
export type WorkerTaskHandler = {
|
|
90
|
+
triggerWorkerTaskCompleted: (
|
|
91
|
+
bits: bigint,
|
|
92
|
+
result: DelegatedWorkerTasksResult,
|
|
93
|
+
) => void;
|
|
94
|
+
/**
|
|
95
|
+
* Release the delegator of a task that ended without a deliverable result.
|
|
96
|
+
* Consumes `delegator_id`; a no-op for a task the engine already cancelled.
|
|
97
|
+
*/
|
|
98
|
+
triggerWorkerTaskFailed: (delegator_id: ReconstructableEntity) => void;
|
|
99
|
+
hasWorkerTask: (bits: bigint) => boolean;
|
|
100
|
+
};
|
|
101
|
+
|
|
102
|
+
export type TileHandler = {
|
|
103
|
+
getMartini: (bits: ReconstructableEntity) => TransferableMartini | undefined;
|
|
104
|
+
getTile: (handle: bigint) => TransferableTile | undefined;
|
|
105
|
+
getParentTile: (handle: bigint) => TransferableTile | undefined;
|
|
106
|
+
getTileElevationDecoder: (handle: bigint) => ElevationDecoder | undefined;
|
|
107
|
+
getVectorTileStates: (handle: bigint) => VectorTileState[] | undefined;
|
|
108
|
+
vectorRevision: () => number;
|
|
109
|
+
/** Reports a terrain tile's drape render-target GPU footprint (bytes) so the
|
|
110
|
+
* memory ledger tracks clamp-to-ground vector bakes that scale with terrain
|
|
111
|
+
* subdivision past the vector `maxZoom`. Pass 0 to release on dispose. */
|
|
112
|
+
reportDrapeGpuBytes: (handle: bigint, bytes: number) => void;
|
|
113
|
+
calcMetersPerTexel: (
|
|
114
|
+
tileHandle: bigint,
|
|
115
|
+
textureZoom: number,
|
|
116
|
+
textureWidth: number,
|
|
117
|
+
) => number;
|
|
118
|
+
};
|
|
119
|
+
|
|
120
|
+
/**
|
|
121
|
+
* Handler for accessing individual Globe properties from WASM.
|
|
122
|
+
* This provides a reference-based interface instead of copying the entire Globe object.
|
|
123
|
+
*/
|
|
124
|
+
export type GlobeHandler = {
|
|
125
|
+
getTransparent: () => boolean | undefined;
|
|
126
|
+
getMaxSse: () => number | undefined;
|
|
127
|
+
getSegments: () => number | undefined;
|
|
128
|
+
getColor: () => CoreColor | undefined;
|
|
129
|
+
getHideUnderground: () => boolean | undefined;
|
|
130
|
+
getUseNormal: () => boolean | undefined;
|
|
131
|
+
getOpacity: () => number | undefined;
|
|
132
|
+
getWireframe: () => boolean | undefined;
|
|
133
|
+
getElevationColormap: () => Float32Array | undefined;
|
|
134
|
+
setTransparent: (value: boolean) => void;
|
|
135
|
+
setMaxSse: (value: number) => void;
|
|
136
|
+
setSegments: (value: number) => void;
|
|
137
|
+
setColor: (value: CoreColor) => void;
|
|
138
|
+
setHideUnderground: (value: boolean) => void;
|
|
139
|
+
setUseNormal: (value: boolean) => void;
|
|
140
|
+
setOpacity: (value: number) => void;
|
|
141
|
+
setWireframe: (value: boolean) => void;
|
|
142
|
+
setElevationColormap: (value: ColorMap) => void;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
export type FeatureHandler = {
|
|
146
|
+
getTransferablePolygonBatchedFeature: (
|
|
147
|
+
bits: bigint,
|
|
148
|
+
) => ReturnedTransferablePolygonBatchedFeature | undefined;
|
|
149
|
+
getTransferablePolylineBatchedFeature: (
|
|
150
|
+
bits: bigint,
|
|
151
|
+
) => ReturnedTransferablePolylineBatchedFeature | undefined;
|
|
152
|
+
markFeatureIsRendered: (
|
|
153
|
+
type: "point" | "polyline" | "polygon" | "model",
|
|
154
|
+
bits: bigint,
|
|
155
|
+
) => void;
|
|
156
|
+
/** Reports a rendered feature's actual measured GPU byte size so the memory
|
|
157
|
+
* ledger replaces its payload-based estimate. Feature kinds the engine has
|
|
158
|
+
* no owner lookup for are a no-op (currently wired: 3D Tiles models, whose
|
|
159
|
+
* post-glTF/Draco-decode size undercounts otherwise). */
|
|
160
|
+
reportFeatureGpuBytes: (bits: bigint, bytes: number) => void;
|
|
161
|
+
readAllBatchedProperties(
|
|
162
|
+
bits: bigint,
|
|
163
|
+
callback: (
|
|
164
|
+
batchIdx: number,
|
|
165
|
+
batchId: number,
|
|
166
|
+
properties?: Record<string, unknown>,
|
|
167
|
+
) => void,
|
|
168
|
+
): void;
|
|
169
|
+
readFilteredBatchedProperties(
|
|
170
|
+
bits: bigint,
|
|
171
|
+
keys: string[],
|
|
172
|
+
callback: (batchIdx: number, batchId: number, filtered?: unknown[]) => void,
|
|
173
|
+
): void;
|
|
174
|
+
};
|
|
175
|
+
|
|
176
|
+
export type MeshHandler = {
|
|
177
|
+
setTileMeshPrepared: (handle: bigint) => void;
|
|
178
|
+
};
|
|
179
|
+
|
|
180
|
+
export type LayerHandler = {
|
|
181
|
+
getLayerIndex: (layerId: string) => number | undefined;
|
|
182
|
+
};
|
|
183
|
+
|
|
184
|
+
type EventContextArgs = {
|
|
185
|
+
eventManager: EventManager;
|
|
186
|
+
scenes: Scenes;
|
|
187
|
+
camera: ThreeViewCamera;
|
|
188
|
+
meshes: MeshCache;
|
|
189
|
+
abortControllers: AbortControllers;
|
|
190
|
+
buf: BufferLoader;
|
|
191
|
+
texFragment: TextureFragmentHandler;
|
|
192
|
+
tileHandler: TileHandler;
|
|
193
|
+
workerTaskHandler: WorkerTaskHandler;
|
|
194
|
+
meshHandler: MeshHandler;
|
|
195
|
+
featureHandler: FeatureHandler;
|
|
196
|
+
loadedTexs: Map<string, Texture>;
|
|
197
|
+
workerPoolPromises: WorkerPoolPromises;
|
|
198
|
+
uniforms: CommonUniforms;
|
|
199
|
+
texturizedSceneByTileCoordinates: TexturizedSceneByTileCoordinates;
|
|
200
|
+
tileTextureCompositor: TileTextureCompositor;
|
|
201
|
+
tileMapByHandle: TileMapByHandle;
|
|
202
|
+
textureOptions: TextureOptions;
|
|
203
|
+
renderFlag: RenderFlag;
|
|
204
|
+
viewEvents: EventHandler<ViewEvents>;
|
|
205
|
+
layersManager: LayersManager;
|
|
206
|
+
viewContext: ViewContext;
|
|
207
|
+
layerHandler?: LayerHandler;
|
|
208
|
+
fontManager?: FontManager;
|
|
209
|
+
textureFragmentIndex?: Map<string, Set<TextureSlot>>;
|
|
210
|
+
tileMeshToFragmentIds?: Map<TileMesh, Set<string>>;
|
|
211
|
+
hillshadeContext?: HillshadeContext;
|
|
212
|
+
};
|
|
213
|
+
|
|
214
|
+
/**
|
|
215
|
+
* EventContext bundles all the shared state needed to process engine events
|
|
216
|
+
* and propagate them into each processor.
|
|
217
|
+
*/
|
|
218
|
+
export class EventContext {
|
|
219
|
+
readonly eventManager: EventManager;
|
|
220
|
+
readonly scenes: Scenes;
|
|
221
|
+
readonly camera: ThreeViewCamera;
|
|
222
|
+
readonly meshes: MeshCache;
|
|
223
|
+
readonly abortControllers: AbortControllers;
|
|
224
|
+
readonly buf: BufferLoader;
|
|
225
|
+
readonly texFragment: TextureFragmentHandler;
|
|
226
|
+
readonly tileHandler: TileHandler;
|
|
227
|
+
readonly workerTaskHandler: WorkerTaskHandler;
|
|
228
|
+
readonly meshHandler: MeshHandler;
|
|
229
|
+
readonly featureHandler: FeatureHandler;
|
|
230
|
+
readonly loadedTexs: Map<string, Texture>;
|
|
231
|
+
readonly workerPoolPromises: WorkerPoolPromises;
|
|
232
|
+
readonly uniforms: CommonUniforms;
|
|
233
|
+
readonly texturizedSceneByTileCoordinates: TexturizedSceneByTileCoordinates;
|
|
234
|
+
readonly tileTextureCompositor: TileTextureCompositor;
|
|
235
|
+
readonly tileMapByHandle: TileMapByHandle;
|
|
236
|
+
readonly textureOptions: TextureOptions;
|
|
237
|
+
readonly renderFlag: RenderFlag;
|
|
238
|
+
readonly viewEvents: EventHandler<ViewEvents>;
|
|
239
|
+
readonly layersManager: LayersManager;
|
|
240
|
+
readonly viewContext: ViewContext;
|
|
241
|
+
readonly layerHandler?: LayerHandler;
|
|
242
|
+
readonly fontManager?: FontManager;
|
|
243
|
+
readonly textureFragmentIndex?: Map<string, Set<TextureSlot>>;
|
|
244
|
+
readonly tileMeshToFragmentIds?: Map<TileMesh, Set<string>>;
|
|
245
|
+
readonly hillshadeContext?: HillshadeContext;
|
|
246
|
+
|
|
247
|
+
updatedAt = 0;
|
|
248
|
+
|
|
249
|
+
constructor(args: EventContextArgs) {
|
|
250
|
+
this.eventManager = args.eventManager;
|
|
251
|
+
this.scenes = args.scenes;
|
|
252
|
+
this.camera = args.camera;
|
|
253
|
+
this.meshes = args.meshes;
|
|
254
|
+
this.abortControllers = args.abortControllers;
|
|
255
|
+
this.buf = args.buf;
|
|
256
|
+
this.texFragment = args.texFragment;
|
|
257
|
+
this.tileHandler = args.tileHandler;
|
|
258
|
+
this.workerTaskHandler = args.workerTaskHandler;
|
|
259
|
+
this.meshHandler = args.meshHandler;
|
|
260
|
+
this.featureHandler = args.featureHandler;
|
|
261
|
+
this.loadedTexs = args.loadedTexs;
|
|
262
|
+
this.workerPoolPromises = args.workerPoolPromises;
|
|
263
|
+
this.uniforms = args.uniforms;
|
|
264
|
+
this.texturizedSceneByTileCoordinates =
|
|
265
|
+
args.texturizedSceneByTileCoordinates;
|
|
266
|
+
this.tileTextureCompositor = args.tileTextureCompositor;
|
|
267
|
+
this.tileMapByHandle = args.tileMapByHandle;
|
|
268
|
+
this.textureOptions = args.textureOptions;
|
|
269
|
+
this.renderFlag = args.renderFlag;
|
|
270
|
+
this.viewEvents = args.viewEvents;
|
|
271
|
+
this.layersManager = args.layersManager;
|
|
272
|
+
this.viewContext = args.viewContext;
|
|
273
|
+
this.layerHandler = args.layerHandler;
|
|
274
|
+
this.fontManager = args.fontManager;
|
|
275
|
+
this.textureFragmentIndex = args.textureFragmentIndex;
|
|
276
|
+
this.tileMeshToFragmentIds = args.tileMeshToFragmentIds;
|
|
277
|
+
this.hillshadeContext = args.hillshadeContext;
|
|
278
|
+
}
|
|
279
|
+
}
|
|
@@ -0,0 +1,357 @@
|
|
|
1
|
+
import type { TileHandle } from "@navaramap/core";
|
|
2
|
+
import { generate_id_from_entity } from "@navaramap/core";
|
|
3
|
+
import {
|
|
4
|
+
type RenderableFeatureAddedEvent,
|
|
5
|
+
type RenderableFeature,
|
|
6
|
+
RenderableFeatureChangedEvent,
|
|
7
|
+
} from "@navaramap/engine";
|
|
8
|
+
import { Mesh, Sprite, Object3D, Scene } from "three";
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
BatchedSdfTextMesh,
|
|
12
|
+
InstancedSpriteMesh,
|
|
13
|
+
ModelMesh,
|
|
14
|
+
PolygonMesh,
|
|
15
|
+
PolylineMesh,
|
|
16
|
+
} from "../mesh";
|
|
17
|
+
import { FEATURE_RENDER_ORDER } from "../renderOrder";
|
|
18
|
+
import type { Scenes } from "../scene";
|
|
19
|
+
|
|
20
|
+
import type { EventContext } from "./context";
|
|
21
|
+
import {
|
|
22
|
+
handleFeatureCreatedEventByLayerId,
|
|
23
|
+
handleFeatureUpdatedEventByLayerId,
|
|
24
|
+
handleFeatureVisibilityChangedEventByLayerId,
|
|
25
|
+
} from "./featureEvent";
|
|
26
|
+
import { renderBillboard, processBillboardChanged } from "./features/billboard";
|
|
27
|
+
import { renderModel, processModelChanged } from "./features/model";
|
|
28
|
+
import { sumModelGpuBytes } from "./features/modelGpuBytes";
|
|
29
|
+
import { renderPoint, processPointChanged } from "./features/point";
|
|
30
|
+
import { renderPolygon, processPolygonChanged } from "./features/polygon";
|
|
31
|
+
import {
|
|
32
|
+
renderPolygonOutline,
|
|
33
|
+
processPolygonOutlineChanged,
|
|
34
|
+
} from "./features/polygonOutline";
|
|
35
|
+
import { renderPolyline, processPolylineChanged } from "./features/polyline";
|
|
36
|
+
import { renderText, processTextChanged } from "./features/text";
|
|
37
|
+
|
|
38
|
+
import { setTransform } from ".";
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Choose the render scene for a non-draped feature based on its material.
|
|
42
|
+
*
|
|
43
|
+
* Sprites (billboards/points) and SDF text configured with `depthTest: false`
|
|
44
|
+
* are meant to render always-on-top. Left in the MRT scene they draw before the
|
|
45
|
+
* depth-based post-processing effects (aerial perspective, clouds, ssao,
|
|
46
|
+
* atmosphere), which sample the depth buffer — where these features wrote
|
|
47
|
+
* nothing — and composite over them, painting them out. Route them into the
|
|
48
|
+
* transparent scene, which TransparentPassEffectDesc renders (clear=false)
|
|
49
|
+
* after those effects. Every other non-draped feature stays in the MRT scene.
|
|
50
|
+
*
|
|
51
|
+
* The material comes straight from the engine event (the source of truth): text
|
|
52
|
+
* applies its Three material asynchronously (behind font preparation), so the
|
|
53
|
+
* live mesh material can lag behind the intended `depthTest`.
|
|
54
|
+
*/
|
|
55
|
+
function overlayScene(
|
|
56
|
+
material: { depthTest?: boolean } | undefined,
|
|
57
|
+
scenes: Scenes,
|
|
58
|
+
): Scene {
|
|
59
|
+
return material?.depthTest === false ? scenes.transparent : scenes.mrt;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
export function renderFeature(
|
|
63
|
+
ctx: EventContext,
|
|
64
|
+
f: RenderableFeature,
|
|
65
|
+
tileHandle: TileHandle | undefined,
|
|
66
|
+
layerId: string,
|
|
67
|
+
): Promise<Mesh | Sprite | Object3D | undefined> | undefined {
|
|
68
|
+
if (f.point) {
|
|
69
|
+
return renderPoint(ctx, f.point);
|
|
70
|
+
}
|
|
71
|
+
if (f.billboard) {
|
|
72
|
+
return renderBillboard(ctx, f.billboard);
|
|
73
|
+
}
|
|
74
|
+
if (f.model) {
|
|
75
|
+
return renderModel(ctx, f.model);
|
|
76
|
+
}
|
|
77
|
+
if (f.polyline) {
|
|
78
|
+
return renderPolyline(ctx, f.polyline);
|
|
79
|
+
}
|
|
80
|
+
if (f.polygon) {
|
|
81
|
+
return renderPolygon(ctx, f.polygon, tileHandle, layerId);
|
|
82
|
+
}
|
|
83
|
+
if (f.text) {
|
|
84
|
+
return renderText(ctx, f.text, layerId);
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Define whether the feature uses web worker internally.
|
|
89
|
+
// - `model` feature uses Web worker internally to parse glTF and its compression.
|
|
90
|
+
export const checkFeatureParallel = (feature: RenderableFeature): boolean => {
|
|
91
|
+
const { model } = feature;
|
|
92
|
+
return !!model;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
export async function processRenderableFeatureAdded(
|
|
96
|
+
ctx: EventContext,
|
|
97
|
+
ev: RenderableFeatureAddedEvent,
|
|
98
|
+
) {
|
|
99
|
+
const {
|
|
100
|
+
scenes,
|
|
101
|
+
meshes,
|
|
102
|
+
texturizedSceneByTileCoordinates,
|
|
103
|
+
featureHandler,
|
|
104
|
+
viewEvents,
|
|
105
|
+
layersManager,
|
|
106
|
+
viewContext,
|
|
107
|
+
updatedAt,
|
|
108
|
+
layerHandler,
|
|
109
|
+
} = ctx;
|
|
110
|
+
const id = generate_id_from_entity(ev);
|
|
111
|
+
const feature = ev.feature;
|
|
112
|
+
|
|
113
|
+
const { point, billboard, text, polyline, polygon, model } = feature;
|
|
114
|
+
|
|
115
|
+
const overscaledTileHandle = ev.overscaled_tile_handle;
|
|
116
|
+
|
|
117
|
+
const tileHandle = overscaledTileHandle?.handle;
|
|
118
|
+
|
|
119
|
+
const featureLayerId = ev.layer_id;
|
|
120
|
+
|
|
121
|
+
const useParallel = checkFeatureParallel(feature);
|
|
122
|
+
|
|
123
|
+
if (useParallel) {
|
|
124
|
+
// Start parallel process
|
|
125
|
+
viewContext.concurrencyManager.increment();
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
const obj = await renderFeature(ctx, feature, tileHandle, featureLayerId)
|
|
129
|
+
?.then((r) => {
|
|
130
|
+
const type = (() => {
|
|
131
|
+
if (point || billboard || text) return "point";
|
|
132
|
+
else if (model) return "model";
|
|
133
|
+
else if (polyline) return "polyline";
|
|
134
|
+
else if (polygon) return "polygon";
|
|
135
|
+
})();
|
|
136
|
+
if (type) {
|
|
137
|
+
featureHandler.markFeatureIsRendered(type, ev.bits);
|
|
138
|
+
}
|
|
139
|
+
// The glTF/Draco decode happened on the JS side, so report the actual
|
|
140
|
+
// decoded GPU size back to the ledger (its compressed-payload estimate
|
|
141
|
+
// undercounts Draco content). Draco decode inflates geometry markedly.
|
|
142
|
+
if (model && r) {
|
|
143
|
+
featureHandler.reportFeatureGpuBytes(ev.bits, sumModelGpuBytes(r));
|
|
144
|
+
}
|
|
145
|
+
// The billboard image atlas (CPU pixel buffer + GPU texture) is
|
|
146
|
+
// allocated and grown lazily on the JS side as images load, so the
|
|
147
|
+
// mesh reports its measured footprint whenever it changes; the ledger
|
|
148
|
+
// folds it into the owning vector tile's cost. Capture `bits` as a
|
|
149
|
+
// plain number now: the reporter fires long after this WASM event
|
|
150
|
+
// object is freed (async image packs), and a deferred `ev.bits` read
|
|
151
|
+
// would throw "null pointer passed to rust".
|
|
152
|
+
if (billboard && r instanceof InstancedSpriteMesh) {
|
|
153
|
+
const featureBits = ev.bits;
|
|
154
|
+
r.setAtlasBytesReporter((bytes) =>
|
|
155
|
+
featureHandler.reportFeatureGpuBytes(featureBits, bytes),
|
|
156
|
+
);
|
|
157
|
+
}
|
|
158
|
+
return r;
|
|
159
|
+
})
|
|
160
|
+
.finally(() => {
|
|
161
|
+
if (useParallel) {
|
|
162
|
+
// End parallel process
|
|
163
|
+
viewContext.concurrencyManager.decrement();
|
|
164
|
+
}
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
if (!obj) return;
|
|
168
|
+
|
|
169
|
+
// Sprite should be handled by mesh itself.
|
|
170
|
+
const transform = (polyline ?? polygon ?? model)?.transform;
|
|
171
|
+
if (transform) {
|
|
172
|
+
setTransform(obj, transform);
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
obj.renderOrder = FEATURE_RENDER_ORDER;
|
|
176
|
+
|
|
177
|
+
// Add to MRT scene if not draped (draped features render to texturized scene)
|
|
178
|
+
const isDraped =
|
|
179
|
+
(obj instanceof PolygonMesh && obj.clampToGround) ||
|
|
180
|
+
(obj instanceof PolylineMesh && obj.draped);
|
|
181
|
+
if (!isDraped) {
|
|
182
|
+
const material = point?.material ?? billboard?.material ?? text?.material;
|
|
183
|
+
overlayScene(material, scenes).add(obj);
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
meshes.set(id, obj);
|
|
187
|
+
|
|
188
|
+
if (isDraped && tileHandle) {
|
|
189
|
+
// Insert the bakeable draped mesh into the per-tile cache now (it is fully built at
|
|
190
|
+
// this point). Readiness/ancestor-fallback is decided entirely on the Rust side from
|
|
191
|
+
// the ECS lifecycle, so no `scene_ready` is reported. Insert even when invisible —
|
|
192
|
+
// the offscreen bake skips invisible meshes.
|
|
193
|
+
const layerIndex = layerHandler?.getLayerIndex(featureLayerId);
|
|
194
|
+
// Timing: the layer may have been removed before this event; skip the insert then (the
|
|
195
|
+
// mesh object still exists, it just won't be baked for this layer).
|
|
196
|
+
if (layerIndex != null) {
|
|
197
|
+
texturizedSceneByTileCoordinates.add(
|
|
198
|
+
tileHandle,
|
|
199
|
+
featureLayerId,
|
|
200
|
+
obj as Mesh,
|
|
201
|
+
layerIndex,
|
|
202
|
+
);
|
|
203
|
+
}
|
|
204
|
+
obj.addEventListener("removedFromWorld", () => {
|
|
205
|
+
texturizedSceneByTileCoordinates.removeMesh(
|
|
206
|
+
tileHandle,
|
|
207
|
+
featureLayerId,
|
|
208
|
+
obj as Mesh,
|
|
209
|
+
);
|
|
210
|
+
});
|
|
211
|
+
obj.addEventListener("needsUpdate", () => {
|
|
212
|
+
texturizedSceneByTileCoordinates.markDirty(tileHandle, featureLayerId);
|
|
213
|
+
});
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
if (obj instanceof PolygonMesh && polygon && polygon.outline_geometry) {
|
|
217
|
+
const outline = await renderPolygonOutline(ctx, polygon);
|
|
218
|
+
outline.renderOrder = FEATURE_RENDER_ORDER;
|
|
219
|
+
scenes.mrt.add(outline);
|
|
220
|
+
|
|
221
|
+
obj.outline = outline;
|
|
222
|
+
|
|
223
|
+
obj.addEventListener("removedFromWorld", () => {
|
|
224
|
+
obj.outline?.clear();
|
|
225
|
+
obj.outline?.removeFromParent();
|
|
226
|
+
});
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
handleFeatureCreatedEventByLayerId(
|
|
230
|
+
featureHandler,
|
|
231
|
+
obj,
|
|
232
|
+
viewEvents,
|
|
233
|
+
layersManager,
|
|
234
|
+
featureLayerId,
|
|
235
|
+
ev.bits,
|
|
236
|
+
);
|
|
237
|
+
if (obj.visible) {
|
|
238
|
+
handleFeatureUpdatedEventByLayerId(
|
|
239
|
+
viewEvents,
|
|
240
|
+
layersManager,
|
|
241
|
+
featureLayerId,
|
|
242
|
+
ev.bits,
|
|
243
|
+
updatedAt,
|
|
244
|
+
);
|
|
245
|
+
}
|
|
246
|
+
}
|
|
247
|
+
|
|
248
|
+
export async function processRenderableFeatureChanged(
|
|
249
|
+
ctx: EventContext,
|
|
250
|
+
ev: RenderableFeatureChangedEvent,
|
|
251
|
+
) {
|
|
252
|
+
const {
|
|
253
|
+
scenes,
|
|
254
|
+
meshes,
|
|
255
|
+
texturizedSceneByTileCoordinates,
|
|
256
|
+
viewEvents,
|
|
257
|
+
layersManager,
|
|
258
|
+
updatedAt,
|
|
259
|
+
} = ctx;
|
|
260
|
+
const id = generate_id_from_entity(ev);
|
|
261
|
+
const obj = meshes.get(id);
|
|
262
|
+
if (!obj) return;
|
|
263
|
+
|
|
264
|
+
const layerId = ev.layer_id;
|
|
265
|
+
|
|
266
|
+
const overscaledTileHandle = ev.overscaled_tile_handle;
|
|
267
|
+
const tileHandle = overscaledTileHandle?.handle;
|
|
268
|
+
|
|
269
|
+
const { point, billboard, text, polyline, polygon, model } = ev.feature;
|
|
270
|
+
|
|
271
|
+
const active =
|
|
272
|
+
(point ?? billboard ?? text ?? polyline ?? polygon ?? model)?.active ??
|
|
273
|
+
true;
|
|
274
|
+
|
|
275
|
+
// Capture visibility before material updates to detect changes
|
|
276
|
+
const prevVisible = obj.visible;
|
|
277
|
+
|
|
278
|
+
if (obj instanceof InstancedSpriteMesh && point) {
|
|
279
|
+
processPointChanged(obj, point, active);
|
|
280
|
+
}
|
|
281
|
+
if (obj instanceof InstancedSpriteMesh && billboard) {
|
|
282
|
+
await processBillboardChanged(obj, billboard, active);
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
if (obj instanceof BatchedSdfTextMesh && text) {
|
|
286
|
+
await processTextChanged(obj, text, active);
|
|
287
|
+
}
|
|
288
|
+
|
|
289
|
+
// `depthTest` may have flipped at runtime, changing which scene a sprite or
|
|
290
|
+
// text feature belongs to (transparent for always-on-top overlays, MRT
|
|
291
|
+
// otherwise). Re-route based on the incoming material; Three's `add()`
|
|
292
|
+
// reparents safely, and the guard keeps draped/model/polygon/polyline
|
|
293
|
+
// features untouched.
|
|
294
|
+
if (obj instanceof InstancedSpriteMesh || obj instanceof BatchedSdfTextMesh) {
|
|
295
|
+
const material = point?.material ?? billboard?.material ?? text?.material;
|
|
296
|
+
const target = overlayScene(material, scenes);
|
|
297
|
+
if (obj.parent !== target) {
|
|
298
|
+
target.add(obj);
|
|
299
|
+
ctx.renderFlag.forceUpdate = true;
|
|
300
|
+
}
|
|
301
|
+
}
|
|
302
|
+
if (obj instanceof ModelMesh && model) {
|
|
303
|
+
processModelChanged(obj, model, active);
|
|
304
|
+
}
|
|
305
|
+
if (obj instanceof PolylineMesh && polyline) {
|
|
306
|
+
processPolylineChanged(obj, polyline, active);
|
|
307
|
+
}
|
|
308
|
+
if (obj instanceof PolygonMesh && polygon) {
|
|
309
|
+
processPolygonChanged(obj, polygon, active, tileHandle);
|
|
310
|
+
|
|
311
|
+
if (obj.outline) {
|
|
312
|
+
processPolygonOutlineChanged(obj.outline, polygon, active);
|
|
313
|
+
}
|
|
314
|
+
}
|
|
315
|
+
|
|
316
|
+
// A draped feature's material/visibility changed: bump the layer scene's revision so the
|
|
317
|
+
// consuming TileMesh re-bakes (invisible meshes stay in the scene and are skipped at bake).
|
|
318
|
+
// Cache membership is owned by CREATE / `removedFromWorld`; a runtime `clampToGround` flip
|
|
319
|
+
// is not handled here (rare — the flag is set once at mesh init).
|
|
320
|
+
if (
|
|
321
|
+
((obj instanceof PolygonMesh && obj.clampToGround) ||
|
|
322
|
+
(obj instanceof PolylineMesh && obj.draped)) &&
|
|
323
|
+
tileHandle
|
|
324
|
+
) {
|
|
325
|
+
texturizedSceneByTileCoordinates.markDirty(tileHandle, layerId);
|
|
326
|
+
}
|
|
327
|
+
|
|
328
|
+
// Emit visibility changed event if visibility actually changed after material updates
|
|
329
|
+
if (prevVisible !== obj.visible) {
|
|
330
|
+
handleFeatureVisibilityChangedEventByLayerId(
|
|
331
|
+
layersManager,
|
|
332
|
+
layerId,
|
|
333
|
+
ev.bits,
|
|
334
|
+
obj.visible,
|
|
335
|
+
);
|
|
336
|
+
}
|
|
337
|
+
|
|
338
|
+
// Point, billboard and text should be handled by their mesh.
|
|
339
|
+
const transform = (polyline ?? polygon ?? model)?.transform;
|
|
340
|
+
|
|
341
|
+
// This should be handled after the asynchronous process to avoid a conflict.
|
|
342
|
+
if (transform) {
|
|
343
|
+
setTransform(obj, transform);
|
|
344
|
+
}
|
|
345
|
+
|
|
346
|
+
obj.updateMatrix();
|
|
347
|
+
|
|
348
|
+
if (obj.visible) {
|
|
349
|
+
handleFeatureUpdatedEventByLayerId(
|
|
350
|
+
viewEvents,
|
|
351
|
+
layersManager,
|
|
352
|
+
layerId,
|
|
353
|
+
ev.bits,
|
|
354
|
+
updatedAt,
|
|
355
|
+
);
|
|
356
|
+
}
|
|
357
|
+
}
|