@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,232 @@
|
|
|
1
|
+
import { describe, it, expect, beforeEach } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { HillshadeContext } from "./HillshadeContext";
|
|
4
|
+
import type { HillshadeConfig } from "./HillshadeContext";
|
|
5
|
+
|
|
6
|
+
describe("HillshadeContext", () => {
|
|
7
|
+
let context: HillshadeContext;
|
|
8
|
+
const mockConfig: HillshadeConfig = {
|
|
9
|
+
rgbScaler: [1, 1, 1],
|
|
10
|
+
boundary: 0,
|
|
11
|
+
minOffset: 0,
|
|
12
|
+
maxOffset: 0,
|
|
13
|
+
epsilon: 1.0,
|
|
14
|
+
offset: 0,
|
|
15
|
+
};
|
|
16
|
+
|
|
17
|
+
beforeEach(() => {
|
|
18
|
+
context = new HillshadeContext();
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
describe("pendingEdges management", () => {
|
|
22
|
+
it("allows multiple edges for same entity", () => {
|
|
23
|
+
const entityId = "tile_1";
|
|
24
|
+
const edge0 = new Uint8Array([1, 2, 3, 4]);
|
|
25
|
+
const edge1 = new Uint8Array([5, 6, 7, 8]);
|
|
26
|
+
|
|
27
|
+
const pending = new Map<number, Uint8Array>();
|
|
28
|
+
pending.set(0, edge0);
|
|
29
|
+
pending.set(1, edge1);
|
|
30
|
+
context.pendingEdges.set(entityId, pending);
|
|
31
|
+
|
|
32
|
+
const stored = context.pendingEdges.get(entityId);
|
|
33
|
+
expect(stored).toBeDefined();
|
|
34
|
+
expect(stored?.size).toBe(2);
|
|
35
|
+
expect(stored?.get(0)).toBe(edge0);
|
|
36
|
+
expect(stored?.get(1)).toBe(edge1);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("overwrites pending edge for same direction", () => {
|
|
40
|
+
const entityId = "tile_1";
|
|
41
|
+
const oldEdge = new Uint8Array([1, 2, 3, 4]);
|
|
42
|
+
const newEdge = new Uint8Array([5, 6, 7, 8]);
|
|
43
|
+
|
|
44
|
+
const pending = new Map<number, Uint8Array>();
|
|
45
|
+
pending.set(0, oldEdge);
|
|
46
|
+
context.pendingEdges.set(entityId, pending);
|
|
47
|
+
|
|
48
|
+
// Overwrite with new edge
|
|
49
|
+
pending.set(0, newEdge);
|
|
50
|
+
|
|
51
|
+
const stored = context.pendingEdges.get(entityId);
|
|
52
|
+
expect(stored).toBeDefined();
|
|
53
|
+
expect(stored?.get(0)).toBe(newEdge);
|
|
54
|
+
expect(stored?.get(0)).not.toBe(oldEdge);
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("tempDemTextures lifecycle", () => {
|
|
59
|
+
it("stores and retrieves temp DEM entry", () => {
|
|
60
|
+
const entityId = "tile_1";
|
|
61
|
+
const originalHandle = 42;
|
|
62
|
+
|
|
63
|
+
context.storeTempDem(entityId, originalHandle, 6, 1.0, mockConfig);
|
|
64
|
+
|
|
65
|
+
const entry = context.getTempDem(entityId);
|
|
66
|
+
expect(entry).toBeDefined();
|
|
67
|
+
expect(entry?.originalHandle).toBe(originalHandle);
|
|
68
|
+
expect(entry?.paddedSize).toBe(6);
|
|
69
|
+
expect(entry?.metersPerTexel).toBe(1.0);
|
|
70
|
+
expect(entry?.receivedEdges.size).toBe(0);
|
|
71
|
+
});
|
|
72
|
+
|
|
73
|
+
it("initializes with empty receivedEdges set and receivedEdgeData map", () => {
|
|
74
|
+
const entityId = "tile_1";
|
|
75
|
+
|
|
76
|
+
context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
|
|
77
|
+
|
|
78
|
+
const entry = context.getTempDem(entityId);
|
|
79
|
+
expect(entry).toBeDefined();
|
|
80
|
+
expect(entry?.receivedEdges).toBeInstanceOf(Set);
|
|
81
|
+
expect(entry?.receivedEdges.size).toBe(0);
|
|
82
|
+
expect(entry?.receivedEdgeData).toBeInstanceOf(Map);
|
|
83
|
+
expect(entry?.receivedEdgeData.size).toBe(0);
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
it("stores edge data via storeEdgeData", () => {
|
|
87
|
+
const entityId = "tile_1";
|
|
88
|
+
context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
|
|
89
|
+
|
|
90
|
+
const edgeBytes = new Uint8Array([1, 2, 3, 4]);
|
|
91
|
+
context.storeEdgeData(entityId, 0, edgeBytes);
|
|
92
|
+
|
|
93
|
+
const entry = context.getTempDem(entityId);
|
|
94
|
+
expect(entry?.receivedEdgeData.get(0)).toBe(edgeBytes);
|
|
95
|
+
});
|
|
96
|
+
|
|
97
|
+
it("tracks edge reception", () => {
|
|
98
|
+
const entityId = "tile_1";
|
|
99
|
+
|
|
100
|
+
context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
|
|
101
|
+
|
|
102
|
+
expect(context.markEdgeReceived(entityId, 0)).toBe(false); // 1/4
|
|
103
|
+
expect(context.markEdgeReceived(entityId, 1)).toBe(false); // 2/4
|
|
104
|
+
expect(context.markEdgeReceived(entityId, 2)).toBe(false); // 3/4
|
|
105
|
+
expect(context.markEdgeReceived(entityId, 3)).toBe(true); // 4/4 - all received
|
|
106
|
+
|
|
107
|
+
const entry = context.getTempDem(entityId);
|
|
108
|
+
expect(entry).toBeDefined();
|
|
109
|
+
expect(entry?.receivedEdges.size).toBe(4);
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
it("handles duplicate edge reception", () => {
|
|
113
|
+
const entityId = "tile_1";
|
|
114
|
+
|
|
115
|
+
context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
|
|
116
|
+
|
|
117
|
+
expect(context.markEdgeReceived(entityId, 0)).toBe(false);
|
|
118
|
+
expect(context.markEdgeReceived(entityId, 0)).toBe(false); // Duplicate
|
|
119
|
+
expect(context.markEdgeReceived(entityId, 0)).toBe(false); // Duplicate
|
|
120
|
+
|
|
121
|
+
const entry = context.getTempDem(entityId);
|
|
122
|
+
expect(entry).toBeDefined();
|
|
123
|
+
expect(entry?.receivedEdges.size).toBe(1); // Still only 1 edge
|
|
124
|
+
});
|
|
125
|
+
|
|
126
|
+
it("clears temp DEM entry", () => {
|
|
127
|
+
const entityId = "tile_1";
|
|
128
|
+
|
|
129
|
+
context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
|
|
130
|
+
expect(context.getTempDem(entityId)).toBeDefined();
|
|
131
|
+
|
|
132
|
+
context.clearTempDem(entityId);
|
|
133
|
+
|
|
134
|
+
expect(context.getTempDem(entityId)).toBeUndefined();
|
|
135
|
+
});
|
|
136
|
+
|
|
137
|
+
it("replaces existing temp DEM when storing new one", () => {
|
|
138
|
+
const entityId = "tile_1";
|
|
139
|
+
|
|
140
|
+
context.storeTempDem(entityId, 10, 6, 1.0, mockConfig);
|
|
141
|
+
context.markEdgeReceived(entityId, 0);
|
|
142
|
+
|
|
143
|
+
// Store new DEM (replaces old one)
|
|
144
|
+
context.storeTempDem(entityId, 20, 6, 2.0, mockConfig);
|
|
145
|
+
|
|
146
|
+
const entry = context.getTempDem(entityId);
|
|
147
|
+
expect(entry).toBeDefined();
|
|
148
|
+
expect(entry?.originalHandle).toBe(20);
|
|
149
|
+
expect(entry?.metersPerTexel).toBe(2.0);
|
|
150
|
+
expect(entry?.receivedEdges.size).toBe(0); // Reset
|
|
151
|
+
});
|
|
152
|
+
});
|
|
153
|
+
|
|
154
|
+
describe("edge-driven lifecycle integration", () => {
|
|
155
|
+
it("scenario: all edges arrive before texture creation", () => {
|
|
156
|
+
const entityId = "tile_1";
|
|
157
|
+
|
|
158
|
+
const pending = new Map<number, Uint8Array>();
|
|
159
|
+
pending.set(0, new Uint8Array([1, 2, 3, 4]));
|
|
160
|
+
pending.set(1, new Uint8Array([5, 6, 7, 8]));
|
|
161
|
+
pending.set(2, new Uint8Array([9, 10, 11, 12]));
|
|
162
|
+
pending.set(3, new Uint8Array([13, 14, 15, 16]));
|
|
163
|
+
context.pendingEdges.set(entityId, pending);
|
|
164
|
+
|
|
165
|
+
context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
|
|
166
|
+
|
|
167
|
+
context.markEdgeReceived(entityId, 0);
|
|
168
|
+
context.markEdgeReceived(entityId, 1);
|
|
169
|
+
context.markEdgeReceived(entityId, 2);
|
|
170
|
+
const allReceived = context.markEdgeReceived(entityId, 3);
|
|
171
|
+
|
|
172
|
+
expect(allReceived).toBe(true);
|
|
173
|
+
const finalEntry = context.getTempDem(entityId);
|
|
174
|
+
expect(finalEntry).toBeDefined();
|
|
175
|
+
expect(finalEntry?.receivedEdges.size).toBe(4);
|
|
176
|
+
|
|
177
|
+
context.clearTempDem(entityId);
|
|
178
|
+
expect(context.getTempDem(entityId)).toBeUndefined();
|
|
179
|
+
});
|
|
180
|
+
|
|
181
|
+
it("scenario: edges arrive after texture, then all cleared", () => {
|
|
182
|
+
const entityId = "tile_1";
|
|
183
|
+
|
|
184
|
+
context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
|
|
185
|
+
|
|
186
|
+
expect(context.markEdgeReceived(entityId, 0)).toBe(false);
|
|
187
|
+
expect(context.markEdgeReceived(entityId, 1)).toBe(false);
|
|
188
|
+
expect(context.markEdgeReceived(entityId, 2)).toBe(false);
|
|
189
|
+
expect(context.markEdgeReceived(entityId, 3)).toBe(true);
|
|
190
|
+
|
|
191
|
+
context.clearTempDem(entityId);
|
|
192
|
+
expect(context.getTempDem(entityId)).toBeUndefined();
|
|
193
|
+
});
|
|
194
|
+
|
|
195
|
+
it("scenario: late edge arrives after temp DEM cleared", () => {
|
|
196
|
+
const entityId = "tile_1";
|
|
197
|
+
|
|
198
|
+
context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
|
|
199
|
+
|
|
200
|
+
context.markEdgeReceived(entityId, 0);
|
|
201
|
+
context.markEdgeReceived(entityId, 1);
|
|
202
|
+
context.markEdgeReceived(entityId, 2);
|
|
203
|
+
context.markEdgeReceived(entityId, 3);
|
|
204
|
+
|
|
205
|
+
context.clearTempDem(entityId);
|
|
206
|
+
|
|
207
|
+
const result = context.markEdgeReceived(entityId, 0);
|
|
208
|
+
expect(result).toBe(false); // No temp DEM exists
|
|
209
|
+
});
|
|
210
|
+
|
|
211
|
+
it("scenario: mixed order (some pending, some after)", () => {
|
|
212
|
+
const entityId = "tile_1";
|
|
213
|
+
|
|
214
|
+
const pending = new Map<number, Uint8Array>();
|
|
215
|
+
pending.set(0, new Uint8Array([1, 2, 3, 4]));
|
|
216
|
+
pending.set(2, new Uint8Array([9, 10, 11, 12]));
|
|
217
|
+
context.pendingEdges.set(entityId, pending);
|
|
218
|
+
|
|
219
|
+
context.storeTempDem(entityId, 1, 6, 1.0, mockConfig);
|
|
220
|
+
|
|
221
|
+
context.markEdgeReceived(entityId, 0);
|
|
222
|
+
context.markEdgeReceived(entityId, 2);
|
|
223
|
+
|
|
224
|
+
expect(context.markEdgeReceived(entityId, 1)).toBe(false);
|
|
225
|
+
expect(context.markEdgeReceived(entityId, 3)).toBe(true);
|
|
226
|
+
|
|
227
|
+
const mixedEntry = context.getTempDem(entityId);
|
|
228
|
+
expect(mixedEntry).toBeDefined();
|
|
229
|
+
expect(mixedEntry?.receivedEdges.size).toBe(4);
|
|
230
|
+
});
|
|
231
|
+
});
|
|
232
|
+
});
|
|
@@ -0,0 +1,299 @@
|
|
|
1
|
+
import type { Texture } from "three";
|
|
2
|
+
import {
|
|
3
|
+
ClampToEdgeWrapping,
|
|
4
|
+
DataTexture,
|
|
5
|
+
LinearFilter,
|
|
6
|
+
NearestFilter,
|
|
7
|
+
NoColorSpace,
|
|
8
|
+
RGBAFormat,
|
|
9
|
+
RGBFormat,
|
|
10
|
+
UnsignedByteType,
|
|
11
|
+
WebGLRenderTarget,
|
|
12
|
+
} from "three";
|
|
13
|
+
|
|
14
|
+
import type { ViewContext } from "../core";
|
|
15
|
+
import { HillshadeNormalMapGenerator } from "../utils/hillshadeNormalMapGenerator";
|
|
16
|
+
|
|
17
|
+
import type { TileHandler } from "./context";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Hillshade decoder configuration from Rust
|
|
21
|
+
*/
|
|
22
|
+
export type HillshadeConfig = {
|
|
23
|
+
rgbScaler: [number, number, number]; // vec3: [R, G, B] scalers
|
|
24
|
+
boundary: number;
|
|
25
|
+
minOffset: number;
|
|
26
|
+
maxOffset: number;
|
|
27
|
+
epsilon: number;
|
|
28
|
+
offset: number;
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Temporary DEM state while waiting for edge updates.
|
|
33
|
+
* Stores only the WASM buffer handle and received edge strips — NOT the full padded DEM.
|
|
34
|
+
* The padded DEM is reconstructed transiently on each edge arrival, then discarded.
|
|
35
|
+
*/
|
|
36
|
+
type TempDemEntry = {
|
|
37
|
+
originalHandle: number;
|
|
38
|
+
paddedSize: number;
|
|
39
|
+
receivedEdges: Set<number>;
|
|
40
|
+
receivedEdgeData: Map<number, Uint8Array>;
|
|
41
|
+
metersPerTexel: number;
|
|
42
|
+
hillshadeConfig: HillshadeConfig;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* Context for managing hillshade-related state and resources
|
|
47
|
+
* Centralizes all hillshade processing state to avoid scattered global variables
|
|
48
|
+
*/
|
|
49
|
+
export class HillshadeContext {
|
|
50
|
+
/** Shared normal map generator for offline rendering */
|
|
51
|
+
private normalMapGenerator: HillshadeNormalMapGenerator | null = null;
|
|
52
|
+
|
|
53
|
+
/** Scale factor for normal map RenderTarget dimensions (1.0 = full res, 0.5 = half res for mobile) */
|
|
54
|
+
normalMapScale = 1.0;
|
|
55
|
+
|
|
56
|
+
/** Pending edge updates that arrived before the main texture was created */
|
|
57
|
+
readonly pendingEdges = new Map<string, Map<number, Uint8Array>>();
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Temporary storage for DEM reconstruction state while waiting for edge updates.
|
|
61
|
+
* entityId → { originalHandle, paddedSize, receivedEdges, receivedEdgeData, ... }
|
|
62
|
+
*/
|
|
63
|
+
readonly tempDemTextures = new Map<string, TempDemEntry>();
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* RenderTarget pool for normal map generation
|
|
67
|
+
* One RenderTarget per entity to avoid GPU→CPU→GPU round-trip
|
|
68
|
+
* Similar to texturizedSceneRenderTargets in tile.ts
|
|
69
|
+
*/
|
|
70
|
+
private renderTargets = new Map<string, WebGLRenderTarget>();
|
|
71
|
+
|
|
72
|
+
/**
|
|
73
|
+
* Get or create the normal map generator
|
|
74
|
+
* @param viewContext - ViewContext to get the renderer from
|
|
75
|
+
*/
|
|
76
|
+
getOrCreateGenerator(viewContext: ViewContext): HillshadeNormalMapGenerator {
|
|
77
|
+
if (!this.normalMapGenerator) {
|
|
78
|
+
const renderer = viewContext.getRenderer();
|
|
79
|
+
this.normalMapGenerator = new HillshadeNormalMapGenerator(renderer);
|
|
80
|
+
}
|
|
81
|
+
return this.normalMapGenerator;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/**
|
|
85
|
+
* Get hillshade decoder config from tile
|
|
86
|
+
* @param tileHandler - TileHandler to query WASM
|
|
87
|
+
* @param tileHandle - Tile handle to get elevation decoder from
|
|
88
|
+
*/
|
|
89
|
+
getHillshadeConfig(
|
|
90
|
+
tileHandler: TileHandler,
|
|
91
|
+
tileHandle: bigint,
|
|
92
|
+
): HillshadeConfig {
|
|
93
|
+
const decoder = tileHandler.getTileElevationDecoder(tileHandle);
|
|
94
|
+
|
|
95
|
+
if (decoder) {
|
|
96
|
+
return {
|
|
97
|
+
rgbScaler: [decoder.r_scaler, decoder.g_scaler, decoder.b_scaler],
|
|
98
|
+
boundary: decoder.boundary,
|
|
99
|
+
minOffset: decoder.min_offset,
|
|
100
|
+
maxOffset: decoder.max_offset,
|
|
101
|
+
epsilon: decoder.epsilon,
|
|
102
|
+
offset: decoder.offset,
|
|
103
|
+
};
|
|
104
|
+
} else {
|
|
105
|
+
// Fallback to Terrarium defaults if no decoder found
|
|
106
|
+
return {
|
|
107
|
+
rgbScaler: [256, 1, 1 / 256],
|
|
108
|
+
boundary: 0,
|
|
109
|
+
minOffset: 0,
|
|
110
|
+
maxOffset: 0,
|
|
111
|
+
epsilon: 1.0,
|
|
112
|
+
offset: -32768,
|
|
113
|
+
};
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
|
|
117
|
+
/**
|
|
118
|
+
* Get or create a RenderTarget for the given entity
|
|
119
|
+
* Reuses existing RenderTarget if size matches, creates new one otherwise
|
|
120
|
+
* @private
|
|
121
|
+
*/
|
|
122
|
+
private getOrCreateRenderTarget(
|
|
123
|
+
entityId: string,
|
|
124
|
+
width: number,
|
|
125
|
+
height: number,
|
|
126
|
+
): WebGLRenderTarget {
|
|
127
|
+
let rt = this.renderTargets.get(entityId);
|
|
128
|
+
|
|
129
|
+
// Check if size matches (different zoom levels may have different sizes)
|
|
130
|
+
if (rt && (rt.width !== width || rt.height !== height)) {
|
|
131
|
+
rt.dispose();
|
|
132
|
+
rt = undefined;
|
|
133
|
+
}
|
|
134
|
+
|
|
135
|
+
if (!rt) {
|
|
136
|
+
rt = new WebGLRenderTarget(width, height, {
|
|
137
|
+
format: RGBFormat,
|
|
138
|
+
type: UnsignedByteType,
|
|
139
|
+
minFilter: LinearFilter,
|
|
140
|
+
magFilter: LinearFilter,
|
|
141
|
+
wrapS: ClampToEdgeWrapping,
|
|
142
|
+
wrapT: ClampToEdgeWrapping,
|
|
143
|
+
colorSpace: NoColorSpace,
|
|
144
|
+
generateMipmaps: false,
|
|
145
|
+
});
|
|
146
|
+
this.renderTargets.set(entityId, rt);
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
return rt;
|
|
150
|
+
}
|
|
151
|
+
|
|
152
|
+
/**
|
|
153
|
+
* Generate normal map texture from DEM data
|
|
154
|
+
* Creates a transient DataTexture for GPU upload, renders to RenderTarget, then frees the DEM texture.
|
|
155
|
+
* @param entityId - Entity ID for RenderTarget lookup/creation
|
|
156
|
+
* @param viewContext - ViewContext to get the renderer from
|
|
157
|
+
* @param demData - Padded DEM pixel data (CPU only, not GPU-resident)
|
|
158
|
+
* @param paddedSize - Width/height of the padded DEM (square)
|
|
159
|
+
* @param metersPerTexel - Meters per texel for normal calculation
|
|
160
|
+
* @param hillshadeConfig - Hillshade decoder configuration
|
|
161
|
+
* @param contentWidth - Content width (without padding)
|
|
162
|
+
* @param contentHeight - Content height (without padding)
|
|
163
|
+
* @returns Normal map texture (references RenderTarget.texture directly)
|
|
164
|
+
*/
|
|
165
|
+
generateNormalMap(
|
|
166
|
+
entityId: string,
|
|
167
|
+
viewContext: ViewContext,
|
|
168
|
+
demData: Uint8Array,
|
|
169
|
+
paddedSize: number,
|
|
170
|
+
metersPerTexel: number,
|
|
171
|
+
hillshadeConfig: HillshadeConfig,
|
|
172
|
+
contentWidth: number,
|
|
173
|
+
contentHeight: number,
|
|
174
|
+
): Texture {
|
|
175
|
+
const renderTarget = this.getOrCreateRenderTarget(
|
|
176
|
+
entityId,
|
|
177
|
+
Math.max(1, Math.round(contentWidth * this.normalMapScale)),
|
|
178
|
+
Math.max(1, Math.round(contentHeight * this.normalMapScale)),
|
|
179
|
+
);
|
|
180
|
+
|
|
181
|
+
// Create a transient DataTexture for GPU upload, render, then dispose immediately
|
|
182
|
+
const demTexture = new DataTexture(
|
|
183
|
+
demData,
|
|
184
|
+
paddedSize,
|
|
185
|
+
paddedSize,
|
|
186
|
+
RGBAFormat,
|
|
187
|
+
UnsignedByteType,
|
|
188
|
+
);
|
|
189
|
+
demTexture.colorSpace = NoColorSpace;
|
|
190
|
+
demTexture.minFilter = NearestFilter;
|
|
191
|
+
demTexture.magFilter = NearestFilter;
|
|
192
|
+
demTexture.needsUpdate = true;
|
|
193
|
+
|
|
194
|
+
const generator = this.getOrCreateGenerator(viewContext);
|
|
195
|
+
generator.renderToTarget(
|
|
196
|
+
renderTarget,
|
|
197
|
+
demTexture,
|
|
198
|
+
metersPerTexel,
|
|
199
|
+
hillshadeConfig,
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
demTexture.dispose();
|
|
203
|
+
|
|
204
|
+
return renderTarget.texture;
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
/**
|
|
208
|
+
* Clear RenderTarget for the given entity
|
|
209
|
+
*/
|
|
210
|
+
clearRenderTarget(entityId: string): void {
|
|
211
|
+
const rt = this.renderTargets.get(entityId);
|
|
212
|
+
if (rt) {
|
|
213
|
+
rt.dispose();
|
|
214
|
+
this.renderTargets.delete(entityId);
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
|
|
218
|
+
/**
|
|
219
|
+
* Store temporary DEM entry (WASM handle + metadata) for edge updates.
|
|
220
|
+
* Does NOT store the full padded DEM — only the handle needed to re-read on demand.
|
|
221
|
+
*/
|
|
222
|
+
storeTempDem(
|
|
223
|
+
entityId: string,
|
|
224
|
+
originalHandle: number,
|
|
225
|
+
paddedSize: number,
|
|
226
|
+
metersPerTexel: number,
|
|
227
|
+
hillshadeConfig: HillshadeConfig,
|
|
228
|
+
): void {
|
|
229
|
+
this.tempDemTextures.set(entityId, {
|
|
230
|
+
originalHandle,
|
|
231
|
+
paddedSize,
|
|
232
|
+
receivedEdges: new Set(),
|
|
233
|
+
receivedEdgeData: new Map(),
|
|
234
|
+
metersPerTexel,
|
|
235
|
+
hillshadeConfig,
|
|
236
|
+
});
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
/**
|
|
240
|
+
* Store an edge pixel strip for later padded DEM reconstruction.
|
|
241
|
+
*/
|
|
242
|
+
storeEdgeData(
|
|
243
|
+
entityId: string,
|
|
244
|
+
edgeDirection: number,
|
|
245
|
+
edgeBytes: Uint8Array,
|
|
246
|
+
): void {
|
|
247
|
+
const entry = this.tempDemTextures.get(entityId);
|
|
248
|
+
if (entry) {
|
|
249
|
+
entry.receivedEdgeData.set(edgeDirection, edgeBytes);
|
|
250
|
+
}
|
|
251
|
+
}
|
|
252
|
+
|
|
253
|
+
/**
|
|
254
|
+
* Get temporary DEM texture entry
|
|
255
|
+
*/
|
|
256
|
+
getTempDem(entityId: string): TempDemEntry | undefined {
|
|
257
|
+
return this.tempDemTextures.get(entityId);
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
/**
|
|
261
|
+
* Mark an edge as received for a temporary DEM
|
|
262
|
+
* @returns true if all 4 edges have been received
|
|
263
|
+
*/
|
|
264
|
+
markEdgeReceived(entityId: string, edgeDirection: number): boolean {
|
|
265
|
+
const entry = this.tempDemTextures.get(entityId);
|
|
266
|
+
if (!entry) return false;
|
|
267
|
+
|
|
268
|
+
entry.receivedEdges.add(edgeDirection);
|
|
269
|
+
return entry.receivedEdges.size >= 4; // All 4 edges received
|
|
270
|
+
}
|
|
271
|
+
|
|
272
|
+
/**
|
|
273
|
+
* Clear temporary DEM data
|
|
274
|
+
*/
|
|
275
|
+
clearTempDem(entityId: string): void {
|
|
276
|
+
this.tempDemTextures.delete(entityId);
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/**
|
|
280
|
+
* Cleanup all resources
|
|
281
|
+
* Should be called on view disposal
|
|
282
|
+
*/
|
|
283
|
+
dispose(): void {
|
|
284
|
+
this.tempDemTextures.clear();
|
|
285
|
+
this.pendingEdges.clear();
|
|
286
|
+
|
|
287
|
+
// Dispose all RenderTargets
|
|
288
|
+
for (const rt of this.renderTargets.values()) {
|
|
289
|
+
rt.dispose();
|
|
290
|
+
}
|
|
291
|
+
this.renderTargets.clear();
|
|
292
|
+
|
|
293
|
+
// Dispose generator
|
|
294
|
+
if (this.normalMapGenerator) {
|
|
295
|
+
this.normalMapGenerator.dispose();
|
|
296
|
+
this.normalMapGenerator = null;
|
|
297
|
+
}
|
|
298
|
+
}
|
|
299
|
+
}
|