@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,130 @@
|
|
|
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 { AVAILABLE_SHADERS, type SupportedMaterial } from "./material";
|
|
8
|
+
import { updateMaterialProps } from "./material";
|
|
9
|
+
import { createBaseMutates } from "./mutates";
|
|
10
|
+
import { transformShader } from "./shader";
|
|
11
|
+
import { DEFAULT_BASE_PROPS, DEFAULT_BASE_STATE, updateState } from "./state";
|
|
12
|
+
import type {
|
|
13
|
+
PolygonBaseMutates,
|
|
14
|
+
PolygonBaseProps,
|
|
15
|
+
PolygonBaseState,
|
|
16
|
+
} from "./types";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Factory function to create a polygon base enhancer.
|
|
20
|
+
*
|
|
21
|
+
* This enhancer handles:
|
|
22
|
+
* - Basic material properties (color, opacity, wireframe)
|
|
23
|
+
* - Height and extrusion
|
|
24
|
+
* - Clamp to ground
|
|
25
|
+
* - Picking
|
|
26
|
+
* - Reflectivity
|
|
27
|
+
* - RTE support
|
|
28
|
+
*
|
|
29
|
+
* Supports Lambert materials.
|
|
30
|
+
*
|
|
31
|
+
* @param material - The Three.js material to enhance
|
|
32
|
+
*/
|
|
33
|
+
export function createPolygonBaseEnhancer(
|
|
34
|
+
material: SupportedMaterial,
|
|
35
|
+
): MaterialEnhancer<
|
|
36
|
+
SupportedMaterial,
|
|
37
|
+
PolygonBaseProps,
|
|
38
|
+
PolygonBaseState,
|
|
39
|
+
PolygonBaseMutates,
|
|
40
|
+
typeof AVAILABLE_SHADERS
|
|
41
|
+
> {
|
|
42
|
+
// Internal state - immutable, always replaced as a whole
|
|
43
|
+
let state: PolygonBaseState | null = null;
|
|
44
|
+
// Internal mutates object (refs are hidden inside)
|
|
45
|
+
let mutates: PolygonBaseMutates | null = null;
|
|
46
|
+
|
|
47
|
+
return {
|
|
48
|
+
material,
|
|
49
|
+
availableShaders: AVAILABLE_SHADERS,
|
|
50
|
+
|
|
51
|
+
transformShader: (shader: WebGLProgramParametersWithUniforms): void => {
|
|
52
|
+
invariant(
|
|
53
|
+
state && mutates,
|
|
54
|
+
"mount() must be called before transformShader",
|
|
55
|
+
);
|
|
56
|
+
transformShader(shader, state, mutates, material);
|
|
57
|
+
},
|
|
58
|
+
|
|
59
|
+
mount: (props: PolygonBaseProps): void => {
|
|
60
|
+
const mergedProps = defaults({}, props, DEFAULT_BASE_PROPS);
|
|
61
|
+
// Create initial state with useRTE from props (useRTE can't change after mount)
|
|
62
|
+
const initialState = {
|
|
63
|
+
...DEFAULT_BASE_STATE,
|
|
64
|
+
useRTE: mergedProps.useRTE,
|
|
65
|
+
};
|
|
66
|
+
state = updateState(mergedProps, initialState);
|
|
67
|
+
// Create mutates (refs are created inside with default values)
|
|
68
|
+
mutates = createBaseMutates(mergedProps.useRTE);
|
|
69
|
+
mutates.update(state);
|
|
70
|
+
// Handle external refs that are passed through props
|
|
71
|
+
if (props.batchDataTexture) {
|
|
72
|
+
mutates.setBatchDataTexture(props.batchDataTexture);
|
|
73
|
+
}
|
|
74
|
+
if (props.globeNormalTexture) {
|
|
75
|
+
mutates.setGlobeNormalTexture(props.globeNormalTexture);
|
|
76
|
+
}
|
|
77
|
+
updateMaterialProps(material, mergedProps);
|
|
78
|
+
},
|
|
79
|
+
|
|
80
|
+
update: (props: PolygonBaseProps): void => {
|
|
81
|
+
invariant(state && mutates, "mount() must be called before update");
|
|
82
|
+
state = updateState(props, state);
|
|
83
|
+
mutates.update(state);
|
|
84
|
+
// Handle external refs that are passed through props
|
|
85
|
+
if (props.batchDataTexture) {
|
|
86
|
+
mutates.setBatchDataTexture(props.batchDataTexture);
|
|
87
|
+
}
|
|
88
|
+
if (props.globeNormalTexture) {
|
|
89
|
+
mutates.setGlobeNormalTexture(props.globeNormalTexture);
|
|
90
|
+
}
|
|
91
|
+
updateMaterialProps(material, props);
|
|
92
|
+
},
|
|
93
|
+
|
|
94
|
+
states: (): PolygonBaseState => {
|
|
95
|
+
invariant(state, "mount() must be called before states");
|
|
96
|
+
return state;
|
|
97
|
+
},
|
|
98
|
+
|
|
99
|
+
mutates: (): PolygonBaseMutates => {
|
|
100
|
+
invariant(mutates, "mount() must be called before mutates");
|
|
101
|
+
return mutates;
|
|
102
|
+
},
|
|
103
|
+
|
|
104
|
+
programCacheKey: (): string => {
|
|
105
|
+
invariant(state, "mount() must be called before programCacheKey");
|
|
106
|
+
// Return cache key based on state that affects shader defines
|
|
107
|
+
return JSON.stringify({
|
|
108
|
+
useBatchTexture: state.useBatchTexture,
|
|
109
|
+
useBatchColorShow: state.useBatchColorShow,
|
|
110
|
+
useBatchHeight: state.useBatchHeight,
|
|
111
|
+
useBatchExtrudedHeight: state.useBatchExtrudedHeight,
|
|
112
|
+
isTexturized: state.isTexturized,
|
|
113
|
+
clampToGround: state.clampToGround,
|
|
114
|
+
useRTE: state.useRTE,
|
|
115
|
+
});
|
|
116
|
+
},
|
|
117
|
+
};
|
|
118
|
+
}
|
|
119
|
+
|
|
120
|
+
// Re-export public types
|
|
121
|
+
export type { PolygonBaseMutates, PolygonBaseProps, PolygonBaseState };
|
|
122
|
+
|
|
123
|
+
// Re-export SupportedMaterial for use by water enhancer
|
|
124
|
+
export type { SupportedMaterial } from "./material";
|
|
125
|
+
|
|
126
|
+
// Re-export marker types for composing enhancers
|
|
127
|
+
export {
|
|
128
|
+
POLYGON_BASE_SHADER_MARKERS,
|
|
129
|
+
createPolygonBaseShaderReplacer,
|
|
130
|
+
} from "./markers";
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
import { type ShaderMarkers, createShaderReplacer } from "../../ShaderReplacer";
|
|
2
|
+
|
|
3
|
+
export const POLYGON_BASE_SHADER_MARKERS = {
|
|
4
|
+
vertex: {},
|
|
5
|
+
fragment: {
|
|
6
|
+
/** Start of polygon uniform declarations. */
|
|
7
|
+
UNIFORM_START: "// NVR_POLYGON_BASE_UNIFORM_START",
|
|
8
|
+
/** End of polygon uniform declarations. */
|
|
9
|
+
UNIFORM_END: "// NVR_POLYGON_BASE_UNIFORM_END",
|
|
10
|
+
/** Start of normal computation block. */
|
|
11
|
+
NORMAL_START: "// NVR_POLYGON_BASE_NORMAL_START",
|
|
12
|
+
/** End of normal computation block. */
|
|
13
|
+
NORMAL_END: "// NVR_POLYGON_BASE_NORMAL_END",
|
|
14
|
+
/** Start of the final normal assignment block (used for MRT output). */
|
|
15
|
+
FINAL_NORMAL_START: "// NVR_POLYGON_BASE_FINAL_NORMAL_START",
|
|
16
|
+
/** End of the final normal assignment block (used for MRT output). */
|
|
17
|
+
FINAL_NORMAL_END: "// NVR_POLYGON_BASE_FINAL_NORMAL_END",
|
|
18
|
+
},
|
|
19
|
+
} as const satisfies ShaderMarkers;
|
|
20
|
+
|
|
21
|
+
export function createPolygonBaseShaderReplacer(source: string) {
|
|
22
|
+
return createShaderReplacer<typeof POLYGON_BASE_SHADER_MARKERS>(source);
|
|
23
|
+
}
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import { MeshLambertMaterial } from "three";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { updateMaterialProps } from "./material";
|
|
5
|
+
|
|
6
|
+
describe("polygonBaseEnhancer/material", () => {
|
|
7
|
+
describe("updateMaterialProps", () => {
|
|
8
|
+
it("should not update properties when props are undefined", () => {
|
|
9
|
+
const material = new MeshLambertMaterial();
|
|
10
|
+
material.color.set(0xff0000);
|
|
11
|
+
material.opacity = 0.5;
|
|
12
|
+
|
|
13
|
+
// Empty props should not change anything
|
|
14
|
+
updateMaterialProps(material, {});
|
|
15
|
+
expect(material.color.getHex()).toBe(0xff0000);
|
|
16
|
+
expect(material.opacity).toBe(0.5);
|
|
17
|
+
});
|
|
18
|
+
});
|
|
19
|
+
});
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { MaterialsFromShaders, ShaderName } from "../../MaterialEnhancer";
|
|
2
|
+
|
|
3
|
+
import type { PolygonBaseProps } from "./types";
|
|
4
|
+
|
|
5
|
+
// Shaders this enhancer supports
|
|
6
|
+
export const AVAILABLE_SHADERS = ["lambert"] satisfies ShaderName[];
|
|
7
|
+
export type SupportedMaterial = MaterialsFromShaders<typeof AVAILABLE_SHADERS>;
|
|
8
|
+
|
|
9
|
+
/**
|
|
10
|
+
* Update Three.js material properties from props and state.
|
|
11
|
+
* Side effect function - mutates material directly.
|
|
12
|
+
*/
|
|
13
|
+
export const updateMaterialProps = (
|
|
14
|
+
material: SupportedMaterial,
|
|
15
|
+
props: PolygonBaseProps,
|
|
16
|
+
): void => {
|
|
17
|
+
if (props.color !== undefined) {
|
|
18
|
+
material.color.set(props.color);
|
|
19
|
+
}
|
|
20
|
+
if (props.opacity !== undefined) {
|
|
21
|
+
material.opacity = props.opacity;
|
|
22
|
+
}
|
|
23
|
+
if (props.transparent !== undefined) {
|
|
24
|
+
material.transparent = props.transparent;
|
|
25
|
+
}
|
|
26
|
+
if (props.wireframe !== undefined) {
|
|
27
|
+
material.wireframe = props.wireframe;
|
|
28
|
+
}
|
|
29
|
+
if (props.emissiveColor !== undefined) {
|
|
30
|
+
material.emissive.set(props.emissiveColor);
|
|
31
|
+
}
|
|
32
|
+
if (props.emissiveIntensity !== undefined) {
|
|
33
|
+
material.emissiveIntensity = props.emissiveIntensity;
|
|
34
|
+
}
|
|
35
|
+
if (props.reflectivity !== undefined) {
|
|
36
|
+
material.reflectivity = props.reflectivity;
|
|
37
|
+
}
|
|
38
|
+
};
|
|
@@ -0,0 +1,75 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import type { ShaderUniforms } from "../../MaterialEnhancer";
|
|
4
|
+
|
|
5
|
+
import { createBaseMutates } from "./mutates";
|
|
6
|
+
import { DEFAULT_BASE_STATE } from "./state";
|
|
7
|
+
import type { PolygonBaseState } from "./types";
|
|
8
|
+
|
|
9
|
+
describe("polygonBaseEnhancer/mutates", () => {
|
|
10
|
+
describe("RTE uniforms", () => {
|
|
11
|
+
it("should assign RTE refs to shader.uniforms when useRTE=true", () => {
|
|
12
|
+
const state: PolygonBaseState = { ...DEFAULT_BASE_STATE, useRTE: true };
|
|
13
|
+
const mutates = createBaseMutates(true);
|
|
14
|
+
mutates.update(state);
|
|
15
|
+
|
|
16
|
+
const uniforms: ShaderUniforms = {};
|
|
17
|
+
mutates.updateUniforms(uniforms, state);
|
|
18
|
+
|
|
19
|
+
expect(uniforms.modelViewMatrixRTE).toBeDefined();
|
|
20
|
+
expect(uniforms.u_cameraPositionHigh).toBeDefined();
|
|
21
|
+
expect(uniforms.u_cameraPositionLow).toBeDefined();
|
|
22
|
+
});
|
|
23
|
+
|
|
24
|
+
it("should not assign RTE refs to shader.uniforms when useRTE=false", () => {
|
|
25
|
+
const state: PolygonBaseState = { ...DEFAULT_BASE_STATE, useRTE: false };
|
|
26
|
+
const mutates = createBaseMutates(false);
|
|
27
|
+
mutates.update(state);
|
|
28
|
+
|
|
29
|
+
const uniforms: ShaderUniforms = {};
|
|
30
|
+
mutates.updateUniforms(uniforms, state);
|
|
31
|
+
|
|
32
|
+
expect(uniforms.modelViewMatrixRTE).toBeUndefined();
|
|
33
|
+
expect(uniforms.u_cameraPositionHigh).toBeUndefined();
|
|
34
|
+
expect(uniforms.u_cameraPositionLow).toBeUndefined();
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
|
|
38
|
+
describe("update syncs refs from state", () => {
|
|
39
|
+
it("should sync core refs from state", () => {
|
|
40
|
+
const state: PolygonBaseState = {
|
|
41
|
+
...DEFAULT_BASE_STATE,
|
|
42
|
+
pickable: true,
|
|
43
|
+
clampToGround: true,
|
|
44
|
+
addHeight: 10,
|
|
45
|
+
addExtrudedHeight: 20,
|
|
46
|
+
minMaxHeight: [5, 50],
|
|
47
|
+
};
|
|
48
|
+
const mutates = createBaseMutates(false);
|
|
49
|
+
mutates.update(state);
|
|
50
|
+
|
|
51
|
+
const uniforms: ShaderUniforms = {};
|
|
52
|
+
mutates.updateUniforms(uniforms, state);
|
|
53
|
+
|
|
54
|
+
expect(uniforms.nvr_uPickable?.value).toBe(1);
|
|
55
|
+
expect(uniforms.uClampToGround?.value).toBe(true);
|
|
56
|
+
expect(uniforms.uAddHeight?.value).toBe(10);
|
|
57
|
+
expect(uniforms.uAddExtrudedHeight?.value).toBe(20);
|
|
58
|
+
expect(uniforms.uMinMaxHeight?.value).toEqual([5, 50]);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("should sync uEmissiveIntensity ref from state", () => {
|
|
62
|
+
const state: PolygonBaseState = {
|
|
63
|
+
...DEFAULT_BASE_STATE,
|
|
64
|
+
emissiveIntensity: 0.3,
|
|
65
|
+
};
|
|
66
|
+
const mutates = createBaseMutates(false);
|
|
67
|
+
mutates.update(state);
|
|
68
|
+
|
|
69
|
+
const uniforms: ShaderUniforms = {};
|
|
70
|
+
mutates.updateUniforms(uniforms, state);
|
|
71
|
+
|
|
72
|
+
expect(uniforms.uEmissiveIntensity?.value).toBe(0.3);
|
|
73
|
+
});
|
|
74
|
+
});
|
|
75
|
+
});
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
import type { Matrix4, Texture, Vector3 } from "three";
|
|
2
|
+
import { Matrix4 as ThreeMatrix4, Vector3 as ThreeVector3 } from "three";
|
|
3
|
+
|
|
4
|
+
import type { UniformValue } from "../../../types";
|
|
5
|
+
|
|
6
|
+
import type {
|
|
7
|
+
PolygonBaseMutates,
|
|
8
|
+
PolygonBaseRefs,
|
|
9
|
+
PolygonBaseState,
|
|
10
|
+
} from "./types";
|
|
11
|
+
|
|
12
|
+
/**
|
|
13
|
+
* Default refs with initial values.
|
|
14
|
+
* These are cloned in createBaseMutates and synced from state via update().
|
|
15
|
+
*/
|
|
16
|
+
const DEFAULT_BASE_REFS: PolygonBaseRefs = {
|
|
17
|
+
uMinMaxHeight: { value: undefined },
|
|
18
|
+
uAddExtrudedHeight: { value: 0 },
|
|
19
|
+
uAddHeight: { value: 0 },
|
|
20
|
+
uClampToGround: { value: false },
|
|
21
|
+
nvr_uPickable: { value: 0 },
|
|
22
|
+
uEffectIdsMask: { value: 0 },
|
|
23
|
+
uEmissiveIntensity: { value: 0 },
|
|
24
|
+
uIsTexturized: { value: false },
|
|
25
|
+
reflectivity: { value: 0 },
|
|
26
|
+
roughness: { value: 0 },
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Create mutation functions for the polygon base enhancer.
|
|
31
|
+
* Refs are created internally and captured via closure.
|
|
32
|
+
*
|
|
33
|
+
* @param useRTE - Whether RTE is enabled (determines if RTE refs are created)
|
|
34
|
+
*/
|
|
35
|
+
export const createBaseMutates = (useRTE: boolean): PolygonBaseMutates => {
|
|
36
|
+
// Clone defaults so each enhancer instance gets independent ref objects
|
|
37
|
+
const refs = structuredClone(DEFAULT_BASE_REFS) as PolygonBaseRefs;
|
|
38
|
+
|
|
39
|
+
// Conditionally create RTE refs (useRTE can't change after mount)
|
|
40
|
+
if (useRTE) {
|
|
41
|
+
refs.modelViewMatrixRTE = { value: new ThreeMatrix4() };
|
|
42
|
+
refs.u_cameraPositionHigh = { value: new ThreeVector3() };
|
|
43
|
+
refs.u_cameraPositionLow = { value: new ThreeVector3() };
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
return {
|
|
47
|
+
update: (state) => {
|
|
48
|
+
// Sync refs from state
|
|
49
|
+
refs.uMinMaxHeight.value = state.minMaxHeight;
|
|
50
|
+
refs.uAddExtrudedHeight.value = state.addExtrudedHeight;
|
|
51
|
+
refs.uAddHeight.value = state.addHeight;
|
|
52
|
+
refs.uClampToGround.value = state.clampToGround;
|
|
53
|
+
refs.nvr_uPickable.value = state.pickable ? 1 : 0;
|
|
54
|
+
refs.uEffectIdsMask.value = state.effectIdsMask;
|
|
55
|
+
refs.uEmissiveIntensity.value = state.emissiveIntensity;
|
|
56
|
+
refs.uIsTexturized.value = state.isTexturized;
|
|
57
|
+
refs.reflectivity.value = state.reflectivity;
|
|
58
|
+
refs.roughness.value = state.roughness;
|
|
59
|
+
},
|
|
60
|
+
updateUniforms: (uniforms, state) => {
|
|
61
|
+
// Assign core uniform refs to shader.uniforms
|
|
62
|
+
if (refs.uGlobeNormal) {
|
|
63
|
+
uniforms.uGlobeNormal = refs.uGlobeNormal;
|
|
64
|
+
}
|
|
65
|
+
uniforms.nvr_uPickable = refs.nvr_uPickable;
|
|
66
|
+
uniforms.uEffectIdsMask = refs.uEffectIdsMask;
|
|
67
|
+
uniforms.uEmissiveIntensity = refs.uEmissiveIntensity;
|
|
68
|
+
uniforms.reflectivity = refs.reflectivity;
|
|
69
|
+
uniforms.roughness = refs.roughness;
|
|
70
|
+
|
|
71
|
+
// RTE uniforms
|
|
72
|
+
if (
|
|
73
|
+
state.useRTE &&
|
|
74
|
+
refs.modelViewMatrixRTE &&
|
|
75
|
+
refs.u_cameraPositionHigh &&
|
|
76
|
+
refs.u_cameraPositionLow
|
|
77
|
+
) {
|
|
78
|
+
uniforms.u_cameraPositionHigh = refs.u_cameraPositionHigh;
|
|
79
|
+
uniforms.u_cameraPositionLow = refs.u_cameraPositionLow;
|
|
80
|
+
uniforms.modelViewMatrixRTE = refs.modelViewMatrixRTE;
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
// Height uniforms
|
|
84
|
+
if (refs.uMinMaxHeight.value) {
|
|
85
|
+
uniforms.uMinMaxHeight = refs.uMinMaxHeight;
|
|
86
|
+
}
|
|
87
|
+
uniforms.uAddExtrudedHeight = refs.uAddExtrudedHeight;
|
|
88
|
+
uniforms.uAddHeight = refs.uAddHeight;
|
|
89
|
+
uniforms.uClampToGround = refs.uClampToGround;
|
|
90
|
+
|
|
91
|
+
// Batch texture
|
|
92
|
+
if (refs.batchDataTexture) {
|
|
93
|
+
uniforms.batchDataTexture = refs.batchDataTexture;
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
uniforms.uIsTexturized = refs.uIsTexturized;
|
|
97
|
+
},
|
|
98
|
+
setBatchDataTexture: (texture: UniformValue<Texture | null>): void => {
|
|
99
|
+
refs.batchDataTexture = texture;
|
|
100
|
+
},
|
|
101
|
+
setGlobeNormalTexture: (texture: UniformValue<Texture | null>): void => {
|
|
102
|
+
refs.uGlobeNormal = texture;
|
|
103
|
+
},
|
|
104
|
+
updateRteUniforms: (
|
|
105
|
+
modelViewMatrixRTE: Matrix4,
|
|
106
|
+
cameraPositionHigh: Vector3,
|
|
107
|
+
cameraPositionLow: Vector3,
|
|
108
|
+
state: PolygonBaseState,
|
|
109
|
+
): void => {
|
|
110
|
+
if (!state.useRTE) return;
|
|
111
|
+
if (refs.modelViewMatrixRTE) {
|
|
112
|
+
refs.modelViewMatrixRTE.value.copy(modelViewMatrixRTE);
|
|
113
|
+
}
|
|
114
|
+
if (refs.u_cameraPositionHigh) {
|
|
115
|
+
refs.u_cameraPositionHigh.value.copy(cameraPositionHigh);
|
|
116
|
+
}
|
|
117
|
+
if (refs.u_cameraPositionLow) {
|
|
118
|
+
refs.u_cameraPositionLow.value.copy(cameraPositionLow);
|
|
119
|
+
}
|
|
120
|
+
},
|
|
121
|
+
};
|
|
122
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
import { testShaderCompatibility } from "../../test-utils/shaderCompatibility";
|
|
2
|
+
|
|
3
|
+
import { POLYGON_BASE_SHADER_MARKERS } from "./markers";
|
|
4
|
+
|
|
5
|
+
import { createPolygonBaseEnhancer, type SupportedMaterial } from ".";
|
|
6
|
+
|
|
7
|
+
testShaderCompatibility(
|
|
8
|
+
"polygonBaseEnhancer",
|
|
9
|
+
(material) => createPolygonBaseEnhancer(material as SupportedMaterial),
|
|
10
|
+
[
|
|
11
|
+
{
|
|
12
|
+
name: "With RTE",
|
|
13
|
+
props: {
|
|
14
|
+
useRTE: true,
|
|
15
|
+
},
|
|
16
|
+
},
|
|
17
|
+
{
|
|
18
|
+
name: "Without RTE",
|
|
19
|
+
props: {
|
|
20
|
+
useRTE: false,
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
],
|
|
24
|
+
POLYGON_BASE_SHADER_MARKERS,
|
|
25
|
+
);
|
|
@@ -0,0 +1,249 @@
|
|
|
1
|
+
import BatchTextureParsVertex from "@shaders/glsl/chunks/batch_texture_pars_vertex.glsl";
|
|
2
|
+
import BatchTextureVertex from "@shaders/glsl/chunks/batch_texture_vertex.glsl";
|
|
3
|
+
import BranchFreeTernary from "@shaders/glsl/chunks/branchFreeTernary.glsl";
|
|
4
|
+
import ExtrudedHeightParsVertex from "@shaders/glsl/chunks/extruded_height_pars_vertex.glsl";
|
|
5
|
+
import ExtrudedHeightVertex from "@shaders/glsl/chunks/extruded_height_vertex.glsl";
|
|
6
|
+
import HeightParsVertex from "@shaders/glsl/chunks/height_pars_vertex.glsl";
|
|
7
|
+
import HeightVertex from "@shaders/glsl/chunks/height_vertex.glsl";
|
|
8
|
+
import Pick from "@shaders/glsl/chunks/pick.glsl";
|
|
9
|
+
import ProjectVertexRte from "@shaders/glsl/chunks/project_vertex_rte.glsl";
|
|
10
|
+
import RteParsVertex from "@shaders/glsl/chunks/rte_pars_vertex.glsl";
|
|
11
|
+
import RteVertex from "@shaders/glsl/chunks/rte_vertex.glsl";
|
|
12
|
+
import ShadowMapDepthFragment from "@shaders/glsl/chunks/shadowmap_depth_fragment.glsl";
|
|
13
|
+
import ShadowMapDepthParsFragment from "@shaders/glsl/chunks/shadowmap_depth_pars_fragment.glsl";
|
|
14
|
+
import ShadowMapDepthParsVertex from "@shaders/glsl/chunks/shadowmap_depth_pars_vertex.glsl";
|
|
15
|
+
import ShadowMapDepthVertex from "@shaders/glsl/chunks/shadowmap_depth_vertex.glsl";
|
|
16
|
+
import ShowFragment from "@shaders/glsl/chunks/show_fragment.glsl";
|
|
17
|
+
import ShowParsFragment from "@shaders/glsl/chunks/show_pars_fragment.glsl";
|
|
18
|
+
import ShowParsVertex from "@shaders/glsl/chunks/show_pars_vertex.glsl";
|
|
19
|
+
import SpecularParsFragment from "@shaders/glsl/chunks/spucular_pars_fragment.glsl";
|
|
20
|
+
import { ShaderChunk } from "three";
|
|
21
|
+
import type { WebGLProgramParametersWithUniforms } from "three";
|
|
22
|
+
|
|
23
|
+
import { createReplacer } from "../../../../utils";
|
|
24
|
+
|
|
25
|
+
import { POLYGON_BASE_SHADER_MARKERS } from "./markers";
|
|
26
|
+
import type { SupportedMaterial } from "./material";
|
|
27
|
+
import type { PolygonBaseMutates, PolygonBaseState } from "./types";
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Transform shader with core polygon modifications.
|
|
31
|
+
* Uniform assignment is handled by mutates.updateUniforms().
|
|
32
|
+
*/
|
|
33
|
+
export const transformShader = (
|
|
34
|
+
shader: WebGLProgramParametersWithUniforms,
|
|
35
|
+
state: PolygonBaseState,
|
|
36
|
+
mutates: PolygonBaseMutates,
|
|
37
|
+
material: SupportedMaterial,
|
|
38
|
+
): void => {
|
|
39
|
+
const { useRTE } = state;
|
|
40
|
+
|
|
41
|
+
// Set core shader defines
|
|
42
|
+
shader.defines ??= {};
|
|
43
|
+
shader.defines.USE_ROUGHNESS = 1;
|
|
44
|
+
shader.defines.USE_SELECTIVE_EFFECT = 1;
|
|
45
|
+
|
|
46
|
+
// TODO: Handle batch texture defines in safe way.
|
|
47
|
+
// Merge defines from material.userData.defines (includes batch texture row defines)
|
|
48
|
+
// This is important for batch texture functionality which sets defines like:
|
|
49
|
+
// - BATCHED_TEXTURE_ROW_COLOR_SHOW, BATCHED_TEXTURE_ROW_HEIGHT, etc.
|
|
50
|
+
// - USE_BATCH_TEXTURE, USE_BATCH_COLOR_SHOW, USE_BATCH_HEIGHT, etc.
|
|
51
|
+
if (material.userData.defines) {
|
|
52
|
+
Object.assign(shader.defines, material.userData.defines);
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
// Assign uniform refs to shader.uniforms via mutates
|
|
56
|
+
mutates.updateUniforms(shader.uniforms, state);
|
|
57
|
+
|
|
58
|
+
// Transform vertex shader
|
|
59
|
+
shader.vertexShader = createReplacer(shader.vertexShader)
|
|
60
|
+
.replace(
|
|
61
|
+
"#include <common>",
|
|
62
|
+
`
|
|
63
|
+
#include <common>
|
|
64
|
+
#include <packing>
|
|
65
|
+
|
|
66
|
+
in float attrBatchId;
|
|
67
|
+
in vec4 scaleNormalAndCap;
|
|
68
|
+
|
|
69
|
+
uniform vec2 uMinMaxHeight;
|
|
70
|
+
out float nvr_vBatchId;
|
|
71
|
+
|
|
72
|
+
${useRTE ? RteParsVertex : ""}
|
|
73
|
+
${ShowParsVertex}
|
|
74
|
+
${ExtrudedHeightParsVertex}
|
|
75
|
+
${HeightParsVertex}
|
|
76
|
+
${BatchTextureParsVertex}
|
|
77
|
+
|
|
78
|
+
${BranchFreeTernary}
|
|
79
|
+
|
|
80
|
+
${ShadowMapDepthParsVertex}
|
|
81
|
+
|
|
82
|
+
varying vec3 vPosition;
|
|
83
|
+
`,
|
|
84
|
+
)
|
|
85
|
+
.replace(
|
|
86
|
+
"#include <begin_vertex>",
|
|
87
|
+
`
|
|
88
|
+
${useRTE ? RteVertex : "#include <begin_vertex>"}
|
|
89
|
+
|
|
90
|
+
${ExtrudedHeightVertex}
|
|
91
|
+
${HeightVertex}
|
|
92
|
+
${BatchTextureVertex}
|
|
93
|
+
|
|
94
|
+
transformed.xyz += scaleNormalAndCap.xyz * nvr_branchFreeTernary(
|
|
95
|
+
scaleNormalAndCap.w == 0.0,
|
|
96
|
+
uMinMaxHeight.x + addHeight,
|
|
97
|
+
uMinMaxHeight.y + addExtrudedHeight
|
|
98
|
+
);
|
|
99
|
+
|
|
100
|
+
// Use the original GlobalBatchId for picking, not the batch_index
|
|
101
|
+
nvr_vBatchId = attrBatchId;
|
|
102
|
+
`,
|
|
103
|
+
)
|
|
104
|
+
.replace(
|
|
105
|
+
"#include <clipping_planes_vertex>",
|
|
106
|
+
`
|
|
107
|
+
#include <clipping_planes_vertex>
|
|
108
|
+
${ShadowMapDepthVertex}
|
|
109
|
+
`,
|
|
110
|
+
)
|
|
111
|
+
.replaceWithCondition("#include <project_vertex>", ProjectVertexRte, useRTE)
|
|
112
|
+
.replaceWithCondition(
|
|
113
|
+
"#include <envmap_vertex>",
|
|
114
|
+
`
|
|
115
|
+
#include <envmap_vertex>
|
|
116
|
+
|
|
117
|
+
vPosition = absTransformed.xyz;
|
|
118
|
+
vViewPosition = -absMvPosition.xyz;
|
|
119
|
+
`,
|
|
120
|
+
useRTE,
|
|
121
|
+
)
|
|
122
|
+
.replaceWithCondition(
|
|
123
|
+
"#include <worldpos_vertex>",
|
|
124
|
+
createReplacer(ShaderChunk.worldpos_vertex).replace(
|
|
125
|
+
"vec4 worldPosition = vec4( transformed, 1.0 );",
|
|
126
|
+
"vec4 worldPosition = vec4( absTransformed, 1.0 );",
|
|
127
|
+
).source,
|
|
128
|
+
useRTE,
|
|
129
|
+
)
|
|
130
|
+
.replaceWithCondition(
|
|
131
|
+
"#include <envmap_vertex>",
|
|
132
|
+
`
|
|
133
|
+
#include <envmap_vertex>
|
|
134
|
+
|
|
135
|
+
vPosition = (modelMatrix * vec4(transformed, 1.0)).xyz;
|
|
136
|
+
`,
|
|
137
|
+
!useRTE,
|
|
138
|
+
).source;
|
|
139
|
+
|
|
140
|
+
// Transform fragment shader
|
|
141
|
+
shader.fragmentShader = createReplacer(shader.fragmentShader)
|
|
142
|
+
.replace(
|
|
143
|
+
"#include <common>",
|
|
144
|
+
`
|
|
145
|
+
#include <common>
|
|
146
|
+
#include <packing>
|
|
147
|
+
`,
|
|
148
|
+
)
|
|
149
|
+
.replace(
|
|
150
|
+
"uniform vec3 diffuse;",
|
|
151
|
+
`
|
|
152
|
+
${POLYGON_BASE_SHADER_MARKERS.fragment.UNIFORM_START}
|
|
153
|
+
uniform vec3 diffuse;
|
|
154
|
+
uniform bool uClampToGround;
|
|
155
|
+
uniform sampler2D uGlobeNormal;
|
|
156
|
+
uniform float nvr_uPickable;
|
|
157
|
+
// uEffectIdsMask is declared by overrideMaterialsForMRT (#ifdef USE_SELECTIVE_EFFECT block)
|
|
158
|
+
uniform bool uIsTexturized;
|
|
159
|
+
${POLYGON_BASE_SHADER_MARKERS.fragment.UNIFORM_END}
|
|
160
|
+
|
|
161
|
+
in float nvr_vBatchId;
|
|
162
|
+
|
|
163
|
+
${ShowParsFragment}
|
|
164
|
+
|
|
165
|
+
${Pick}
|
|
166
|
+
|
|
167
|
+
${ShadowMapDepthParsFragment}
|
|
168
|
+
`,
|
|
169
|
+
)
|
|
170
|
+
.replace(
|
|
171
|
+
"#include <lights_lambert_pars_fragment>",
|
|
172
|
+
`
|
|
173
|
+
#include <lights_lambert_pars_fragment>
|
|
174
|
+
|
|
175
|
+
${SpecularParsFragment}
|
|
176
|
+
`,
|
|
177
|
+
)
|
|
178
|
+
.replace(
|
|
179
|
+
"void main() {",
|
|
180
|
+
`
|
|
181
|
+
void main() {
|
|
182
|
+
${ShowFragment}
|
|
183
|
+
${ShadowMapDepthFragment}
|
|
184
|
+
`,
|
|
185
|
+
)
|
|
186
|
+
.replace(
|
|
187
|
+
"#include <color_fragment>",
|
|
188
|
+
`
|
|
189
|
+
#include <color_fragment>
|
|
190
|
+
|
|
191
|
+
#ifdef USE_BATCH_COLOR_SHOW
|
|
192
|
+
diffuseColor.a *= nvr_vOpacity;
|
|
193
|
+
#endif
|
|
194
|
+
`,
|
|
195
|
+
)
|
|
196
|
+
.replace(
|
|
197
|
+
"#include <normal_fragment_maps>",
|
|
198
|
+
`
|
|
199
|
+
${POLYGON_BASE_SHADER_MARKERS.fragment.NORMAL_START}
|
|
200
|
+
|
|
201
|
+
vec3 origNormal = vec3(normal);
|
|
202
|
+
vec3 specular;
|
|
203
|
+
|
|
204
|
+
if(uClampToGround) {
|
|
205
|
+
vec2 uv = gl_FragCoord.xy / vec2(textureSize(uGlobeNormal, 0));
|
|
206
|
+
vec3 mapN = unpackVec2ToNormal(texture2D( uGlobeNormal, uv ).xy);
|
|
207
|
+
normal = normalize( mapN );
|
|
208
|
+
} else {
|
|
209
|
+
#include <normal_fragment_maps>
|
|
210
|
+
}
|
|
211
|
+
|
|
212
|
+
${POLYGON_BASE_SHADER_MARKERS.fragment.NORMAL_END}
|
|
213
|
+
`,
|
|
214
|
+
)
|
|
215
|
+
.replace(
|
|
216
|
+
"vec3 outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;",
|
|
217
|
+
`
|
|
218
|
+
vec3 outgoingLight;
|
|
219
|
+
if(uClampToGround) {
|
|
220
|
+
// Without lighting
|
|
221
|
+
outgoingLight = diffuseColor.xyz;
|
|
222
|
+
} else {
|
|
223
|
+
outgoingLight = reflectedLight.directDiffuse + reflectedLight.indirectDiffuse + totalEmissiveRadiance;
|
|
224
|
+
if(!uIsTexturized) {
|
|
225
|
+
outgoingLight += specular;
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
`,
|
|
229
|
+
)
|
|
230
|
+
.replace(
|
|
231
|
+
"#include <dithering_fragment>",
|
|
232
|
+
`
|
|
233
|
+
#include <dithering_fragment>
|
|
234
|
+
if (nvr_uPickable > 0.0 && diffuseColor.a > 0.0) {
|
|
235
|
+
vec3 pickColor = nvr_batchIdToColor(nvr_vBatchId);
|
|
236
|
+
gl_FragColor = vec4(pickColor.xyz, 1.0);
|
|
237
|
+
}
|
|
238
|
+
`,
|
|
239
|
+
)
|
|
240
|
+
.replace(
|
|
241
|
+
"normalBuffer = vec4(packNormalToVec2(normal), reflectivity, roughnessFactor);",
|
|
242
|
+
`
|
|
243
|
+
${POLYGON_BASE_SHADER_MARKERS.fragment.FINAL_NORMAL_START}
|
|
244
|
+
vec3 finalNormal = origNormal;
|
|
245
|
+
${POLYGON_BASE_SHADER_MARKERS.fragment.FINAL_NORMAL_END}
|
|
246
|
+
normalBuffer = vec4(packNormalToVec2(finalNormal), reflectivity, roughnessFactor);
|
|
247
|
+
`,
|
|
248
|
+
).source;
|
|
249
|
+
};
|