@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,112 @@
|
|
|
1
|
+
import {
|
|
2
|
+
MeshBasicMaterial,
|
|
3
|
+
MeshLambertMaterial,
|
|
4
|
+
MeshPhongMaterial,
|
|
5
|
+
MeshPhysicalMaterial,
|
|
6
|
+
MeshStandardMaterial,
|
|
7
|
+
PointsMaterial,
|
|
8
|
+
ShaderMaterial,
|
|
9
|
+
type Material,
|
|
10
|
+
type WebGLProgramParametersWithUniforms,
|
|
11
|
+
} from "three";
|
|
12
|
+
import { ShaderLib as ThreeShaderLib } from "three";
|
|
13
|
+
|
|
14
|
+
// Re-export ShaderLib for convenience
|
|
15
|
+
export const ShaderLib = ThreeShaderLib;
|
|
16
|
+
|
|
17
|
+
// Mapping from shader names to their corresponding material classes
|
|
18
|
+
type ShaderToMaterial = {
|
|
19
|
+
basic: MeshBasicMaterial;
|
|
20
|
+
lambert: MeshLambertMaterial;
|
|
21
|
+
phong: MeshPhongMaterial;
|
|
22
|
+
standard: MeshStandardMaterial;
|
|
23
|
+
physical: MeshPhysicalMaterial;
|
|
24
|
+
points: PointsMaterial;
|
|
25
|
+
shader: ShaderMaterial;
|
|
26
|
+
};
|
|
27
|
+
|
|
28
|
+
// All shader names that have material mappings
|
|
29
|
+
export type ShaderName = keyof ShaderToMaterial;
|
|
30
|
+
|
|
31
|
+
// Helper type: Extract material union from shader name array
|
|
32
|
+
export type MaterialsFromShaders<S extends readonly ShaderName[]> =
|
|
33
|
+
ShaderToMaterial[S[number]];
|
|
34
|
+
|
|
35
|
+
/**
|
|
36
|
+
* Type alias for shader uniforms.
|
|
37
|
+
*/
|
|
38
|
+
export type ShaderUniforms = WebGLProgramParametersWithUniforms["uniforms"];
|
|
39
|
+
|
|
40
|
+
/**
|
|
41
|
+
* Generic Mutates type - refs must be updated by states.
|
|
42
|
+
* All mutates have:
|
|
43
|
+
* - `update(state)`: Syncs internal refs from state
|
|
44
|
+
* - `updateUniforms(uniforms, state)`: Assigns internal refs to shader.uniforms
|
|
45
|
+
* Additional methods can be added via the Methods type parameter.
|
|
46
|
+
*/
|
|
47
|
+
export type Mutates<
|
|
48
|
+
States,
|
|
49
|
+
Uniforms extends ShaderUniforms,
|
|
50
|
+
Methods extends Record<string, (...args: never[]) => void> = Record<
|
|
51
|
+
never,
|
|
52
|
+
never
|
|
53
|
+
>,
|
|
54
|
+
> = {
|
|
55
|
+
update: (states: States) => void;
|
|
56
|
+
updateUniforms: (uniforms: Uniforms, states: States) => void;
|
|
57
|
+
} & Methods;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Core abstraction: Material enhancer with shader type constraints
|
|
61
|
+
*
|
|
62
|
+
* A MaterialEnhancer encapsulates a single material feature and declares which shaders it supports.
|
|
63
|
+
*
|
|
64
|
+
* The enhancer separates concerns into three categories:
|
|
65
|
+
* - **State** (immutable): Configuration flags and values that define behavior.
|
|
66
|
+
* Always replaced as a whole when updated (never mutated). Returned directly via `states()`.
|
|
67
|
+
* - **Refs** (mutable, internal): Uniform value objects (`{ value: T }`) that are shared
|
|
68
|
+
* references with shader.uniforms. Hidden inside mutates, synced from state via `mutates().update(state)`.
|
|
69
|
+
* - **Mutates** (mutation functions): Functions exposed via `mutates()` for controlled
|
|
70
|
+
* mutation of internal refs. Always includes `update(state)` to sync refs from state.
|
|
71
|
+
*
|
|
72
|
+
* The material is passed to the factory function when creating the enhancer,
|
|
73
|
+
* and is exposed via the `material` property for composed enhancers to reference.
|
|
74
|
+
*/
|
|
75
|
+
export type MaterialEnhancer<
|
|
76
|
+
M extends Material,
|
|
77
|
+
Props,
|
|
78
|
+
States = unknown,
|
|
79
|
+
Mutates = unknown,
|
|
80
|
+
Shaders extends readonly ShaderName[] = readonly ShaderName[],
|
|
81
|
+
> = {
|
|
82
|
+
/** The Three.js material being enhanced */
|
|
83
|
+
readonly material: M;
|
|
84
|
+
/** Declares which shaders this enhancer is compatible with */
|
|
85
|
+
readonly availableShaders: Shaders;
|
|
86
|
+
/** Called once during shader compilation - assigns internal refs to shader.uniforms */
|
|
87
|
+
transformShader: (shader: WebGLProgramParametersWithUniforms) => void;
|
|
88
|
+
/** Called once after creation - initializes internal state with props */
|
|
89
|
+
mount: (props: Props) => void;
|
|
90
|
+
/** Called on every props update - updates internal state and refs */
|
|
91
|
+
update: (props: Props) => void;
|
|
92
|
+
/** Get the current state directly (no getters - refresh after updates) */
|
|
93
|
+
states: () => States;
|
|
94
|
+
/** Get mutation functions for controlled updates to internal refs */
|
|
95
|
+
mutates: () => Mutates;
|
|
96
|
+
/** Returns cache key based on state affecting shader defines. Used with material.customProgramCacheKey */
|
|
97
|
+
programCacheKey: () => string;
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
/** Enhanced material wrapper */
|
|
101
|
+
export type EnhancedMaterial<
|
|
102
|
+
M extends Material,
|
|
103
|
+
Props,
|
|
104
|
+
States = unknown,
|
|
105
|
+
Mutates = unknown,
|
|
106
|
+
> = {
|
|
107
|
+
material: M;
|
|
108
|
+
mount: (props: Props) => void;
|
|
109
|
+
update: (props: Props) => void;
|
|
110
|
+
states: () => States;
|
|
111
|
+
mutates: () => Mutates;
|
|
112
|
+
};
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { describe, expect, it } from "vitest";
|
|
2
|
+
|
|
3
|
+
import {
|
|
4
|
+
ShaderReplacer,
|
|
5
|
+
createShaderReplacer,
|
|
6
|
+
type ShaderMarkers,
|
|
7
|
+
} from "./ShaderReplacer";
|
|
8
|
+
|
|
9
|
+
const MARKERS = {
|
|
10
|
+
vertex: {
|
|
11
|
+
START: "// MARKER_START",
|
|
12
|
+
END: "// MARKER_END",
|
|
13
|
+
},
|
|
14
|
+
fragment: {},
|
|
15
|
+
} satisfies ShaderMarkers;
|
|
16
|
+
|
|
17
|
+
type TestMarkers = typeof MARKERS;
|
|
18
|
+
|
|
19
|
+
describe("ShaderReplacer", () => {
|
|
20
|
+
const baseSource = [
|
|
21
|
+
"line1",
|
|
22
|
+
MARKERS.vertex.START,
|
|
23
|
+
"content",
|
|
24
|
+
MARKERS.vertex.END,
|
|
25
|
+
"line2",
|
|
26
|
+
].join("\n");
|
|
27
|
+
|
|
28
|
+
describe("insertBefore", () => {
|
|
29
|
+
it("should insert code before the marker and preserve the marker", () => {
|
|
30
|
+
const replacer = new ShaderReplacer<TestMarkers>(baseSource);
|
|
31
|
+
replacer.insertBefore(MARKERS.vertex.START, "inserted");
|
|
32
|
+
|
|
33
|
+
expect(replacer.source).toContain(`inserted\n${MARKERS.vertex.START}`);
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
it("should throw when marker is not found", () => {
|
|
37
|
+
const replacer = new ShaderReplacer<TestMarkers>("no markers here");
|
|
38
|
+
expect(() =>
|
|
39
|
+
replacer.insertBefore(MARKERS.vertex.START, "code"),
|
|
40
|
+
).toThrow();
|
|
41
|
+
});
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
describe("insertAfter", () => {
|
|
45
|
+
it("should insert code after the marker and preserve the marker", () => {
|
|
46
|
+
const replacer = new ShaderReplacer<TestMarkers>(baseSource);
|
|
47
|
+
replacer.insertAfter(MARKERS.vertex.END, "inserted");
|
|
48
|
+
|
|
49
|
+
expect(replacer.source).toContain(`${MARKERS.vertex.END}\ninserted`);
|
|
50
|
+
});
|
|
51
|
+
|
|
52
|
+
it("should throw when marker is not found", () => {
|
|
53
|
+
const replacer = new ShaderReplacer<TestMarkers>("no markers here");
|
|
54
|
+
expect(() => replacer.insertAfter(MARKERS.vertex.END, "code")).toThrow();
|
|
55
|
+
});
|
|
56
|
+
});
|
|
57
|
+
|
|
58
|
+
describe("replaceBlock", () => {
|
|
59
|
+
it("should replace content between markers and preserve markers", () => {
|
|
60
|
+
const replacer = new ShaderReplacer<TestMarkers>(baseSource);
|
|
61
|
+
replacer.replaceBlock(
|
|
62
|
+
{ start: MARKERS.vertex.START, end: MARKERS.vertex.END },
|
|
63
|
+
"REPLACED",
|
|
64
|
+
);
|
|
65
|
+
|
|
66
|
+
expect(replacer.source).toContain(`${MARKERS.vertex.START}
|
|
67
|
+
REPLACED
|
|
68
|
+
${MARKERS.vertex.END}`);
|
|
69
|
+
expect(replacer.source).not.toContain("content");
|
|
70
|
+
});
|
|
71
|
+
|
|
72
|
+
it("should throw when start marker is not found", () => {
|
|
73
|
+
const replacer = new ShaderReplacer<TestMarkers>("no markers here");
|
|
74
|
+
expect(() =>
|
|
75
|
+
replacer.replaceBlock(
|
|
76
|
+
{ start: MARKERS.vertex.START, end: MARKERS.vertex.END },
|
|
77
|
+
"code",
|
|
78
|
+
),
|
|
79
|
+
).toThrow("start marker");
|
|
80
|
+
});
|
|
81
|
+
|
|
82
|
+
it("should throw when end marker is not found", () => {
|
|
83
|
+
const source = `before\n${MARKERS.vertex.START}\nno end`;
|
|
84
|
+
const replacer = new ShaderReplacer<TestMarkers>(source);
|
|
85
|
+
expect(() =>
|
|
86
|
+
replacer.replaceBlock(
|
|
87
|
+
{ start: MARKERS.vertex.START, end: MARKERS.vertex.END },
|
|
88
|
+
"code",
|
|
89
|
+
),
|
|
90
|
+
).toThrow("end marker");
|
|
91
|
+
});
|
|
92
|
+
});
|
|
93
|
+
|
|
94
|
+
describe("chaining", () => {
|
|
95
|
+
it("should support chaining multiple operations", () => {
|
|
96
|
+
const replacer = new ShaderReplacer<TestMarkers>(baseSource);
|
|
97
|
+
const result = replacer
|
|
98
|
+
.insertBefore(MARKERS.vertex.START, "before_start")
|
|
99
|
+
.insertAfter(MARKERS.vertex.END, "after_end");
|
|
100
|
+
|
|
101
|
+
expect(result).toBe(replacer);
|
|
102
|
+
expect(replacer.source).toContain("before_start");
|
|
103
|
+
expect(replacer.source).toContain("after_end");
|
|
104
|
+
});
|
|
105
|
+
});
|
|
106
|
+
|
|
107
|
+
describe("createShaderReplacer", () => {
|
|
108
|
+
it("should create a ShaderReplacer instance", () => {
|
|
109
|
+
const replacer = createShaderReplacer<TestMarkers>(baseSource);
|
|
110
|
+
expect(replacer).toBeInstanceOf(ShaderReplacer);
|
|
111
|
+
expect(replacer.source).toBe(baseSource);
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
});
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { replaceOrThrow } from "../../utils/replacer";
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Common type for organizing shader markers by shader stage.
|
|
5
|
+
*/
|
|
6
|
+
export type ShaderMarkers = {
|
|
7
|
+
readonly vertex: Record<string, string>;
|
|
8
|
+
readonly fragment: Record<string, string>;
|
|
9
|
+
};
|
|
10
|
+
|
|
11
|
+
type PickMarker<Markers extends ShaderMarkers, Key extends keyof Markers> = {
|
|
12
|
+
[VK in keyof Markers[Key]]: Markers[Key][VK];
|
|
13
|
+
}[keyof Markers[Key]];
|
|
14
|
+
|
|
15
|
+
type PickMarkers<Markers extends ShaderMarkers> =
|
|
16
|
+
| PickMarker<Markers, "vertex">
|
|
17
|
+
| PickMarker<Markers, "fragment">;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* A type-safe shader string replacer that restricts operations to declared markers.
|
|
21
|
+
*
|
|
22
|
+
* Each enhancer level declares its own markers and exposes a factory function
|
|
23
|
+
* that returns a ShaderReplacer typed to those markers. Composing enhancers
|
|
24
|
+
* use the parent's factory to safely modify shader code at known insertion points.
|
|
25
|
+
*
|
|
26
|
+
* @template Markers - Union of allowed marker strings
|
|
27
|
+
*/
|
|
28
|
+
export class ShaderReplacer<
|
|
29
|
+
AllMarkers extends ShaderMarkers,
|
|
30
|
+
Markers extends string = PickMarkers<AllMarkers>,
|
|
31
|
+
> {
|
|
32
|
+
private _source: string;
|
|
33
|
+
|
|
34
|
+
constructor(source: string) {
|
|
35
|
+
this._source = source;
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
get source(): string {
|
|
39
|
+
return this._source;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* Insert code before the target marker.
|
|
44
|
+
* The target marker is preserved.
|
|
45
|
+
*/
|
|
46
|
+
insertBefore(marker: Markers, code: string): this {
|
|
47
|
+
this._source = replaceOrThrow(this._source, marker, `${code}\n${marker}`);
|
|
48
|
+
return this;
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
/**
|
|
52
|
+
* Insert code after the target marker.
|
|
53
|
+
* The target marker is preserved.
|
|
54
|
+
*/
|
|
55
|
+
insertAfter(marker: Markers, code: string): this {
|
|
56
|
+
this._source = replaceOrThrow(this._source, marker, `${marker}\n${code}`);
|
|
57
|
+
return this;
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Replace the content between start and end markers with the given code.
|
|
62
|
+
* The markers themselves are preserved.
|
|
63
|
+
*/
|
|
64
|
+
replaceBlock(
|
|
65
|
+
position: { readonly start: Markers; readonly end: Markers },
|
|
66
|
+
code: string,
|
|
67
|
+
): this {
|
|
68
|
+
const { start, end } = position;
|
|
69
|
+
|
|
70
|
+
const startIdx = this._source.indexOf(start);
|
|
71
|
+
if (startIdx === -1) {
|
|
72
|
+
throw new Error(`Failed to find start marker "${start}" in shader code.`);
|
|
73
|
+
}
|
|
74
|
+
const endIdx = this._source.indexOf(end);
|
|
75
|
+
if (endIdx === -1) {
|
|
76
|
+
throw new Error(`Failed to find end marker "${end}" in shader code.`);
|
|
77
|
+
}
|
|
78
|
+
this._source =
|
|
79
|
+
this._source.substring(0, startIdx) +
|
|
80
|
+
start +
|
|
81
|
+
"\n" +
|
|
82
|
+
code +
|
|
83
|
+
"\n" +
|
|
84
|
+
end +
|
|
85
|
+
this._source.substring(endIdx + end.length);
|
|
86
|
+
return this;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
|
|
90
|
+
/**
|
|
91
|
+
* Create a ShaderReplacer typed to the given marker union.
|
|
92
|
+
*/
|
|
93
|
+
export function createShaderReplacer<AllMarkers extends ShaderMarkers>(
|
|
94
|
+
source: string,
|
|
95
|
+
) {
|
|
96
|
+
return new ShaderReplacer<AllMarkers>(source);
|
|
97
|
+
}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export type BatchTextureFlags = {
|
|
2
|
+
useBatchTexture?: boolean;
|
|
3
|
+
useBatchColorShow?: boolean; // Note: opacity is bundled with show in COLOR_SHOW's alpha channel
|
|
4
|
+
useBatchHeight?: boolean;
|
|
5
|
+
useBatchExtrudedHeight?: boolean;
|
|
6
|
+
useBatchLineWidth?: boolean;
|
|
7
|
+
useBatchSize?: boolean;
|
|
8
|
+
};
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
export { ShaderLib } from "./MaterialEnhancer";
|
|
2
|
+
export type {
|
|
3
|
+
EnhancedMaterial,
|
|
4
|
+
MaterialEnhancer,
|
|
5
|
+
MaterialsFromShaders,
|
|
6
|
+
Mutates,
|
|
7
|
+
ShaderName,
|
|
8
|
+
} from "./MaterialEnhancer";
|
|
9
|
+
|
|
10
|
+
// Polygon enhancers
|
|
11
|
+
export { createPolygonMaterialEnhancer } from "./polygon";
|
|
12
|
+
export type { PolygonMaterialProps } from "./polygon";
|
|
13
|
+
|
|
14
|
+
// Shadow map depth enhancers
|
|
15
|
+
export { createShadowMapDepthEnhancer } from "./shadowMap";
|
|
16
|
+
export type {
|
|
17
|
+
ShadowMapDepthProps,
|
|
18
|
+
ShadowMapDepthSupportedMaterial,
|
|
19
|
+
} from "./shadowMap";
|
|
20
|
+
|
|
21
|
+
// Polyline enhancers
|
|
22
|
+
export { createPolylineMaterialEnhancer } from "./polyline";
|
|
23
|
+
export type {
|
|
24
|
+
PolylineMaterialProps,
|
|
25
|
+
PolylineBaseMutates,
|
|
26
|
+
PolylineBaseProps,
|
|
27
|
+
PolylineBaseState,
|
|
28
|
+
} from "./polyline";
|
|
29
|
+
|
|
30
|
+
// InstancedSprite enhancers
|
|
31
|
+
export { createInstancedSpriteMaterialEnhancer } from "./instancedSprite";
|
|
32
|
+
export type { InstancedSpriteMaterialProps } from "./instancedSprite";
|
|
33
|
+
export type {
|
|
34
|
+
InstancedSpriteBaseMutates,
|
|
35
|
+
InstancedSpriteBaseProps,
|
|
36
|
+
InstancedSpriteBaseState,
|
|
37
|
+
} from "./instancedSprite";
|
|
38
|
+
|
|
39
|
+
// SdfText enhancers
|
|
40
|
+
export { createSdfTextMaterialEnhancer } from "./sdfText";
|
|
41
|
+
export type { SdfTextMaterialProps } from "./sdfText";
|
|
42
|
+
export type {
|
|
43
|
+
SdfTextBaseMutates,
|
|
44
|
+
SdfTextBaseProps,
|
|
45
|
+
SdfTextBaseState,
|
|
46
|
+
} from "./sdfText";
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { createInstancedSpriteMaterialEnhancer } from "./instancedSpriteMaterialEnhancer";
|
|
2
|
+
export type { InstancedSpriteMaterialProps } from "./instancedSpriteMaterialEnhancer";
|
|
3
|
+
export type {
|
|
4
|
+
InstancedSpriteBaseMutates,
|
|
5
|
+
InstancedSpriteBaseProps,
|
|
6
|
+
InstancedSpriteBaseState,
|
|
7
|
+
} from "./instancedSpriteMaterialEnhancer";
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
import { ShaderMaterial } from "three";
|
|
2
|
+
import type { Texture } from "three";
|
|
3
|
+
import { beforeEach, describe, expect, it } from "vitest";
|
|
4
|
+
|
|
5
|
+
import type { InstancedSpriteBaseProps } from "./types";
|
|
6
|
+
|
|
7
|
+
import { createInstancedSpriteBaseEnhancer } from "./index";
|
|
8
|
+
|
|
9
|
+
describe("instancedSpriteBaseEnhancer", () => {
|
|
10
|
+
let enhancer: ReturnType<typeof createInstancedSpriteBaseEnhancer>;
|
|
11
|
+
|
|
12
|
+
beforeEach(() => {
|
|
13
|
+
enhancer = createInstancedSpriteBaseEnhancer(new ShaderMaterial());
|
|
14
|
+
});
|
|
15
|
+
|
|
16
|
+
describe("lifecycle", () => {
|
|
17
|
+
it("transformShader() should throw if called before mount", () => {
|
|
18
|
+
const freshEnhancer = createInstancedSpriteBaseEnhancer(
|
|
19
|
+
new ShaderMaterial(),
|
|
20
|
+
);
|
|
21
|
+
|
|
22
|
+
const shader = {
|
|
23
|
+
uniforms: {},
|
|
24
|
+
vertexShader: "",
|
|
25
|
+
fragmentShader: "",
|
|
26
|
+
defines: {},
|
|
27
|
+
} as any;
|
|
28
|
+
|
|
29
|
+
expect(() => freshEnhancer.transformShader(shader)).toThrow(
|
|
30
|
+
"mount() must be called before transformShader",
|
|
31
|
+
);
|
|
32
|
+
});
|
|
33
|
+
|
|
34
|
+
it("states() should throw if called before mount", () => {
|
|
35
|
+
const freshEnhancer = createInstancedSpriteBaseEnhancer(
|
|
36
|
+
new ShaderMaterial(),
|
|
37
|
+
);
|
|
38
|
+
|
|
39
|
+
expect(() => freshEnhancer.states()).toThrow(
|
|
40
|
+
"mount() must be called before states",
|
|
41
|
+
);
|
|
42
|
+
});
|
|
43
|
+
|
|
44
|
+
it("mutates() should throw if called before mount", () => {
|
|
45
|
+
const freshEnhancer = createInstancedSpriteBaseEnhancer(
|
|
46
|
+
new ShaderMaterial(),
|
|
47
|
+
);
|
|
48
|
+
|
|
49
|
+
expect(() => freshEnhancer.mutates()).toThrow(
|
|
50
|
+
"mount() must be called before mutates",
|
|
51
|
+
);
|
|
52
|
+
});
|
|
53
|
+
|
|
54
|
+
it("update() should throw if called before mount", () => {
|
|
55
|
+
const freshEnhancer = createInstancedSpriteBaseEnhancer(
|
|
56
|
+
new ShaderMaterial(),
|
|
57
|
+
);
|
|
58
|
+
|
|
59
|
+
expect(() => freshEnhancer.update({})).toThrow(
|
|
60
|
+
"mount() must be called before update",
|
|
61
|
+
);
|
|
62
|
+
});
|
|
63
|
+
|
|
64
|
+
it("programCacheKey() should throw if called before mount", () => {
|
|
65
|
+
const freshEnhancer = createInstancedSpriteBaseEnhancer(
|
|
66
|
+
new ShaderMaterial(),
|
|
67
|
+
);
|
|
68
|
+
|
|
69
|
+
expect(() => freshEnhancer.programCacheKey()).toThrow(
|
|
70
|
+
"mount() must be called before programCacheKey",
|
|
71
|
+
);
|
|
72
|
+
});
|
|
73
|
+
|
|
74
|
+
it("should initialize state on mount", () => {
|
|
75
|
+
const props: InstancedSpriteBaseProps = {
|
|
76
|
+
scale: 50,
|
|
77
|
+
center: [0.5, 0.5],
|
|
78
|
+
pickable: true,
|
|
79
|
+
};
|
|
80
|
+
|
|
81
|
+
enhancer.mount(props);
|
|
82
|
+
|
|
83
|
+
const state = enhancer.states();
|
|
84
|
+
expect(state.scale).toBe(50);
|
|
85
|
+
expect(state.center).toEqual([0.5, 0.5]);
|
|
86
|
+
expect(state.pickable).toBe(true);
|
|
87
|
+
expect(state.useRTE).toBe(false);
|
|
88
|
+
expect(state.billboard).toBe(false);
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
it("should update state on update", () => {
|
|
92
|
+
enhancer.mount({ scale: 50 });
|
|
93
|
+
|
|
94
|
+
const stateBefore = enhancer.states();
|
|
95
|
+
expect(stateBefore.scale).toBe(50);
|
|
96
|
+
|
|
97
|
+
enhancer.update({ scale: 200 });
|
|
98
|
+
|
|
99
|
+
const stateAfter = enhancer.states();
|
|
100
|
+
expect(stateAfter.scale).toBe(200);
|
|
101
|
+
});
|
|
102
|
+
|
|
103
|
+
it("should allow transformShader after mount", () => {
|
|
104
|
+
enhancer.mount({ scale: 50 });
|
|
105
|
+
|
|
106
|
+
const shader = {
|
|
107
|
+
uniforms: {} as any,
|
|
108
|
+
vertexShader: "",
|
|
109
|
+
fragmentShader: "",
|
|
110
|
+
defines: {},
|
|
111
|
+
} as any;
|
|
112
|
+
|
|
113
|
+
// Should not throw
|
|
114
|
+
expect(() => enhancer.transformShader(shader)).not.toThrow();
|
|
115
|
+
|
|
116
|
+
// Should have assigned uniforms
|
|
117
|
+
expect(shader.uniforms.uScale).toBeDefined();
|
|
118
|
+
expect(shader.uniforms.uCenter).toBeDefined();
|
|
119
|
+
expect(shader.uniforms.nvr_uPickable).toBeDefined();
|
|
120
|
+
});
|
|
121
|
+
|
|
122
|
+
it("should update material properties on mount", () => {
|
|
123
|
+
const material = new ShaderMaterial();
|
|
124
|
+
const e = createInstancedSpriteBaseEnhancer(material);
|
|
125
|
+
e.mount({ transparent: false, depthTest: false });
|
|
126
|
+
|
|
127
|
+
expect(material.transparent).toBe(false);
|
|
128
|
+
expect(material.depthTest).toBe(false);
|
|
129
|
+
});
|
|
130
|
+
|
|
131
|
+
it("should update material properties on update", () => {
|
|
132
|
+
const material = new ShaderMaterial();
|
|
133
|
+
const e = createInstancedSpriteBaseEnhancer(material);
|
|
134
|
+
e.mount({});
|
|
135
|
+
e.update({ transparent: false });
|
|
136
|
+
|
|
137
|
+
expect(material.transparent).toBe(false);
|
|
138
|
+
});
|
|
139
|
+
|
|
140
|
+
it("should update texture and atlasSize together without replacing uTexture ref", () => {
|
|
141
|
+
enhancer.mount({ billboard: true });
|
|
142
|
+
|
|
143
|
+
const shader = {
|
|
144
|
+
uniforms: {} as any,
|
|
145
|
+
vertexShader: "",
|
|
146
|
+
fragmentShader: "",
|
|
147
|
+
defines: {},
|
|
148
|
+
} as any;
|
|
149
|
+
enhancer.transformShader(shader);
|
|
150
|
+
|
|
151
|
+
const initialTextureUniform = shader.uniforms.uTexture;
|
|
152
|
+
expect(initialTextureUniform).toBeDefined();
|
|
153
|
+
|
|
154
|
+
const nextTexture = {
|
|
155
|
+
image: {
|
|
156
|
+
width: 1,
|
|
157
|
+
height: 1,
|
|
158
|
+
data: new Uint8Array([0, 0, 0, 0]),
|
|
159
|
+
},
|
|
160
|
+
} as unknown as Texture;
|
|
161
|
+
|
|
162
|
+
enhancer.update({
|
|
163
|
+
texture: { value: nextTexture },
|
|
164
|
+
atlasSize: [512, 512],
|
|
165
|
+
});
|
|
166
|
+
|
|
167
|
+
expect(shader.uniforms.uTexture).toBe(initialTextureUniform);
|
|
168
|
+
expect(shader.uniforms.uTexture.value).toBe(nextTexture);
|
|
169
|
+
expect(shader.uniforms.uAtlasSize.value.x).toBe(512);
|
|
170
|
+
expect(shader.uniforms.uAtlasSize.value.y).toBe(512);
|
|
171
|
+
expect(enhancer.states().atlasSize).toEqual([512, 512]);
|
|
172
|
+
});
|
|
173
|
+
});
|
|
174
|
+
|
|
175
|
+
describe("programCacheKey", () => {
|
|
176
|
+
it("should return cache key based on shader-affecting state", () => {
|
|
177
|
+
enhancer.mount({
|
|
178
|
+
useRTE: true,
|
|
179
|
+
billboard: true,
|
|
180
|
+
});
|
|
181
|
+
|
|
182
|
+
const cacheKey = enhancer.programCacheKey();
|
|
183
|
+
const parsed = JSON.parse(cacheKey);
|
|
184
|
+
|
|
185
|
+
expect(parsed).toEqual({
|
|
186
|
+
useRTE: true,
|
|
187
|
+
billboard: true,
|
|
188
|
+
userDataDefines: undefined,
|
|
189
|
+
});
|
|
190
|
+
});
|
|
191
|
+
|
|
192
|
+
it("should return different cache keys for different shader-affecting states", () => {
|
|
193
|
+
enhancer.mount({ useRTE: false, billboard: false });
|
|
194
|
+
const cacheKey1 = enhancer.programCacheKey();
|
|
195
|
+
|
|
196
|
+
const enhancer2 = createInstancedSpriteBaseEnhancer(new ShaderMaterial());
|
|
197
|
+
enhancer2.mount({ useRTE: true, billboard: false });
|
|
198
|
+
const cacheKey2 = enhancer2.programCacheKey();
|
|
199
|
+
|
|
200
|
+
expect(cacheKey1).not.toBe(cacheKey2);
|
|
201
|
+
});
|
|
202
|
+
|
|
203
|
+
it("should return same cache key for same shader-affecting states with different non-affecting states", () => {
|
|
204
|
+
enhancer.mount({ useRTE: true, billboard: true, scale: 50 });
|
|
205
|
+
const cacheKey1 = enhancer.programCacheKey();
|
|
206
|
+
|
|
207
|
+
const enhancer2 = createInstancedSpriteBaseEnhancer(new ShaderMaterial());
|
|
208
|
+
enhancer2.mount({ useRTE: true, billboard: true, scale: 200 });
|
|
209
|
+
const cacheKey2 = enhancer2.programCacheKey();
|
|
210
|
+
|
|
211
|
+
expect(cacheKey1).toBe(cacheKey2);
|
|
212
|
+
});
|
|
213
|
+
});
|
|
214
|
+
});
|