@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,67 @@
|
|
|
1
|
+
import FlatPolylineFragShader from "@shaders/glsl/flatPolyline.frag.glsl";
|
|
2
|
+
import FlatPolylineVertShader from "@shaders/glsl/flatPolyline.vert.glsl";
|
|
3
|
+
import PolylineFragShader from "@shaders/glsl/polyline.frag.glsl";
|
|
4
|
+
import PolylineVertShader from "@shaders/glsl/polyline.vert.glsl";
|
|
5
|
+
import { describe, it, expect } from "vitest";
|
|
6
|
+
|
|
7
|
+
import { createPolylineBaseEnhancer, type SupportedMaterial } from ".";
|
|
8
|
+
|
|
9
|
+
describe("polylineBaseEnhancer shader selection", () => {
|
|
10
|
+
it("should use FlatPolyline shaders when isTexturized is true", () => {
|
|
11
|
+
const material = {
|
|
12
|
+
type: "ShaderMaterial",
|
|
13
|
+
userData: {},
|
|
14
|
+
} as unknown as SupportedMaterial;
|
|
15
|
+
|
|
16
|
+
const enhancer = createPolylineBaseEnhancer(material);
|
|
17
|
+
|
|
18
|
+
// Mount with isTexturized = true
|
|
19
|
+
enhancer.mount({
|
|
20
|
+
isTexturized: true,
|
|
21
|
+
});
|
|
22
|
+
|
|
23
|
+
// Create a mock shader object
|
|
24
|
+
const shader = {
|
|
25
|
+
vertexShader: "",
|
|
26
|
+
fragmentShader: "",
|
|
27
|
+
uniforms: {},
|
|
28
|
+
defines: {},
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
// Transform the shader
|
|
32
|
+
enhancer.transformShader(shader as any);
|
|
33
|
+
|
|
34
|
+
// Verify that FlatPolyline shaders are used
|
|
35
|
+
expect(shader.vertexShader).toBe(FlatPolylineVertShader);
|
|
36
|
+
expect(shader.fragmentShader).toBe(FlatPolylineFragShader);
|
|
37
|
+
});
|
|
38
|
+
|
|
39
|
+
it("should use PolylineFragShader when isTexturized is false", () => {
|
|
40
|
+
const material = {
|
|
41
|
+
type: "ShaderMaterial",
|
|
42
|
+
userData: {},
|
|
43
|
+
} as unknown as SupportedMaterial;
|
|
44
|
+
|
|
45
|
+
const enhancer = createPolylineBaseEnhancer(material);
|
|
46
|
+
|
|
47
|
+
// Mount with isTexturized = false
|
|
48
|
+
enhancer.mount({
|
|
49
|
+
isTexturized: false,
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
// Create a mock shader object
|
|
53
|
+
const shader = {
|
|
54
|
+
vertexShader: "",
|
|
55
|
+
fragmentShader: "",
|
|
56
|
+
uniforms: {},
|
|
57
|
+
defines: {},
|
|
58
|
+
};
|
|
59
|
+
|
|
60
|
+
// Transform the shader
|
|
61
|
+
enhancer.transformShader(shader as any);
|
|
62
|
+
|
|
63
|
+
// Verify that PolylineVertShader and PolylineFragShader are used
|
|
64
|
+
expect(shader.vertexShader).toBe(PolylineVertShader);
|
|
65
|
+
expect(shader.fragmentShader).toContain(PolylineFragShader);
|
|
66
|
+
});
|
|
67
|
+
});
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import FlatPolylineFragShader from "@shaders/glsl/flatPolyline.frag.glsl";
|
|
2
|
+
import FlatPolylineVertShader from "@shaders/glsl/flatPolyline.vert.glsl";
|
|
3
|
+
import PolylineFragShader from "@shaders/glsl/polyline.frag.glsl";
|
|
4
|
+
import PolylineVertShader from "@shaders/glsl/polyline.vert.glsl";
|
|
5
|
+
import { packing } from "@takram/three-geospatial/shaders";
|
|
6
|
+
import type { WebGLProgramParametersWithUniforms } from "three";
|
|
7
|
+
|
|
8
|
+
import type { SupportedMaterial } from "./material";
|
|
9
|
+
import type { PolylineBaseMutates, PolylineBaseState } from "./types";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Select appropriate shaders based on polyline state.
|
|
13
|
+
*
|
|
14
|
+
* @param isTexturized - Whether the polyline is rendered as flat texturized tile
|
|
15
|
+
* @returns Object with vertexShader and fragmentShader code
|
|
16
|
+
*/
|
|
17
|
+
const selectShaders = (
|
|
18
|
+
isTexturized: boolean,
|
|
19
|
+
): { vertexShader: string; fragmentShader: string } => {
|
|
20
|
+
if (isTexturized) {
|
|
21
|
+
// Flat polyline for texturized tile rendering
|
|
22
|
+
return {
|
|
23
|
+
vertexShader: FlatPolylineVertShader,
|
|
24
|
+
fragmentShader: FlatPolylineFragShader,
|
|
25
|
+
};
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
// 3D polyline for globe rendering
|
|
29
|
+
const fragmentShader = `${packing}\n` + PolylineFragShader;
|
|
30
|
+
|
|
31
|
+
return {
|
|
32
|
+
vertexShader: PolylineVertShader,
|
|
33
|
+
fragmentShader,
|
|
34
|
+
};
|
|
35
|
+
};
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* Transform shader with polyline base modifications.
|
|
39
|
+
*
|
|
40
|
+
* For polylines, the shaders are already provided as custom GLSL (polyline.vert.glsl, polyline.frag.glsl).
|
|
41
|
+
* This function primarily handles uniform assignment via mutates.updateUniforms().
|
|
42
|
+
*
|
|
43
|
+
* The shader transformation is minimal because:
|
|
44
|
+
* 1. Polyline shaders are custom ShaderMaterial shaders (not built-in Three.js shaders)
|
|
45
|
+
* 2. The shader code already contains all necessary features (RTE, batch texture, picking, etc.)
|
|
46
|
+
* 3. Features are controlled via #define flags set in onBeforeCompile (see PolylineMesh.initMaterial)
|
|
47
|
+
*/
|
|
48
|
+
export const transformShader = (
|
|
49
|
+
shader: WebGLProgramParametersWithUniforms,
|
|
50
|
+
state: PolylineBaseState,
|
|
51
|
+
mutates: PolylineBaseMutates,
|
|
52
|
+
material: SupportedMaterial,
|
|
53
|
+
): void => {
|
|
54
|
+
// Select and set shaders based on state
|
|
55
|
+
const shaders = selectShaders(state.isTexturized);
|
|
56
|
+
shader.vertexShader = shaders.vertexShader;
|
|
57
|
+
shader.fragmentShader = shaders.fragmentShader;
|
|
58
|
+
|
|
59
|
+
// Set shader defines based on state
|
|
60
|
+
shader.defines ??= {};
|
|
61
|
+
|
|
62
|
+
if (state.useRTE) {
|
|
63
|
+
shader.defines.USE_RTE = true;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
shader.defines.USE_SELECTIVE_EFFECT = 1;
|
|
67
|
+
|
|
68
|
+
// Merge defines from material.userData.defines (includes batch texture defines)
|
|
69
|
+
if (material.userData.defines) {
|
|
70
|
+
Object.assign(shader.defines, material.userData.defines);
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
// Assign uniform refs to shader.uniforms via mutates
|
|
74
|
+
mutates.updateUniforms(shader.uniforms, state);
|
|
75
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { DEFAULT_BASE_STATE, updateState } from "./state";
|
|
4
|
+
import type { PolylineBaseProps } from "./types";
|
|
5
|
+
|
|
6
|
+
describe("polylineBaseEnhancer/state", () => {
|
|
7
|
+
describe("updateState", () => {
|
|
8
|
+
it("should initialize state from props with defaults", () => {
|
|
9
|
+
const props: PolylineBaseProps = {
|
|
10
|
+
color: 0xff0000,
|
|
11
|
+
width: 2,
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
const state = updateState(props, DEFAULT_BASE_STATE);
|
|
15
|
+
|
|
16
|
+
expect(state.width).toBe(2);
|
|
17
|
+
expect(state.useRTE).toBe(false);
|
|
18
|
+
expect(state.pickable).toBe(false);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("should update minMaxHeight from props", () => {
|
|
22
|
+
const props: PolylineBaseProps = {
|
|
23
|
+
minMaxHeight: [100, 200],
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
const state = updateState(props, DEFAULT_BASE_STATE);
|
|
27
|
+
|
|
28
|
+
expect(state.minMaxHeight).toEqual([100, 200]);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("should update width from props", () => {
|
|
32
|
+
const props: PolylineBaseProps = {
|
|
33
|
+
width: 5,
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
const state = updateState(props, DEFAULT_BASE_STATE);
|
|
37
|
+
|
|
38
|
+
expect(state.width).toBe(5);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("should update batch flags from props", () => {
|
|
42
|
+
const props: PolylineBaseProps = {
|
|
43
|
+
batchColorEnabled: true,
|
|
44
|
+
useBatchTexture: true,
|
|
45
|
+
useBatchColorShow: true,
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
const state = updateState(props, DEFAULT_BASE_STATE);
|
|
49
|
+
|
|
50
|
+
expect(state.batchColorEnabled).toBe(true);
|
|
51
|
+
expect(state.useBatchTexture).toBe(true);
|
|
52
|
+
expect(state.useBatchColorShow).toBe(true);
|
|
53
|
+
});
|
|
54
|
+
});
|
|
55
|
+
});
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import type { PolylineBaseProps, PolylineBaseState } from "./types";
|
|
2
|
+
|
|
3
|
+
export const DEFAULT_BASE_PROPS: Required<
|
|
4
|
+
Omit<
|
|
5
|
+
PolylineBaseProps,
|
|
6
|
+
| "batchDataTexture"
|
|
7
|
+
| "minMaxHeight"
|
|
8
|
+
| "viewportAndPixelRatio"
|
|
9
|
+
| "frustumNearFar"
|
|
10
|
+
| "frustumRatio"
|
|
11
|
+
>
|
|
12
|
+
> = {
|
|
13
|
+
color: 0xffffff,
|
|
14
|
+
transparent: false,
|
|
15
|
+
opacity: 1.0,
|
|
16
|
+
depthWrite: true,
|
|
17
|
+
addHeight: 0,
|
|
18
|
+
width: 1,
|
|
19
|
+
maxWidth: 1000,
|
|
20
|
+
isTexturized: false,
|
|
21
|
+
pickable: false,
|
|
22
|
+
effectIdsMask: 0,
|
|
23
|
+
emissiveColor: 0,
|
|
24
|
+
emissiveIntensity: 0,
|
|
25
|
+
useRTE: false,
|
|
26
|
+
batchColorEnabled: false,
|
|
27
|
+
useBatchTexture: false,
|
|
28
|
+
useBatchColorShow: false,
|
|
29
|
+
useBatchHeight: false,
|
|
30
|
+
useBatchLineWidth: false,
|
|
31
|
+
};
|
|
32
|
+
|
|
33
|
+
/** Default state derived from DEFAULT_BASE_PROPS */
|
|
34
|
+
export const DEFAULT_BASE_STATE: PolylineBaseState = {
|
|
35
|
+
useRTE: DEFAULT_BASE_PROPS.useRTE,
|
|
36
|
+
isTexturized: DEFAULT_BASE_PROPS.isTexturized,
|
|
37
|
+
pickable: DEFAULT_BASE_PROPS.pickable,
|
|
38
|
+
effectIdsMask: DEFAULT_BASE_PROPS.effectIdsMask,
|
|
39
|
+
emissiveColor: DEFAULT_BASE_PROPS.emissiveColor,
|
|
40
|
+
emissiveIntensity: DEFAULT_BASE_PROPS.emissiveIntensity,
|
|
41
|
+
minMaxHeight: [0, 0],
|
|
42
|
+
addHeight: DEFAULT_BASE_PROPS.addHeight,
|
|
43
|
+
width: DEFAULT_BASE_PROPS.width,
|
|
44
|
+
maxWidth: DEFAULT_BASE_PROPS.maxWidth,
|
|
45
|
+
color: DEFAULT_BASE_PROPS.color,
|
|
46
|
+
batchColorEnabled: DEFAULT_BASE_PROPS.batchColorEnabled,
|
|
47
|
+
useBatchTexture: DEFAULT_BASE_PROPS.useBatchTexture,
|
|
48
|
+
useBatchColorShow: DEFAULT_BASE_PROPS.useBatchColorShow,
|
|
49
|
+
useBatchHeight: DEFAULT_BASE_PROPS.useBatchHeight,
|
|
50
|
+
useBatchLineWidth: DEFAULT_BASE_PROPS.useBatchLineWidth,
|
|
51
|
+
};
|
|
52
|
+
|
|
53
|
+
/**
|
|
54
|
+
* Update immutable state from props.
|
|
55
|
+
* Props override currentState values; missing props fall back to currentState.
|
|
56
|
+
* Pass DEFAULT_BASE_STATE as currentState for initial mount.
|
|
57
|
+
*
|
|
58
|
+
* @param props - The props to apply
|
|
59
|
+
* @param currentState - The current state to use as fallback (use DEFAULT_BASE_STATE for mount)
|
|
60
|
+
*/
|
|
61
|
+
export const updateState = (
|
|
62
|
+
props: PolylineBaseProps,
|
|
63
|
+
currentState: PolylineBaseState,
|
|
64
|
+
): PolylineBaseState => {
|
|
65
|
+
const isTexturized = props.isTexturized ?? currentState.isTexturized;
|
|
66
|
+
|
|
67
|
+
return {
|
|
68
|
+
// RTE cannot change after mount - always preserve current value
|
|
69
|
+
useRTE: currentState.useRTE,
|
|
70
|
+
isTexturized,
|
|
71
|
+
pickable: props.pickable ?? currentState.pickable,
|
|
72
|
+
effectIdsMask: props.effectIdsMask ?? currentState.effectIdsMask,
|
|
73
|
+
emissiveColor: props.emissiveColor ?? currentState.emissiveColor,
|
|
74
|
+
emissiveIntensity:
|
|
75
|
+
props.emissiveIntensity ?? currentState.emissiveIntensity,
|
|
76
|
+
minMaxHeight: props.minMaxHeight ?? currentState.minMaxHeight,
|
|
77
|
+
addHeight: props.addHeight ?? currentState.addHeight,
|
|
78
|
+
width: props.width ?? currentState.width,
|
|
79
|
+
maxWidth: props.maxWidth ?? currentState.maxWidth,
|
|
80
|
+
color: props.color ?? currentState.color,
|
|
81
|
+
// Batch flags can only transition from false to true, never back
|
|
82
|
+
batchColorEnabled:
|
|
83
|
+
currentState.batchColorEnabled || !!props.batchColorEnabled,
|
|
84
|
+
useBatchTexture: currentState.useBatchTexture || !!props.useBatchTexture,
|
|
85
|
+
useBatchColorShow:
|
|
86
|
+
currentState.useBatchColorShow || !!props.useBatchColorShow,
|
|
87
|
+
useBatchHeight: currentState.useBatchHeight || !!props.useBatchHeight,
|
|
88
|
+
useBatchLineWidth:
|
|
89
|
+
currentState.useBatchLineWidth || !!props.useBatchLineWidth,
|
|
90
|
+
};
|
|
91
|
+
};
|
|
@@ -0,0 +1,170 @@
|
|
|
1
|
+
import type { Color, Matrix4, Texture, Vector2, Vector3 } from "three";
|
|
2
|
+
|
|
3
|
+
import type { UniformValue } from "../../../types";
|
|
4
|
+
import type { BatchTextureFlags } from "../../batchTexture";
|
|
5
|
+
import type { Mutates } from "../../MaterialEnhancer";
|
|
6
|
+
|
|
7
|
+
type PolylineBatchTextureFlags = Required<
|
|
8
|
+
Omit<BatchTextureFlags, "useBatchExtrudedHeight" | "useBatchSize">
|
|
9
|
+
>;
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Props for the polyline base enhancer.
|
|
13
|
+
*/
|
|
14
|
+
export type PolylineBaseProps = {
|
|
15
|
+
// Basic material props
|
|
16
|
+
color?: number;
|
|
17
|
+
|
|
18
|
+
transparent?: boolean;
|
|
19
|
+
opacity?: number;
|
|
20
|
+
depthWrite?: boolean;
|
|
21
|
+
|
|
22
|
+
// Height/width
|
|
23
|
+
minMaxHeight?: [number, number];
|
|
24
|
+
addHeight?: number;
|
|
25
|
+
width?: number;
|
|
26
|
+
maxWidth?: number;
|
|
27
|
+
|
|
28
|
+
isTexturized?: boolean;
|
|
29
|
+
|
|
30
|
+
// Picking
|
|
31
|
+
pickable?: boolean;
|
|
32
|
+
|
|
33
|
+
// SelectiveEffect
|
|
34
|
+
effectIdsMask?: number;
|
|
35
|
+
emissiveColor?: number;
|
|
36
|
+
emissiveIntensity?: number;
|
|
37
|
+
|
|
38
|
+
// External uniforms (passed from CommonUniforms)
|
|
39
|
+
// Note: These use tuple types matching CommonUniforms, not Three.js Vector types
|
|
40
|
+
viewportAndPixelRatio?: {
|
|
41
|
+
value: [x: number, y: number, z: number] | undefined | null;
|
|
42
|
+
};
|
|
43
|
+
frustumNearFar?: { value: [x: number, y: number] | undefined | null };
|
|
44
|
+
frustumRatio?: {
|
|
45
|
+
value: [x: number, y: number, z: number, w: number] | undefined | null;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
// Batch texture
|
|
49
|
+
batchDataTexture?: UniformValue<Texture | null>;
|
|
50
|
+
|
|
51
|
+
// Batch texture state flags - track when batch attributes are being used
|
|
52
|
+
batchColorEnabled?: boolean;
|
|
53
|
+
|
|
54
|
+
// RTE (Relative To Eye) support
|
|
55
|
+
useRTE?: boolean;
|
|
56
|
+
} & Partial<PolylineBatchTextureFlags>;
|
|
57
|
+
|
|
58
|
+
/**
|
|
59
|
+
* Immutable state for the polyline base enhancer.
|
|
60
|
+
* This state is always replaced as a whole (never mutated).
|
|
61
|
+
* Returned directly via states() - refresh after updates.
|
|
62
|
+
*/
|
|
63
|
+
export type PolylineBaseState = Readonly<
|
|
64
|
+
{
|
|
65
|
+
useRTE: boolean;
|
|
66
|
+
isTexturized: boolean;
|
|
67
|
+
pickable: boolean;
|
|
68
|
+
effectIdsMask: number;
|
|
69
|
+
emissiveColor: number;
|
|
70
|
+
emissiveIntensity: number;
|
|
71
|
+
minMaxHeight: [number, number];
|
|
72
|
+
addHeight: number;
|
|
73
|
+
width: number;
|
|
74
|
+
maxWidth: number;
|
|
75
|
+
color: number;
|
|
76
|
+
// Batch texture state - when true, material.color is white and colors come from batch texture
|
|
77
|
+
batchColorEnabled: boolean;
|
|
78
|
+
} & PolylineBatchTextureFlags
|
|
79
|
+
>;
|
|
80
|
+
|
|
81
|
+
/**
|
|
82
|
+
* Mutable references (uniforms) for the polyline base enhancer.
|
|
83
|
+
*
|
|
84
|
+
* These are shared references with shader.uniforms and can be mutated directly
|
|
85
|
+
* for efficient GPU uniform updates without shader recompilation.
|
|
86
|
+
* Internal type - not exposed externally.
|
|
87
|
+
*/
|
|
88
|
+
export type PolylineBaseRefs = {
|
|
89
|
+
// Core uniforms
|
|
90
|
+
minMaxHeightAndWidth: UniformValue<[number, number, number]>;
|
|
91
|
+
maxWidth: UniformValue<number>;
|
|
92
|
+
uAddHeight: UniformValue<number>;
|
|
93
|
+
color: UniformValue<Color>;
|
|
94
|
+
nvr_uPickable: UniformValue<number>;
|
|
95
|
+
uEffectIdsMask: UniformValue<number>;
|
|
96
|
+
uEmissiveColor: UniformValue<Vector3>;
|
|
97
|
+
uEmissiveIntensity: UniformValue<number>;
|
|
98
|
+
nvr_uPickingCoord: UniformValue<Vector2>;
|
|
99
|
+
|
|
100
|
+
// Optional uniforms
|
|
101
|
+
batchDataTexture?: UniformValue<Texture | null>;
|
|
102
|
+
|
|
103
|
+
// External shared uniforms (references passed from CommonUniforms)
|
|
104
|
+
// Note: These use tuple types matching CommonUniforms, not Three.js Vector types
|
|
105
|
+
viewportAndPixelRatio?: {
|
|
106
|
+
value: [x: number, y: number, z: number] | undefined | null;
|
|
107
|
+
};
|
|
108
|
+
frustumNearFar?: { value: [x: number, y: number] | undefined | null };
|
|
109
|
+
frustumRatio?: {
|
|
110
|
+
value: [x: number, y: number, z: number, w: number] | undefined | null;
|
|
111
|
+
};
|
|
112
|
+
|
|
113
|
+
// RTE uniforms (only present if useRTE is true)
|
|
114
|
+
modelViewMatrixRTE?: UniformValue<Matrix4>;
|
|
115
|
+
u_cameraPositionHigh?: UniformValue<Vector3>;
|
|
116
|
+
u_cameraPositionLow?: UniformValue<Vector3>;
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
export type PolylineBaseUniforms = Partial<PolylineBaseRefs>;
|
|
120
|
+
|
|
121
|
+
/**
|
|
122
|
+
* Mutation functions for the polyline base enhancer.
|
|
123
|
+
* Includes `update(state)` to sync refs from state, plus additional methods.
|
|
124
|
+
*/
|
|
125
|
+
export type PolylineBaseMutates = Mutates<
|
|
126
|
+
PolylineBaseState,
|
|
127
|
+
PolylineBaseUniforms,
|
|
128
|
+
{
|
|
129
|
+
/**
|
|
130
|
+
* Update RTE (Relative-To-Eye) uniforms for high-precision rendering.
|
|
131
|
+
* Call this per-frame to update the model-view matrix and camera position.
|
|
132
|
+
* Does nothing if RTE is not enabled.
|
|
133
|
+
*
|
|
134
|
+
* @param modelViewMatrixRTE - The model-view matrix in RTE coordinates
|
|
135
|
+
* @param cameraPositionHigh - High-precision component of camera position
|
|
136
|
+
* @param cameraPositionLow - Low-precision component of camera position
|
|
137
|
+
* @param state - PolylineBaseState
|
|
138
|
+
*/
|
|
139
|
+
updateRteUniforms: (
|
|
140
|
+
modelViewMatrixRTE: Matrix4,
|
|
141
|
+
cameraPositionHigh: Vector3,
|
|
142
|
+
cameraPositionLow: Vector3,
|
|
143
|
+
state: PolylineBaseState,
|
|
144
|
+
) => void;
|
|
145
|
+
/**
|
|
146
|
+
* Set the batch data texture ref.
|
|
147
|
+
* This is needed because batchDataTexture is an external ref passed via props.
|
|
148
|
+
*/
|
|
149
|
+
setBatchDataTexture: (texture: UniformValue<Texture | null>) => void;
|
|
150
|
+
/**
|
|
151
|
+
* Set the picking coordinate.
|
|
152
|
+
* This is needed to update the picking coordinate uniform.
|
|
153
|
+
*/
|
|
154
|
+
setPickingCoord: (coord: Vector2) => void;
|
|
155
|
+
/**
|
|
156
|
+
* Set external uniform references shared across materials.
|
|
157
|
+
* These are typically passed from CommonUniforms and should be set once during mount.
|
|
158
|
+
*/
|
|
159
|
+
setExternalRefs: (externalRefs: {
|
|
160
|
+
batchDataTexture?: UniformValue<Texture | null>;
|
|
161
|
+
viewportAndPixelRatio?: {
|
|
162
|
+
value: [x: number, y: number, z: number] | undefined | null;
|
|
163
|
+
};
|
|
164
|
+
frustumNearFar?: { value: [x: number, y: number] | undefined | null };
|
|
165
|
+
frustumRatio?: {
|
|
166
|
+
value: [x: number, y: number, z: number, w: number] | undefined | null;
|
|
167
|
+
};
|
|
168
|
+
}) => void;
|
|
169
|
+
}
|
|
170
|
+
>;
|
|
@@ -0,0 +1,102 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Polyline Material Enhancer - Currently just the Base enhancer
|
|
3
|
+
*
|
|
4
|
+
* This module provides polyline material functionality using the base enhancer.
|
|
5
|
+
* Unlike polygon materials which have water effects, polyline materials currently
|
|
6
|
+
* only need the base functionality.
|
|
7
|
+
*/
|
|
8
|
+
|
|
9
|
+
import type { MaterialEnhancer } from "../MaterialEnhancer";
|
|
10
|
+
|
|
11
|
+
import {
|
|
12
|
+
createPolylineBaseEnhancer,
|
|
13
|
+
type PolylineBaseMutates,
|
|
14
|
+
type PolylineBaseProps,
|
|
15
|
+
type PolylineBaseState,
|
|
16
|
+
type SupportedMaterial,
|
|
17
|
+
} from "./polylineBaseEnhancer";
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* Props for the polyline material enhancer.
|
|
21
|
+
* Currently just wraps the base props, but structured for future composition.
|
|
22
|
+
*/
|
|
23
|
+
export type PolylineMaterialProps = {
|
|
24
|
+
base?: PolylineBaseProps;
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// Shaders this enhancer supports (custom ShaderMaterial via the "shader" shader name)
|
|
28
|
+
const AVAILABLE_SHADERS = ["shader"] as const;
|
|
29
|
+
type AVAILABLE_SHADERS = typeof AVAILABLE_SHADERS;
|
|
30
|
+
|
|
31
|
+
/**
|
|
32
|
+
* Factory function to create the polyline material enhancer.
|
|
33
|
+
*
|
|
34
|
+
* This creates a new enhancer instance with its own internal state.
|
|
35
|
+
*
|
|
36
|
+
* @param material - The Three.js ShaderMaterial to enhance
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* const material = new ShaderMaterial();
|
|
41
|
+
* const enhancer = createPolylineMaterialEnhancer(material);
|
|
42
|
+
*
|
|
43
|
+
* // Mount with base props
|
|
44
|
+
* enhancer.mount({
|
|
45
|
+
* base: { color: 0xff0000, width: 2, useRTE: true },
|
|
46
|
+
* });
|
|
47
|
+
*
|
|
48
|
+
* // Get state directly via states() - refresh after updates
|
|
49
|
+
* const state = enhancer.states();
|
|
50
|
+
*
|
|
51
|
+
* // Update RTE uniforms per-frame via mutates()
|
|
52
|
+
* if (state.useRTE) {
|
|
53
|
+
* const mutates = enhancer.mutates();
|
|
54
|
+
* mutates.updateRteUniforms(modelViewMatrix, cameraHigh, cameraLow, state);
|
|
55
|
+
* }
|
|
56
|
+
*
|
|
57
|
+
* // Update props (then call states() again to get fresh state)
|
|
58
|
+
* enhancer.update({ base: { width: 3 } });
|
|
59
|
+
*
|
|
60
|
+
* // Use transformShader for onBeforeCompile
|
|
61
|
+
* material.onBeforeCompile = enhancer.transformShader;
|
|
62
|
+
* ```
|
|
63
|
+
*/
|
|
64
|
+
export function createPolylineMaterialEnhancer(
|
|
65
|
+
material: SupportedMaterial,
|
|
66
|
+
): MaterialEnhancer<
|
|
67
|
+
SupportedMaterial,
|
|
68
|
+
PolylineMaterialProps,
|
|
69
|
+
PolylineBaseState,
|
|
70
|
+
PolylineBaseMutates,
|
|
71
|
+
AVAILABLE_SHADERS
|
|
72
|
+
> {
|
|
73
|
+
const baseEnhancer = createPolylineBaseEnhancer(material);
|
|
74
|
+
|
|
75
|
+
return {
|
|
76
|
+
material,
|
|
77
|
+
availableShaders: AVAILABLE_SHADERS,
|
|
78
|
+
|
|
79
|
+
transformShader: (shader) => {
|
|
80
|
+
baseEnhancer.transformShader(shader);
|
|
81
|
+
},
|
|
82
|
+
|
|
83
|
+
mount: (props) => {
|
|
84
|
+
baseEnhancer.mount(props.base ?? {});
|
|
85
|
+
},
|
|
86
|
+
|
|
87
|
+
update: (props) => {
|
|
88
|
+
if (props.base) {
|
|
89
|
+
baseEnhancer.update(props.base);
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
|
|
93
|
+
states: () => baseEnhancer.states(),
|
|
94
|
+
|
|
95
|
+
mutates: () => baseEnhancer.mutates(),
|
|
96
|
+
|
|
97
|
+
programCacheKey: () => baseEnhancer.programCacheKey(),
|
|
98
|
+
};
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
// Re-export types for convenience
|
|
102
|
+
export type { PolylineBaseMutates, PolylineBaseProps, PolylineBaseState };
|
|
@@ -0,0 +1,125 @@
|
|
|
1
|
+
import { defaults } from "lodash-es";
|
|
2
|
+
import type { WebGLProgramParametersWithUniforms } from "three";
|
|
3
|
+
import invariant from "tiny-invariant";
|
|
4
|
+
|
|
5
|
+
import type { MaterialEnhancer } from "../../MaterialEnhancer";
|
|
6
|
+
|
|
7
|
+
import {
|
|
8
|
+
AVAILABLE_SHADERS,
|
|
9
|
+
type SupportedMaterial,
|
|
10
|
+
updateMaterialProps,
|
|
11
|
+
} from "./material";
|
|
12
|
+
import { createBaseMutates } from "./mutates";
|
|
13
|
+
import { transformShader } from "./shader";
|
|
14
|
+
import { DEFAULT_BASE_PROPS, DEFAULT_BASE_STATE, updateState } from "./state";
|
|
15
|
+
import type {
|
|
16
|
+
SdfTextBaseMutates,
|
|
17
|
+
SdfTextBaseProps,
|
|
18
|
+
SdfTextBaseState,
|
|
19
|
+
} from "./types";
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* Factory function to create an sdfText base enhancer.
|
|
23
|
+
*
|
|
24
|
+
* This enhancer handles:
|
|
25
|
+
* - Text color, font size, centering
|
|
26
|
+
* - Outline (width, color, opacity)
|
|
27
|
+
* - Background quad (color, border)
|
|
28
|
+
* - Height offset, depth offset
|
|
29
|
+
* - Picking
|
|
30
|
+
* - RTE (Relative-To-Eye) support for high-precision coordinates
|
|
31
|
+
* - Billboard scaling by distance
|
|
32
|
+
* - SDF atlas texture management
|
|
33
|
+
*
|
|
34
|
+
* Supports ShaderMaterial with custom sdfText shaders.
|
|
35
|
+
*
|
|
36
|
+
* @param material - The Three.js ShaderMaterial to enhance
|
|
37
|
+
*/
|
|
38
|
+
export function createSdfTextBaseEnhancer(
|
|
39
|
+
material: SupportedMaterial,
|
|
40
|
+
): MaterialEnhancer<
|
|
41
|
+
SupportedMaterial,
|
|
42
|
+
SdfTextBaseProps,
|
|
43
|
+
SdfTextBaseState,
|
|
44
|
+
SdfTextBaseMutates,
|
|
45
|
+
typeof AVAILABLE_SHADERS
|
|
46
|
+
> {
|
|
47
|
+
// Internal state - immutable, always replaced as a whole
|
|
48
|
+
let state: SdfTextBaseState | null = null;
|
|
49
|
+
// Internal mutates object (refs are hidden inside)
|
|
50
|
+
let mutates: SdfTextBaseMutates | null = null;
|
|
51
|
+
|
|
52
|
+
return {
|
|
53
|
+
material,
|
|
54
|
+
availableShaders: AVAILABLE_SHADERS,
|
|
55
|
+
|
|
56
|
+
transformShader: (shader: WebGLProgramParametersWithUniforms): void => {
|
|
57
|
+
invariant(
|
|
58
|
+
state && mutates,
|
|
59
|
+
"mount() must be called before transformShader",
|
|
60
|
+
);
|
|
61
|
+
transformShader(shader, state, mutates);
|
|
62
|
+
},
|
|
63
|
+
|
|
64
|
+
mount: (props: SdfTextBaseProps): void => {
|
|
65
|
+
const mergedProps = defaults({}, props, DEFAULT_BASE_PROPS);
|
|
66
|
+
// Create initial state with immutable fields from props
|
|
67
|
+
const initialState = {
|
|
68
|
+
...DEFAULT_BASE_STATE,
|
|
69
|
+
useRTE: mergedProps.useRTE,
|
|
70
|
+
useMsdf: mergedProps.useMsdf,
|
|
71
|
+
};
|
|
72
|
+
state = updateState(mergedProps, initialState);
|
|
73
|
+
// Create mutates (refs are created inside with default values)
|
|
74
|
+
mutates = createBaseMutates(mergedProps.useRTE, mergedProps.rtcCenter);
|
|
75
|
+
mutates.update(state);
|
|
76
|
+
|
|
77
|
+
// Set atlas texture external ref if provided
|
|
78
|
+
if (props.atlasTexture) {
|
|
79
|
+
mutates.setAtlasTexture(props.atlasTexture);
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
updateMaterialProps(material, mergedProps);
|
|
83
|
+
},
|
|
84
|
+
|
|
85
|
+
update: (props: SdfTextBaseProps): void => {
|
|
86
|
+
invariant(state && mutates, "mount() must be called before update");
|
|
87
|
+
|
|
88
|
+
state = updateState(props, state);
|
|
89
|
+
mutates.update(state);
|
|
90
|
+
|
|
91
|
+
if (props.atlasTexture) {
|
|
92
|
+
mutates.setAtlasTexture(props.atlasTexture);
|
|
93
|
+
}
|
|
94
|
+
|
|
95
|
+
updateMaterialProps(material, props);
|
|
96
|
+
},
|
|
97
|
+
|
|
98
|
+
states: (): SdfTextBaseState => {
|
|
99
|
+
invariant(state, "mount() must be called before states");
|
|
100
|
+
return state;
|
|
101
|
+
},
|
|
102
|
+
|
|
103
|
+
mutates: (): SdfTextBaseMutates => {
|
|
104
|
+
invariant(mutates, "mount() must be called before mutates");
|
|
105
|
+
return mutates;
|
|
106
|
+
},
|
|
107
|
+
|
|
108
|
+
programCacheKey: (): string => {
|
|
109
|
+
invariant(state, "mount() must be called before programCacheKey");
|
|
110
|
+
return JSON.stringify({ useRTE: state.useRTE, useMsdf: state.useMsdf });
|
|
111
|
+
},
|
|
112
|
+
};
|
|
113
|
+
}
|
|
114
|
+
|
|
115
|
+
// Re-export public types
|
|
116
|
+
export type { SdfTextBaseMutates, SdfTextBaseProps, SdfTextBaseState };
|
|
117
|
+
|
|
118
|
+
// Re-export SupportedMaterial for use by composing enhancers
|
|
119
|
+
export type { SupportedMaterial } from "./material";
|
|
120
|
+
|
|
121
|
+
// Re-export marker types for composing enhancers
|
|
122
|
+
export {
|
|
123
|
+
SDF_TEXT_BASE_SHADER_MARKERS,
|
|
124
|
+
createSdfTextBaseShaderReplacer,
|
|
125
|
+
} from "./markers";
|