@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,393 @@
|
|
|
1
|
+
import { Mesh, BoxGeometry, MeshBasicMaterial } from "three";
|
|
2
|
+
import { describe, expect, it, vi } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { TexturizedSceneByTileCoordinates } from "../scene";
|
|
5
|
+
|
|
6
|
+
import { TileMesh } from "./tile";
|
|
7
|
+
|
|
8
|
+
// The package barrel pulled in by tile.ts initializes a worker pool at module
|
|
9
|
+
// load (os.cpus()), which is unavailable in the test environment. Stub it.
|
|
10
|
+
vi.mock("@navaramap/worker", () => ({
|
|
11
|
+
initializeWorkerPool: vi.fn(),
|
|
12
|
+
terminateWorkerPool: vi.fn(),
|
|
13
|
+
}));
|
|
14
|
+
|
|
15
|
+
function createMockRenderer() {
|
|
16
|
+
return {
|
|
17
|
+
getContext: vi.fn(),
|
|
18
|
+
getPixelRatio: vi.fn().mockReturnValue(1),
|
|
19
|
+
getSize: vi.fn(),
|
|
20
|
+
setSize: vi.fn(),
|
|
21
|
+
render: vi.fn(),
|
|
22
|
+
} as unknown as ConstructorParameters<
|
|
23
|
+
typeof TexturizedSceneByTileCoordinates
|
|
24
|
+
>[0];
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function drapedMesh(): Mesh {
|
|
28
|
+
return new Mesh(new BoxGeometry(1, 1, 1), new MeshBasicMaterial());
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
/** One Rust-resolved vector-tile state (identity WebMercator drape). */
|
|
32
|
+
function state(layerId: string, tileHandle: bigint) {
|
|
33
|
+
return {
|
|
34
|
+
layer_id: layerId,
|
|
35
|
+
tile_handle: tileHandle,
|
|
36
|
+
uv_offset: new Float32Array([0, 0]),
|
|
37
|
+
uv_scale: new Float32Array([1, 1]),
|
|
38
|
+
reproject_terrain_lat: new Float32Array([]),
|
|
39
|
+
};
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
function makeTile(atlasSize = 512) {
|
|
43
|
+
const texturizedScenes = new TexturizedSceneByTileCoordinates(
|
|
44
|
+
createMockRenderer(),
|
|
45
|
+
);
|
|
46
|
+
const renderVectorScenes = vi.fn();
|
|
47
|
+
const markDirty = vi.fn();
|
|
48
|
+
const compositor = {
|
|
49
|
+
acquire: vi.fn(),
|
|
50
|
+
release: vi.fn(),
|
|
51
|
+
renderVectorScenes,
|
|
52
|
+
markDirty,
|
|
53
|
+
// Atlas / drape RT side length the TileMesh reads to size its render
|
|
54
|
+
// targets and per-tile GPU byte cost. The composite atlas is 512² on both
|
|
55
|
+
// desktop and mobile; this mock is parameterized so the sizing math can be
|
|
56
|
+
// exercised at other side lengths too.
|
|
57
|
+
size: atlasSize,
|
|
58
|
+
// Keep the MRT composite pass out of this test: it runs only when dirty,
|
|
59
|
+
// and _onBeforeRender returns right after the vector bake when it isn't.
|
|
60
|
+
cache: { isDirty: vi.fn().mockReturnValue(false) },
|
|
61
|
+
};
|
|
62
|
+
const getVectorTileStates = vi.fn().mockReturnValue([]);
|
|
63
|
+
const reportDrapeGpuBytes = vi.fn();
|
|
64
|
+
|
|
65
|
+
// The vector resolve revision the WASM side exposes: it changes only when the
|
|
66
|
+
// resolved slot set could have changed (a traverse ran / a scene became ready). The
|
|
67
|
+
// tile re-fetches its slots only when this differs from the last frame, so tests that
|
|
68
|
+
// change `getVectorTileStates` must bump it too (as a real traverse would).
|
|
69
|
+
let vectorRevision = 0;
|
|
70
|
+
const bumpRevision = () => {
|
|
71
|
+
vectorRevision += 1;
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const ctx = {
|
|
75
|
+
texturizedSceneByTileCoordinates: texturizedScenes,
|
|
76
|
+
tileTextureCompositor: compositor,
|
|
77
|
+
textureOptions: { maxTextures: 4, additionalTexturesInUse: {} },
|
|
78
|
+
tileMapByHandle: new Map(),
|
|
79
|
+
tileHandler: {
|
|
80
|
+
getVectorTileStates,
|
|
81
|
+
vectorRevision: () => vectorRevision,
|
|
82
|
+
getTile: vi.fn().mockReturnValue({ coords: { x: 0, y: 0, z: 0 } }),
|
|
83
|
+
reportDrapeGpuBytes,
|
|
84
|
+
},
|
|
85
|
+
} as unknown as ConstructorParameters<typeof TileMesh>[0];
|
|
86
|
+
|
|
87
|
+
const meshAdded = {
|
|
88
|
+
tile_handle: 1n,
|
|
89
|
+
} as unknown as ConstructorParameters<typeof TileMesh>[1];
|
|
90
|
+
|
|
91
|
+
const tile = new TileMesh(ctx, meshAdded);
|
|
92
|
+
|
|
93
|
+
return {
|
|
94
|
+
tile,
|
|
95
|
+
texturizedScenes,
|
|
96
|
+
renderVectorScenes,
|
|
97
|
+
getVectorTileStates,
|
|
98
|
+
reportDrapeGpuBytes,
|
|
99
|
+
bumpRevision,
|
|
100
|
+
};
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
const RT_BYTES = 512 * 512 * 4;
|
|
104
|
+
const ATLAS_BYTES = 512 * 512 * 4 * 3;
|
|
105
|
+
// A smaller 256² atlas / drape RT (a quarter of the 512² GPU cost), used to
|
|
106
|
+
// exercise the sizing math at a non-default side length. NOTE: the real mobile
|
|
107
|
+
// atlas is 512², same as desktop — 256² here is just a smaller parametric size.
|
|
108
|
+
const RT_BYTES_SMALL = 256 * 256 * 4;
|
|
109
|
+
const ATLAS_BYTES_SMALL = 256 * 256 * 4 * 3;
|
|
110
|
+
|
|
111
|
+
function renderTargetCount(tile: TileMesh): number {
|
|
112
|
+
return (tile as unknown as { texturizedSceneRenderTargets: unknown[] })
|
|
113
|
+
.texturizedSceneRenderTargets.length;
|
|
114
|
+
}
|
|
115
|
+
|
|
116
|
+
/** Invoke the private onBeforeRender hook (args are ignored by the impl). */
|
|
117
|
+
function frame(tile: TileMesh) {
|
|
118
|
+
(tile as unknown as { _onBeforeRender: () => void })._onBeforeRender();
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
describe("TileMesh vector bake dirty-gating", () => {
|
|
122
|
+
it("bakes on the first frame, then skips frames with no change", () => {
|
|
123
|
+
const { tile, texturizedScenes, renderVectorScenes, getVectorTileStates } =
|
|
124
|
+
makeTile();
|
|
125
|
+
|
|
126
|
+
// One clamp-to-ground layer resolved onto this terrain tile, backed by a
|
|
127
|
+
// populated WM vector scene (handle 1n).
|
|
128
|
+
getVectorTileStates.mockReturnValue([state("a", 1n)]);
|
|
129
|
+
texturizedScenes.add(1n, "a", drapedMesh(), 0);
|
|
130
|
+
|
|
131
|
+
frame(tile);
|
|
132
|
+
expect(renderVectorScenes).toHaveBeenCalledTimes(1);
|
|
133
|
+
|
|
134
|
+
// Nothing changed → signature stable → no re-bake.
|
|
135
|
+
frame(tile);
|
|
136
|
+
frame(tile);
|
|
137
|
+
expect(renderVectorScenes).toHaveBeenCalledTimes(1);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("re-bakes when the backing scene's revision changes", () => {
|
|
141
|
+
const { tile, texturizedScenes, renderVectorScenes, getVectorTileStates } =
|
|
142
|
+
makeTile();
|
|
143
|
+
|
|
144
|
+
getVectorTileStates.mockReturnValue([state("a", 1n)]);
|
|
145
|
+
texturizedScenes.add(1n, "a", drapedMesh(), 0);
|
|
146
|
+
|
|
147
|
+
frame(tile);
|
|
148
|
+
expect(renderVectorScenes).toHaveBeenCalledTimes(1);
|
|
149
|
+
|
|
150
|
+
// The backing scene's content changed (e.g. material/visibility) bumps the scene's
|
|
151
|
+
// revision. This is caught by the bake signature independently of the Rust resolve
|
|
152
|
+
// revision (which is unchanged here, so the slots are not re-fetched).
|
|
153
|
+
texturizedScenes.markDirty(1n, "a");
|
|
154
|
+
frame(tile);
|
|
155
|
+
expect(renderVectorScenes).toHaveBeenCalledTimes(2);
|
|
156
|
+
|
|
157
|
+
// Stable again.
|
|
158
|
+
frame(tile);
|
|
159
|
+
expect(renderVectorScenes).toHaveBeenCalledTimes(2);
|
|
160
|
+
});
|
|
161
|
+
|
|
162
|
+
it("re-bakes when the resolved slot set changes", () => {
|
|
163
|
+
const {
|
|
164
|
+
tile,
|
|
165
|
+
texturizedScenes,
|
|
166
|
+
renderVectorScenes,
|
|
167
|
+
getVectorTileStates,
|
|
168
|
+
bumpRevision,
|
|
169
|
+
} = makeTile();
|
|
170
|
+
|
|
171
|
+
getVectorTileStates.mockReturnValue([state("a", 1n)]);
|
|
172
|
+
texturizedScenes.add(1n, "a", drapedMesh(), 0);
|
|
173
|
+
|
|
174
|
+
frame(tile);
|
|
175
|
+
expect(renderVectorScenes).toHaveBeenCalledTimes(1);
|
|
176
|
+
|
|
177
|
+
// A second layer becomes resolved → slot set grows. The new resolution comes from a
|
|
178
|
+
// traverse, which bumps the revision; that's what makes the tile re-fetch its slots.
|
|
179
|
+
texturizedScenes.add(2n, "b", drapedMesh(), 1);
|
|
180
|
+
getVectorTileStates.mockReturnValue([state("a", 1n), state("b", 2n)]);
|
|
181
|
+
bumpRevision();
|
|
182
|
+
frame(tile);
|
|
183
|
+
expect(renderVectorScenes).toHaveBeenCalledTimes(2);
|
|
184
|
+
});
|
|
185
|
+
|
|
186
|
+
it("does not let a non-draped layer steal a slot from a draped one", () => {
|
|
187
|
+
const {
|
|
188
|
+
tile,
|
|
189
|
+
texturizedScenes,
|
|
190
|
+
renderVectorScenes,
|
|
191
|
+
getVectorTileStates,
|
|
192
|
+
bumpRevision,
|
|
193
|
+
} = makeTile();
|
|
194
|
+
|
|
195
|
+
// maxTextures 4 → numTexturizedVector 2. Rust returns THREE layers with a rendered
|
|
196
|
+
// tile, but only "a" and "c" are actually draped (have a texturized scene). "b" is a
|
|
197
|
+
// non-draped MVT layer rendered in the MRT scene; it must not occupy a bake slot and
|
|
198
|
+
// push "c" past the cap.
|
|
199
|
+
texturizedScenes.add(1n, "a", drapedMesh(), 0);
|
|
200
|
+
texturizedScenes.add(3n, "c", drapedMesh(), 2);
|
|
201
|
+
getVectorTileStates.mockReturnValue([
|
|
202
|
+
state("a", 1n),
|
|
203
|
+
state("b", 2n),
|
|
204
|
+
state("c", 3n),
|
|
205
|
+
]);
|
|
206
|
+
bumpRevision();
|
|
207
|
+
|
|
208
|
+
frame(tile);
|
|
209
|
+
|
|
210
|
+
const slots = (tile as unknown as { vectorSlots: { layerId: string }[] })
|
|
211
|
+
.vectorSlots;
|
|
212
|
+
expect(slots.map((s) => s.layerId).sort()).toEqual(["a", "c"]);
|
|
213
|
+
expect(renderVectorScenes).toHaveBeenCalledTimes(1);
|
|
214
|
+
});
|
|
215
|
+
|
|
216
|
+
it("skips the per-tile resolve fetch while the revision is unchanged", () => {
|
|
217
|
+
const { tile, texturizedScenes, getVectorTileStates } = makeTile();
|
|
218
|
+
|
|
219
|
+
getVectorTileStates.mockReturnValue([state("a", 1n)]);
|
|
220
|
+
texturizedScenes.add(1n, "a", drapedMesh(), 0);
|
|
221
|
+
|
|
222
|
+
frame(tile);
|
|
223
|
+
expect(getVectorTileStates).toHaveBeenCalledTimes(1);
|
|
224
|
+
|
|
225
|
+
// No revision change → the WASM-boundary resolve is not called again, even though
|
|
226
|
+
// its mock would now return a different set. This is the per-frame cost we removed.
|
|
227
|
+
getVectorTileStates.mockReturnValue([state("a", 1n), state("b", 2n)]);
|
|
228
|
+
frame(tile);
|
|
229
|
+
frame(tile);
|
|
230
|
+
expect(getVectorTileStates).toHaveBeenCalledTimes(1);
|
|
231
|
+
});
|
|
232
|
+
});
|
|
233
|
+
|
|
234
|
+
describe("TileMesh drape render-target lazy allocation + accounting", () => {
|
|
235
|
+
it("allocates no render targets and reports nothing while nothing drapes", () => {
|
|
236
|
+
const { tile, reportDrapeGpuBytes } = makeTile();
|
|
237
|
+
|
|
238
|
+
frame(tile);
|
|
239
|
+
|
|
240
|
+
expect(renderTargetCount(tile)).toBe(0);
|
|
241
|
+
// A tile that never draped reports nothing (its footprint never left 0).
|
|
242
|
+
expect(reportDrapeGpuBytes).not.toHaveBeenCalled();
|
|
243
|
+
});
|
|
244
|
+
|
|
245
|
+
it("allocates one render target per draped layer and reports the footprint", () => {
|
|
246
|
+
const {
|
|
247
|
+
tile,
|
|
248
|
+
texturizedScenes,
|
|
249
|
+
getVectorTileStates,
|
|
250
|
+
reportDrapeGpuBytes,
|
|
251
|
+
bumpRevision,
|
|
252
|
+
} = makeTile();
|
|
253
|
+
|
|
254
|
+
texturizedScenes.add(1n, "a", drapedMesh(), 0);
|
|
255
|
+
getVectorTileStates.mockReturnValue([state("a", 1n)]);
|
|
256
|
+
bumpRevision();
|
|
257
|
+
frame(tile);
|
|
258
|
+
|
|
259
|
+
expect(renderTargetCount(tile)).toBe(1);
|
|
260
|
+
// Footprint = composite atlas + one render target per draped layer.
|
|
261
|
+
expect(reportDrapeGpuBytes).toHaveBeenLastCalledWith(
|
|
262
|
+
1n,
|
|
263
|
+
ATLAS_BYTES + RT_BYTES,
|
|
264
|
+
);
|
|
265
|
+
|
|
266
|
+
// A second draped layer resolves → pool grows to 2, RT footprint doubles.
|
|
267
|
+
texturizedScenes.add(2n, "b", drapedMesh(), 1);
|
|
268
|
+
getVectorTileStates.mockReturnValue([state("a", 1n), state("b", 2n)]);
|
|
269
|
+
bumpRevision();
|
|
270
|
+
frame(tile);
|
|
271
|
+
|
|
272
|
+
expect(renderTargetCount(tile)).toBe(2);
|
|
273
|
+
expect(reportDrapeGpuBytes).toHaveBeenLastCalledWith(
|
|
274
|
+
1n,
|
|
275
|
+
ATLAS_BYTES + 2 * RT_BYTES,
|
|
276
|
+
);
|
|
277
|
+
});
|
|
278
|
+
|
|
279
|
+
it("disposes render targets and re-reports when a draped layer vanishes", () => {
|
|
280
|
+
const {
|
|
281
|
+
tile,
|
|
282
|
+
texturizedScenes,
|
|
283
|
+
getVectorTileStates,
|
|
284
|
+
reportDrapeGpuBytes,
|
|
285
|
+
bumpRevision,
|
|
286
|
+
} = makeTile();
|
|
287
|
+
|
|
288
|
+
texturizedScenes.add(1n, "a", drapedMesh(), 0);
|
|
289
|
+
texturizedScenes.add(2n, "b", drapedMesh(), 1);
|
|
290
|
+
getVectorTileStates.mockReturnValue([state("a", 1n), state("b", 2n)]);
|
|
291
|
+
bumpRevision();
|
|
292
|
+
frame(tile);
|
|
293
|
+
expect(renderTargetCount(tile)).toBe(2);
|
|
294
|
+
|
|
295
|
+
// "b" is no longer draped here → pool shrinks to 1, RT footprint halves.
|
|
296
|
+
getVectorTileStates.mockReturnValue([state("a", 1n)]);
|
|
297
|
+
bumpRevision();
|
|
298
|
+
frame(tile);
|
|
299
|
+
|
|
300
|
+
expect(renderTargetCount(tile)).toBe(1);
|
|
301
|
+
expect(reportDrapeGpuBytes).toHaveBeenLastCalledWith(
|
|
302
|
+
1n,
|
|
303
|
+
ATLAS_BYTES + RT_BYTES,
|
|
304
|
+
);
|
|
305
|
+
});
|
|
306
|
+
|
|
307
|
+
it("keeps charging the atlas when the last draped layer vanishes", () => {
|
|
308
|
+
const {
|
|
309
|
+
tile,
|
|
310
|
+
texturizedScenes,
|
|
311
|
+
getVectorTileStates,
|
|
312
|
+
reportDrapeGpuBytes,
|
|
313
|
+
bumpRevision,
|
|
314
|
+
} = makeTile();
|
|
315
|
+
|
|
316
|
+
texturizedScenes.add(1n, "a", drapedMesh(), 0);
|
|
317
|
+
getVectorTileStates.mockReturnValue([state("a", 1n)]);
|
|
318
|
+
bumpRevision();
|
|
319
|
+
frame(tile);
|
|
320
|
+
expect(renderTargetCount(tile)).toBe(1);
|
|
321
|
+
|
|
322
|
+
// All draped layers vanish → the render targets go, but the composite
|
|
323
|
+
// atlas is held for the tile's lifetime (acquired in the constructor), so
|
|
324
|
+
// the report must fall back to the atlas cost — not 0, which would wipe
|
|
325
|
+
// the baseline Rust seeds at mesh-attach time.
|
|
326
|
+
getVectorTileStates.mockReturnValue([]);
|
|
327
|
+
bumpRevision();
|
|
328
|
+
frame(tile);
|
|
329
|
+
|
|
330
|
+
expect(renderTargetCount(tile)).toBe(0);
|
|
331
|
+
expect(reportDrapeGpuBytes).toHaveBeenLastCalledWith(1n, ATLAS_BYTES);
|
|
332
|
+
});
|
|
333
|
+
|
|
334
|
+
it("tracks the compositor's atlas size for the atlas + drape footprint", () => {
|
|
335
|
+
// Drives the compositor size to 256² to confirm the per-tile cost tracks
|
|
336
|
+
// `compositor.size` (not a hardcoded 512²). This is a parametric size, not
|
|
337
|
+
// the mobile default — mobile also uses a 512² atlas.
|
|
338
|
+
const {
|
|
339
|
+
tile,
|
|
340
|
+
texturizedScenes,
|
|
341
|
+
getVectorTileStates,
|
|
342
|
+
reportDrapeGpuBytes,
|
|
343
|
+
bumpRevision,
|
|
344
|
+
} = makeTile(256);
|
|
345
|
+
|
|
346
|
+
texturizedScenes.add(1n, "a", drapedMesh(), 0);
|
|
347
|
+
getVectorTileStates.mockReturnValue([state("a", 1n)]);
|
|
348
|
+
bumpRevision();
|
|
349
|
+
frame(tile);
|
|
350
|
+
|
|
351
|
+
// One draped layer → atlas + one 256² render target, a quarter of 512².
|
|
352
|
+
expect(reportDrapeGpuBytes).toHaveBeenLastCalledWith(
|
|
353
|
+
1n,
|
|
354
|
+
ATLAS_BYTES_SMALL + RT_BYTES_SMALL,
|
|
355
|
+
);
|
|
356
|
+
|
|
357
|
+
// Last draped layer vanishes → falls back to the atlas seed, not 0.
|
|
358
|
+
getVectorTileStates.mockReturnValue([]);
|
|
359
|
+
bumpRevision();
|
|
360
|
+
frame(tile);
|
|
361
|
+
expect(reportDrapeGpuBytes).toHaveBeenLastCalledWith(1n, ATLAS_BYTES_SMALL);
|
|
362
|
+
});
|
|
363
|
+
|
|
364
|
+
it("frees render targets on dispose without a zero drape report", () => {
|
|
365
|
+
const {
|
|
366
|
+
tile,
|
|
367
|
+
texturizedScenes,
|
|
368
|
+
getVectorTileStates,
|
|
369
|
+
reportDrapeGpuBytes,
|
|
370
|
+
bumpRevision,
|
|
371
|
+
} = makeTile();
|
|
372
|
+
|
|
373
|
+
texturizedScenes.add(1n, "a", drapedMesh(), 0);
|
|
374
|
+
getVectorTileStates.mockReturnValue([state("a", 1n)]);
|
|
375
|
+
bumpRevision();
|
|
376
|
+
frame(tile);
|
|
377
|
+
expect(reportDrapeGpuBytes).toHaveBeenLastCalledWith(
|
|
378
|
+
1n,
|
|
379
|
+
ATLAS_BYTES + RT_BYTES,
|
|
380
|
+
);
|
|
381
|
+
const callsBeforeDispose = reportDrapeGpuBytes.mock.calls.length;
|
|
382
|
+
|
|
383
|
+
tile.dispose();
|
|
384
|
+
|
|
385
|
+
// Render targets are freed, but dispose must NOT report a zero cost: the
|
|
386
|
+
// handle is position-stable and reused by the replacement mesh entity, so a
|
|
387
|
+
// zero report would resolve (Without<Deleted>) to the NEW live entity and
|
|
388
|
+
// wipe the atlas cost the Rust side just seeded. The despawn of the old
|
|
389
|
+
// entity subtracts the cost from the ledger instead.
|
|
390
|
+
expect(renderTargetCount(tile)).toBe(0);
|
|
391
|
+
expect(reportDrapeGpuBytes.mock.calls.length).toBe(callsBeforeDispose);
|
|
392
|
+
});
|
|
393
|
+
});
|