@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,439 @@
|
|
|
1
|
+
// Ref: https://github.com/takram-design-engineering/three-geospatial/blob/main/packages/effects/src/setupMaterialsForGeometryPass.ts
|
|
2
|
+
|
|
3
|
+
import { packing } from "@takram/three-geospatial/shaders";
|
|
4
|
+
import { ShaderLib, ShaderMaterial, type ShaderLibShader } from "three";
|
|
5
|
+
import { LineMaterial } from "three-stdlib";
|
|
6
|
+
|
|
7
|
+
import { createReplacer } from "../utils";
|
|
8
|
+
|
|
9
|
+
const SETUP = Symbol("SETUP");
|
|
10
|
+
|
|
11
|
+
declare module "three" {
|
|
12
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
|
|
13
|
+
interface ShaderLibShader {
|
|
14
|
+
[SETUP]?: boolean;
|
|
15
|
+
}
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/consistent-type-definitions
|
|
17
|
+
interface ShaderMaterial {
|
|
18
|
+
[SETUP]?: boolean;
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
function injectNormal(shader: ShaderLibShader): ShaderLibShader {
|
|
23
|
+
const vertexShader = createReplacer(shader.vertexShader)
|
|
24
|
+
.replace(
|
|
25
|
+
/* glsl */ `#include <fog_pars_vertex>`,
|
|
26
|
+
/* glsl */ `
|
|
27
|
+
#include <fog_pars_vertex>
|
|
28
|
+
#include <normal_pars_vertex>
|
|
29
|
+
`,
|
|
30
|
+
)
|
|
31
|
+
.replace(
|
|
32
|
+
/* glsl */ `#include <defaultnormal_vertex>`,
|
|
33
|
+
/* glsl */ `
|
|
34
|
+
#include <defaultnormal_vertex>
|
|
35
|
+
#include <normal_vertex>
|
|
36
|
+
`,
|
|
37
|
+
)
|
|
38
|
+
.replace(
|
|
39
|
+
/* glsl */ `#if defined ( USE_ENVMAP ) || defined ( USE_SKINNING )`,
|
|
40
|
+
/* glsl */ `#if 1`,
|
|
41
|
+
)
|
|
42
|
+
.replace(
|
|
43
|
+
/* glsl */ `#include <clipping_planes_vertex>`,
|
|
44
|
+
/* glsl */ `
|
|
45
|
+
#include <clipping_planes_vertex>
|
|
46
|
+
vViewPosition = - mvPosition.xyz;
|
|
47
|
+
`,
|
|
48
|
+
).source;
|
|
49
|
+
shader.vertexShader = /* glsl */ `
|
|
50
|
+
#undef FLAT_SHADED
|
|
51
|
+
varying vec3 vViewPosition;
|
|
52
|
+
${vertexShader}
|
|
53
|
+
`;
|
|
54
|
+
|
|
55
|
+
const fragmentShader = createReplacer(shader.fragmentShader)
|
|
56
|
+
.replace(
|
|
57
|
+
/#ifndef FLAT_SHADED\s+varying vec3 vNormal;\s+#endif/m,
|
|
58
|
+
/* glsl */ `#include <normal_pars_fragment>`,
|
|
59
|
+
)
|
|
60
|
+
.replace(
|
|
61
|
+
/* glsl */ `#include <common>`,
|
|
62
|
+
/* glsl */ `
|
|
63
|
+
#include <common>
|
|
64
|
+
#include <packing>
|
|
65
|
+
`,
|
|
66
|
+
)
|
|
67
|
+
.replace(
|
|
68
|
+
/* glsl */ `#include <specularmap_fragment>`,
|
|
69
|
+
/* glsl */ `
|
|
70
|
+
#include <specularmap_fragment>
|
|
71
|
+
#include <normal_fragment_begin>
|
|
72
|
+
#include <normal_fragment_maps>
|
|
73
|
+
`,
|
|
74
|
+
).source;
|
|
75
|
+
shader.fragmentShader = /* glsl */ `
|
|
76
|
+
#undef FLAT_SHADED
|
|
77
|
+
varying vec3 vViewPosition;
|
|
78
|
+
${fragmentShader}
|
|
79
|
+
`;
|
|
80
|
+
|
|
81
|
+
return shader;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
function injectGBuffer(
|
|
85
|
+
shader: ShaderLibShader,
|
|
86
|
+
{ type }: { type?: "basic" | "physical" } = {},
|
|
87
|
+
): ShaderLibShader {
|
|
88
|
+
if (shader[SETUP] === true) {
|
|
89
|
+
return shader;
|
|
90
|
+
}
|
|
91
|
+
if (type === "basic") {
|
|
92
|
+
injectNormal(shader);
|
|
93
|
+
}
|
|
94
|
+
const normalBufferWrite =
|
|
95
|
+
type === "physical"
|
|
96
|
+
? /* glsl */ `
|
|
97
|
+
normalBuffer = vec4(packNormalToVec2(normal), metalnessFactor, roughnessFactor)
|
|
98
|
+
`
|
|
99
|
+
: /* glsl */ `
|
|
100
|
+
#ifdef USE_ROUGHNESS
|
|
101
|
+
float roughnessFactor = roughness;
|
|
102
|
+
#else
|
|
103
|
+
float roughnessFactor = 0.0;
|
|
104
|
+
#endif
|
|
105
|
+
normalBuffer = vec4(packNormalToVec2(normal), reflectivity, roughnessFactor);
|
|
106
|
+
`;
|
|
107
|
+
shader.fragmentShader = /* glsl */ `
|
|
108
|
+
// MRT layout:
|
|
109
|
+
// location 0: gl_FragColor (color)
|
|
110
|
+
// location 1: normalBuffer (normal + material props)
|
|
111
|
+
// location 2: effectIdBuffer (effectIds: R=bitmask) — SelectiveEffect only
|
|
112
|
+
// location 3: emissiveBuffer (emissive: RGB=diffuseColor×intensity+emissive additive, A=unused) — SelectiveEffect only
|
|
113
|
+
#ifndef USE_SHADOWMAP_DEPTH
|
|
114
|
+
layout(location = 1) out vec4 normalBuffer;
|
|
115
|
+
layout(location = 2) out vec4 effectIdBuffer;
|
|
116
|
+
layout(location = 3) out vec4 emissiveBuffer;
|
|
117
|
+
#endif
|
|
118
|
+
|
|
119
|
+
#if !defined(USE_ENVMAP)
|
|
120
|
+
uniform float reflectivity;
|
|
121
|
+
#endif // !defined(USE_ENVMAP)
|
|
122
|
+
|
|
123
|
+
#ifdef USE_ROUGHNESS
|
|
124
|
+
uniform float roughness;
|
|
125
|
+
#endif // USE_ROUGHNESS
|
|
126
|
+
|
|
127
|
+
#ifdef USE_SELECTIVE_EFFECT
|
|
128
|
+
uniform float uEffectIdsMask;
|
|
129
|
+
uniform float uEmissiveIntensity;
|
|
130
|
+
#endif
|
|
131
|
+
|
|
132
|
+
${packing}
|
|
133
|
+
${
|
|
134
|
+
createReplacer(shader.fragmentShader).replace(
|
|
135
|
+
/}\s*$/, // Assume the last curly brace is of main()
|
|
136
|
+
/* glsl */ `
|
|
137
|
+
#ifndef USE_SHADOWMAP_DEPTH
|
|
138
|
+
${normalBufferWrite};
|
|
139
|
+
|
|
140
|
+
#ifdef USE_SELECTIVE_EFFECT
|
|
141
|
+
effectIdBuffer = vec4(uEffectIdsMask, 0.0, 0.0, 1.0);
|
|
142
|
+
emissiveBuffer = vec4(diffuseColor.rgb * uEmissiveIntensity + emissive, 1.0);
|
|
143
|
+
#else
|
|
144
|
+
effectIdBuffer = vec4(0.0);
|
|
145
|
+
emissiveBuffer = vec4(0.0);
|
|
146
|
+
#endif
|
|
147
|
+
#endif
|
|
148
|
+
}
|
|
149
|
+
`,
|
|
150
|
+
).source
|
|
151
|
+
}
|
|
152
|
+
`;
|
|
153
|
+
shader[SETUP] = true;
|
|
154
|
+
return shader;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
function injectGBufferToSpriteMaterial(shader: ShaderLibShader) {
|
|
158
|
+
if (shader[SETUP] === true) {
|
|
159
|
+
return shader;
|
|
160
|
+
}
|
|
161
|
+
|
|
162
|
+
shader.vertexShader = /* glsl */ `
|
|
163
|
+
varying vec3 vViewPosition;
|
|
164
|
+
${
|
|
165
|
+
createReplacer(shader.vertexShader).replace(
|
|
166
|
+
/}\s*$/,
|
|
167
|
+
`
|
|
168
|
+
vViewPosition = -mvPosition.xyz;
|
|
169
|
+
}
|
|
170
|
+
`,
|
|
171
|
+
).source
|
|
172
|
+
}
|
|
173
|
+
`;
|
|
174
|
+
|
|
175
|
+
shader.fragmentShader = /* glsl */ `
|
|
176
|
+
layout(location = 1) out vec4 normalBuffer;
|
|
177
|
+
layout(location = 2) out vec4 effectIdBuffer;
|
|
178
|
+
layout(location = 3) out vec4 emissiveBuffer;
|
|
179
|
+
|
|
180
|
+
#ifdef USE_SELECTIVE_EFFECT
|
|
181
|
+
uniform float uEffectIdsMask;
|
|
182
|
+
#endif
|
|
183
|
+
|
|
184
|
+
varying vec3 vViewPosition;
|
|
185
|
+
|
|
186
|
+
${packing}
|
|
187
|
+
|
|
188
|
+
${
|
|
189
|
+
createReplacer(shader.fragmentShader).replace(
|
|
190
|
+
/}\s*$/, // Assume the last curly brace is of main()
|
|
191
|
+
/* glsl */ `
|
|
192
|
+
// Flat shading
|
|
193
|
+
vec3 fdx = dFdx( vViewPosition );
|
|
194
|
+
vec3 fdy = dFdy( vViewPosition );
|
|
195
|
+
vec3 normal = normalize( cross( fdx, fdy ) );
|
|
196
|
+
normalBuffer = vec4(
|
|
197
|
+
packNormalToVec2(normal),
|
|
198
|
+
0.0,
|
|
199
|
+
0.0
|
|
200
|
+
);
|
|
201
|
+
|
|
202
|
+
#ifdef USE_SELECTIVE_EFFECT
|
|
203
|
+
effectIdBuffer = vec4(uEffectIdsMask, 0.0, 0.0, 1.0);
|
|
204
|
+
emissiveBuffer = vec4(0.0);
|
|
205
|
+
#else
|
|
206
|
+
effectIdBuffer = vec4(0.0);
|
|
207
|
+
emissiveBuffer = vec4(0.0);
|
|
208
|
+
#endif
|
|
209
|
+
}
|
|
210
|
+
`,
|
|
211
|
+
).source
|
|
212
|
+
}
|
|
213
|
+
`;
|
|
214
|
+
|
|
215
|
+
shader[SETUP] = true;
|
|
216
|
+
|
|
217
|
+
return shader;
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
/**
|
|
221
|
+
* @internal
|
|
222
|
+
* Patches all built-in Three.js `ShaderLib` materials (basic, lambert, phong,
|
|
223
|
+
* standard, physical, sprite, points) so they write to the MRT G-buffer.
|
|
224
|
+
* Called automatically when `@navaramap/three` is imported — application code
|
|
225
|
+
* never needs to call this. Custom `ShaderMaterial`/`LineMaterial` do not go
|
|
226
|
+
* through `ShaderLib`, so they must opt in via {@link setupMaterialForMRT}.
|
|
227
|
+
*/
|
|
228
|
+
export function overrideMaterialsForMRT(): void {
|
|
229
|
+
injectGBuffer(ShaderLib.lambert);
|
|
230
|
+
injectGBuffer(ShaderLib.phong);
|
|
231
|
+
injectGBuffer(ShaderLib.basic, { type: "basic" });
|
|
232
|
+
injectGBuffer(ShaderLib.standard, { type: "physical" });
|
|
233
|
+
injectGBuffer(ShaderLib.physical, { type: "physical" });
|
|
234
|
+
injectGBufferToSpriteMaterial(ShaderLib.sprite);
|
|
235
|
+
injectGBufferToSpriteMaterial(ShaderLib.points);
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
// TODO: Use a parser to handle this.
|
|
239
|
+
function injectGBufferToShaderMaterial(
|
|
240
|
+
shader: ShaderMaterial,
|
|
241
|
+
normalVariableName = "normal",
|
|
242
|
+
): ShaderLibShader {
|
|
243
|
+
if (shader[SETUP] === true) {
|
|
244
|
+
return shader;
|
|
245
|
+
}
|
|
246
|
+
|
|
247
|
+
// Vertex shader
|
|
248
|
+
const common = "#include <common>";
|
|
249
|
+
|
|
250
|
+
const logdepthParsVert = "#include <logdepthbuf_pars_vertex>";
|
|
251
|
+
const logdepthVert = "#include <logdepthbuf_vertex>";
|
|
252
|
+
|
|
253
|
+
shader.vertexShader = /* glsl */ `
|
|
254
|
+
${shader.vertexShader.includes(common) ? "" : common}
|
|
255
|
+
${shader.vertexShader.includes(logdepthParsVert) ? "" : logdepthParsVert}
|
|
256
|
+
|
|
257
|
+
${
|
|
258
|
+
createReplacer(shader.vertexShader).replace(
|
|
259
|
+
/}\s*$/, // Assume the last curly brace is of main()
|
|
260
|
+
/* glsl */ `
|
|
261
|
+
${shader.vertexShader.includes(logdepthVert) ? "" : logdepthVert}
|
|
262
|
+
}
|
|
263
|
+
`,
|
|
264
|
+
).source
|
|
265
|
+
}
|
|
266
|
+
`;
|
|
267
|
+
|
|
268
|
+
// Fragment shader
|
|
269
|
+
const logdepthParsFrag = "#include <logdepthbuf_pars_fragment>";
|
|
270
|
+
const logdepthFrag = "#include <logdepthbuf_fragment>";
|
|
271
|
+
const normalBufferWrite = /* glsl */ `
|
|
272
|
+
vec4(
|
|
273
|
+
packNormalToVec2(${normalVariableName}),
|
|
274
|
+
0.0,
|
|
275
|
+
0.0
|
|
276
|
+
);
|
|
277
|
+
`;
|
|
278
|
+
shader.fragmentShader = /* glsl */ `
|
|
279
|
+
#ifndef USE_SHADOWMAP_DEPTH
|
|
280
|
+
layout(location = 1) out vec4 normalBuffer;
|
|
281
|
+
layout(location = 2) out vec4 effectIdBuffer;
|
|
282
|
+
layout(location = 3) out vec4 emissiveBuffer;
|
|
283
|
+
|
|
284
|
+
#ifdef USE_SELECTIVE_EFFECT
|
|
285
|
+
uniform float uEffectIdsMask;
|
|
286
|
+
uniform vec3 uEmissiveColor;
|
|
287
|
+
uniform float uEmissiveIntensity;
|
|
288
|
+
#endif
|
|
289
|
+
#endif
|
|
290
|
+
|
|
291
|
+
${packing}
|
|
292
|
+
|
|
293
|
+
${shader.fragmentShader.includes(logdepthParsFrag) ? "" : logdepthParsFrag}
|
|
294
|
+
|
|
295
|
+
${
|
|
296
|
+
createReplacer(shader.fragmentShader).replace(
|
|
297
|
+
/}\s*$/, // Assume the last curly brace is of main()
|
|
298
|
+
/* glsl */ `
|
|
299
|
+
${shader.fragmentShader.includes(logdepthFrag) ? "" : logdepthFrag}
|
|
300
|
+
|
|
301
|
+
#ifndef USE_SHADOWMAP_DEPTH
|
|
302
|
+
normalBuffer = ${normalBufferWrite};
|
|
303
|
+
|
|
304
|
+
#ifdef USE_SELECTIVE_EFFECT
|
|
305
|
+
effectIdBuffer = vec4(uEffectIdsMask, 0.0, 0.0, 1.0);
|
|
306
|
+
emissiveBuffer = vec4((gl_FragColor.rgb + uEmissiveColor) * uEmissiveIntensity, 1.0);
|
|
307
|
+
#else
|
|
308
|
+
effectIdBuffer = vec4(0.0);
|
|
309
|
+
emissiveBuffer = vec4(0.0);
|
|
310
|
+
#endif
|
|
311
|
+
#endif
|
|
312
|
+
}
|
|
313
|
+
`,
|
|
314
|
+
).source
|
|
315
|
+
}
|
|
316
|
+
`;
|
|
317
|
+
|
|
318
|
+
shader[SETUP] = true;
|
|
319
|
+
|
|
320
|
+
return shader;
|
|
321
|
+
}
|
|
322
|
+
|
|
323
|
+
export type SetupMaterialForMRTOptions = {
|
|
324
|
+
/**
|
|
325
|
+
* Name of the GLSL variable holding the **view-space** normal in the
|
|
326
|
+
* fragment shader (it is packed with `packNormalToVec2`, which assumes
|
|
327
|
+
* view space). Defaults to `"normal"`. Shaders that expose their normal as
|
|
328
|
+
* a `varying vec3 vNormal` should pass `{ normal: "vNormal" }`.
|
|
329
|
+
*
|
|
330
|
+
* Ignored for `LineMaterial`, which derives a screen-space normal itself.
|
|
331
|
+
*/
|
|
332
|
+
normal?: string;
|
|
333
|
+
};
|
|
334
|
+
|
|
335
|
+
// LineMaterial MRT Support. Injects normalBuffer, effectIdBuffer, emissiveBuffer outputs.
|
|
336
|
+
// When USE_SELECTIVE_EFFECT is defined, outputs effectIdsMask (emissive not supported for LineMaterial).
|
|
337
|
+
function injectGBufferToLineMaterial(lineMaterial: LineMaterial) {
|
|
338
|
+
if (lineMaterial[SETUP] === true) {
|
|
339
|
+
return lineMaterial;
|
|
340
|
+
}
|
|
341
|
+
|
|
342
|
+
// Check if this is actually a LineMaterial from three-stdlib
|
|
343
|
+
if (
|
|
344
|
+
!lineMaterial.fragmentShader ||
|
|
345
|
+
!lineMaterial.fragmentShader.includes("vLineDistance")
|
|
346
|
+
) {
|
|
347
|
+
return lineMaterial;
|
|
348
|
+
}
|
|
349
|
+
|
|
350
|
+
// LineMaterial already has proper vertex shader setup, so we only modify fragment shader
|
|
351
|
+
|
|
352
|
+
lineMaterial.fragmentShader = /* glsl */ `
|
|
353
|
+
layout(location = 1) out vec4 normalBuffer;
|
|
354
|
+
layout(location = 2) out vec4 effectIdBuffer;
|
|
355
|
+
layout(location = 3) out vec4 emissiveBuffer;
|
|
356
|
+
|
|
357
|
+
#ifdef USE_SELECTIVE_EFFECT
|
|
358
|
+
uniform float uEffectIdsMask;
|
|
359
|
+
#endif
|
|
360
|
+
|
|
361
|
+
${packing}
|
|
362
|
+
|
|
363
|
+
${
|
|
364
|
+
createReplacer(lineMaterial.fragmentShader)
|
|
365
|
+
.replace(
|
|
366
|
+
"void main() {",
|
|
367
|
+
/* glsl */ `
|
|
368
|
+
void main() {
|
|
369
|
+
// Calculate screen-space normal for Line2 MRT compatibility
|
|
370
|
+
vec3 fdx = dFdx(gl_FragCoord.xyz);
|
|
371
|
+
vec3 fdy = dFdy(gl_FragCoord.xyz);
|
|
372
|
+
vec3 normal = normalize(cross(fdx, fdy));
|
|
373
|
+
|
|
374
|
+
// Ensure normal faces camera (positive Z in screen space)
|
|
375
|
+
if (normal.z < 0.0) normal = -normal;
|
|
376
|
+
`,
|
|
377
|
+
)
|
|
378
|
+
.replace(
|
|
379
|
+
/}\s*$/, // Assume the last curly brace is of main()
|
|
380
|
+
/* glsl */ `
|
|
381
|
+
normalBuffer = vec4(
|
|
382
|
+
packNormalToVec2(normal),
|
|
383
|
+
0.0,
|
|
384
|
+
0.0
|
|
385
|
+
);
|
|
386
|
+
|
|
387
|
+
#ifdef USE_SELECTIVE_EFFECT
|
|
388
|
+
effectIdBuffer = vec4(uEffectIdsMask, 0.0, 0.0, 1.0);
|
|
389
|
+
emissiveBuffer = vec4(0.0);
|
|
390
|
+
#else
|
|
391
|
+
effectIdBuffer = vec4(0.0);
|
|
392
|
+
emissiveBuffer = vec4(0.0);
|
|
393
|
+
#endif
|
|
394
|
+
}
|
|
395
|
+
`,
|
|
396
|
+
).source
|
|
397
|
+
}
|
|
398
|
+
`;
|
|
399
|
+
|
|
400
|
+
lineMaterial[SETUP] = true;
|
|
401
|
+
|
|
402
|
+
return lineMaterial;
|
|
403
|
+
}
|
|
404
|
+
|
|
405
|
+
/**
|
|
406
|
+
* Wire a custom material into Navara's MRT G-buffer so depth/normal-based
|
|
407
|
+
* effects (SSAO, SSR, outline, aerial perspective, clouds) and SelectiveEffect
|
|
408
|
+
* (Bloom/Outline) work on the mesh that uses it.
|
|
409
|
+
*
|
|
410
|
+
* Built-in Three.js materials (`MeshStandardMaterial`, `MeshBasicMaterial`,
|
|
411
|
+
* `Sprite`, `Points`, …) are patched automatically on import and do **not**
|
|
412
|
+
* need this. Only custom `ShaderMaterial` and three-stdlib `LineMaterial`
|
|
413
|
+
* bypass `ShaderLib`, so they must opt in here.
|
|
414
|
+
*
|
|
415
|
+
* `LineMaterial` is detected and routed automatically; the `normal` option is
|
|
416
|
+
* only used for plain `ShaderMaterial`.
|
|
417
|
+
*
|
|
418
|
+
* Injects `normalBuffer` (location 1), `effectIdBuffer` (location 2), and
|
|
419
|
+
* `emissiveBuffer` (location 3). For `ShaderMaterial` it also injects the
|
|
420
|
+
* `logdepthbuf` modules; `LineMaterial` already has its own vertex setup, so
|
|
421
|
+
* those are not added. When `USE_SELECTIVE_EFFECT` is defined,
|
|
422
|
+
* `effectIdBuffer`/`emissiveBuffer` are populated (emissive is unsupported for
|
|
423
|
+
* `LineMaterial`). Idempotent — calling it more than once on the same material
|
|
424
|
+
* is a no-op.
|
|
425
|
+
*
|
|
426
|
+
* Requirements for `ShaderMaterial`: the fragment shader must expose a
|
|
427
|
+
* view-space normal (named by `options.normal`, default `"normal"`), and the
|
|
428
|
+
* last `}` in each shader is assumed to close `main()`.
|
|
429
|
+
*/
|
|
430
|
+
export function setupMaterialForMRT(
|
|
431
|
+
material: ShaderMaterial,
|
|
432
|
+
options?: SetupMaterialForMRTOptions,
|
|
433
|
+
): void {
|
|
434
|
+
if (material instanceof LineMaterial) {
|
|
435
|
+
injectGBufferToLineMaterial(material);
|
|
436
|
+
return;
|
|
437
|
+
}
|
|
438
|
+
injectGBufferToShaderMaterial(material, options?.normal);
|
|
439
|
+
}
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import { MeshLambertMaterial } from "three";
|
|
2
|
+
import { describe, expect, it } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { setupSelectiveEffectUniforms } from "./selectiveEffectMaterialSetup";
|
|
5
|
+
|
|
6
|
+
describe("setupSelectiveEffectUniforms", () => {
|
|
7
|
+
it("should link uEmissiveIntensity that auto-syncs with material.emissiveIntensity", () => {
|
|
8
|
+
const material = new MeshLambertMaterial();
|
|
9
|
+
material.emissiveIntensity = 0.5;
|
|
10
|
+
setupSelectiveEffectUniforms(material);
|
|
11
|
+
|
|
12
|
+
// Initial value should match material.emissiveIntensity
|
|
13
|
+
expect(material.userData.uEmissiveIntensity.value).toBe(0.5);
|
|
14
|
+
|
|
15
|
+
// Changing material.emissiveIntensity should be reflected via getter
|
|
16
|
+
material.emissiveIntensity = 0.8;
|
|
17
|
+
expect(material.userData.uEmissiveIntensity.value).toBe(0.8);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("should link uEffectIdsMask uniform", () => {
|
|
21
|
+
const material = new MeshLambertMaterial();
|
|
22
|
+
setupSelectiveEffectUniforms(material);
|
|
23
|
+
|
|
24
|
+
expect(material.userData.uEffectIdsMask).toBeDefined();
|
|
25
|
+
expect(material.userData.uEffectIdsMask.value).toBe(0);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("should set USE_SELECTIVE_EFFECT define", () => {
|
|
29
|
+
const material = new MeshLambertMaterial();
|
|
30
|
+
setupSelectiveEffectUniforms(material);
|
|
31
|
+
|
|
32
|
+
expect(material.defines?.USE_SELECTIVE_EFFECT).toBe(1);
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
it("should include SelectiveEffect in program cache key", () => {
|
|
36
|
+
const material = new MeshLambertMaterial();
|
|
37
|
+
setupSelectiveEffectUniforms(material);
|
|
38
|
+
|
|
39
|
+
const cacheKey = material.customProgramCacheKey();
|
|
40
|
+
expect(cacheKey).toContain("SelectiveEffect");
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
it("should be idempotent — second call is a no-op", () => {
|
|
44
|
+
const material = new MeshLambertMaterial();
|
|
45
|
+
setupSelectiveEffectUniforms(material);
|
|
46
|
+
|
|
47
|
+
const firstRef = material.userData.uEffectIdsMask;
|
|
48
|
+
setupSelectiveEffectUniforms(material);
|
|
49
|
+
|
|
50
|
+
expect(material.userData.uEffectIdsMask).toBe(firstRef);
|
|
51
|
+
});
|
|
52
|
+
});
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import type { MeshLambertMaterial, MeshStandardMaterial } from "three";
|
|
2
|
+
|
|
3
|
+
const SELECTIVE_EFFECT_SETUP = Symbol("SELECTIVE_EFFECT_SETUP");
|
|
4
|
+
|
|
5
|
+
/**
|
|
6
|
+
* Set up Selective Effect defines and uniforms on a standard Three.js material.
|
|
7
|
+
* Sets USE_SELECTIVE_EFFECT define so the MRT shader writes effectIds + emissive.
|
|
8
|
+
* Emissive output uses additive blend: diffuseColor × emissiveIntensity + emissive.
|
|
9
|
+
* Used by non-enhancer meshes (Box, Sphere, etc.).
|
|
10
|
+
*
|
|
11
|
+
* Idempotent — calling multiple times on the same material is safe (no-op after first call).
|
|
12
|
+
*/
|
|
13
|
+
export function setupSelectiveEffectUniforms(
|
|
14
|
+
material: MeshLambertMaterial | MeshStandardMaterial,
|
|
15
|
+
): void {
|
|
16
|
+
// Guard: only set up once per material
|
|
17
|
+
if ((material as unknown as Record<symbol, boolean>)[SELECTIVE_EFFECT_SETUP])
|
|
18
|
+
return;
|
|
19
|
+
(material as unknown as Record<symbol, boolean>)[SELECTIVE_EFFECT_SETUP] =
|
|
20
|
+
true;
|
|
21
|
+
|
|
22
|
+
material.userData.uEffectIdsMask = { value: 0 };
|
|
23
|
+
// Getter-based uniform: auto-syncs with material.emissiveIntensity without manual updates
|
|
24
|
+
material.userData.uEmissiveIntensity = {
|
|
25
|
+
get value() {
|
|
26
|
+
return material.emissiveIntensity;
|
|
27
|
+
},
|
|
28
|
+
};
|
|
29
|
+
|
|
30
|
+
// Set define on material.defines so Three.js includes it in program cache key.
|
|
31
|
+
// This ensures SelectiveEffect and non-SelectiveEffect materials get separate compiled programs.
|
|
32
|
+
material.defines = material.defines ?? {};
|
|
33
|
+
material.defines.USE_SELECTIVE_EFFECT = 1;
|
|
34
|
+
|
|
35
|
+
// Include SelectiveEffect token in program cache key to prevent program sharing
|
|
36
|
+
const prevCacheKey = material.customProgramCacheKey;
|
|
37
|
+
material.customProgramCacheKey = () => {
|
|
38
|
+
const base = prevCacheKey ? prevCacheKey.call(material) : "";
|
|
39
|
+
return `${base}_SelectiveEffect`;
|
|
40
|
+
};
|
|
41
|
+
|
|
42
|
+
const prevOnBeforeCompile = material.onBeforeCompile;
|
|
43
|
+
material.onBeforeCompile = (shader, renderer) => {
|
|
44
|
+
prevOnBeforeCompile?.call(material, shader, renderer);
|
|
45
|
+
|
|
46
|
+
// Link SelectiveEffect uniforms for runtime value updates
|
|
47
|
+
shader.uniforms.uEffectIdsMask = material.userData.uEffectIdsMask;
|
|
48
|
+
shader.uniforms.uEmissiveIntensity = material.userData.uEmissiveIntensity;
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// Force recompile if the material was already rendered with the old program
|
|
52
|
+
material.needsUpdate = true;
|
|
53
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * from "./uniform";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export type UniformValue<T> = { value: T };
|
|
@@ -0,0 +1,101 @@
|
|
|
1
|
+
import {
|
|
2
|
+
AlwaysStencilFunc,
|
|
3
|
+
BackSide,
|
|
4
|
+
DecrementWrapStencilOp,
|
|
5
|
+
FrontSide,
|
|
6
|
+
IncrementWrapStencilOp,
|
|
7
|
+
KeepStencilOp,
|
|
8
|
+
Mesh,
|
|
9
|
+
NotEqualStencilFunc,
|
|
10
|
+
ZeroStencilOp,
|
|
11
|
+
type BufferGeometry,
|
|
12
|
+
type Material,
|
|
13
|
+
type NormalBufferAttributes,
|
|
14
|
+
type Object3DEventMap,
|
|
15
|
+
} from "three";
|
|
16
|
+
|
|
17
|
+
export class DrapedMesh<
|
|
18
|
+
TGeometry extends BufferGeometry = BufferGeometry<NormalBufferAttributes>,
|
|
19
|
+
TMaterial extends Material | Material[] = Material | Material[],
|
|
20
|
+
TEventMap extends Object3DEventMap = Object3DEventMap,
|
|
21
|
+
> extends Mesh<TGeometry, TMaterial, TEventMap> {
|
|
22
|
+
drapedEnable: boolean;
|
|
23
|
+
|
|
24
|
+
constructor(geometry?: TGeometry, material?: TMaterial, enable = true) {
|
|
25
|
+
super(geometry, material);
|
|
26
|
+
this.drapedEnable = enable;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
enabled() {
|
|
30
|
+
return this.drapedEnable && this.visible;
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Run the stencil-test draping passes for this mesh.
|
|
35
|
+
* The caller supplies a `render` callback that performs the actual draw call
|
|
36
|
+
* (e.g. `renderer.render(scene, camera)`).
|
|
37
|
+
*/
|
|
38
|
+
process(render: () => void): void {
|
|
39
|
+
if (!this.enabled()) return;
|
|
40
|
+
|
|
41
|
+
const run = (m: Material) => {
|
|
42
|
+
// Save original material state
|
|
43
|
+
const origStencilFunc = m.stencilFunc;
|
|
44
|
+
const origStencilFail = m.stencilFail;
|
|
45
|
+
const origStencilZPass = m.stencilZPass;
|
|
46
|
+
const origStencilZFail = m.stencilZFail;
|
|
47
|
+
const origSide = m.side;
|
|
48
|
+
const origColorWrite = m.colorWrite;
|
|
49
|
+
const origDepthWrite = m.depthWrite;
|
|
50
|
+
const origStencilWrite = m.stencilWrite;
|
|
51
|
+
const origDepthTest = m.depthTest;
|
|
52
|
+
|
|
53
|
+
// Back face pass
|
|
54
|
+
m.stencilFunc = AlwaysStencilFunc;
|
|
55
|
+
m.stencilFail = KeepStencilOp;
|
|
56
|
+
m.stencilZPass = KeepStencilOp;
|
|
57
|
+
m.stencilZFail = IncrementWrapStencilOp;
|
|
58
|
+
m.side = BackSide;
|
|
59
|
+
m.colorWrite = false;
|
|
60
|
+
m.depthWrite = false;
|
|
61
|
+
m.stencilWrite = true;
|
|
62
|
+
m.depthTest = true;
|
|
63
|
+
|
|
64
|
+
render();
|
|
65
|
+
|
|
66
|
+
// Front face pass
|
|
67
|
+
m.side = FrontSide;
|
|
68
|
+
m.stencilZFail = DecrementWrapStencilOp;
|
|
69
|
+
|
|
70
|
+
render();
|
|
71
|
+
|
|
72
|
+
// Final pass
|
|
73
|
+
m.stencilFunc = NotEqualStencilFunc;
|
|
74
|
+
m.stencilFail = ZeroStencilOp;
|
|
75
|
+
m.stencilZFail = ZeroStencilOp;
|
|
76
|
+
m.stencilZPass = ZeroStencilOp;
|
|
77
|
+
m.side = BackSide;
|
|
78
|
+
m.colorWrite = true;
|
|
79
|
+
m.depthTest = false;
|
|
80
|
+
|
|
81
|
+
render();
|
|
82
|
+
|
|
83
|
+
// Restore original material state
|
|
84
|
+
m.stencilFunc = origStencilFunc;
|
|
85
|
+
m.stencilFail = origStencilFail;
|
|
86
|
+
m.stencilZPass = origStencilZPass;
|
|
87
|
+
m.stencilZFail = origStencilZFail;
|
|
88
|
+
m.side = origSide;
|
|
89
|
+
m.colorWrite = origColorWrite;
|
|
90
|
+
m.depthWrite = origDepthWrite;
|
|
91
|
+
m.stencilWrite = origStencilWrite;
|
|
92
|
+
m.depthTest = origDepthTest;
|
|
93
|
+
};
|
|
94
|
+
|
|
95
|
+
if (Array.isArray(this.material)) {
|
|
96
|
+
this.material.map(run);
|
|
97
|
+
} else {
|
|
98
|
+
run(this.material);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|