@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,125 @@
|
|
|
1
|
+
import PostProcessingCommon from "@shaders/glsl/postprocessingCommon.vert.glsl";
|
|
2
|
+
import { Pass } from "postprocessing";
|
|
3
|
+
import {
|
|
4
|
+
HalfFloatType,
|
|
5
|
+
LinearFilter,
|
|
6
|
+
NoBlending,
|
|
7
|
+
RGBAFormat,
|
|
8
|
+
ShaderMaterial,
|
|
9
|
+
Texture,
|
|
10
|
+
WebGLRenderTarget,
|
|
11
|
+
type WebGLRenderer,
|
|
12
|
+
} from "three";
|
|
13
|
+
|
|
14
|
+
import { packing } from "../shaders";
|
|
15
|
+
|
|
16
|
+
const fragmentShader = `
|
|
17
|
+
#include <packing>
|
|
18
|
+
|
|
19
|
+
${packing}
|
|
20
|
+
|
|
21
|
+
uniform sampler2D tNormal;
|
|
22
|
+
varying vec2 vUv;
|
|
23
|
+
|
|
24
|
+
void main() {
|
|
25
|
+
#ifdef UNPACK_NORMAL
|
|
26
|
+
gl_FragColor = vec4(unpackVec2ToNormal(texture2D(tNormal, vUv).xy), 1.0);
|
|
27
|
+
#else
|
|
28
|
+
gl_FragColor = texture2D(tNormal, vUv);
|
|
29
|
+
#endif
|
|
30
|
+
}
|
|
31
|
+
`;
|
|
32
|
+
|
|
33
|
+
/**
|
|
34
|
+
* A pass that copies normal buffer contents to a render target.
|
|
35
|
+
*/
|
|
36
|
+
export class NormalCopyPass extends Pass {
|
|
37
|
+
private _renderTarget: WebGLRenderTarget;
|
|
38
|
+
private _material: ShaderMaterial;
|
|
39
|
+
private _autoResize: boolean;
|
|
40
|
+
|
|
41
|
+
constructor(renderTarget?: WebGLRenderTarget, autoResize = true) {
|
|
42
|
+
super("NormalCopyPass");
|
|
43
|
+
|
|
44
|
+
this.needsSwap = false;
|
|
45
|
+
|
|
46
|
+
this._material = new ShaderMaterial({
|
|
47
|
+
uniforms: {
|
|
48
|
+
tNormal: { value: null },
|
|
49
|
+
},
|
|
50
|
+
vertexShader: PostProcessingCommon,
|
|
51
|
+
fragmentShader,
|
|
52
|
+
blending: NoBlending,
|
|
53
|
+
toneMapped: false,
|
|
54
|
+
depthWrite: false,
|
|
55
|
+
depthTest: false,
|
|
56
|
+
defines: {
|
|
57
|
+
UNPACK_NORMAL: false,
|
|
58
|
+
},
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
this._autoResize = autoResize;
|
|
62
|
+
|
|
63
|
+
if (renderTarget) {
|
|
64
|
+
this._renderTarget = renderTarget;
|
|
65
|
+
} else {
|
|
66
|
+
this._renderTarget = new WebGLRenderTarget(1, 1, {
|
|
67
|
+
format: RGBAFormat,
|
|
68
|
+
type: HalfFloatType,
|
|
69
|
+
minFilter: LinearFilter,
|
|
70
|
+
magFilter: LinearFilter,
|
|
71
|
+
generateMipmaps: false,
|
|
72
|
+
stencilBuffer: false,
|
|
73
|
+
depthBuffer: false,
|
|
74
|
+
});
|
|
75
|
+
}
|
|
76
|
+
|
|
77
|
+
this.fullscreenMaterial = this._material;
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
get texture(): Texture {
|
|
81
|
+
return this._renderTarget.texture;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
get autoResize(): boolean {
|
|
85
|
+
return this._autoResize;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
set autoResize(value: boolean) {
|
|
89
|
+
this._autoResize = value;
|
|
90
|
+
}
|
|
91
|
+
|
|
92
|
+
set unpackNormal(v: boolean) {
|
|
93
|
+
if (v) {
|
|
94
|
+
this._material.defines.UNPACK_NORMAL = "1";
|
|
95
|
+
} else {
|
|
96
|
+
delete this._material.defines.UNPACK_NORMAL;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
setNormalTexture(texture: Texture): void {
|
|
101
|
+
this._material.uniforms.tNormal.value = texture;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
setSize(width: number, height: number): void {
|
|
105
|
+
if (this._autoResize) {
|
|
106
|
+
this._renderTarget.setSize(width, height);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
render(
|
|
111
|
+
renderer: WebGLRenderer,
|
|
112
|
+
_inputBuffer: WebGLRenderTarget | null,
|
|
113
|
+
_outputBuffer: WebGLRenderTarget | null,
|
|
114
|
+
): void {
|
|
115
|
+
const renderTarget = this.renderToScreen ? null : this._renderTarget;
|
|
116
|
+
|
|
117
|
+
renderer.setRenderTarget(renderTarget);
|
|
118
|
+
renderer.render(this.scene, this.camera);
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
dispose(): void {
|
|
122
|
+
this._renderTarget.dispose();
|
|
123
|
+
this._material.dispose();
|
|
124
|
+
}
|
|
125
|
+
}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import PostProcessingCommon from "@shaders/glsl/postprocessingCommon.vert.glsl";
|
|
2
|
+
import { Pass } from "postprocessing";
|
|
3
|
+
import {
|
|
4
|
+
NoBlending,
|
|
5
|
+
ShaderMaterial,
|
|
6
|
+
Texture,
|
|
7
|
+
WebGLRenderTarget,
|
|
8
|
+
type WebGLRenderer,
|
|
9
|
+
} from "three";
|
|
10
|
+
|
|
11
|
+
const fragmentShader = `
|
|
12
|
+
uniform sampler2D color;
|
|
13
|
+
uniform sampler2D depth;
|
|
14
|
+
|
|
15
|
+
varying vec2 vUv;
|
|
16
|
+
|
|
17
|
+
void main() {
|
|
18
|
+
gl_FragColor = texture2D(color, vUv);
|
|
19
|
+
gl_FragDepth = texture2D(color, vUv).r;
|
|
20
|
+
}
|
|
21
|
+
`;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* A pass that copies normal buffer contents to a render target.
|
|
25
|
+
*/
|
|
26
|
+
export class RenderTargetCopyPass extends Pass {
|
|
27
|
+
private _renderTarget: WebGLRenderTarget;
|
|
28
|
+
private _material: ShaderMaterial;
|
|
29
|
+
private _autoResize: boolean;
|
|
30
|
+
|
|
31
|
+
constructor(renderTarget: WebGLRenderTarget, autoResize = true) {
|
|
32
|
+
super("RenderTargetCopyPass");
|
|
33
|
+
|
|
34
|
+
this.needsSwap = false;
|
|
35
|
+
|
|
36
|
+
this._material = new ShaderMaterial({
|
|
37
|
+
uniforms: {
|
|
38
|
+
color: { value: null },
|
|
39
|
+
depth: { value: null },
|
|
40
|
+
},
|
|
41
|
+
vertexShader: PostProcessingCommon,
|
|
42
|
+
fragmentShader,
|
|
43
|
+
blending: NoBlending,
|
|
44
|
+
toneMapped: false,
|
|
45
|
+
depthWrite: false,
|
|
46
|
+
depthTest: false,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
this._autoResize = autoResize;
|
|
50
|
+
|
|
51
|
+
this._renderTarget = renderTarget;
|
|
52
|
+
|
|
53
|
+
this.fullscreenMaterial = this._material;
|
|
54
|
+
|
|
55
|
+
this.setTexture(renderTarget.texture);
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
get texture(): Texture {
|
|
59
|
+
return this._renderTarget.texture;
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
get autoResize(): boolean {
|
|
63
|
+
return this._autoResize;
|
|
64
|
+
}
|
|
65
|
+
|
|
66
|
+
set autoResize(value: boolean) {
|
|
67
|
+
this._autoResize = value;
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
setTexture(texture: Texture): void {
|
|
71
|
+
this._material.uniforms.color.value = texture;
|
|
72
|
+
}
|
|
73
|
+
|
|
74
|
+
setDepthTexture(texture: Texture): void {
|
|
75
|
+
this._material.uniforms.depth.value = texture;
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
render(
|
|
79
|
+
renderer: WebGLRenderer,
|
|
80
|
+
inputBuffer: WebGLRenderTarget | null,
|
|
81
|
+
_outputBuffer: WebGLRenderTarget | null,
|
|
82
|
+
): void {
|
|
83
|
+
renderer.setRenderTarget(inputBuffer);
|
|
84
|
+
renderer.render(this.scene, this.camera);
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
dispose(): void {
|
|
88
|
+
this._renderTarget.dispose();
|
|
89
|
+
this._material.dispose();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
@@ -0,0 +1,58 @@
|
|
|
1
|
+
import {
|
|
2
|
+
CubeCamera,
|
|
3
|
+
HalfFloatType,
|
|
4
|
+
WebGLCubeRenderTarget,
|
|
5
|
+
type PerspectiveCamera,
|
|
6
|
+
type WebGLRenderer,
|
|
7
|
+
type WebGLRenderTarget,
|
|
8
|
+
} from "three";
|
|
9
|
+
|
|
10
|
+
import { RenderPass } from "../effects";
|
|
11
|
+
import type { Scenes } from "../scene";
|
|
12
|
+
|
|
13
|
+
export class SkyEnvMapPass extends RenderPass {
|
|
14
|
+
private _scenes: Scenes;
|
|
15
|
+
private _camera: PerspectiveCamera;
|
|
16
|
+
private cubeCamera: CubeCamera;
|
|
17
|
+
public cubeRenderTarget: WebGLCubeRenderTarget;
|
|
18
|
+
|
|
19
|
+
constructor(scenes: Scenes, camera: PerspectiveCamera, resolution = 64) {
|
|
20
|
+
super();
|
|
21
|
+
|
|
22
|
+
this._scenes = scenes;
|
|
23
|
+
this._camera = camera;
|
|
24
|
+
|
|
25
|
+
this.cubeRenderTarget = new WebGLCubeRenderTarget(resolution, {
|
|
26
|
+
generateMipmaps: true,
|
|
27
|
+
type: HalfFloatType,
|
|
28
|
+
});
|
|
29
|
+
|
|
30
|
+
this.cubeCamera = new CubeCamera(0.1, 1000, this.cubeRenderTarget);
|
|
31
|
+
}
|
|
32
|
+
|
|
33
|
+
render(
|
|
34
|
+
renderer: WebGLRenderer,
|
|
35
|
+
_inputBuffer: WebGLRenderTarget | null,
|
|
36
|
+
_outputBuffer: WebGLRenderTarget | null,
|
|
37
|
+
) {
|
|
38
|
+
// Nothing requests the env map (no sky mesh with `envMap` enabled), so skip
|
|
39
|
+
// the expensive 6-face cube render entirely.
|
|
40
|
+
if (this._scenes.skyEnvMap.children.length === 0) return;
|
|
41
|
+
|
|
42
|
+
this.cubeCamera.position.copy(this._camera.position);
|
|
43
|
+
|
|
44
|
+
this.cubeCamera.update(renderer, this._scenes.skyEnvMap);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
getEnvMapTexture(): WebGLCubeRenderTarget["texture"] | undefined {
|
|
48
|
+
// Don't hand a stale/cleared cube texture to meshes when nothing populates
|
|
49
|
+
// the env map scene; callers fall back to `null`.
|
|
50
|
+
if (this._scenes.skyEnvMap.children.length === 0) return undefined;
|
|
51
|
+
|
|
52
|
+
return this.cubeRenderTarget.texture;
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
dispose() {
|
|
56
|
+
this.cubeRenderTarget.dispose();
|
|
57
|
+
}
|
|
58
|
+
}
|
|
@@ -0,0 +1,273 @@
|
|
|
1
|
+
import {
|
|
2
|
+
WebGLRenderer,
|
|
3
|
+
WebGLRenderTarget,
|
|
4
|
+
PerspectiveCamera,
|
|
5
|
+
Object3D,
|
|
6
|
+
RGBAFormat,
|
|
7
|
+
Color,
|
|
8
|
+
Scene,
|
|
9
|
+
Vector2,
|
|
10
|
+
} from "three";
|
|
11
|
+
|
|
12
|
+
import { BufferView } from "../bufferView";
|
|
13
|
+
import { isPickableMesh, type PickableMesh } from "../mesh/pickableMesh";
|
|
14
|
+
import { TileScene } from "../scene";
|
|
15
|
+
import type { MeshCache } from "../type";
|
|
16
|
+
|
|
17
|
+
export type PickHelperOptions = {
|
|
18
|
+
debug: boolean;
|
|
19
|
+
};
|
|
20
|
+
|
|
21
|
+
/**
|
|
22
|
+
* GPU picking using a dedicated single-pixel render pass.
|
|
23
|
+
*
|
|
24
|
+
* The pick pass does NOT reuse the main render pipeline (globe / MRT /
|
|
25
|
+
* draped / copy passes). Instead, every pickable raw — regardless of
|
|
26
|
+
* which pass scene (opaque, mrt, ...) it normally lives in — is
|
|
27
|
+
* temporarily re-parented into a dedicated `pickScene` for the render
|
|
28
|
+
* and then restored to its original parent afterwards. This guarantees
|
|
29
|
+
* the pick buffer contains exactly the pickable content and nothing
|
|
30
|
+
* else can leak in (globe tiles, outlines, draped features, sky, etc.).
|
|
31
|
+
*
|
|
32
|
+
* Re-parenting is safe because pass scenes all have identity world
|
|
33
|
+
* transforms, so world matrices of the re-parented objects are
|
|
34
|
+
* unaffected.
|
|
35
|
+
*/
|
|
36
|
+
export class PickHelper {
|
|
37
|
+
private element: HTMLElement;
|
|
38
|
+
private pixelBuffer: Uint8Array;
|
|
39
|
+
private _renderer: WebGLRenderer;
|
|
40
|
+
private _camera: PerspectiveCamera;
|
|
41
|
+
private _meshes: MeshCache;
|
|
42
|
+
private onPickCallback: (pickArr: number[]) => void;
|
|
43
|
+
|
|
44
|
+
/** Dedicated scene used only during the pick render. */
|
|
45
|
+
private readonly pickScene = new Scene();
|
|
46
|
+
|
|
47
|
+
private debugBufferView?: BufferView;
|
|
48
|
+
private debugRenderTarget?: WebGLRenderTarget;
|
|
49
|
+
/** Full-size render target used for click picking with scissor restriction. */
|
|
50
|
+
private pickRenderTarget: WebGLRenderTarget;
|
|
51
|
+
|
|
52
|
+
private mouseMoved: boolean;
|
|
53
|
+
private mouseDownHandler: (event: MouseEvent) => void;
|
|
54
|
+
private mouseMoveHandler: (event: MouseEvent) => void;
|
|
55
|
+
private mouseUpHandler: (event: MouseEvent) => void;
|
|
56
|
+
|
|
57
|
+
constructor(
|
|
58
|
+
element: HTMLElement,
|
|
59
|
+
renderer: WebGLRenderer,
|
|
60
|
+
camera: PerspectiveCamera,
|
|
61
|
+
meshes: MeshCache,
|
|
62
|
+
onPickCallback: (pickArr: number[]) => void,
|
|
63
|
+
options?: PickHelperOptions,
|
|
64
|
+
) {
|
|
65
|
+
this.element = element;
|
|
66
|
+
this.pixelBuffer = new Uint8Array(4);
|
|
67
|
+
this._renderer = renderer;
|
|
68
|
+
this._camera = camera;
|
|
69
|
+
this._meshes = meshes;
|
|
70
|
+
this.onPickCallback = onPickCallback;
|
|
71
|
+
|
|
72
|
+
this.mouseMoved = false;
|
|
73
|
+
this.mouseDownHandler = (event: MouseEvent) => this.onMouseDown(event);
|
|
74
|
+
this.mouseMoveHandler = (event: MouseEvent) => this.onMouseMove(event);
|
|
75
|
+
this.mouseUpHandler = (event: MouseEvent) => this.onMouseUp(event);
|
|
76
|
+
|
|
77
|
+
const width = this._renderer.getContext().drawingBufferWidth;
|
|
78
|
+
const height = this._renderer.getContext().drawingBufferHeight;
|
|
79
|
+
|
|
80
|
+
this.pickRenderTarget = new WebGLRenderTarget(width, height, {
|
|
81
|
+
format: RGBAFormat,
|
|
82
|
+
depthBuffer: true,
|
|
83
|
+
stencilBuffer: false,
|
|
84
|
+
});
|
|
85
|
+
|
|
86
|
+
if (options?.debug) {
|
|
87
|
+
this.debugBufferView = new BufferView(width, height);
|
|
88
|
+
this.debugRenderTarget = new WebGLRenderTarget(width, height, {
|
|
89
|
+
format: RGBAFormat,
|
|
90
|
+
depthBuffer: true,
|
|
91
|
+
stencilBuffer: false,
|
|
92
|
+
});
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
private onMouseDown(_event: MouseEvent) {
|
|
97
|
+
this.mouseMoved = false;
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
private onMouseMove(_event: MouseEvent) {
|
|
101
|
+
this.mouseMoved = true;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
private onMouseUp(event: MouseEvent) {
|
|
105
|
+
if (!this.mouseMoved) {
|
|
106
|
+
this.onMouseClick(event);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
enablePick(bPick: boolean) {
|
|
111
|
+
if (bPick) {
|
|
112
|
+
this.element.addEventListener("mousedown", this.mouseDownHandler);
|
|
113
|
+
this.element.addEventListener("mousemove", this.mouseMoveHandler);
|
|
114
|
+
this.element.addEventListener("mouseup", this.mouseUpHandler);
|
|
115
|
+
} else {
|
|
116
|
+
this.element.removeEventListener("mousedown", this.mouseDownHandler);
|
|
117
|
+
this.element.removeEventListener("mousemove", this.mouseMoveHandler);
|
|
118
|
+
this.element.removeEventListener("mouseup", this.mouseUpHandler);
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Moves every pickable raw (visible, currently parented) into the
|
|
124
|
+
* dedicated `pickScene` and activates the picking uniforms on its
|
|
125
|
+
* wrapper. Returns a teardown callback that restores original parents
|
|
126
|
+
* and deactivates the uniforms.
|
|
127
|
+
*/
|
|
128
|
+
private stagePickables(pickingCoord?: Vector2): () => void {
|
|
129
|
+
const restoreParents: [Object3D, Object3D][] = [];
|
|
130
|
+
const activated: PickableMesh[] = [];
|
|
131
|
+
|
|
132
|
+
for (const [_key, obj] of this._meshes) {
|
|
133
|
+
if (!isPickableMesh(obj)) continue;
|
|
134
|
+
|
|
135
|
+
const raw = obj.getRenderable();
|
|
136
|
+
const originalParent = raw.parent;
|
|
137
|
+
|
|
138
|
+
// Only pick visible, currently-parented renderables. A mesh that's
|
|
139
|
+
// hidden or detached isn't rendered in the main view, so picking
|
|
140
|
+
// it would be surprising.
|
|
141
|
+
if (!originalParent || !raw.visible) continue;
|
|
142
|
+
|
|
143
|
+
obj.onBeforePicking(pickingCoord);
|
|
144
|
+
activated.push(obj);
|
|
145
|
+
|
|
146
|
+
// Draped vector-tile meshes live inside a TileScene and are picked
|
|
147
|
+
// through their owning TileMesh's composite atlas — the per-layer RT
|
|
148
|
+
// is re-rendered with pick mode active (the onBeforePicking above
|
|
149
|
+
// flipped the mesh's own enhancer into pick mode) and the atlas then
|
|
150
|
+
// carries the pick IDs into the main pick render. Reparenting them
|
|
151
|
+
// here would (a) empty the TileScene so the per-layer RT renders
|
|
152
|
+
// nothing and (b) make them draw at their un-draped 3D position in
|
|
153
|
+
// pickScene, where they depth-fight with the terrain.
|
|
154
|
+
if (originalParent instanceof TileScene) continue;
|
|
155
|
+
|
|
156
|
+
// Scene.add auto-removes from the previous parent. Both parents
|
|
157
|
+
// are pass scenes with identity world transforms, so the raw's
|
|
158
|
+
// world matrix is unaffected.
|
|
159
|
+
this.pickScene.add(raw);
|
|
160
|
+
restoreParents.push([raw, originalParent]);
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
return () => {
|
|
164
|
+
for (const [raw, parent] of restoreParents) parent.add(raw);
|
|
165
|
+
for (const w of activated) w.onAfterPicking();
|
|
166
|
+
};
|
|
167
|
+
}
|
|
168
|
+
|
|
169
|
+
/**
|
|
170
|
+
* Dedicated picking render: clears the target to black (batchId=0) and
|
|
171
|
+
* renders only the pickable raws, regardless of which pass scene they
|
|
172
|
+
* normally live in.
|
|
173
|
+
*/
|
|
174
|
+
public processRender(target: WebGLRenderTarget, pickingCoord?: Vector2) {
|
|
175
|
+
const origClearColor = new Color();
|
|
176
|
+
this._renderer.getClearColor(origClearColor);
|
|
177
|
+
const origClearAlpha = this._renderer.getClearAlpha();
|
|
178
|
+
const origRenderTarget = this._renderer.getRenderTarget();
|
|
179
|
+
const origAutoClear = this._renderer.autoClear;
|
|
180
|
+
|
|
181
|
+
const teardown = this.stagePickables(pickingCoord);
|
|
182
|
+
|
|
183
|
+
this._renderer.setClearColor(0x000000, 1);
|
|
184
|
+
this._renderer.setRenderTarget(target);
|
|
185
|
+
this._renderer.autoClear = true;
|
|
186
|
+
this._renderer.clear(true, true, false);
|
|
187
|
+
this._renderer.render(this.pickScene, this._camera);
|
|
188
|
+
|
|
189
|
+
teardown();
|
|
190
|
+
|
|
191
|
+
this._renderer.setRenderTarget(origRenderTarget);
|
|
192
|
+
this._renderer.setClearColor(origClearColor, origClearAlpha);
|
|
193
|
+
this._renderer.autoClear = origAutoClear;
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
public setSize(width: number, height: number) {
|
|
197
|
+
this.pickRenderTarget.setSize(width, height);
|
|
198
|
+
this.debugRenderTarget?.setSize(width, height);
|
|
199
|
+
if (this.debugBufferView) {
|
|
200
|
+
this.debugBufferView.canvas.width = width;
|
|
201
|
+
this.debugBufferView.canvas.height = height;
|
|
202
|
+
this.debugBufferView.canvasForImage.width = width;
|
|
203
|
+
this.debugBufferView.canvasForImage.height = height;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
206
|
+
|
|
207
|
+
public renderDebugCanvas() {
|
|
208
|
+
if (!this.debugBufferView || !this.debugRenderTarget) return;
|
|
209
|
+
|
|
210
|
+
// Full-screen debug view: no view-offset so we can see everything.
|
|
211
|
+
this.processRender(this.debugRenderTarget);
|
|
212
|
+
this.debugBufferView.render(this._renderer, this.debugRenderTarget);
|
|
213
|
+
}
|
|
214
|
+
|
|
215
|
+
private onMouseClick(event: MouseEvent) {
|
|
216
|
+
const rect = this.element.getBoundingClientRect();
|
|
217
|
+
const x = event.clientX - rect.left;
|
|
218
|
+
const y = event.clientY - rect.top;
|
|
219
|
+
|
|
220
|
+
const pixelRatio = this._renderer.getPixelRatio();
|
|
221
|
+
const fullWidth = this._renderer.getContext().drawingBufferWidth;
|
|
222
|
+
const fullHeight = this._renderer.getContext().drawingBufferHeight;
|
|
223
|
+
|
|
224
|
+
// gl_FragCoord-style pixel-space coords (centers at 0.5, 1.5, ...).
|
|
225
|
+
// Clamp to valid viewport bounds.
|
|
226
|
+
const pixelX = Math.max(
|
|
227
|
+
0,
|
|
228
|
+
Math.min(Math.floor(x * pixelRatio), fullWidth - 1),
|
|
229
|
+
);
|
|
230
|
+
const pixelY = Math.max(
|
|
231
|
+
0,
|
|
232
|
+
Math.min(Math.floor(y * pixelRatio), fullHeight - 1),
|
|
233
|
+
);
|
|
234
|
+
const pickingCoord = new Vector2(
|
|
235
|
+
pixelX + 0.5,
|
|
236
|
+
fullHeight - pixelY - 0.5, // flip Y for WebGL
|
|
237
|
+
);
|
|
238
|
+
const readY = fullHeight - 1 - pixelY;
|
|
239
|
+
|
|
240
|
+
// Keep the camera projection unchanged for wide lines / screen-space
|
|
241
|
+
// expanded shaders, and limit fragment work to one pixel via scissor.
|
|
242
|
+
this._renderer.setScissor(pixelX, readY, 1, 1);
|
|
243
|
+
this._renderer.setScissorTest(true);
|
|
244
|
+
|
|
245
|
+
this.processRender(this.pickRenderTarget, pickingCoord);
|
|
246
|
+
|
|
247
|
+
this._renderer.readRenderTargetPixels(
|
|
248
|
+
this.pickRenderTarget,
|
|
249
|
+
pixelX,
|
|
250
|
+
readY,
|
|
251
|
+
1,
|
|
252
|
+
1,
|
|
253
|
+
this.pixelBuffer,
|
|
254
|
+
);
|
|
255
|
+
|
|
256
|
+
this._renderer.setScissorTest(false);
|
|
257
|
+
|
|
258
|
+
const batchId =
|
|
259
|
+
(this.pixelBuffer[0] << 16) +
|
|
260
|
+
(this.pixelBuffer[1] << 8) +
|
|
261
|
+
this.pixelBuffer[2];
|
|
262
|
+
|
|
263
|
+
const pickArr = batchId > 0 ? [batchId] : [];
|
|
264
|
+
this.onPickCallback(pickArr);
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
public dispose() {
|
|
268
|
+
this.enablePick(false);
|
|
269
|
+
this.pickRenderTarget.dispose();
|
|
270
|
+
this.debugRenderTarget?.dispose();
|
|
271
|
+
this.debugBufferView?.dispose();
|
|
272
|
+
}
|
|
273
|
+
}
|