@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,34 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ConstructedPolygonGeometryLike,
|
|
3
|
+
ExtentRadianF32Like,
|
|
4
|
+
PolygonMaterialLike,
|
|
5
|
+
TransferablePolygonBatchedFeatureLike,
|
|
6
|
+
} from "@navaramap/core";
|
|
7
|
+
import type { Promise } from "@navaramap/worker";
|
|
8
|
+
|
|
9
|
+
import { queueTask } from "./queueTask";
|
|
10
|
+
|
|
11
|
+
export function constructPolygonBatchedFeature(
|
|
12
|
+
transferableBatchedFeatureLike: TransferablePolygonBatchedFeatureLike,
|
|
13
|
+
materialLike: PolygonMaterialLike,
|
|
14
|
+
flat: boolean,
|
|
15
|
+
tileExtent: ExtentRadianF32Like | undefined,
|
|
16
|
+
): Promise<ConstructedPolygonGeometryLike | undefined> {
|
|
17
|
+
return queueTask(
|
|
18
|
+
"constructPolygonBatchedFeature",
|
|
19
|
+
[transferableBatchedFeatureLike, materialLike, flat, tileExtent],
|
|
20
|
+
{
|
|
21
|
+
transfer: [
|
|
22
|
+
transferableBatchedFeatureLike.batch_ids.buffer,
|
|
23
|
+
transferableBatchedFeatureLike.batch_indices.buffer,
|
|
24
|
+
transferableBatchedFeatureLike.expected_winding_orders.buffer,
|
|
25
|
+
transferableBatchedFeatureLike.holes.buffer,
|
|
26
|
+
transferableBatchedFeatureLike.holes_boundaries.buffer,
|
|
27
|
+
transferableBatchedFeatureLike.holes_sizes.buffer,
|
|
28
|
+
transferableBatchedFeatureLike.holes_total_sizes.buffer,
|
|
29
|
+
transferableBatchedFeatureLike.outer_ring.buffer,
|
|
30
|
+
transferableBatchedFeatureLike.outer_ring_sizes.buffer,
|
|
31
|
+
],
|
|
32
|
+
},
|
|
33
|
+
);
|
|
34
|
+
}
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ConstructedPolylineGeometryLike,
|
|
3
|
+
PolylineMaterialLike,
|
|
4
|
+
TransferablePolylineBatchedFeatureLike,
|
|
5
|
+
} from "@navaramap/core";
|
|
6
|
+
import type { Promise } from "@navaramap/worker";
|
|
7
|
+
|
|
8
|
+
import { queueTask } from "./queueTask";
|
|
9
|
+
|
|
10
|
+
export function constructPolylineBatchedFeature(
|
|
11
|
+
transferableBatchedFeatureLike: TransferablePolylineBatchedFeatureLike,
|
|
12
|
+
materialLike: PolylineMaterialLike,
|
|
13
|
+
flat: boolean,
|
|
14
|
+
): Promise<ConstructedPolylineGeometryLike | undefined> {
|
|
15
|
+
return queueTask(
|
|
16
|
+
"constructPolylineBatchedFeature",
|
|
17
|
+
[transferableBatchedFeatureLike, materialLike, flat],
|
|
18
|
+
{
|
|
19
|
+
transfer: [
|
|
20
|
+
transferableBatchedFeatureLike.points.buffer,
|
|
21
|
+
transferableBatchedFeatureLike.points_sizes.buffer,
|
|
22
|
+
transferableBatchedFeatureLike.batch_ids.buffer,
|
|
23
|
+
transferableBatchedFeatureLike.batch_indices.buffer,
|
|
24
|
+
],
|
|
25
|
+
},
|
|
26
|
+
);
|
|
27
|
+
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ReturnedConstructedTerrainMeshLike,
|
|
3
|
+
TransferableTileLike,
|
|
4
|
+
} from "@navaramap/core";
|
|
5
|
+
import type { Promise } from "@navaramap/worker";
|
|
6
|
+
|
|
7
|
+
import { queueTask } from "./queueTask";
|
|
8
|
+
|
|
9
|
+
export function constructQuantizedMeshTerrainMesh(
|
|
10
|
+
bytes: Uint8Array,
|
|
11
|
+
tileLike: TransferableTileLike,
|
|
12
|
+
skirt: boolean,
|
|
13
|
+
skirtExaggeration: number,
|
|
14
|
+
geographic: boolean,
|
|
15
|
+
tms: boolean,
|
|
16
|
+
): Promise<{
|
|
17
|
+
result: ReturnedConstructedTerrainMeshLike;
|
|
18
|
+
}> {
|
|
19
|
+
return queueTask(
|
|
20
|
+
"constructQuantizedMeshTerrainMesh",
|
|
21
|
+
[bytes, tileLike, skirt, skirtExaggeration, geographic, tms],
|
|
22
|
+
{ transfer: [bytes.buffer] },
|
|
23
|
+
);
|
|
24
|
+
}
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ReturnedConstructedTerrainMeshLike,
|
|
3
|
+
TransferableRasterDEMDataLike,
|
|
4
|
+
TransferableTileLike,
|
|
5
|
+
} from "@navaramap/core";
|
|
6
|
+
import type { Promise } from "@navaramap/worker";
|
|
7
|
+
|
|
8
|
+
import { queueTask } from "./queueTask";
|
|
9
|
+
|
|
10
|
+
export function constructTerrainMesh(
|
|
11
|
+
bytes: Uint8Array,
|
|
12
|
+
tileLike: TransferableTileLike,
|
|
13
|
+
rasterDEMDataLike: TransferableRasterDEMDataLike,
|
|
14
|
+
size: number,
|
|
15
|
+
skirt: boolean,
|
|
16
|
+
skirtExaggeration: number,
|
|
17
|
+
): Promise<{
|
|
18
|
+
result: ReturnedConstructedTerrainMeshLike;
|
|
19
|
+
}> {
|
|
20
|
+
return queueTask(
|
|
21
|
+
"constructTerrainMesh",
|
|
22
|
+
[bytes, tileLike, rasterDEMDataLike, size, skirt, skirtExaggeration],
|
|
23
|
+
{ transfer: [bytes.buffer] },
|
|
24
|
+
);
|
|
25
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import type { Promise } from "@navaramap/worker";
|
|
2
|
+
|
|
3
|
+
import { queueTask } from "./queueTask";
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Decode a compressed image Blob into raw RGBA pixels on a worker thread.
|
|
7
|
+
* The Blob is cheap to clone across the worker boundary (it references
|
|
8
|
+
* immutable backing storage), so the whole decode — including
|
|
9
|
+
* `createImageBitmap` — stays off the main thread.
|
|
10
|
+
*/
|
|
11
|
+
export function getImageDataFromBlob(blob: Blob): Promise<Uint8ClampedArray> {
|
|
12
|
+
return queueTask("getImageDataFromBlob", [blob]);
|
|
13
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Promise } from "@navaramap/worker";
|
|
2
|
+
|
|
3
|
+
import { queueTask } from "./queueTask";
|
|
4
|
+
|
|
5
|
+
export function getImageDataFromImageBitmap(
|
|
6
|
+
img: ImageBitmap,
|
|
7
|
+
canvas: OffscreenCanvas,
|
|
8
|
+
): Promise<Uint8ClampedArray> {
|
|
9
|
+
return queueTask("getImageDataFromImageBitmap", [img, canvas], {
|
|
10
|
+
transfer: [img, canvas],
|
|
11
|
+
});
|
|
12
|
+
}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
import { ExtentRadianF32Like } from "@navaramap/core";
|
|
2
|
+
import type { ParsedMvtTileResultLike, Promise } from "@navaramap/worker";
|
|
3
|
+
|
|
4
|
+
import { queueTask } from "./queueTask";
|
|
5
|
+
|
|
6
|
+
export function parseMvtTile(
|
|
7
|
+
bytes: Uint8Array,
|
|
8
|
+
x: number,
|
|
9
|
+
y: number,
|
|
10
|
+
z: number,
|
|
11
|
+
tileExtent: ExtentRadianF32Like | undefined,
|
|
12
|
+
compression: number,
|
|
13
|
+
configsJson: string,
|
|
14
|
+
): Promise<ParsedMvtTileResultLike> {
|
|
15
|
+
return queueTask(
|
|
16
|
+
"parseMvtTile",
|
|
17
|
+
[bytes, x, y, z, tileExtent, compression, configsJson],
|
|
18
|
+
{
|
|
19
|
+
transfer: [bytes.buffer],
|
|
20
|
+
},
|
|
21
|
+
);
|
|
22
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import {
|
|
2
|
+
queueTask as queueTaskImpl,
|
|
3
|
+
type ExecOptions,
|
|
4
|
+
type TaskParams,
|
|
5
|
+
type WorkerTask,
|
|
6
|
+
} from "@navaramap/worker";
|
|
7
|
+
|
|
8
|
+
import type { Tasks } from "../worker";
|
|
9
|
+
|
|
10
|
+
type AllTasks = WorkerTask<Tasks>;
|
|
11
|
+
type TaskNames = keyof AllTasks;
|
|
12
|
+
|
|
13
|
+
export function queueTask<T extends TaskNames>(
|
|
14
|
+
method: T,
|
|
15
|
+
params?: TaskParams<AllTasks, T>,
|
|
16
|
+
options?: ExecOptions,
|
|
17
|
+
) {
|
|
18
|
+
return queueTaskImpl(method, params, options);
|
|
19
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { type BufferGeometry } from "three";
|
|
2
|
+
|
|
3
|
+
import { fromBufferGeometryLike, toBufferGeometryLike } from "../utils";
|
|
4
|
+
|
|
5
|
+
import { queueTask } from "./queueTask";
|
|
6
|
+
|
|
7
|
+
export async function toCreasedNormalsAsync(
|
|
8
|
+
geometry: BufferGeometry,
|
|
9
|
+
creaseAngle?: number,
|
|
10
|
+
): Promise<BufferGeometry> {
|
|
11
|
+
const [geometryLike, transfer] = toBufferGeometryLike(geometry);
|
|
12
|
+
const result = await queueTask(
|
|
13
|
+
"toCreasedNormals",
|
|
14
|
+
[geometryLike, creaseAngle],
|
|
15
|
+
{ transfer },
|
|
16
|
+
);
|
|
17
|
+
return fromBufferGeometryLike(result, geometry);
|
|
18
|
+
}
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ReturnedConstructedTerrainMeshLike,
|
|
3
|
+
TransferableTileLike,
|
|
4
|
+
UpsamplableTerrainGeometryLike,
|
|
5
|
+
} from "@navaramap/core";
|
|
6
|
+
import type { Promise } from "@navaramap/worker";
|
|
7
|
+
|
|
8
|
+
import { queueTask } from "./queueTask";
|
|
9
|
+
|
|
10
|
+
export function upsampleQuantizedMeshTerrainMesh(
|
|
11
|
+
tileLike: TransferableTileLike,
|
|
12
|
+
parentTileLike: TransferableTileLike,
|
|
13
|
+
upsamplableGeometryLike: UpsamplableTerrainGeometryLike,
|
|
14
|
+
skirt: boolean,
|
|
15
|
+
skirtExaggeration: number,
|
|
16
|
+
geographic: boolean,
|
|
17
|
+
tms: boolean,
|
|
18
|
+
): Promise<ReturnedConstructedTerrainMeshLike> {
|
|
19
|
+
return queueTask(
|
|
20
|
+
"upsampleQuantizedMeshTerrainMesh",
|
|
21
|
+
[
|
|
22
|
+
tileLike,
|
|
23
|
+
parentTileLike,
|
|
24
|
+
upsamplableGeometryLike,
|
|
25
|
+
skirt,
|
|
26
|
+
skirtExaggeration,
|
|
27
|
+
geographic,
|
|
28
|
+
tms,
|
|
29
|
+
],
|
|
30
|
+
{
|
|
31
|
+
transfer: [
|
|
32
|
+
upsamplableGeometryLike.uvs.buffer,
|
|
33
|
+
upsamplableGeometryLike.heights.buffer,
|
|
34
|
+
upsamplableGeometryLike.indices.buffer,
|
|
35
|
+
...(upsamplableGeometryLike.normals
|
|
36
|
+
? [upsamplableGeometryLike.normals.buffer]
|
|
37
|
+
: []),
|
|
38
|
+
...(upsamplableGeometryLike.watermask
|
|
39
|
+
? [upsamplableGeometryLike.watermask.buffer]
|
|
40
|
+
: []),
|
|
41
|
+
],
|
|
42
|
+
},
|
|
43
|
+
);
|
|
44
|
+
}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import {
|
|
2
|
+
ReturnedConstructedTerrainMeshLike,
|
|
3
|
+
TransferableRasterDEMDataLike,
|
|
4
|
+
TransferableTileLike,
|
|
5
|
+
UpsamplableTerrainGeometryLike,
|
|
6
|
+
} from "@navaramap/core";
|
|
7
|
+
import type { Promise } from "@navaramap/worker";
|
|
8
|
+
|
|
9
|
+
import { queueTask } from "./queueTask";
|
|
10
|
+
|
|
11
|
+
export function upsampleTerrainMesh(
|
|
12
|
+
tileLike: TransferableTileLike,
|
|
13
|
+
parentTileLike: TransferableTileLike,
|
|
14
|
+
rasterDEMDataLike: TransferableRasterDEMDataLike,
|
|
15
|
+
upsamplableGeometryLike: UpsamplableTerrainGeometryLike,
|
|
16
|
+
skirt: boolean,
|
|
17
|
+
skirtExaggeration: number,
|
|
18
|
+
tms: boolean,
|
|
19
|
+
): Promise<ReturnedConstructedTerrainMeshLike> {
|
|
20
|
+
return queueTask(
|
|
21
|
+
"upsampleTerrainMesh",
|
|
22
|
+
[
|
|
23
|
+
tileLike,
|
|
24
|
+
parentTileLike,
|
|
25
|
+
rasterDEMDataLike,
|
|
26
|
+
upsamplableGeometryLike,
|
|
27
|
+
skirt,
|
|
28
|
+
skirtExaggeration,
|
|
29
|
+
tms,
|
|
30
|
+
],
|
|
31
|
+
{
|
|
32
|
+
transfer: [
|
|
33
|
+
upsamplableGeometryLike.uvs.buffer,
|
|
34
|
+
upsamplableGeometryLike.heights.buffer,
|
|
35
|
+
upsamplableGeometryLike.indices.buffer,
|
|
36
|
+
],
|
|
37
|
+
},
|
|
38
|
+
);
|
|
39
|
+
}
|
package/src/texture.ts
ADDED
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type { Material, Object3D, Texture } from "three";
|
|
2
|
+
|
|
3
|
+
// Adjust the texture's aspect ratio automatically.
|
|
4
|
+
export function applyTextureAspect(obj: Object3D) {
|
|
5
|
+
const material = "material" in obj ? (obj.material as Material) : undefined;
|
|
6
|
+
if (
|
|
7
|
+
material &&
|
|
8
|
+
!Array.isArray(material) &&
|
|
9
|
+
"map" in material &&
|
|
10
|
+
material.map
|
|
11
|
+
) {
|
|
12
|
+
const map = material.map as Texture<ImageData>;
|
|
13
|
+
if (map) {
|
|
14
|
+
const image = map.image;
|
|
15
|
+
const aspectRatio = image.height / image.width;
|
|
16
|
+
obj.scale.y *= aspectRatio;
|
|
17
|
+
}
|
|
18
|
+
}
|
|
19
|
+
}
|
package/src/textures.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
// TODO: Provide an API to specify these settings for each material.
|
|
2
|
+
export type TextureOptions = {
|
|
3
|
+
maxAnisotropy: number;
|
|
4
|
+
minFilter: number;
|
|
5
|
+
magFilter: number;
|
|
6
|
+
useMipmaps: boolean;
|
|
7
|
+
maxTextures: number;
|
|
8
|
+
// Automatically tracked - which additional textures are in use
|
|
9
|
+
additionalTexturesInUse?: {
|
|
10
|
+
waterTexture?: boolean;
|
|
11
|
+
colorMapTexture?: boolean;
|
|
12
|
+
};
|
|
13
|
+
};
|
|
@@ -0,0 +1,59 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { generateCompositeFragmentShader } from "./CompositeShader";
|
|
4
|
+
import type { CompositeFeatures } from "./types";
|
|
5
|
+
|
|
6
|
+
const OFF: CompositeFeatures = {
|
|
7
|
+
hasHillshade: false,
|
|
8
|
+
hasWater: false,
|
|
9
|
+
hasElevationHeatmap: false,
|
|
10
|
+
hasWatermask: false,
|
|
11
|
+
};
|
|
12
|
+
const ALL: CompositeFeatures = {
|
|
13
|
+
hasHillshade: true,
|
|
14
|
+
hasWater: true,
|
|
15
|
+
hasElevationHeatmap: true,
|
|
16
|
+
hasWatermask: true,
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Characterization snapshots: pin the exact generated GLSL across a matrix of
|
|
21
|
+
* slot counts and feature combinations. The composite-pass refactor (extracting
|
|
22
|
+
* the base skeleton + per-layer enhancers) must keep output byte-identical —
|
|
23
|
+
* these snapshots fail loudly if any character drifts.
|
|
24
|
+
*/
|
|
25
|
+
const CASES: {
|
|
26
|
+
name: string;
|
|
27
|
+
args: [number, number, number, CompositeFeatures];
|
|
28
|
+
}[] = [
|
|
29
|
+
{ name: "raster+vector, all features off", args: [2, 2, 2, OFF] },
|
|
30
|
+
{ name: "raster+single vector, boundary 24", args: [2, 1, 24, OFF] },
|
|
31
|
+
{ name: "single raster+2 vector, boundary 24", args: [1, 2, 24, OFF] },
|
|
32
|
+
{
|
|
33
|
+
name: "hillshade only",
|
|
34
|
+
args: [2, 0, 24, { ...OFF, hasHillshade: true }],
|
|
35
|
+
},
|
|
36
|
+
{ name: "water only", args: [2, 0, 24, { ...OFF, hasWater: true }] },
|
|
37
|
+
{
|
|
38
|
+
name: "elevation heatmap only",
|
|
39
|
+
args: [2, 0, 24, { ...OFF, hasElevationHeatmap: true }],
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
name: "watermask only feature, with slots",
|
|
43
|
+
args: [2, 0, 24, { ...OFF, hasWatermask: true }],
|
|
44
|
+
},
|
|
45
|
+
{ name: "all features on, mixed raster+vector", args: [2, 2, 2, ALL] },
|
|
46
|
+
{ name: "vector-only (rasterCount 0)", args: [0, 2, 24, OFF] },
|
|
47
|
+
{
|
|
48
|
+
name: "watermask-only shader (no slots)",
|
|
49
|
+
args: [0, 0, 24, { ...OFF, hasWatermask: true }],
|
|
50
|
+
},
|
|
51
|
+
];
|
|
52
|
+
|
|
53
|
+
describe("generateCompositeFragmentShader snapshots", () => {
|
|
54
|
+
for (const { name, args } of CASES) {
|
|
55
|
+
it(name, () => {
|
|
56
|
+
expect(generateCompositeFragmentShader(...args)).toMatchSnapshot();
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
});
|
|
@@ -0,0 +1,168 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
compositeSlotMarker,
|
|
5
|
+
generateCompositeFragmentShader,
|
|
6
|
+
} from "./CompositeShader";
|
|
7
|
+
|
|
8
|
+
const ALL_OFF = {
|
|
9
|
+
hasHillshade: false,
|
|
10
|
+
hasWater: false,
|
|
11
|
+
hasElevationHeatmap: false,
|
|
12
|
+
hasWatermask: false,
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
describe("generateCompositeFragmentShader", () => {
|
|
16
|
+
it("emits MRT layout declarations for all three attachments", () => {
|
|
17
|
+
const src = generateCompositeFragmentShader(2, 2, 2, ALL_OFF);
|
|
18
|
+
expect(src).toContain("layout(location = 0) out vec4 colorBuffer;");
|
|
19
|
+
expect(src).toContain("layout(location = 1) out vec4 attrBuffer;");
|
|
20
|
+
expect(src).toContain("layout(location = 2) out vec4 normalBuffer;");
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
it("emits rasterCount + vectorCount compact slot blocks", () => {
|
|
24
|
+
const src = generateCompositeFragmentShader(2, 1, 24, ALL_OFF);
|
|
25
|
+
// Compact slot 0,1 are raster (absSlot 0,1); slot 2 is vector (absSlot 24).
|
|
26
|
+
expect(src).toContain(compositeSlotMarker(0, 0, false));
|
|
27
|
+
expect(src).toContain(compositeSlotMarker(1, 1, false));
|
|
28
|
+
expect(src).toContain(compositeSlotMarker(2, 24, true));
|
|
29
|
+
expect(src).not.toContain("compact slot 3");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
it("bakes the absolute slot index into winningSlot so winIdx stays correct in the main shader", () => {
|
|
33
|
+
// raster=1, vector=2, boundary=24 → compact 0=abs0, compact 1=abs24, compact 2=abs25.
|
|
34
|
+
const src = generateCompositeFragmentShader(1, 2, 24, ALL_OFF);
|
|
35
|
+
expect(src).toContain(compositeSlotMarker(0, 0, false));
|
|
36
|
+
expect(src).toContain(compositeSlotMarker(1, 24, true));
|
|
37
|
+
expect(src).toContain(compositeSlotMarker(2, 25, true));
|
|
38
|
+
expect(src).toMatch(/winningSlot = 0;[\s\S]*isTexturized = 0\.0;/);
|
|
39
|
+
expect(src).toMatch(/winningSlot = 24;[\s\S]*isTexturized = 1\.0;/);
|
|
40
|
+
expect(src).toMatch(/winningSlot = 25;[\s\S]*isTexturized = 1\.0;/);
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("sizes uniform arrays to (rasterCount + vectorCount)", () => {
|
|
44
|
+
const src = generateCompositeFragmentShader(2, 3, 24, ALL_OFF);
|
|
45
|
+
expect(src).toContain("uniform int uShows[5];");
|
|
46
|
+
expect(src).toContain("uniform sampler2D uTextures[5];");
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
it("elides hillshade uniforms and code when feature is off", () => {
|
|
50
|
+
const src = generateCompositeFragmentShader(2, 2, 2, ALL_OFF);
|
|
51
|
+
expect(src).not.toContain("uIsHillshades");
|
|
52
|
+
expect(src).not.toContain("uHillshadeExaggeration");
|
|
53
|
+
expect(src).not.toContain("hillshadeNormal = n0");
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("includes hillshade normal sampling per compact slot when feature is on", () => {
|
|
57
|
+
const src = generateCompositeFragmentShader(2, 0, 24, {
|
|
58
|
+
...ALL_OFF,
|
|
59
|
+
hasHillshade: true,
|
|
60
|
+
});
|
|
61
|
+
expect(src).toContain("uniform bool uIsHillshades[2];");
|
|
62
|
+
expect(src).toContain("uniform float uHillshadeExaggeration;");
|
|
63
|
+
expect(src).toContain("hillshadeNormal = n0 * 0.5 + 0.5;");
|
|
64
|
+
expect(src).toContain("hillshadeNormal = n1 * 0.5 + 0.5;");
|
|
65
|
+
// Hillshade slots must contribute no color to the composite.
|
|
66
|
+
expect(src).toContain(
|
|
67
|
+
"if (uIsHillshades[0]) {\n texColor0 = vec4(0.0)",
|
|
68
|
+
);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("elides water uniforms and writes constant isWater when off", () => {
|
|
72
|
+
const src = generateCompositeFragmentShader(2, 0, 24, ALL_OFF);
|
|
73
|
+
expect(src).not.toContain("uWaters");
|
|
74
|
+
expect(src).toContain("float isWater = 0.0;");
|
|
75
|
+
expect(src).not.toContain("isWater = uWaters[0]");
|
|
76
|
+
});
|
|
77
|
+
|
|
78
|
+
it("writes per-slot water flag when water is on", () => {
|
|
79
|
+
const src = generateCompositeFragmentShader(2, 0, 24, {
|
|
80
|
+
...ALL_OFF,
|
|
81
|
+
hasWater: true,
|
|
82
|
+
});
|
|
83
|
+
expect(src).toContain("uniform bool uWaters[2];");
|
|
84
|
+
expect(src).toContain("isWater = uWaters[0] ? 1.0 : 0.0;");
|
|
85
|
+
expect(src).toContain("isWater = uWaters[1] ? 1.0 : 0.0;");
|
|
86
|
+
// Precision-sensitive water params live in TileMesh's uniform arrays.
|
|
87
|
+
expect(src).not.toContain("uWaterScaleNormals");
|
|
88
|
+
expect(src).not.toContain("uWaterSpeeds");
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("elides elevation heatmap uniforms/sampling when off", () => {
|
|
92
|
+
const src = generateCompositeFragmentShader(2, 0, 24, ALL_OFF);
|
|
93
|
+
expect(src).not.toContain("uIsElevationHeatmaps");
|
|
94
|
+
expect(src).not.toContain("uColorMapTexture");
|
|
95
|
+
expect(src).not.toContain("sampleElevationBilinear");
|
|
96
|
+
});
|
|
97
|
+
|
|
98
|
+
it("emits elevation heatmap branch + colormap sample when on", () => {
|
|
99
|
+
const src = generateCompositeFragmentShader(2, 0, 24, {
|
|
100
|
+
...ALL_OFF,
|
|
101
|
+
hasElevationHeatmap: true,
|
|
102
|
+
});
|
|
103
|
+
expect(src).toContain("uniform bool uIsElevationHeatmaps[2];");
|
|
104
|
+
expect(src).toContain("uniform sampler2D uColorMapTexture;");
|
|
105
|
+
expect(src).toContain("if (uIsElevationHeatmaps[0])");
|
|
106
|
+
expect(src).toContain("sampleElevationBilinear(uTextures[0]");
|
|
107
|
+
});
|
|
108
|
+
|
|
109
|
+
it("encodes (winningSlot + 1) / 255 in attr.a", () => {
|
|
110
|
+
const src = generateCompositeFragmentShader(1, 0, 24, ALL_OFF);
|
|
111
|
+
expect(src).toContain("float(winningSlot + 1) / 255.0");
|
|
112
|
+
});
|
|
113
|
+
|
|
114
|
+
it("elides watermask uniform and sampling when feature is off", () => {
|
|
115
|
+
const src = generateCompositeFragmentShader(2, 0, 24, ALL_OFF);
|
|
116
|
+
expect(src).not.toContain("uWatermask");
|
|
117
|
+
expect(src).not.toContain("step(0.5, texture");
|
|
118
|
+
});
|
|
119
|
+
|
|
120
|
+
it("samples watermask after slot loop and OR's into isWater when on", () => {
|
|
121
|
+
const src = generateCompositeFragmentShader(2, 0, 24, {
|
|
122
|
+
...ALL_OFF,
|
|
123
|
+
hasWater: true,
|
|
124
|
+
hasWatermask: true,
|
|
125
|
+
});
|
|
126
|
+
expect(src).toContain("uniform sampler2D uWatermask;");
|
|
127
|
+
// Watermask priority: max() with step() over the slot-loop result so the
|
|
128
|
+
// watermask flips isWater on even when no slot's uWaters[k] was true.
|
|
129
|
+
expect(src).toMatch(
|
|
130
|
+
/isWater = max\(isWater, step\(0\.5, texture\(uWatermask, vUv\)\.r\)\);/,
|
|
131
|
+
);
|
|
132
|
+
});
|
|
133
|
+
|
|
134
|
+
it("emits watermask path even without hasWater (independent feature)", () => {
|
|
135
|
+
// hasWater off → per-slot water flag path is elided; watermask still works
|
|
136
|
+
// because it operates on the always-declared `isWater` variable.
|
|
137
|
+
const src = generateCompositeFragmentShader(1, 0, 24, {
|
|
138
|
+
...ALL_OFF,
|
|
139
|
+
hasWatermask: true,
|
|
140
|
+
});
|
|
141
|
+
expect(src).not.toContain("uWaters[");
|
|
142
|
+
expect(src).toContain("uniform sampler2D uWatermask;");
|
|
143
|
+
expect(src).toContain("isWater = max(isWater, step(0.5,");
|
|
144
|
+
});
|
|
145
|
+
|
|
146
|
+
it("handles vector-only (rasterCount=0) without emitting raster blocks", () => {
|
|
147
|
+
const src = generateCompositeFragmentShader(0, 2, 24, ALL_OFF);
|
|
148
|
+
expect(src).toContain(compositeSlotMarker(0, 24, true));
|
|
149
|
+
expect(src).toContain(compositeSlotMarker(1, 25, true));
|
|
150
|
+
expect(src).not.toContain("raster");
|
|
151
|
+
});
|
|
152
|
+
|
|
153
|
+
it("emits watermask-only shader (no slot uniforms) when both counts are 0", () => {
|
|
154
|
+
// Open-ocean tile: no raster + no vector layers, but a quantized-mesh
|
|
155
|
+
// watermask is present. GLSL forbids zero-length arrays so the per-slot
|
|
156
|
+
// declarations must be elided, but uWatermask and the post-loop sample
|
|
157
|
+
// must still be emitted so attr.r ends up flagged as water.
|
|
158
|
+
const src = generateCompositeFragmentShader(0, 0, 24, {
|
|
159
|
+
...ALL_OFF,
|
|
160
|
+
hasWatermask: true,
|
|
161
|
+
});
|
|
162
|
+
expect(src).not.toContain("uShows[");
|
|
163
|
+
expect(src).not.toContain("uTextures[");
|
|
164
|
+
expect(src).not.toContain("uColors[");
|
|
165
|
+
expect(src).toContain("uniform sampler2D uWatermask;");
|
|
166
|
+
expect(src).toContain("isWater = max(isWater, step(0.5,");
|
|
167
|
+
});
|
|
168
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import {
|
|
2
|
+
buildCompositeFragmentShader,
|
|
3
|
+
composeCompositeContributions,
|
|
4
|
+
compositeSlotMarker,
|
|
5
|
+
COMPOSITE_VERTEX_SHADER,
|
|
6
|
+
createCompositeLayerEnhancers,
|
|
7
|
+
} from "../material/enhancer/tileComposite";
|
|
8
|
+
|
|
9
|
+
import type { CompositeFeatures } from "./types";
|
|
10
|
+
|
|
11
|
+
// Re-exported from the composite enhancer modules so existing import sites
|
|
12
|
+
// (tests, index) keep resolving them from here.
|
|
13
|
+
export { compositeSlotMarker, COMPOSITE_VERTEX_SHADER };
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* Produce the fragment shader for the offscreen composite pass.
|
|
17
|
+
*
|
|
18
|
+
* Slot layout — to avoid wasting blocks on the sparse gap between active raster
|
|
19
|
+
* slots (low indices) and active vector slots (starting at
|
|
20
|
+
* `texturizedSceneIndexFrom`), the shader emits a **compact** index space:
|
|
21
|
+
*
|
|
22
|
+
* compact slot k ∈ [0, rasterCount) → absSlot = k (raster)
|
|
23
|
+
* compact slot k ∈ [rasterCount, rasterCount+vectorCount)
|
|
24
|
+
* → absSlot = texturizedSceneIndexFrom + (k - rasterCount)
|
|
25
|
+
*
|
|
26
|
+
* The absolute index is baked into `winningSlot = <abs>` so the TileMesh main
|
|
27
|
+
* shader's per-slot uniform arrays (sized at the original maxTextures) still
|
|
28
|
+
* index correctly via `winIdx`.
|
|
29
|
+
*
|
|
30
|
+
* Each expression (hillshade, elevation heatmap, water, watermask) is owned by a
|
|
31
|
+
* composite layer enhancer; `createCompositeLayerEnhancers` builds the chain for
|
|
32
|
+
* this feature set and `composeCompositeContributions` folds it onto the base
|
|
33
|
+
* enhancer's skeleton. CPU branch elision falls out naturally: an inactive
|
|
34
|
+
* enhancer contributes empty GLSL, so absent features cost nothing.
|
|
35
|
+
*/
|
|
36
|
+
export function generateCompositeFragmentShader(
|
|
37
|
+
rasterCount: number,
|
|
38
|
+
vectorCount: number,
|
|
39
|
+
texturizedSceneIndexFrom: number,
|
|
40
|
+
features: CompositeFeatures,
|
|
41
|
+
): string {
|
|
42
|
+
const enhancers = createCompositeLayerEnhancers(features);
|
|
43
|
+
const contributions = composeCompositeContributions(
|
|
44
|
+
enhancers,
|
|
45
|
+
rasterCount + vectorCount,
|
|
46
|
+
);
|
|
47
|
+
return buildCompositeFragmentShader(
|
|
48
|
+
rasterCount,
|
|
49
|
+
vectorCount,
|
|
50
|
+
texturizedSceneIndexFrom,
|
|
51
|
+
contributions,
|
|
52
|
+
);
|
|
53
|
+
}
|