@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,114 @@
|
|
|
1
|
+
import instancedSpriteFragmentShader from "@shaders/glsl/instancedSprite.frag.glsl";
|
|
2
|
+
import instancedSpriteVertexShader from "@shaders/glsl/instancedSprite.vert.glsl";
|
|
3
|
+
import { describe, expect, it } from "vitest";
|
|
4
|
+
|
|
5
|
+
import { createInstancedSpriteBaseEnhancer, type SupportedMaterial } from ".";
|
|
6
|
+
|
|
7
|
+
describe("instancedSpriteBaseEnhancer shader", () => {
|
|
8
|
+
const createMockMaterial = () =>
|
|
9
|
+
({
|
|
10
|
+
type: "ShaderMaterial",
|
|
11
|
+
userData: {},
|
|
12
|
+
}) as unknown as SupportedMaterial;
|
|
13
|
+
|
|
14
|
+
const createMockShader = () => ({
|
|
15
|
+
vertexShader: "",
|
|
16
|
+
fragmentShader: "",
|
|
17
|
+
uniforms: {},
|
|
18
|
+
defines: {} as Record<string, unknown>,
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("should set correct vertex and fragment shaders", () => {
|
|
22
|
+
const material = createMockMaterial();
|
|
23
|
+
const enhancer = createInstancedSpriteBaseEnhancer(material);
|
|
24
|
+
enhancer.mount({});
|
|
25
|
+
|
|
26
|
+
const shader = createMockShader();
|
|
27
|
+
enhancer.transformShader(shader as any);
|
|
28
|
+
|
|
29
|
+
expect(shader.vertexShader).toBe(instancedSpriteVertexShader);
|
|
30
|
+
expect(shader.fragmentShader).toBe(instancedSpriteFragmentShader);
|
|
31
|
+
});
|
|
32
|
+
|
|
33
|
+
it("should set USE_RTE define when useRTE=true", () => {
|
|
34
|
+
const material = createMockMaterial();
|
|
35
|
+
const enhancer = createInstancedSpriteBaseEnhancer(material);
|
|
36
|
+
enhancer.mount({ useRTE: true });
|
|
37
|
+
|
|
38
|
+
const shader = createMockShader();
|
|
39
|
+
enhancer.transformShader(shader as any);
|
|
40
|
+
|
|
41
|
+
expect(shader.defines.USE_RTE).toBe(1);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("should not set USE_RTE define when useRTE=false", () => {
|
|
45
|
+
const material = createMockMaterial();
|
|
46
|
+
const enhancer = createInstancedSpriteBaseEnhancer(material);
|
|
47
|
+
enhancer.mount({ useRTE: false });
|
|
48
|
+
|
|
49
|
+
const shader = createMockShader();
|
|
50
|
+
enhancer.transformShader(shader as any);
|
|
51
|
+
|
|
52
|
+
expect(shader.defines.USE_RTE).toBeUndefined();
|
|
53
|
+
});
|
|
54
|
+
|
|
55
|
+
it("should set BILLBOARD define when billboard=true", () => {
|
|
56
|
+
const material = createMockMaterial();
|
|
57
|
+
const enhancer = createInstancedSpriteBaseEnhancer(material);
|
|
58
|
+
enhancer.mount({ billboard: true });
|
|
59
|
+
|
|
60
|
+
const shader = createMockShader();
|
|
61
|
+
enhancer.transformShader(shader as any);
|
|
62
|
+
|
|
63
|
+
expect(shader.defines.BILLBOARD).toBe(1);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("should not set BILLBOARD define when billboard=false", () => {
|
|
67
|
+
const material = createMockMaterial();
|
|
68
|
+
const enhancer = createInstancedSpriteBaseEnhancer(material);
|
|
69
|
+
enhancer.mount({ billboard: false });
|
|
70
|
+
|
|
71
|
+
const shader = createMockShader();
|
|
72
|
+
enhancer.transformShader(shader as any);
|
|
73
|
+
|
|
74
|
+
expect(shader.defines.BILLBOARD).toBeUndefined();
|
|
75
|
+
});
|
|
76
|
+
|
|
77
|
+
it("should set both USE_RTE and BILLBOARD when both are true", () => {
|
|
78
|
+
const material = createMockMaterial();
|
|
79
|
+
const enhancer = createInstancedSpriteBaseEnhancer(material);
|
|
80
|
+
enhancer.mount({ useRTE: true, billboard: true });
|
|
81
|
+
|
|
82
|
+
const shader = createMockShader();
|
|
83
|
+
enhancer.transformShader(shader as any);
|
|
84
|
+
|
|
85
|
+
expect(shader.defines.USE_RTE).toBe(1);
|
|
86
|
+
expect(shader.defines.BILLBOARD).toBe(1);
|
|
87
|
+
});
|
|
88
|
+
|
|
89
|
+
it("should merge material.userData.defines", () => {
|
|
90
|
+
const material = createMockMaterial();
|
|
91
|
+
material.userData.defines = { CUSTOM_DEFINE: 1 };
|
|
92
|
+
const enhancer = createInstancedSpriteBaseEnhancer(material);
|
|
93
|
+
enhancer.mount({});
|
|
94
|
+
|
|
95
|
+
const shader = createMockShader();
|
|
96
|
+
enhancer.transformShader(shader as any);
|
|
97
|
+
|
|
98
|
+
expect(shader.defines.CUSTOM_DEFINE).toBe(1);
|
|
99
|
+
});
|
|
100
|
+
|
|
101
|
+
it("should assign uniforms to shader.uniforms", () => {
|
|
102
|
+
const material = createMockMaterial();
|
|
103
|
+
const enhancer = createInstancedSpriteBaseEnhancer(material);
|
|
104
|
+
enhancer.mount({ scale: 200 });
|
|
105
|
+
|
|
106
|
+
const shader = createMockShader();
|
|
107
|
+
enhancer.transformShader(shader as any);
|
|
108
|
+
|
|
109
|
+
expect((shader.uniforms as Record<string, unknown>).uScale).toBeDefined();
|
|
110
|
+
expect(
|
|
111
|
+
(shader.uniforms as Record<string, { value: unknown }>).uScale.value,
|
|
112
|
+
).toBe(200);
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
import instancedSpriteFragmentShader from "@shaders/glsl/instancedSprite.frag.glsl";
|
|
2
|
+
import instancedSpriteVertexShader from "@shaders/glsl/instancedSprite.vert.glsl";
|
|
3
|
+
import type { WebGLProgramParametersWithUniforms } from "three";
|
|
4
|
+
|
|
5
|
+
import type { SupportedMaterial } from "./material";
|
|
6
|
+
import type {
|
|
7
|
+
InstancedSpriteBaseMutates,
|
|
8
|
+
InstancedSpriteBaseState,
|
|
9
|
+
} from "./types";
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Transform shader with instancedSprite base modifications.
|
|
13
|
+
*
|
|
14
|
+
* InstancedSprites use custom ShaderMaterial shaders. This function:
|
|
15
|
+
* 1. Sets the vertex/fragment shader sources
|
|
16
|
+
* 2. Sets defines based on state (USE_RTE, BILLBOARD)
|
|
17
|
+
* 3. Assigns uniform refs via mutates.updateUniforms()
|
|
18
|
+
*/
|
|
19
|
+
export const transformShader = (
|
|
20
|
+
shader: WebGLProgramParametersWithUniforms,
|
|
21
|
+
state: InstancedSpriteBaseState,
|
|
22
|
+
mutates: InstancedSpriteBaseMutates,
|
|
23
|
+
material: SupportedMaterial,
|
|
24
|
+
): void => {
|
|
25
|
+
// Set shaders — instancedSprite always uses the same shader pair
|
|
26
|
+
shader.vertexShader = instancedSpriteVertexShader;
|
|
27
|
+
shader.fragmentShader = instancedSpriteFragmentShader;
|
|
28
|
+
|
|
29
|
+
// Set defines based on state
|
|
30
|
+
shader.defines ??= {};
|
|
31
|
+
|
|
32
|
+
if (state.useRTE) {
|
|
33
|
+
shader.defines.USE_RTE = 1;
|
|
34
|
+
}
|
|
35
|
+
|
|
36
|
+
if (state.billboard) {
|
|
37
|
+
shader.defines.BILLBOARD = 1;
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
shader.defines.USE_SELECTIVE_EFFECT = 1;
|
|
41
|
+
|
|
42
|
+
// Merge defines from material.userData.defines
|
|
43
|
+
if (material.userData?.defines) {
|
|
44
|
+
Object.assign(shader.defines, material.userData.defines);
|
|
45
|
+
}
|
|
46
|
+
|
|
47
|
+
// Assign uniform refs to shader.uniforms via mutates
|
|
48
|
+
mutates.updateUniforms(shader.uniforms, state);
|
|
49
|
+
};
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import { DEFAULT_BASE_STATE, updateState } from "./state";
|
|
4
|
+
|
|
5
|
+
describe("instancedSpriteBaseEnhancer / state", () => {
|
|
6
|
+
describe("updateState", () => {
|
|
7
|
+
it("initializes state from props with defaults", () => {
|
|
8
|
+
const state = updateState({ scale: 50 }, DEFAULT_BASE_STATE);
|
|
9
|
+
expect(state.scale).toBe(50);
|
|
10
|
+
expect(state.center).toEqual([0.0, 0.0]);
|
|
11
|
+
expect(state.sizeInMeters).toBe(true);
|
|
12
|
+
});
|
|
13
|
+
|
|
14
|
+
it("preserves immutable fields (useRTE) from currentState", () => {
|
|
15
|
+
const currentState = { ...DEFAULT_BASE_STATE, useRTE: true };
|
|
16
|
+
const state = updateState({ useRTE: false }, currentState);
|
|
17
|
+
expect(state.useRTE).toBe(true);
|
|
18
|
+
});
|
|
19
|
+
|
|
20
|
+
it("preserves immutable fields (billboard) from currentState", () => {
|
|
21
|
+
const currentState = { ...DEFAULT_BASE_STATE, billboard: true };
|
|
22
|
+
const state = updateState({ billboard: false }, currentState);
|
|
23
|
+
expect(state.billboard).toBe(true);
|
|
24
|
+
});
|
|
25
|
+
|
|
26
|
+
it("updates scale", () => {
|
|
27
|
+
const state = updateState({ scale: 200 }, DEFAULT_BASE_STATE);
|
|
28
|
+
expect(state.scale).toBe(200);
|
|
29
|
+
});
|
|
30
|
+
|
|
31
|
+
it("updates center", () => {
|
|
32
|
+
const state = updateState({ center: [0.5, 0.5] }, DEFAULT_BASE_STATE);
|
|
33
|
+
expect(state.center).toEqual([0.5, 0.5]);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("updates sizeInMeters", () => {
|
|
37
|
+
const state = updateState({ sizeInMeters: false }, DEFAULT_BASE_STATE);
|
|
38
|
+
expect(state.sizeInMeters).toBe(false);
|
|
39
|
+
});
|
|
40
|
+
|
|
41
|
+
it("updates offsetDepth", () => {
|
|
42
|
+
const state = updateState({ offsetDepth: false }, DEFAULT_BASE_STATE);
|
|
43
|
+
expect(state.offsetDepth).toBe(false);
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
it("updates alphaTest", () => {
|
|
47
|
+
const state = updateState({ alphaTest: 0.5 }, DEFAULT_BASE_STATE);
|
|
48
|
+
expect(state.alphaTest).toBe(0.5);
|
|
49
|
+
});
|
|
50
|
+
|
|
51
|
+
it("updates pickable", () => {
|
|
52
|
+
const state = updateState({ pickable: true }, DEFAULT_BASE_STATE);
|
|
53
|
+
expect(state.pickable).toBe(true);
|
|
54
|
+
});
|
|
55
|
+
|
|
56
|
+
it("updates transparent", () => {
|
|
57
|
+
const state = updateState({ transparent: false }, DEFAULT_BASE_STATE);
|
|
58
|
+
expect(state.transparent).toBe(false);
|
|
59
|
+
});
|
|
60
|
+
|
|
61
|
+
it("updates depthTest", () => {
|
|
62
|
+
const state = updateState({ depthTest: false }, DEFAULT_BASE_STATE);
|
|
63
|
+
expect(state.depthTest).toBe(false);
|
|
64
|
+
});
|
|
65
|
+
|
|
66
|
+
it("updates atlasSize", () => {
|
|
67
|
+
const state = updateState({ atlasSize: [512, 256] }, DEFAULT_BASE_STATE);
|
|
68
|
+
expect(state.atlasSize).toEqual([512, 256]);
|
|
69
|
+
});
|
|
70
|
+
|
|
71
|
+
it("falls back to currentState for missing props", () => {
|
|
72
|
+
const currentState = {
|
|
73
|
+
...DEFAULT_BASE_STATE,
|
|
74
|
+
scale: 42,
|
|
75
|
+
center: [1, 2] as [number, number],
|
|
76
|
+
};
|
|
77
|
+
const state = updateState({}, currentState);
|
|
78
|
+
expect(state.scale).toBe(42);
|
|
79
|
+
expect(state.center).toEqual([1, 2]);
|
|
80
|
+
});
|
|
81
|
+
});
|
|
82
|
+
});
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
import type {
|
|
2
|
+
InstancedSpriteBaseProps,
|
|
3
|
+
InstancedSpriteBaseState,
|
|
4
|
+
} from "./types";
|
|
5
|
+
|
|
6
|
+
export const DEFAULT_BASE_PROPS: Required<
|
|
7
|
+
Omit<InstancedSpriteBaseProps, "texture" | "rtcCenter">
|
|
8
|
+
> = {
|
|
9
|
+
useRTE: false,
|
|
10
|
+
billboard: false,
|
|
11
|
+
scale: 100.0,
|
|
12
|
+
center: [0.0, 0.0],
|
|
13
|
+
sizeInMeters: true,
|
|
14
|
+
offsetDepth: true,
|
|
15
|
+
alphaTest: 0.0,
|
|
16
|
+
pickable: false,
|
|
17
|
+
effectIdsMask: 0,
|
|
18
|
+
emissiveColor: 0,
|
|
19
|
+
emissiveIntensity: 0,
|
|
20
|
+
transparent: true,
|
|
21
|
+
depthTest: true,
|
|
22
|
+
atlasSize: [1.0, 1.0],
|
|
23
|
+
fovRad: 1.0,
|
|
24
|
+
screenHeightPx: 1080,
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
/** Default state derived from DEFAULT_BASE_PROPS */
|
|
28
|
+
export const DEFAULT_BASE_STATE: InstancedSpriteBaseState = {
|
|
29
|
+
useRTE: DEFAULT_BASE_PROPS.useRTE,
|
|
30
|
+
billboard: DEFAULT_BASE_PROPS.billboard,
|
|
31
|
+
scale: DEFAULT_BASE_PROPS.scale,
|
|
32
|
+
center: DEFAULT_BASE_PROPS.center,
|
|
33
|
+
sizeInMeters: DEFAULT_BASE_PROPS.sizeInMeters,
|
|
34
|
+
offsetDepth: DEFAULT_BASE_PROPS.offsetDepth,
|
|
35
|
+
alphaTest: DEFAULT_BASE_PROPS.alphaTest,
|
|
36
|
+
pickable: DEFAULT_BASE_PROPS.pickable,
|
|
37
|
+
effectIdsMask: DEFAULT_BASE_PROPS.effectIdsMask,
|
|
38
|
+
emissiveColor: DEFAULT_BASE_PROPS.emissiveColor,
|
|
39
|
+
emissiveIntensity: DEFAULT_BASE_PROPS.emissiveIntensity,
|
|
40
|
+
transparent: DEFAULT_BASE_PROPS.transparent,
|
|
41
|
+
depthTest: DEFAULT_BASE_PROPS.depthTest,
|
|
42
|
+
atlasSize: DEFAULT_BASE_PROPS.atlasSize,
|
|
43
|
+
fovRad: DEFAULT_BASE_PROPS.fovRad,
|
|
44
|
+
screenHeightPx: DEFAULT_BASE_PROPS.screenHeightPx,
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/**
|
|
48
|
+
* Update mutable state from props.
|
|
49
|
+
* Props override currentState values; missing props fall back to currentState.
|
|
50
|
+
* Pass DEFAULT_BASE_STATE as currentState for initial mount.
|
|
51
|
+
*
|
|
52
|
+
* @param props - The props to apply
|
|
53
|
+
* @param currentState - The current state to use as fallback (use DEFAULT_BASE_STATE for mount)
|
|
54
|
+
*/
|
|
55
|
+
export const updateState = (
|
|
56
|
+
props: InstancedSpriteBaseProps,
|
|
57
|
+
currentState: InstancedSpriteBaseState,
|
|
58
|
+
): InstancedSpriteBaseState => {
|
|
59
|
+
return {
|
|
60
|
+
// Immutable after mount - always preserve current value
|
|
61
|
+
useRTE: currentState.useRTE,
|
|
62
|
+
billboard: currentState.billboard,
|
|
63
|
+
// Mutable
|
|
64
|
+
scale: props.scale ?? currentState.scale,
|
|
65
|
+
center: props.center ?? currentState.center,
|
|
66
|
+
sizeInMeters: props.sizeInMeters ?? currentState.sizeInMeters,
|
|
67
|
+
offsetDepth: props.offsetDepth ?? currentState.offsetDepth,
|
|
68
|
+
alphaTest: props.alphaTest ?? currentState.alphaTest,
|
|
69
|
+
pickable: props.pickable ?? currentState.pickable,
|
|
70
|
+
effectIdsMask: props.effectIdsMask ?? currentState.effectIdsMask,
|
|
71
|
+
emissiveColor: props.emissiveColor ?? currentState.emissiveColor,
|
|
72
|
+
emissiveIntensity:
|
|
73
|
+
props.emissiveIntensity ?? currentState.emissiveIntensity,
|
|
74
|
+
transparent: props.transparent ?? currentState.transparent,
|
|
75
|
+
depthTest: props.depthTest ?? currentState.depthTest,
|
|
76
|
+
atlasSize: props.atlasSize ?? currentState.atlasSize,
|
|
77
|
+
fovRad: props.fovRad ?? currentState.fovRad,
|
|
78
|
+
screenHeightPx: props.screenHeightPx ?? currentState.screenHeightPx,
|
|
79
|
+
};
|
|
80
|
+
};
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
import type { Matrix4, Texture, Vector2, Vector3 } from "three";
|
|
2
|
+
|
|
3
|
+
import type { UniformValue } from "../../../types";
|
|
4
|
+
import type { Mutates } from "../../MaterialEnhancer";
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* Props for the instancedSprite base enhancer.
|
|
8
|
+
*/
|
|
9
|
+
export type InstancedSpriteBaseProps = {
|
|
10
|
+
// Immutable after mount
|
|
11
|
+
useRTE?: boolean;
|
|
12
|
+
billboard?: boolean;
|
|
13
|
+
|
|
14
|
+
// Mutable state
|
|
15
|
+
scale?: number;
|
|
16
|
+
center?: [number, number];
|
|
17
|
+
sizeInMeters?: boolean;
|
|
18
|
+
offsetDepth?: boolean;
|
|
19
|
+
alphaTest?: number;
|
|
20
|
+
pickable?: boolean;
|
|
21
|
+
|
|
22
|
+
// SelectiveEffect
|
|
23
|
+
effectIdsMask?: number;
|
|
24
|
+
emissiveColor?: number;
|
|
25
|
+
emissiveIntensity?: number;
|
|
26
|
+
|
|
27
|
+
// Material properties (set directly on material, not via uniforms)
|
|
28
|
+
transparent?: boolean;
|
|
29
|
+
depthTest?: boolean;
|
|
30
|
+
|
|
31
|
+
// External uniform refs / values (may change over time)
|
|
32
|
+
rtcCenter?: [number, number, number];
|
|
33
|
+
texture?: UniformValue<Texture | null>;
|
|
34
|
+
/** Billboard atlas dimensions in pixels; normalizes instanceUvRect in the shader. */
|
|
35
|
+
atlasSize?: [number, number];
|
|
36
|
+
fovRad?: number;
|
|
37
|
+
screenHeightPx?: number;
|
|
38
|
+
};
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Immutable state snapshot for the instancedSprite base enhancer.
|
|
42
|
+
* This state is always replaced as a whole (never mutated).
|
|
43
|
+
*/
|
|
44
|
+
export type InstancedSpriteBaseState = Readonly<{
|
|
45
|
+
// Immutable after mount
|
|
46
|
+
useRTE: boolean;
|
|
47
|
+
billboard: boolean;
|
|
48
|
+
|
|
49
|
+
// Mutable
|
|
50
|
+
scale: number;
|
|
51
|
+
center: [number, number];
|
|
52
|
+
sizeInMeters: boolean;
|
|
53
|
+
offsetDepth: boolean;
|
|
54
|
+
alphaTest: number;
|
|
55
|
+
pickable: boolean;
|
|
56
|
+
effectIdsMask: number;
|
|
57
|
+
emissiveColor: number;
|
|
58
|
+
emissiveIntensity: number;
|
|
59
|
+
|
|
60
|
+
// Material properties
|
|
61
|
+
transparent: boolean;
|
|
62
|
+
depthTest: boolean;
|
|
63
|
+
|
|
64
|
+
// External ref state
|
|
65
|
+
atlasSize: [number, number];
|
|
66
|
+
fovRad: number;
|
|
67
|
+
screenHeightPx: number;
|
|
68
|
+
}>;
|
|
69
|
+
|
|
70
|
+
/**
|
|
71
|
+
* Mutable references (uniforms) for the instancedSprite base enhancer.
|
|
72
|
+
* These are shared references with shader.uniforms.
|
|
73
|
+
* Internal type - not exposed externally.
|
|
74
|
+
*/
|
|
75
|
+
export type InstancedSpriteBaseRefs = {
|
|
76
|
+
uRTCCenter: UniformValue<Vector3>;
|
|
77
|
+
uRTCCenterView: UniformValue<Vector3>;
|
|
78
|
+
uEyeRTELow: UniformValue<Vector3>;
|
|
79
|
+
uEyeRTEHigh: UniformValue<Vector3>;
|
|
80
|
+
uScale: UniformValue<number>;
|
|
81
|
+
uCenter: UniformValue<Vector2>;
|
|
82
|
+
uSizeInMeters: UniformValue<boolean>;
|
|
83
|
+
uOffsetDepth: UniformValue<boolean>;
|
|
84
|
+
uAlphaTest: UniformValue<number>;
|
|
85
|
+
uFarPlane: UniformValue<number>;
|
|
86
|
+
uAtlasSize: UniformValue<Vector2>;
|
|
87
|
+
nvr_uPickable: UniformValue<number>;
|
|
88
|
+
uEffectIdsMask: UniformValue<number>;
|
|
89
|
+
uEmissiveColor: UniformValue<Vector3>;
|
|
90
|
+
uEmissiveIntensity: UniformValue<number>;
|
|
91
|
+
uFovRad: UniformValue<number>;
|
|
92
|
+
uScreenHeightPx: UniformValue<number>;
|
|
93
|
+
|
|
94
|
+
// External ref - only present in billboard mode
|
|
95
|
+
uTexture?: UniformValue<Texture | null>;
|
|
96
|
+
};
|
|
97
|
+
|
|
98
|
+
export type InstancedSpriteBaseUniforms = Partial<InstancedSpriteBaseRefs>;
|
|
99
|
+
|
|
100
|
+
/**
|
|
101
|
+
* Mutation functions for the instancedSprite base enhancer.
|
|
102
|
+
*/
|
|
103
|
+
export type InstancedSpriteBaseMutates = Mutates<
|
|
104
|
+
InstancedSpriteBaseState,
|
|
105
|
+
InstancedSpriteBaseUniforms,
|
|
106
|
+
{
|
|
107
|
+
/**
|
|
108
|
+
* Update RTE uniforms per-frame.
|
|
109
|
+
* Calls encodePosition internally to split camera position into high/low.
|
|
110
|
+
*/
|
|
111
|
+
updateRteUniforms: (
|
|
112
|
+
cameraX: number,
|
|
113
|
+
cameraY: number,
|
|
114
|
+
cameraZ: number,
|
|
115
|
+
state: InstancedSpriteBaseState,
|
|
116
|
+
) => void;
|
|
117
|
+
/**
|
|
118
|
+
* Update the RTC uniforms per-frame. Transforms the RTC center into view
|
|
119
|
+
* space on the CPU (float64) so the shader avoids a large-coordinate
|
|
120
|
+
* float32 subtraction that would otherwise cause jitter.
|
|
121
|
+
*/
|
|
122
|
+
updateRtcUniforms: (
|
|
123
|
+
viewMatrix: Matrix4,
|
|
124
|
+
state: InstancedSpriteBaseState,
|
|
125
|
+
) => void;
|
|
126
|
+
/**
|
|
127
|
+
* Update far plane per-frame from camera.
|
|
128
|
+
*/
|
|
129
|
+
updateFarPlane: (far: number) => void;
|
|
130
|
+
|
|
131
|
+
/**
|
|
132
|
+
* Update FOV per-frame from camera, in radians.
|
|
133
|
+
*/
|
|
134
|
+
updateFovRad: (fovRad: number) => void;
|
|
135
|
+
|
|
136
|
+
/**
|
|
137
|
+
* Update screen height per-frame from renderer size, in pixels.
|
|
138
|
+
*/
|
|
139
|
+
updateScreenHeightPx: (height: number) => void;
|
|
140
|
+
|
|
141
|
+
/**
|
|
142
|
+
* Set texture external ref.
|
|
143
|
+
*/
|
|
144
|
+
setTexture: (texture: UniformValue<Texture | null>) => void;
|
|
145
|
+
}
|
|
146
|
+
>;
|
|
@@ -0,0 +1,105 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* InstancedSprite Material Enhancer - Currently just the Base enhancer
|
|
3
|
+
*
|
|
4
|
+
* This module provides instancedSprite material functionality using the base enhancer.
|
|
5
|
+
* Structured for future composition if additional enhancers are needed.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
import type { MaterialEnhancer } from "../MaterialEnhancer";
|
|
9
|
+
|
|
10
|
+
import {
|
|
11
|
+
createInstancedSpriteBaseEnhancer,
|
|
12
|
+
type InstancedSpriteBaseMutates,
|
|
13
|
+
type InstancedSpriteBaseProps,
|
|
14
|
+
type InstancedSpriteBaseState,
|
|
15
|
+
type SupportedMaterial,
|
|
16
|
+
} from "./instancedSpriteBaseEnhancer";
|
|
17
|
+
|
|
18
|
+
/**
|
|
19
|
+
* Props for the instancedSprite material enhancer.
|
|
20
|
+
* Currently just wraps the base props, but structured for future composition.
|
|
21
|
+
*/
|
|
22
|
+
export type InstancedSpriteMaterialProps = {
|
|
23
|
+
base?: InstancedSpriteBaseProps;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// Shaders this enhancer supports (custom ShaderMaterial via the "shader" shader name)
|
|
27
|
+
const AVAILABLE_SHADERS = ["shader"] as const;
|
|
28
|
+
type AVAILABLE_SHADERS = typeof AVAILABLE_SHADERS;
|
|
29
|
+
|
|
30
|
+
/**
|
|
31
|
+
* Factory function to create the instancedSprite material enhancer.
|
|
32
|
+
*
|
|
33
|
+
* This creates a new enhancer instance with its own internal state.
|
|
34
|
+
*
|
|
35
|
+
* @param material - The Three.js ShaderMaterial to enhance
|
|
36
|
+
*
|
|
37
|
+
* @example
|
|
38
|
+
* ```typescript
|
|
39
|
+
* const material = new ShaderMaterial();
|
|
40
|
+
* const enhancer = createInstancedSpriteMaterialEnhancer(material);
|
|
41
|
+
*
|
|
42
|
+
* // Mount with base props
|
|
43
|
+
* enhancer.mount({
|
|
44
|
+
* base: { scale: 100, useRTE: true, billboard: true },
|
|
45
|
+
* });
|
|
46
|
+
*
|
|
47
|
+
* // Get state directly via states() - refresh after updates
|
|
48
|
+
* const state = enhancer.states();
|
|
49
|
+
*
|
|
50
|
+
* // Update RTE uniforms per-frame via mutates()
|
|
51
|
+
* if (state.useRTE) {
|
|
52
|
+
* const mutates = enhancer.mutates();
|
|
53
|
+
* mutates.updateRteUniforms(camX, camY, camZ, state);
|
|
54
|
+
* }
|
|
55
|
+
*
|
|
56
|
+
* // Update props (then call states() again to get fresh state)
|
|
57
|
+
* enhancer.update({ base: { scale: 200 } });
|
|
58
|
+
*
|
|
59
|
+
* // Use transformShader for onBeforeCompile
|
|
60
|
+
* material.onBeforeCompile = enhancer.transformShader;
|
|
61
|
+
* ```
|
|
62
|
+
*/
|
|
63
|
+
export function createInstancedSpriteMaterialEnhancer(
|
|
64
|
+
material: SupportedMaterial,
|
|
65
|
+
): MaterialEnhancer<
|
|
66
|
+
SupportedMaterial,
|
|
67
|
+
InstancedSpriteMaterialProps,
|
|
68
|
+
InstancedSpriteBaseState,
|
|
69
|
+
InstancedSpriteBaseMutates,
|
|
70
|
+
AVAILABLE_SHADERS
|
|
71
|
+
> {
|
|
72
|
+
const baseEnhancer = createInstancedSpriteBaseEnhancer(material);
|
|
73
|
+
|
|
74
|
+
return {
|
|
75
|
+
material,
|
|
76
|
+
availableShaders: AVAILABLE_SHADERS,
|
|
77
|
+
|
|
78
|
+
transformShader: (shader) => {
|
|
79
|
+
baseEnhancer.transformShader(shader);
|
|
80
|
+
},
|
|
81
|
+
|
|
82
|
+
mount: (props) => {
|
|
83
|
+
baseEnhancer.mount(props.base ?? {});
|
|
84
|
+
},
|
|
85
|
+
|
|
86
|
+
update: (props) => {
|
|
87
|
+
if (props.base) {
|
|
88
|
+
baseEnhancer.update(props.base);
|
|
89
|
+
}
|
|
90
|
+
},
|
|
91
|
+
|
|
92
|
+
states: () => baseEnhancer.states(),
|
|
93
|
+
|
|
94
|
+
mutates: () => baseEnhancer.mutates(),
|
|
95
|
+
|
|
96
|
+
programCacheKey: () => baseEnhancer.programCacheKey(),
|
|
97
|
+
};
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
// Re-export types for convenience
|
|
101
|
+
export type {
|
|
102
|
+
InstancedSpriteBaseMutates,
|
|
103
|
+
InstancedSpriteBaseProps,
|
|
104
|
+
InstancedSpriteBaseState,
|
|
105
|
+
};
|
|
@@ -0,0 +1,25 @@
|
|
|
1
|
+
export { createModelBaseEnhancer } from "./modelBaseEnhancer";
|
|
2
|
+
export {
|
|
3
|
+
MODEL_BASE_SHADER_MARKERS,
|
|
4
|
+
createModelBaseShaderReplacer,
|
|
5
|
+
} from "./modelBaseEnhancer";
|
|
6
|
+
export type {
|
|
7
|
+
ModelBaseMutates,
|
|
8
|
+
ModelBaseProps,
|
|
9
|
+
ModelBaseState,
|
|
10
|
+
} from "./modelBaseEnhancer";
|
|
11
|
+
|
|
12
|
+
export { createModelWaterEnhancer } from "./modelWaterEnhancer";
|
|
13
|
+
export type {
|
|
14
|
+
ModelWaterCombinedMutates,
|
|
15
|
+
ModelWaterCombinedStates,
|
|
16
|
+
ModelWaterOnlyProps,
|
|
17
|
+
ModelWaterProps,
|
|
18
|
+
ModelWaterState,
|
|
19
|
+
} from "./modelWaterEnhancer";
|
|
20
|
+
|
|
21
|
+
export { createModelMaterialEnhancer } from "./modelMaterialEnhancer";
|
|
22
|
+
export type { ModelMaterialProps } from "./modelMaterialEnhancer";
|
|
23
|
+
|
|
24
|
+
export { createPntsEnhancer } from "./pntsEnhancer";
|
|
25
|
+
export type { PntsMutates, PntsProps, PntsState } from "./pntsEnhancer";
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
import { MeshStandardMaterial } from "three";
|
|
2
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
3
|
+
|
|
4
|
+
import { createModelBaseEnhancer } from ".";
|
|
5
|
+
|
|
6
|
+
describe("modelBaseEnhancer", () => {
|
|
7
|
+
let enhancer: ReturnType<typeof createModelBaseEnhancer>;
|
|
8
|
+
|
|
9
|
+
beforeEach(() => {
|
|
10
|
+
enhancer = createModelBaseEnhancer(new MeshStandardMaterial());
|
|
11
|
+
});
|
|
12
|
+
|
|
13
|
+
describe("lifecycle", () => {
|
|
14
|
+
it("states() should throw if called before mount", () => {
|
|
15
|
+
const freshEnhancer = createModelBaseEnhancer(new MeshStandardMaterial());
|
|
16
|
+
expect(() => freshEnhancer.states()).toThrow(
|
|
17
|
+
"mount() must be called before states",
|
|
18
|
+
);
|
|
19
|
+
});
|
|
20
|
+
|
|
21
|
+
it("mutates() should throw if called before mount", () => {
|
|
22
|
+
const freshEnhancer = createModelBaseEnhancer(new MeshStandardMaterial());
|
|
23
|
+
expect(() => freshEnhancer.mutates()).toThrow(
|
|
24
|
+
"mount() must be called before mutates",
|
|
25
|
+
);
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
it("update() should throw if called before mount", () => {
|
|
29
|
+
const freshEnhancer = createModelBaseEnhancer(new MeshStandardMaterial());
|
|
30
|
+
expect(() => freshEnhancer.update({})).toThrow(
|
|
31
|
+
"mount() must be called before update",
|
|
32
|
+
);
|
|
33
|
+
});
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
describe("programCacheKey", () => {
|
|
37
|
+
it("should return cache key based on shader-affecting state", () => {
|
|
38
|
+
enhancer.mount({
|
|
39
|
+
useBatchTexture: true,
|
|
40
|
+
useBatchColorShow: false,
|
|
41
|
+
});
|
|
42
|
+
|
|
43
|
+
const cacheKey = enhancer.programCacheKey();
|
|
44
|
+
const parsed = JSON.parse(cacheKey);
|
|
45
|
+
|
|
46
|
+
expect(parsed).toEqual({
|
|
47
|
+
useBatchTexture: true,
|
|
48
|
+
useBatchColorShow: false,
|
|
49
|
+
});
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("should return different cache keys for different shader-affecting states", () => {
|
|
53
|
+
enhancer.mount({ useBatchTexture: false });
|
|
54
|
+
const cacheKey1 = enhancer.programCacheKey();
|
|
55
|
+
|
|
56
|
+
const enhancer2 = createModelBaseEnhancer(new MeshStandardMaterial());
|
|
57
|
+
enhancer2.mount({ useBatchTexture: true });
|
|
58
|
+
const cacheKey2 = enhancer2.programCacheKey();
|
|
59
|
+
|
|
60
|
+
expect(cacheKey1).not.toBe(cacheKey2);
|
|
61
|
+
});
|
|
62
|
+
|
|
63
|
+
it("should return same cache key for same shader-affecting states with different non-affecting states", () => {
|
|
64
|
+
enhancer.mount({ useBatchTexture: true, pickable: true });
|
|
65
|
+
const cacheKey1 = enhancer.programCacheKey();
|
|
66
|
+
|
|
67
|
+
const enhancer2 = createModelBaseEnhancer(new MeshStandardMaterial());
|
|
68
|
+
enhancer2.mount({ useBatchTexture: true, pickable: false });
|
|
69
|
+
const cacheKey2 = enhancer2.programCacheKey();
|
|
70
|
+
|
|
71
|
+
expect(cacheKey1).toBe(cacheKey2);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
});
|