@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
package/src/input.ts
ADDED
|
@@ -0,0 +1,144 @@
|
|
|
1
|
+
import type { Core } from "@navaramap/engine";
|
|
2
|
+
|
|
3
|
+
// TODO: Need to think about how to propagate these event to worker.
|
|
4
|
+
export function registerInputEvents(
|
|
5
|
+
core: Core,
|
|
6
|
+
element: HTMLElement,
|
|
7
|
+
getTerrainDistance?: () => number | null,
|
|
8
|
+
): () => void {
|
|
9
|
+
let mouseEvent:
|
|
10
|
+
| {
|
|
11
|
+
type: "mousedown" | "mouseup";
|
|
12
|
+
button: number;
|
|
13
|
+
}
|
|
14
|
+
| undefined;
|
|
15
|
+
|
|
16
|
+
let lastTerrainDistance: number | undefined;
|
|
17
|
+
|
|
18
|
+
const mousedown = (event: MouseEvent) => {
|
|
19
|
+
mouseEvent = {
|
|
20
|
+
type: "mousedown",
|
|
21
|
+
button: event.button,
|
|
22
|
+
};
|
|
23
|
+
const terrainDistance = getTerrainDistance?.() ?? undefined;
|
|
24
|
+
lastTerrainDistance = terrainDistance;
|
|
25
|
+
core.input({ ...mouseEvent, terrain_distance: terrainDistance });
|
|
26
|
+
};
|
|
27
|
+
const mouseup = () => {
|
|
28
|
+
core.input({
|
|
29
|
+
...(mouseEvent ?? {}),
|
|
30
|
+
type: "mouseup",
|
|
31
|
+
});
|
|
32
|
+
mouseEvent = undefined;
|
|
33
|
+
};
|
|
34
|
+
|
|
35
|
+
const mousemove = (event: MouseEvent) => {
|
|
36
|
+
const width = element.clientWidth;
|
|
37
|
+
const height = element.clientHeight;
|
|
38
|
+
const aspectRatio = width / height;
|
|
39
|
+
core.input({
|
|
40
|
+
type: "mousemove",
|
|
41
|
+
x: (event.clientX / width) * aspectRatio,
|
|
42
|
+
y: event.clientY / height,
|
|
43
|
+
});
|
|
44
|
+
};
|
|
45
|
+
|
|
46
|
+
const touchstart = (event: TouchEvent) => {
|
|
47
|
+
event.preventDefault();
|
|
48
|
+
|
|
49
|
+
lastTerrainDistance = getTerrainDistance?.() ?? undefined;
|
|
50
|
+
for (const touch of event.changedTouches) {
|
|
51
|
+
core.input({
|
|
52
|
+
type: "touchstart",
|
|
53
|
+
x: touch.clientX,
|
|
54
|
+
y: touch.clientY,
|
|
55
|
+
id: touch.identifier,
|
|
56
|
+
terrain_distance: lastTerrainDistance,
|
|
57
|
+
});
|
|
58
|
+
}
|
|
59
|
+
};
|
|
60
|
+
|
|
61
|
+
const touchend = (event: TouchEvent) => {
|
|
62
|
+
event.preventDefault();
|
|
63
|
+
|
|
64
|
+
for (const touch of event.changedTouches) {
|
|
65
|
+
core.input({
|
|
66
|
+
type: "touchend",
|
|
67
|
+
x: touch.clientX,
|
|
68
|
+
y: touch.clientY,
|
|
69
|
+
id: touch.identifier,
|
|
70
|
+
});
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
const touchmove = (event: TouchEvent) => {
|
|
75
|
+
event.preventDefault();
|
|
76
|
+
|
|
77
|
+
for (const touch of event.changedTouches) {
|
|
78
|
+
core.input({
|
|
79
|
+
type: "touchmove",
|
|
80
|
+
x: touch.clientX,
|
|
81
|
+
y: touch.clientY,
|
|
82
|
+
id: touch.identifier,
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
};
|
|
86
|
+
|
|
87
|
+
const wheel = (event: WheelEvent) => {
|
|
88
|
+
lastTerrainDistance = getTerrainDistance?.() ?? undefined;
|
|
89
|
+
core.input({
|
|
90
|
+
type: "wheel",
|
|
91
|
+
x: event.deltaX,
|
|
92
|
+
y: event.deltaY,
|
|
93
|
+
terrain_distance: lastTerrainDistance,
|
|
94
|
+
});
|
|
95
|
+
};
|
|
96
|
+
|
|
97
|
+
const keydown = (event: KeyboardEvent) => {
|
|
98
|
+
core.input({
|
|
99
|
+
type: "keydown",
|
|
100
|
+
key_code: event.code,
|
|
101
|
+
key: event.key,
|
|
102
|
+
});
|
|
103
|
+
};
|
|
104
|
+
|
|
105
|
+
const keyup = (event: KeyboardEvent) => {
|
|
106
|
+
core.input({
|
|
107
|
+
type: "keyup",
|
|
108
|
+
key_code: event?.code,
|
|
109
|
+
key: event?.key,
|
|
110
|
+
});
|
|
111
|
+
};
|
|
112
|
+
// This is used to emit a key up event without any params.
|
|
113
|
+
const keyupEmpty = () => {
|
|
114
|
+
core.input({
|
|
115
|
+
type: "keyup",
|
|
116
|
+
});
|
|
117
|
+
};
|
|
118
|
+
|
|
119
|
+
element.addEventListener("mousedown", mousedown);
|
|
120
|
+
element.addEventListener("mouseup", mouseup);
|
|
121
|
+
element.addEventListener("mouseleave", mouseup);
|
|
122
|
+
element.addEventListener("mouseleave", keyupEmpty);
|
|
123
|
+
element.addEventListener("mousemove", mousemove);
|
|
124
|
+
element.addEventListener("touchstart", touchstart);
|
|
125
|
+
element.addEventListener("touchend", touchend);
|
|
126
|
+
element.addEventListener("touchmove", touchmove);
|
|
127
|
+
element.addEventListener("wheel", wheel);
|
|
128
|
+
document.addEventListener("keydown", keydown);
|
|
129
|
+
document.addEventListener("keyup", keyup);
|
|
130
|
+
|
|
131
|
+
return () => {
|
|
132
|
+
element.removeEventListener("mousedown", mousedown);
|
|
133
|
+
element.removeEventListener("mouseup", mouseup);
|
|
134
|
+
element.removeEventListener("mouseleave", mouseup);
|
|
135
|
+
element.removeEventListener("mouseleave", keyupEmpty);
|
|
136
|
+
element.removeEventListener("mousemove", mousemove);
|
|
137
|
+
element.removeEventListener("touchstart", touchstart);
|
|
138
|
+
element.removeEventListener("touchend", touchend);
|
|
139
|
+
element.removeEventListener("touchmove", touchmove);
|
|
140
|
+
element.removeEventListener("wheel", wheel);
|
|
141
|
+
document.removeEventListener("keydown", keydown);
|
|
142
|
+
document.removeEventListener("keyup", keyup);
|
|
143
|
+
};
|
|
144
|
+
}
|
package/src/layer.ts
ADDED
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
import { EventHandler, type FeatureSetId } from "@navaramap/core";
|
|
2
|
+
import type { Core } from "@navaramap/engine";
|
|
3
|
+
|
|
4
|
+
import { FeatureEvaluator } from "./evaluations";
|
|
5
|
+
import { Source } from "./source";
|
|
6
|
+
import type { LayerDescription } from "./type";
|
|
7
|
+
|
|
8
|
+
export type FeatureCreatedParams = {
|
|
9
|
+
featureSetId: FeatureSetId;
|
|
10
|
+
evaluator: FeatureEvaluator;
|
|
11
|
+
credit?: string;
|
|
12
|
+
};
|
|
13
|
+
|
|
14
|
+
export type FeatureUpdatedParams = {
|
|
15
|
+
featureSetId: FeatureSetId;
|
|
16
|
+
evaluator: FeatureEvaluator;
|
|
17
|
+
updatedAt: number;
|
|
18
|
+
};
|
|
19
|
+
|
|
20
|
+
export type FeatureVisibilityChangedParams = {
|
|
21
|
+
featureSetId: FeatureSetId;
|
|
22
|
+
visible: boolean;
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
export type FeatureRemovedParams = {
|
|
26
|
+
featureSetId: FeatureSetId;
|
|
27
|
+
};
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Events emitted by Layer. Subscribe using `layer.on(eventName, callback)`.
|
|
31
|
+
*/
|
|
32
|
+
export type LayerEvent = {
|
|
33
|
+
/** Emitted when a new feature is created in this layer. */
|
|
34
|
+
featureCreated: (params: FeatureCreatedParams) => void;
|
|
35
|
+
/** Emitted when a feature in this layer is updated. */
|
|
36
|
+
featureUpdated: (params: FeatureUpdatedParams) => void;
|
|
37
|
+
/** Emitted when a feature's visibility changes. */
|
|
38
|
+
featureVisibilityChanged: (params: FeatureVisibilityChangedParams) => void;
|
|
39
|
+
/** Emitted when a feature is removed from this layer. */
|
|
40
|
+
featureRemoved: (params: FeatureRemovedParams) => void;
|
|
41
|
+
/** Emitted when the layer is deleted. */
|
|
42
|
+
deleted: () => void;
|
|
43
|
+
};
|
|
44
|
+
|
|
45
|
+
/**
|
|
46
|
+
* A handle to control a resource layer (e.g., imagery, terrain, GeoJSON, 3D Tiles) after it has been added to the scene.
|
|
47
|
+
* Returned by `ThreeView.addLayer()` when adding resource layers (not mesh, light, or effect descriptors).
|
|
48
|
+
*
|
|
49
|
+
* Resource layers are data-driven layers that load and display geographic data from external sources.
|
|
50
|
+
* Use this handle to update layer configuration or delete the layer.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* // Add a GeoJSON layer
|
|
55
|
+
* const geoJsonLayer = view.addLayer({
|
|
56
|
+
* type: "geojson",
|
|
57
|
+
* data: {
|
|
58
|
+
* url: "https://example.com/data.geojson",
|
|
59
|
+
* },
|
|
60
|
+
* point: { color: 0xff0000 }
|
|
61
|
+
* });
|
|
62
|
+
*
|
|
63
|
+
* // Update the layer configuration
|
|
64
|
+
* geoJsonLayer.update({ point: { color: 0x00ff00 } });
|
|
65
|
+
*
|
|
66
|
+
* // Listen to feature events
|
|
67
|
+
* geoJsonLayer.on("featureCreated", ({ evaluator }) => {
|
|
68
|
+
* console.log("Feature created:", evaluator);
|
|
69
|
+
* });
|
|
70
|
+
*
|
|
71
|
+
* // Delete the layer
|
|
72
|
+
* geoJsonLayer.delete();
|
|
73
|
+
* ```
|
|
74
|
+
*/
|
|
75
|
+
export class Layer extends EventHandler<LayerEvent> {
|
|
76
|
+
/** The unique identifier of this layer. */
|
|
77
|
+
id: string;
|
|
78
|
+
private core: Core;
|
|
79
|
+
private featureEvaluators: Map<FeatureSetId, FeatureEvaluator> = new Map<
|
|
80
|
+
FeatureSetId,
|
|
81
|
+
FeatureEvaluator
|
|
82
|
+
>();
|
|
83
|
+
private needUpdate = false;
|
|
84
|
+
private convertColors?: (obj: unknown) => unknown;
|
|
85
|
+
|
|
86
|
+
constructor(
|
|
87
|
+
id: string,
|
|
88
|
+
core: Core,
|
|
89
|
+
convertColors?: (obj: unknown) => unknown,
|
|
90
|
+
) {
|
|
91
|
+
super();
|
|
92
|
+
|
|
93
|
+
this.id = id;
|
|
94
|
+
this.core = core;
|
|
95
|
+
this.convertColors = convertColors;
|
|
96
|
+
}
|
|
97
|
+
|
|
98
|
+
/**
|
|
99
|
+
* Register a feature evaluator with this layer
|
|
100
|
+
* @internal Used by the event system
|
|
101
|
+
*/
|
|
102
|
+
_registerFeatureEvaluator(
|
|
103
|
+
featureSetId: FeatureSetId,
|
|
104
|
+
evaluator: FeatureEvaluator,
|
|
105
|
+
) {
|
|
106
|
+
this.featureEvaluators.set(featureSetId, evaluator);
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/**
|
|
110
|
+
* Get a feature evaluator by ID
|
|
111
|
+
* @internal Used by the event system
|
|
112
|
+
*/
|
|
113
|
+
_getFeatureEvaluator(
|
|
114
|
+
featureSetId: FeatureSetId,
|
|
115
|
+
): FeatureEvaluator | undefined {
|
|
116
|
+
return this.featureEvaluators.get(featureSetId);
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
/**
|
|
120
|
+
* Unregister a feature evaluator from this layer
|
|
121
|
+
* @internal Used by the event system
|
|
122
|
+
*/
|
|
123
|
+
_unregisterFeatureEvaluator(featureSetId: FeatureSetId) {
|
|
124
|
+
this.featureEvaluators.delete(featureSetId);
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
/**
|
|
128
|
+
* Process feature updates for all registered features
|
|
129
|
+
* @internal Used by the animation loop
|
|
130
|
+
*/
|
|
131
|
+
_processFeatureUpdates(updatedAt: number) {
|
|
132
|
+
if (!this.needUpdate) {
|
|
133
|
+
return false;
|
|
134
|
+
}
|
|
135
|
+
this.needUpdate = false;
|
|
136
|
+
|
|
137
|
+
// Process all evaluators with the registered callbacks
|
|
138
|
+
for (const evaluator of this.featureEvaluators.values()) {
|
|
139
|
+
this.emit("featureUpdated", {
|
|
140
|
+
featureSetId: evaluator.id,
|
|
141
|
+
evaluator,
|
|
142
|
+
updatedAt,
|
|
143
|
+
});
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
return true;
|
|
147
|
+
}
|
|
148
|
+
|
|
149
|
+
/**
|
|
150
|
+
* Marks the layer for update on the next frame.
|
|
151
|
+
* Call this when you need to trigger `featureUpdated` events.
|
|
152
|
+
*/
|
|
153
|
+
forceUpdate() {
|
|
154
|
+
this.needUpdate = true;
|
|
155
|
+
}
|
|
156
|
+
|
|
157
|
+
/**
|
|
158
|
+
* Updates the layer configuration.
|
|
159
|
+
* The entire configuration is replaced with the new values.
|
|
160
|
+
* @param l - New layer configuration
|
|
161
|
+
*/
|
|
162
|
+
update(l: LayerDescription) {
|
|
163
|
+
const normalized =
|
|
164
|
+
"source" in l && l.source instanceof Source
|
|
165
|
+
? { ...l, source: l.source.id }
|
|
166
|
+
: l;
|
|
167
|
+
// Convert Color objects to numbers if converter is provided
|
|
168
|
+
const processedLayer = this.convertColors
|
|
169
|
+
? (this.convertColors(normalized) as LayerDescription)
|
|
170
|
+
: normalized;
|
|
171
|
+
this.core.updateLayer(this.id, processedLayer);
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
/**
|
|
175
|
+
* Removes the layer from the scene and disposes its resources.
|
|
176
|
+
* Emits the "deleted" event before cleanup.
|
|
177
|
+
* After calling this, the layer should no longer be used.
|
|
178
|
+
*/
|
|
179
|
+
delete() {
|
|
180
|
+
this.core.deleteLayer(this.id);
|
|
181
|
+
this.emit("deleted");
|
|
182
|
+
}
|
|
183
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EffectDesc,
|
|
3
|
+
type EffectConfig,
|
|
4
|
+
type EffectUpdate,
|
|
5
|
+
} from "../../core/EffectDesc";
|
|
6
|
+
import { CopyPass } from "../../effects";
|
|
7
|
+
|
|
8
|
+
type Description = {
|
|
9
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
10
|
+
final?: {};
|
|
11
|
+
};
|
|
12
|
+
|
|
13
|
+
export type FinalCopyPassConfig = Description & EffectConfig;
|
|
14
|
+
|
|
15
|
+
export type FinalCopyPassUpdate = Description & EffectUpdate;
|
|
16
|
+
|
|
17
|
+
export class FinalCopyEffectDesc extends EffectDesc<
|
|
18
|
+
FinalCopyPassConfig,
|
|
19
|
+
FinalCopyPassUpdate,
|
|
20
|
+
CopyPass
|
|
21
|
+
> {
|
|
22
|
+
static key = "final";
|
|
23
|
+
|
|
24
|
+
createPass() {
|
|
25
|
+
const pass = new CopyPass();
|
|
26
|
+
|
|
27
|
+
return pass;
|
|
28
|
+
}
|
|
29
|
+
}
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
import type { DepthPackingStrategies, Texture } from "three";
|
|
2
|
+
import invariant from "tiny-invariant";
|
|
3
|
+
|
|
4
|
+
import {
|
|
5
|
+
EffectDesc,
|
|
6
|
+
type EffectConfig,
|
|
7
|
+
type EffectUpdate,
|
|
8
|
+
} from "../../core/EffectDesc";
|
|
9
|
+
import type { ViewContext } from "../../core/ViewContext";
|
|
10
|
+
import type ThreeView from "../../index";
|
|
11
|
+
import { CustomRenderPass } from "../../passes";
|
|
12
|
+
|
|
13
|
+
type Description = {
|
|
14
|
+
mrt?: {
|
|
15
|
+
debugNormal?: boolean;
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
|
|
19
|
+
export type MRTPassConfig = Description & EffectConfig;
|
|
20
|
+
|
|
21
|
+
export type MRTPassUpdate = Description & EffectUpdate;
|
|
22
|
+
|
|
23
|
+
export class MRTPassEffectDesc extends EffectDesc<
|
|
24
|
+
MRTPassConfig,
|
|
25
|
+
MRTPassUpdate,
|
|
26
|
+
CustomRenderPass
|
|
27
|
+
> {
|
|
28
|
+
static key = "mrt";
|
|
29
|
+
// No insertAfter/Before - this is typically the first pass
|
|
30
|
+
|
|
31
|
+
private config: MRTPassConfig;
|
|
32
|
+
|
|
33
|
+
constructor(view: ThreeView, ctx: ViewContext, config: MRTPassConfig) {
|
|
34
|
+
super(view, ctx, config);
|
|
35
|
+
this.config = config;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
createPass(): CustomRenderPass {
|
|
39
|
+
// Create render pass for MRT scene
|
|
40
|
+
const scenes = this.ctx.scenes;
|
|
41
|
+
const camera = this.view.camera.raw;
|
|
42
|
+
|
|
43
|
+
invariant(this.view.globe);
|
|
44
|
+
|
|
45
|
+
const pass = new CustomRenderPass(
|
|
46
|
+
scenes,
|
|
47
|
+
camera,
|
|
48
|
+
this.ctx.getInputBuffer(),
|
|
49
|
+
this.view.globe,
|
|
50
|
+
{
|
|
51
|
+
debugNormal: !!this.config.mrt?.debugNormal,
|
|
52
|
+
},
|
|
53
|
+
);
|
|
54
|
+
|
|
55
|
+
return pass;
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
get normalBuffer(): Texture | undefined {
|
|
59
|
+
return this.raw?.gbufferRenderTarget.textures[1];
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
get effectIdsBuffer(): Texture | undefined {
|
|
63
|
+
return this.raw?.gbufferRenderTarget.textures[2];
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
get emissiveBuffer(): Texture | undefined {
|
|
67
|
+
return this.raw?.gbufferRenderTarget.textures[3];
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
get depthBuffer(): Texture | undefined {
|
|
71
|
+
return this.raw?.allDepthCopyPass.texture;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
get depthBufferPacking(): DepthPackingStrategies | undefined {
|
|
75
|
+
return this.raw?.allDepthCopyPass.depthPacking;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
get globeNormalBuffer(): Texture | undefined {
|
|
79
|
+
return this.raw?.globeNormalCopyPass.texture;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
get globeDepthBuffer(): Texture | undefined {
|
|
83
|
+
return this.raw?.globeDepthCopyPass.texture;
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
get globeDepthBufferPacking(): DepthPackingStrategies | undefined {
|
|
87
|
+
return this.raw?.globeDepthCopyPass.depthPacking;
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
onUpdateConfig(updates: MRTPassUpdate): void {
|
|
91
|
+
super.onUpdateConfig(updates);
|
|
92
|
+
|
|
93
|
+
if (!this._instance) return;
|
|
94
|
+
|
|
95
|
+
Object.assign(this.config, updates);
|
|
96
|
+
|
|
97
|
+
if (updates.mrt?.debugNormal !== undefined) {
|
|
98
|
+
// TODO: Support
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
|
|
102
|
+
onDestroy(): void {
|
|
103
|
+
super.onDestroy();
|
|
104
|
+
}
|
|
105
|
+
}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# Core Effect Descriptors
|
|
2
|
+
|
|
3
|
+
This module contains only core effect descriptors that are tightly coupled with the
|
|
4
|
+
internal rendering pipeline (MRT passes, transparent pass, final copy, selective
|
|
5
|
+
effects).
|
|
6
|
+
|
|
7
|
+
Independent, self-contained effect descriptors should be implemented as external
|
|
8
|
+
packages (e.g., `@navaramap/three_default_descs`) using the public
|
|
9
|
+
`EffectDesc` API and registered via plugins.
|
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
import { OrthographicCamera, PlaneGeometry, type Texture } from "three";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
EffectDesc,
|
|
5
|
+
type EffectConfig,
|
|
6
|
+
type EffectUpdate,
|
|
7
|
+
} from "../../core/EffectDesc";
|
|
8
|
+
import type { ViewContext } from "../../core/ViewContext";
|
|
9
|
+
import type ThreeView from "../../index";
|
|
10
|
+
|
|
11
|
+
import type { MRTPassEffectDesc } from "./MRTPassEffectDesc";
|
|
12
|
+
|
|
13
|
+
// Base configuration for selective effect descriptors
|
|
14
|
+
export type SelectiveEffectConfig = {
|
|
15
|
+
selectiveEffect?: true;
|
|
16
|
+
} & EffectConfig;
|
|
17
|
+
|
|
18
|
+
export type SelectiveEffectUpdate = EffectUpdate;
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Create fullscreen rendering infrastructure for selective effect passes.
|
|
22
|
+
*/
|
|
23
|
+
export function createFullscreenQuad(): {
|
|
24
|
+
camera: OrthographicCamera;
|
|
25
|
+
geometry: PlaneGeometry;
|
|
26
|
+
} {
|
|
27
|
+
return {
|
|
28
|
+
camera: new OrthographicCamera(-1, 1, 1, -1, 0, 1),
|
|
29
|
+
geometry: new PlaneGeometry(2, 2),
|
|
30
|
+
};
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* Base class for buffer-based selective effect descriptors (Bloom, Outline, etc.).
|
|
35
|
+
*
|
|
36
|
+
* Manages effect key registration, EffectIds Buffer slot allocation, and
|
|
37
|
+
* provides MRT buffer accessors for subclass passes.
|
|
38
|
+
*
|
|
39
|
+
* Subclasses implement {@link createPass}.
|
|
40
|
+
*/
|
|
41
|
+
export abstract class SelectiveEffectDesc<
|
|
42
|
+
Config extends SelectiveEffectConfig = SelectiveEffectConfig,
|
|
43
|
+
UpdateConfig extends SelectiveEffectUpdate = SelectiveEffectUpdate,
|
|
44
|
+
> extends EffectDesc<Config, UpdateConfig> {
|
|
45
|
+
protected config: Config;
|
|
46
|
+
|
|
47
|
+
constructor(view: ThreeView, ctx: ViewContext, config: Config) {
|
|
48
|
+
super(view, ctx, config);
|
|
49
|
+
this.config = config;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// ---------------------------------------------------------------------------
|
|
53
|
+
// Public API for Pass classes
|
|
54
|
+
// ---------------------------------------------------------------------------
|
|
55
|
+
|
|
56
|
+
/** ViewContext for accessing scenes, renderer, registry, etc. */
|
|
57
|
+
public get viewContext(): ViewContext {
|
|
58
|
+
return this.ctx;
|
|
59
|
+
}
|
|
60
|
+
|
|
61
|
+
/** Layer configuration (typed per subclass). */
|
|
62
|
+
public get layerConfig(): Config {
|
|
63
|
+
return this.config;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
// ---------------------------------------------------------------------------
|
|
67
|
+
// Lifecycle
|
|
68
|
+
// ---------------------------------------------------------------------------
|
|
69
|
+
|
|
70
|
+
onCreate(): void {
|
|
71
|
+
const registry = this.ctx.selectiveEffectRegistry;
|
|
72
|
+
if (!registry) {
|
|
73
|
+
throw new Error(
|
|
74
|
+
"SelectiveEffectRegistry not initialized. Ensure MRTPassEffectDesc is added before selective effect descriptors.",
|
|
75
|
+
);
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
// Allocate a slot bit in the EffectIds Buffer
|
|
79
|
+
registry.registerSlot(this.id);
|
|
80
|
+
|
|
81
|
+
super.onCreate();
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
onDestroy(): void {
|
|
85
|
+
const registry = this.ctx.selectiveEffectRegistry;
|
|
86
|
+
|
|
87
|
+
// Release slot bit in the EffectIds Buffer
|
|
88
|
+
registry?.unregisterSlot(this.id);
|
|
89
|
+
|
|
90
|
+
super.onDestroy();
|
|
91
|
+
}
|
|
92
|
+
|
|
93
|
+
// ---------------------------------------------------------------------------
|
|
94
|
+
// Buffer accessors — used by subclass passes to read MRT data
|
|
95
|
+
// ---------------------------------------------------------------------------
|
|
96
|
+
|
|
97
|
+
/** Emissive RGB buffer (MRT attachment[3]). */
|
|
98
|
+
public getEmissiveBuffer(): Texture | null {
|
|
99
|
+
const mrtDesc = this.find<MRTPassEffectDesc>("mrt");
|
|
100
|
+
return mrtDesc?.emissiveBuffer ?? null;
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
/** EffectIds bitmask buffer (MRT attachment[2]). NearestFilter, discrete data. */
|
|
104
|
+
public getEffectIdsBuffer(): Texture | null {
|
|
105
|
+
const mrtDesc = this.find<MRTPassEffectDesc>("mrt");
|
|
106
|
+
return mrtDesc?.effectIdsBuffer ?? null;
|
|
107
|
+
}
|
|
108
|
+
|
|
109
|
+
/** Slot bit index for this effect instance in the EffectIds Buffer. -1 if unregistered. */
|
|
110
|
+
public getEffectSlot(): number {
|
|
111
|
+
return this.ctx.selectiveEffectRegistry?.getSlot(this.id) ?? -1;
|
|
112
|
+
}
|
|
113
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {
|
|
2
|
+
EffectDesc,
|
|
3
|
+
type EffectConfig,
|
|
4
|
+
type EffectUpdate,
|
|
5
|
+
} from "../../core/EffectDesc";
|
|
6
|
+
import type { ViewContext } from "../../core/ViewContext";
|
|
7
|
+
import type ThreeView from "../../index";
|
|
8
|
+
import { SkyEnvMapPass } from "../../passes";
|
|
9
|
+
|
|
10
|
+
type Description = {
|
|
11
|
+
skyEnvMap?: {
|
|
12
|
+
resolution?: number;
|
|
13
|
+
};
|
|
14
|
+
};
|
|
15
|
+
|
|
16
|
+
export type SkyEnvMapPassConfig = Description & EffectConfig;
|
|
17
|
+
|
|
18
|
+
export type SkyEnvMapPassUpdate = Description & EffectUpdate;
|
|
19
|
+
|
|
20
|
+
export class SkyEnvMapEffectDesc extends EffectDesc<
|
|
21
|
+
SkyEnvMapPassConfig,
|
|
22
|
+
SkyEnvMapPassUpdate,
|
|
23
|
+
SkyEnvMapPass
|
|
24
|
+
> {
|
|
25
|
+
static key = "skyEnvMap";
|
|
26
|
+
static insertBefore = ["mrt"];
|
|
27
|
+
|
|
28
|
+
private config: SkyEnvMapPassConfig;
|
|
29
|
+
|
|
30
|
+
constructor(view: ThreeView, ctx: ViewContext, config: SkyEnvMapPassConfig) {
|
|
31
|
+
super(view, ctx, config);
|
|
32
|
+
this.config = config;
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
createPass(): SkyEnvMapPass {
|
|
36
|
+
const scenes = this.ctx.scenes;
|
|
37
|
+
const camera = this.view.camera.raw;
|
|
38
|
+
|
|
39
|
+
const resolution = this.config.skyEnvMap?.resolution ?? 256;
|
|
40
|
+
|
|
41
|
+
const pass = new SkyEnvMapPass(scenes, camera, resolution);
|
|
42
|
+
|
|
43
|
+
return pass;
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
onUpdateConfig(updates: SkyEnvMapPassUpdate): void {
|
|
47
|
+
super.onUpdateConfig(updates);
|
|
48
|
+
|
|
49
|
+
if (!this._instance) return;
|
|
50
|
+
|
|
51
|
+
Object.assign(this.config, updates);
|
|
52
|
+
|
|
53
|
+
if (updates.skyEnvMap?.resolution !== undefined) {
|
|
54
|
+
// Would need to recreate the pass to change resolution
|
|
55
|
+
// For now, resolution is set at creation time only
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
import { Group, Scene } from "three";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
EffectDesc,
|
|
5
|
+
type EffectConfig,
|
|
6
|
+
type EffectUpdate,
|
|
7
|
+
} from "../../core/EffectDesc";
|
|
8
|
+
import { RenderPass } from "../../effects";
|
|
9
|
+
|
|
10
|
+
type Description = {
|
|
11
|
+
// eslint-disable-next-line @typescript-eslint/no-empty-object-type
|
|
12
|
+
transparent?: {};
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export type TransparentPassConfig = Description & EffectConfig;
|
|
16
|
+
|
|
17
|
+
export type TransparentPassUpdate = Description & EffectUpdate;
|
|
18
|
+
|
|
19
|
+
export class TransparentPassEffectDesc extends EffectDesc<
|
|
20
|
+
TransparentPassConfig,
|
|
21
|
+
TransparentPassUpdate,
|
|
22
|
+
RenderPass
|
|
23
|
+
> {
|
|
24
|
+
static key = "transparent";
|
|
25
|
+
static insertAfter = ["ssao", "clouds", "atmosphere", "mrt"];
|
|
26
|
+
|
|
27
|
+
light = new Group();
|
|
28
|
+
lightsSyncMap = new Map();
|
|
29
|
+
|
|
30
|
+
createPass(): RenderPass {
|
|
31
|
+
// Create render pass for transparent objects
|
|
32
|
+
const scene = new Scene();
|
|
33
|
+
scene.add(this.light);
|
|
34
|
+
scene.add(this.ctx.scenes.transparent);
|
|
35
|
+
|
|
36
|
+
const camera = this.view.camera.raw;
|
|
37
|
+
|
|
38
|
+
const pass = new RenderPass(scene, camera);
|
|
39
|
+
pass.clear = false;
|
|
40
|
+
|
|
41
|
+
this.ctx.scenes.light.addEventListener("childadded", ({ child }) => {
|
|
42
|
+
const cloned = child.clone(true);
|
|
43
|
+
this.lightsSyncMap.set(child.id, cloned);
|
|
44
|
+
this.light.add(cloned);
|
|
45
|
+
});
|
|
46
|
+
this.ctx.scenes.light.addEventListener("childremoved", ({ child }) => {
|
|
47
|
+
this.light.remove(this.lightsSyncMap.get(child.id));
|
|
48
|
+
this.lightsSyncMap.delete(child.id);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
return pass;
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
update(_time: number): void {
|
|
55
|
+
// Sync lights
|
|
56
|
+
let i = 0;
|
|
57
|
+
for (const child of this.ctx.scenes.light.children) {
|
|
58
|
+
this.light.children[i].copy(child, true);
|
|
59
|
+
i++;
|
|
60
|
+
}
|
|
61
|
+
}
|
|
62
|
+
}
|