@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,529 @@
|
|
|
1
|
+
import BATCHID_TO_COLOR from "@shaders/glsl/chunks/pick.glsl";
|
|
2
|
+
import {
|
|
3
|
+
BufferGeometry,
|
|
4
|
+
InstancedBufferAttribute,
|
|
5
|
+
InstancedMesh,
|
|
6
|
+
Material,
|
|
7
|
+
Mesh,
|
|
8
|
+
Object3D,
|
|
9
|
+
ShaderMaterial,
|
|
10
|
+
type Vector2,
|
|
11
|
+
type WebGLProgramParametersWithUniforms,
|
|
12
|
+
} from "three";
|
|
13
|
+
|
|
14
|
+
import type { ViewContext } from "../core/ViewContext";
|
|
15
|
+
|
|
16
|
+
import { PickableMesh } from "./pickableMesh";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Picking uniform declarations injected into fragment shaders.
|
|
20
|
+
*/
|
|
21
|
+
const PICKING_UNIFORMS_DECL = /* glsl */ `
|
|
22
|
+
uniform float nvr_uPickable;
|
|
23
|
+
uniform float nvr_uBatchId;
|
|
24
|
+
|
|
25
|
+
${BATCHID_TO_COLOR}
|
|
26
|
+
`;
|
|
27
|
+
|
|
28
|
+
/**
|
|
29
|
+
* Picking override block: when pickable, output batchId-encoded color.
|
|
30
|
+
* This block must be placed at the very end of main(), after all other
|
|
31
|
+
* gl_FragColor assignments, so it overrides the final output.
|
|
32
|
+
*/
|
|
33
|
+
const PICKING_OVERRIDE = /* glsl */ `
|
|
34
|
+
if (nvr_uPickable > 0.0) {
|
|
35
|
+
gl_FragColor = vec4(nvr_batchIdToColor(nvr_uBatchId), 1.0);
|
|
36
|
+
}
|
|
37
|
+
`;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Inject picking shader support into a standard Three.js material
|
|
41
|
+
* via onBeforeCompile.
|
|
42
|
+
*
|
|
43
|
+
* Standard materials (MeshBasicMaterial, MeshLambertMaterial, etc.) always
|
|
44
|
+
* contain `#include <dithering_fragment>` as the last meaningful chunk
|
|
45
|
+
* before main() closes. Picking code is injected right after it.
|
|
46
|
+
*/
|
|
47
|
+
function injectPickingShader(
|
|
48
|
+
shader: WebGLProgramParametersWithUniforms,
|
|
49
|
+
refs: { nvr_uPickable: { value: number }; nvr_uBatchId: { value: number } },
|
|
50
|
+
): void {
|
|
51
|
+
shader.uniforms.nvr_uPickable = refs.nvr_uPickable;
|
|
52
|
+
shader.uniforms.nvr_uBatchId = refs.nvr_uBatchId;
|
|
53
|
+
|
|
54
|
+
shader.fragmentShader = shader.fragmentShader.replace(
|
|
55
|
+
"void main() {",
|
|
56
|
+
`${PICKING_UNIFORMS_DECL}\nvoid main() {`,
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
shader.fragmentShader = shader.fragmentShader.replace(
|
|
60
|
+
"#include <dithering_fragment>",
|
|
61
|
+
`#include <dithering_fragment>\n${PICKING_OVERRIDE}`,
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
|
|
65
|
+
/**
|
|
66
|
+
* Inject picking shader support for instanced meshes.
|
|
67
|
+
*
|
|
68
|
+
* Uses a per-instance `batchId` attribute passed as a varying to the fragment
|
|
69
|
+
* shader. When pickable, the fragment shader outputs the batchId-encoded color.
|
|
70
|
+
*/
|
|
71
|
+
function injectInstancedPickingShader(
|
|
72
|
+
shader: WebGLProgramParametersWithUniforms,
|
|
73
|
+
refs: { nvr_uPickable: { value: number } },
|
|
74
|
+
): void {
|
|
75
|
+
shader.uniforms.nvr_uPickable = refs.nvr_uPickable;
|
|
76
|
+
|
|
77
|
+
// Vertex shader: declare batchId attribute and pass as varying
|
|
78
|
+
shader.vertexShader = shader.vertexShader.replace(
|
|
79
|
+
"void main() {",
|
|
80
|
+
`
|
|
81
|
+
attribute float batchId;
|
|
82
|
+
varying float nvr_vBatchId;
|
|
83
|
+
|
|
84
|
+
void main() {
|
|
85
|
+
nvr_vBatchId = batchId;
|
|
86
|
+
`,
|
|
87
|
+
);
|
|
88
|
+
|
|
89
|
+
// Fragment shader: inject uniforms, varying, and picking override
|
|
90
|
+
shader.fragmentShader = shader.fragmentShader.replace(
|
|
91
|
+
"void main() {",
|
|
92
|
+
`
|
|
93
|
+
uniform float nvr_uPickable;
|
|
94
|
+
varying float nvr_vBatchId;
|
|
95
|
+
|
|
96
|
+
${BATCHID_TO_COLOR}
|
|
97
|
+
|
|
98
|
+
void main() {
|
|
99
|
+
`,
|
|
100
|
+
);
|
|
101
|
+
|
|
102
|
+
shader.fragmentShader = shader.fragmentShader.replace(
|
|
103
|
+
"#include <dithering_fragment>",
|
|
104
|
+
`#include <dithering_fragment>
|
|
105
|
+
|
|
106
|
+
if (nvr_uPickable > 0.0) {
|
|
107
|
+
gl_FragColor = vec4(nvr_batchIdToColor(nvr_vBatchId), 1.0);
|
|
108
|
+
}
|
|
109
|
+
`,
|
|
110
|
+
);
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* Directly inject picking shader code into a ShaderMaterial's source strings.
|
|
115
|
+
*
|
|
116
|
+
* For ShaderMaterial (and its subclasses like LineMaterial), modifying the
|
|
117
|
+
* shader source directly is more reliable than `onBeforeCompile` because:
|
|
118
|
+
* 1. Other code may set onBeforeCompile (e.g. RTE injection for LineMaterial)
|
|
119
|
+
* 2. MRT overrides already modify material.fragmentShader directly
|
|
120
|
+
* 3. The material source is the ground truth for ShaderMaterial compilation
|
|
121
|
+
*
|
|
122
|
+
* The picking override is injected before the last closing brace of main()
|
|
123
|
+
* so it runs after all other gl_FragColor assignments.
|
|
124
|
+
*/
|
|
125
|
+
function injectPickingIntoShaderMaterial(
|
|
126
|
+
material: ShaderMaterial,
|
|
127
|
+
refs: { nvr_uPickable: { value: number }; nvr_uBatchId: { value: number } },
|
|
128
|
+
): void {
|
|
129
|
+
// Add uniforms to the material's uniform map
|
|
130
|
+
material.uniforms.nvr_uPickable = refs.nvr_uPickable;
|
|
131
|
+
material.uniforms.nvr_uBatchId = refs.nvr_uBatchId;
|
|
132
|
+
|
|
133
|
+
// Inject uniform declarations before void main()
|
|
134
|
+
material.fragmentShader = material.fragmentShader.replace(
|
|
135
|
+
"void main() {",
|
|
136
|
+
`${PICKING_UNIFORMS_DECL}\nvoid main() {`,
|
|
137
|
+
);
|
|
138
|
+
|
|
139
|
+
// Inject picking override before the last closing brace of main().
|
|
140
|
+
// Custom materials (ShaderMaterial, LineMaterial) don't have
|
|
141
|
+
// #include <dithering_fragment>, so we target the last `}` instead.
|
|
142
|
+
const lastBrace = material.fragmentShader.lastIndexOf("}");
|
|
143
|
+
material.fragmentShader =
|
|
144
|
+
material.fragmentShader.slice(0, lastBrace) +
|
|
145
|
+
PICKING_OVERRIDE +
|
|
146
|
+
material.fragmentShader.slice(lastBrace);
|
|
147
|
+
|
|
148
|
+
material.needsUpdate = true;
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
/**
|
|
152
|
+
* Turnkey {@link PickableMesh} implementation for stock Three.js materials.
|
|
153
|
+
*
|
|
154
|
+
* Traverses the wrapped Object3D and injects picking shader code into every
|
|
155
|
+
* child `Mesh`'s material: `onBeforeCompile` for standard materials, direct
|
|
156
|
+
* source mutation for `ShaderMaterial`. During the pick pass the fragment
|
|
157
|
+
* shader outputs a batchId-encoded color, bypassing lighting/tonemapping.
|
|
158
|
+
*
|
|
159
|
+
* Apply this explicitly, don't rely on the framework to
|
|
160
|
+
* wrap your mesh for you. If you have a custom shader and don't want shader
|
|
161
|
+
* injection, implement {@link PickableMesh} yourself instead of using this
|
|
162
|
+
* class.
|
|
163
|
+
*/
|
|
164
|
+
export class PickableMeshWrapper extends Object3D implements PickableMesh {
|
|
165
|
+
public readonly batchId: number;
|
|
166
|
+
private refs: {
|
|
167
|
+
nvr_uPickable: { value: number };
|
|
168
|
+
nvr_uBatchId: { value: number };
|
|
169
|
+
};
|
|
170
|
+
/** Materials that already have picking shaders installed. */
|
|
171
|
+
private injectedMaterials = new WeakSet<Material>();
|
|
172
|
+
|
|
173
|
+
constructor(
|
|
174
|
+
public object: Object3D,
|
|
175
|
+
ctx: ViewContext,
|
|
176
|
+
) {
|
|
177
|
+
super();
|
|
178
|
+
this.batchId = ctx.genGlobalBatchId() ?? 0;
|
|
179
|
+
this.refs = {
|
|
180
|
+
nvr_uPickable: { value: 0 },
|
|
181
|
+
nvr_uBatchId: { value: this.batchId },
|
|
182
|
+
};
|
|
183
|
+
this.setupShaders();
|
|
184
|
+
}
|
|
185
|
+
|
|
186
|
+
/**
|
|
187
|
+
* Re-scan the wrapped object and inject picking into any materials that
|
|
188
|
+
* appeared since the last pass (e.g. after a layer swapped its material).
|
|
189
|
+
* Preserves the existing `batchId` and skips materials already injected.
|
|
190
|
+
*/
|
|
191
|
+
syncMaterials(): void {
|
|
192
|
+
this.setupShaders();
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
private setupShaders(): void {
|
|
196
|
+
const refs = this.refs;
|
|
197
|
+
this.object.traverse((child) => {
|
|
198
|
+
if (!(child instanceof Mesh)) return;
|
|
199
|
+
|
|
200
|
+
const materials = Array.isArray(child.material)
|
|
201
|
+
? child.material
|
|
202
|
+
: [child.material];
|
|
203
|
+
|
|
204
|
+
materials.forEach((m) => {
|
|
205
|
+
if (!(m instanceof Material)) return;
|
|
206
|
+
if (this.injectedMaterials.has(m)) return;
|
|
207
|
+
// For ShaderMaterial (includes LineMaterial), inject directly into
|
|
208
|
+
// the shader source. This is more reliable than onBeforeCompile
|
|
209
|
+
// because ShaderMaterial sources may already be modified by MRT
|
|
210
|
+
// overrides and RTE injection.
|
|
211
|
+
if (m instanceof ShaderMaterial) {
|
|
212
|
+
injectPickingIntoShaderMaterial(m, refs);
|
|
213
|
+
this.injectedMaterials.add(m);
|
|
214
|
+
return;
|
|
215
|
+
}
|
|
216
|
+
// For standard materials, use onBeforeCompile
|
|
217
|
+
const prevOnBeforeCompile = m.onBeforeCompile;
|
|
218
|
+
const prevCacheKey = m.customProgramCacheKey?.bind(m);
|
|
219
|
+
m.onBeforeCompile = (shader, renderer) => {
|
|
220
|
+
prevOnBeforeCompile?.call(m, shader, renderer);
|
|
221
|
+
injectPickingShader(shader, refs);
|
|
222
|
+
};
|
|
223
|
+
m.customProgramCacheKey = () =>
|
|
224
|
+
(prevCacheKey?.() ?? "") + "_nvr_pickable";
|
|
225
|
+
m.needsUpdate = true;
|
|
226
|
+
this.injectedMaterials.add(m);
|
|
227
|
+
});
|
|
228
|
+
});
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
onBeforePicking(_pickingCoord?: Vector2): void {
|
|
232
|
+
this.refs.nvr_uPickable.value = 1;
|
|
233
|
+
}
|
|
234
|
+
|
|
235
|
+
onAfterPicking(): void {
|
|
236
|
+
this.refs.nvr_uPickable.value = 0;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
getRenderable(): Object3D {
|
|
240
|
+
return this.object;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
/**
|
|
245
|
+
* Turnkey {@link PickableMesh} implementation for `InstancedMesh`.
|
|
246
|
+
*
|
|
247
|
+
* Adds a per-instance `batchId` attribute and injects picking shader code.
|
|
248
|
+
* During the pick pass each instance renders with its unique batchId color.
|
|
249
|
+
*
|
|
250
|
+
* The wrapper owns the batchId array; callers drive instance lifecycle via
|
|
251
|
+
* {@link addInstance}, {@link removeInstanceAt}, {@link clearInstances},
|
|
252
|
+
* {@link replaceAll}, and {@link syncMesh} (after a buffer grow).
|
|
253
|
+
*/
|
|
254
|
+
export class PickableInstancedMeshWrapper
|
|
255
|
+
extends Object3D
|
|
256
|
+
implements PickableMesh
|
|
257
|
+
{
|
|
258
|
+
public batchIds: number[];
|
|
259
|
+
private refs: { nvr_uPickable: { value: number } };
|
|
260
|
+
private batchIdAttr: InstancedBufferAttribute | null = null;
|
|
261
|
+
/** Set of materials that already have picking shaders installed. */
|
|
262
|
+
private injectedMaterials = new WeakSet<Material>();
|
|
263
|
+
|
|
264
|
+
constructor(
|
|
265
|
+
public mesh: InstancedMesh,
|
|
266
|
+
initialCount: number,
|
|
267
|
+
private ctx: ViewContext,
|
|
268
|
+
) {
|
|
269
|
+
super();
|
|
270
|
+
this.batchIds = Array.from(
|
|
271
|
+
{ length: initialCount },
|
|
272
|
+
() => ctx.genGlobalBatchId() ?? 0,
|
|
273
|
+
);
|
|
274
|
+
this.refs = { nvr_uPickable: { value: 0 } };
|
|
275
|
+
this.setupBatchIdAttribute();
|
|
276
|
+
this.setupShader();
|
|
277
|
+
}
|
|
278
|
+
|
|
279
|
+
/** Allocate a batchId for a new instance and extend the attribute. */
|
|
280
|
+
addInstance(): number {
|
|
281
|
+
const id = this.ctx.genGlobalBatchId() ?? 0;
|
|
282
|
+
this.batchIds.push(id);
|
|
283
|
+
this.setupBatchIdAttribute();
|
|
284
|
+
return id;
|
|
285
|
+
}
|
|
286
|
+
|
|
287
|
+
/** Remove an instance by index (swap-with-last, O(1)). */
|
|
288
|
+
removeInstanceAt(index: number): void {
|
|
289
|
+
const last = this.batchIds.length - 1;
|
|
290
|
+
if (index < 0 || index > last) return;
|
|
291
|
+
if (index !== last) this.batchIds[index] = this.batchIds[last];
|
|
292
|
+
this.batchIds.pop();
|
|
293
|
+
this.setupBatchIdAttribute();
|
|
294
|
+
}
|
|
295
|
+
|
|
296
|
+
/** Drop all instance batchIds. */
|
|
297
|
+
clearInstances(): void {
|
|
298
|
+
this.batchIds = [];
|
|
299
|
+
this.setupBatchIdAttribute();
|
|
300
|
+
}
|
|
301
|
+
|
|
302
|
+
/** Regenerate `count` fresh batchIds and refresh the attribute. */
|
|
303
|
+
replaceAll(count: number): number[] {
|
|
304
|
+
this.batchIds = Array.from(
|
|
305
|
+
{ length: count },
|
|
306
|
+
() => this.ctx.genGlobalBatchId() ?? 0,
|
|
307
|
+
);
|
|
308
|
+
this.setupBatchIdAttribute();
|
|
309
|
+
return this.batchIds;
|
|
310
|
+
}
|
|
311
|
+
|
|
312
|
+
/** Re-attach bookkeeping after the underlying `InstancedMesh` was replaced. */
|
|
313
|
+
syncMesh(mesh: InstancedMesh): void {
|
|
314
|
+
this.mesh = mesh;
|
|
315
|
+
this.batchIdAttr = null;
|
|
316
|
+
this.setupBatchIdAttribute();
|
|
317
|
+
this.setupShader();
|
|
318
|
+
}
|
|
319
|
+
|
|
320
|
+
/** Create/update the per-instance batchId attribute on the geometry. */
|
|
321
|
+
private setupBatchIdAttribute(): void {
|
|
322
|
+
const count = this.mesh.instanceMatrix.count;
|
|
323
|
+
const len = Math.min(this.batchIds.length, count);
|
|
324
|
+
|
|
325
|
+
if (this.batchIdAttr && this.batchIdAttr.array.length >= count) {
|
|
326
|
+
// Reuse existing buffer — zero out then fill
|
|
327
|
+
const arr = this.batchIdAttr.array as Float32Array;
|
|
328
|
+
arr.fill(0);
|
|
329
|
+
for (let i = 0; i < len; i++) {
|
|
330
|
+
arr[i] = this.batchIds[i] ?? 0;
|
|
331
|
+
}
|
|
332
|
+
this.batchIdAttr.needsUpdate = true;
|
|
333
|
+
} else {
|
|
334
|
+
// First call or buffer too small — allocate new attribute
|
|
335
|
+
const data = new Float32Array(count);
|
|
336
|
+
for (let i = 0; i < len; i++) {
|
|
337
|
+
data[i] = this.batchIds[i] ?? 0;
|
|
338
|
+
}
|
|
339
|
+
this.batchIdAttr = new InstancedBufferAttribute(data, 1);
|
|
340
|
+
this.mesh.geometry.setAttribute("batchId", this.batchIdAttr);
|
|
341
|
+
}
|
|
342
|
+
}
|
|
343
|
+
|
|
344
|
+
/** Install picking shader hooks on materials that haven't been injected yet. */
|
|
345
|
+
private setupShader(): void {
|
|
346
|
+
const materials = Array.isArray(this.mesh.material)
|
|
347
|
+
? this.mesh.material
|
|
348
|
+
: [this.mesh.material];
|
|
349
|
+
|
|
350
|
+
const refs = this.refs;
|
|
351
|
+
|
|
352
|
+
for (const mat of materials) {
|
|
353
|
+
if (!(mat instanceof Material)) continue;
|
|
354
|
+
if (this.injectedMaterials.has(mat)) continue;
|
|
355
|
+
|
|
356
|
+
const prevOnBeforeCompile = mat.onBeforeCompile;
|
|
357
|
+
const prevCacheKey = mat.customProgramCacheKey?.bind(mat);
|
|
358
|
+
|
|
359
|
+
mat.onBeforeCompile = (shader, renderer) => {
|
|
360
|
+
prevOnBeforeCompile?.call(mat, shader, renderer);
|
|
361
|
+
injectInstancedPickingShader(shader, refs);
|
|
362
|
+
};
|
|
363
|
+
// Ensure Three.js treats this as a distinct shader program
|
|
364
|
+
mat.customProgramCacheKey = () =>
|
|
365
|
+
(prevCacheKey?.() ?? "") + "_nvr_instanced_pickable";
|
|
366
|
+
// Force shader recompilation
|
|
367
|
+
mat.needsUpdate = true;
|
|
368
|
+
|
|
369
|
+
this.injectedMaterials.add(mat);
|
|
370
|
+
}
|
|
371
|
+
}
|
|
372
|
+
|
|
373
|
+
onBeforePicking(_pickingCoord?: Vector2): void {
|
|
374
|
+
this.refs.nvr_uPickable.value = 1;
|
|
375
|
+
}
|
|
376
|
+
|
|
377
|
+
onAfterPicking(): void {
|
|
378
|
+
this.refs.nvr_uPickable.value = 0;
|
|
379
|
+
}
|
|
380
|
+
|
|
381
|
+
getRenderable(): Object3D {
|
|
382
|
+
return this.mesh;
|
|
383
|
+
}
|
|
384
|
+
}
|
|
385
|
+
|
|
386
|
+
/**
|
|
387
|
+
* Turnkey {@link PickableMesh} implementation for a group of sibling
|
|
388
|
+
* `InstancedMesh`es that share one logical per-instance identity.
|
|
389
|
+
*
|
|
390
|
+
* Used for instanced GLTF models: a single source model has multiple sub-meshes
|
|
391
|
+
* (one `InstancedMesh` per node), each with its own geometry and material.
|
|
392
|
+
* Every instance `i` represents one full model, so all sub-meshes at slot `i`
|
|
393
|
+
* share the same `batchId`. Picking any sub-mesh of a given instance resolves
|
|
394
|
+
* to the same id.
|
|
395
|
+
*
|
|
396
|
+
* The wrapper owns a single `batchIds` array, installs a synchronized
|
|
397
|
+
* `batchId` `InstancedBufferAttribute` on every sub-mesh geometry, and injects
|
|
398
|
+
* the instanced picking shader into every sub-mesh material.
|
|
399
|
+
*/
|
|
400
|
+
export class PickableMultiInstancedMeshWrapper
|
|
401
|
+
extends Object3D
|
|
402
|
+
implements PickableMesh
|
|
403
|
+
{
|
|
404
|
+
public batchIds: number[];
|
|
405
|
+
private refs: { nvr_uPickable: { value: number } };
|
|
406
|
+
// Keyed by BufferGeometry, not InstancedMesh: sub-meshes loaded from a GLTF
|
|
407
|
+
// commonly share a geometry, and `batchId` lives on the geometry. Keying by
|
|
408
|
+
// mesh would let a later `geometry.setAttribute("batchId", ...)` silently
|
|
409
|
+
// overwrite the earlier mesh's cached attribute, so updates would mutate
|
|
410
|
+
// a stale object and picking would read outdated ids.
|
|
411
|
+
private attrs = new Map<BufferGeometry, InstancedBufferAttribute>();
|
|
412
|
+
private injectedMaterials = new WeakSet<Material>();
|
|
413
|
+
|
|
414
|
+
constructor(
|
|
415
|
+
public root: Object3D,
|
|
416
|
+
public meshes: InstancedMesh[],
|
|
417
|
+
initialCount: number,
|
|
418
|
+
private ctx: ViewContext,
|
|
419
|
+
) {
|
|
420
|
+
super();
|
|
421
|
+
this.batchIds = Array.from(
|
|
422
|
+
{ length: initialCount },
|
|
423
|
+
() => ctx.genGlobalBatchId() ?? 0,
|
|
424
|
+
);
|
|
425
|
+
this.refs = { nvr_uPickable: { value: 0 } };
|
|
426
|
+
this.setupBatchIdAttributes();
|
|
427
|
+
this.setupShaders();
|
|
428
|
+
}
|
|
429
|
+
|
|
430
|
+
addInstance(): number {
|
|
431
|
+
const id = this.ctx.genGlobalBatchId() ?? 0;
|
|
432
|
+
this.batchIds.push(id);
|
|
433
|
+
this.setupBatchIdAttributes();
|
|
434
|
+
return id;
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
removeInstanceAt(index: number): void {
|
|
438
|
+
const last = this.batchIds.length - 1;
|
|
439
|
+
if (index < 0 || index > last) return;
|
|
440
|
+
if (index !== last) this.batchIds[index] = this.batchIds[last];
|
|
441
|
+
this.batchIds.pop();
|
|
442
|
+
this.setupBatchIdAttributes();
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
clearInstances(): void {
|
|
446
|
+
this.batchIds = [];
|
|
447
|
+
this.setupBatchIdAttributes();
|
|
448
|
+
}
|
|
449
|
+
|
|
450
|
+
replaceAll(count: number): number[] {
|
|
451
|
+
this.batchIds = Array.from(
|
|
452
|
+
{ length: count },
|
|
453
|
+
() => this.ctx.genGlobalBatchId() ?? 0,
|
|
454
|
+
);
|
|
455
|
+
this.setupBatchIdAttributes();
|
|
456
|
+
return this.batchIds;
|
|
457
|
+
}
|
|
458
|
+
|
|
459
|
+
/** Re-attach bookkeeping after the underlying sub-meshes were replaced. */
|
|
460
|
+
syncMeshes(meshes: InstancedMesh[]): void {
|
|
461
|
+
this.meshes = meshes;
|
|
462
|
+
this.attrs.clear();
|
|
463
|
+
this.setupBatchIdAttributes();
|
|
464
|
+
this.setupShaders();
|
|
465
|
+
}
|
|
466
|
+
|
|
467
|
+
private setupBatchIdAttributes(): void {
|
|
468
|
+
const seen = new Set<BufferGeometry>();
|
|
469
|
+
for (const mesh of this.meshes) {
|
|
470
|
+
const geometry = mesh.geometry;
|
|
471
|
+
if (seen.has(geometry)) continue;
|
|
472
|
+
seen.add(geometry);
|
|
473
|
+
|
|
474
|
+
const count = mesh.instanceMatrix.count;
|
|
475
|
+
const len = Math.min(this.batchIds.length, count);
|
|
476
|
+
let attr = this.attrs.get(geometry);
|
|
477
|
+
if (attr && attr.array.length >= count) {
|
|
478
|
+
const arr = attr.array as Float32Array;
|
|
479
|
+
arr.fill(0);
|
|
480
|
+
for (let i = 0; i < len; i++) arr[i] = this.batchIds[i] ?? 0;
|
|
481
|
+
attr.needsUpdate = true;
|
|
482
|
+
} else {
|
|
483
|
+
const data = new Float32Array(count);
|
|
484
|
+
for (let i = 0; i < len; i++) data[i] = this.batchIds[i] ?? 0;
|
|
485
|
+
attr = new InstancedBufferAttribute(data, 1);
|
|
486
|
+
geometry.setAttribute("batchId", attr);
|
|
487
|
+
this.attrs.set(geometry, attr);
|
|
488
|
+
}
|
|
489
|
+
}
|
|
490
|
+
}
|
|
491
|
+
|
|
492
|
+
private setupShaders(): void {
|
|
493
|
+
const refs = this.refs;
|
|
494
|
+
for (const mesh of this.meshes) {
|
|
495
|
+
const materials = Array.isArray(mesh.material)
|
|
496
|
+
? mesh.material
|
|
497
|
+
: [mesh.material];
|
|
498
|
+
for (const mat of materials) {
|
|
499
|
+
if (!(mat instanceof Material)) continue;
|
|
500
|
+
if (this.injectedMaterials.has(mat)) continue;
|
|
501
|
+
|
|
502
|
+
const prevOnBeforeCompile = mat.onBeforeCompile;
|
|
503
|
+
const prevCacheKey = mat.customProgramCacheKey?.bind(mat);
|
|
504
|
+
|
|
505
|
+
mat.onBeforeCompile = (shader, renderer) => {
|
|
506
|
+
prevOnBeforeCompile?.call(mat, shader, renderer);
|
|
507
|
+
injectInstancedPickingShader(shader, refs);
|
|
508
|
+
};
|
|
509
|
+
mat.customProgramCacheKey = () =>
|
|
510
|
+
(prevCacheKey?.() ?? "") + "_nvr_instanced_pickable";
|
|
511
|
+
mat.needsUpdate = true;
|
|
512
|
+
|
|
513
|
+
this.injectedMaterials.add(mat);
|
|
514
|
+
}
|
|
515
|
+
}
|
|
516
|
+
}
|
|
517
|
+
|
|
518
|
+
onBeforePicking(_pickingCoord?: Vector2): void {
|
|
519
|
+
this.refs.nvr_uPickable.value = 1;
|
|
520
|
+
}
|
|
521
|
+
|
|
522
|
+
onAfterPicking(): void {
|
|
523
|
+
this.refs.nvr_uPickable.value = 0;
|
|
524
|
+
}
|
|
525
|
+
|
|
526
|
+
getRenderable(): Object3D {
|
|
527
|
+
return this.root;
|
|
528
|
+
}
|
|
529
|
+
}
|