@genome-spy/core 0.36.1 → 0.37.1
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/README.md +1 -0
- package/dist/{index.es.js → bundle/index.es.js} +2253 -2115
- package/dist/{index.js → bundle/index.js} +180 -44
- package/dist/src/data/collector.d.ts +36 -0
- package/dist/src/data/collector.d.ts.map +1 -0
- package/dist/src/data/collector.js +184 -0
- package/dist/src/data/collector.test.js +84 -0
- package/dist/src/data/dataFlow.d.ts +65 -0
- package/dist/src/data/dataFlow.d.ts.map +1 -0
- package/dist/src/data/dataFlow.js +142 -0
- package/dist/src/data/dataFlow.test.js +5 -0
- package/dist/src/data/facetNode.d.ts +17 -0
- package/dist/src/data/facetNode.d.ts.map +1 -0
- package/dist/src/data/facetNode.js +17 -0
- package/dist/src/data/flow.test.js +72 -0
- package/dist/src/data/flowNode.d.ts +136 -0
- package/dist/src/data/flowNode.d.ts.map +1 -0
- package/dist/src/data/flowNode.js +286 -0
- package/dist/src/data/flowNode.test.js +50 -0
- package/dist/src/data/flowOptimizer.d.ts +27 -0
- package/dist/src/data/flowOptimizer.d.ts.map +1 -0
- package/dist/src/data/flowOptimizer.js +133 -0
- package/dist/src/data/flowOptimizer.test.js +193 -0
- package/dist/src/data/flowTestUtils.d.ts +30 -0
- package/dist/src/data/flowTestUtils.d.ts.map +1 -0
- package/dist/src/data/flowTestUtils.js +63 -0
- package/dist/src/data/formats/fasta.d.ts +20 -0
- package/dist/src/data/formats/fasta.d.ts.map +1 -0
- package/dist/src/data/formats/fasta.js +32 -0
- package/dist/src/data/formats/fasta.test.js +27 -0
- package/dist/src/data/sources/dataSource.d.ts +12 -0
- package/dist/src/data/sources/dataSource.d.ts.map +1 -0
- package/dist/src/data/sources/dataSource.js +25 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts +16 -0
- package/dist/src/data/sources/dataSourceFactory.d.ts.map +1 -0
- package/dist/src/data/sources/dataSourceFactory.js +127 -0
- package/dist/src/data/sources/dataUtils.d.ts +50 -0
- package/dist/src/data/sources/dataUtils.d.ts.map +1 -0
- package/dist/src/data/sources/dataUtils.js +83 -0
- package/dist/src/data/sources/dynamic/README.md +3 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts +13 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/axisGenomeSource.js +19 -0
- package/dist/src/data/sources/dynamic/axisTickSource.d.ts +18 -0
- package/dist/src/data/sources/dynamic/axisTickSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/axisTickSource.js +73 -0
- package/dist/src/data/sources/dynamic/bamSource.d.ts +46 -0
- package/dist/src/data/sources/dynamic/bamSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bamSource.js +115 -0
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts +51 -0
- package/dist/src/data/sources/dynamic/bigBedSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bigBedSource.js +128 -0
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts +58 -0
- package/dist/src/data/sources/dynamic/bigWigSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/bigWigSource.js +166 -0
- package/dist/src/data/sources/dynamic/gff3Source.d.ts +8 -0
- package/dist/src/data/sources/dynamic/gff3Source.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/gff3Source.js +19 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts +30 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/indexedFastaSource.js +86 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts +42 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/singleAxisLazySource.js +129 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts +54 -0
- package/dist/src/data/sources/dynamic/tabixSource.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/tabixSource.js +140 -0
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts +32 -0
- package/dist/src/data/sources/dynamic/windowedMixin.d.ts.map +1 -0
- package/dist/src/data/sources/dynamic/windowedMixin.js +53 -0
- package/dist/src/data/sources/inlineSource.d.ts +16 -0
- package/dist/src/data/sources/inlineSource.d.ts.map +1 -0
- package/dist/src/data/sources/inlineSource.js +68 -0
- package/dist/src/data/sources/inlineSource.test.js +56 -0
- package/dist/src/data/sources/namedSource.d.ts +25 -0
- package/dist/src/data/sources/namedSource.d.ts.map +1 -0
- package/dist/src/data/sources/namedSource.js +80 -0
- package/dist/src/data/sources/sequenceSource.d.ts +17 -0
- package/dist/src/data/sources/sequenceSource.d.ts.map +1 -0
- package/dist/src/data/sources/sequenceSource.js +47 -0
- package/dist/src/data/sources/sequenceSource.test.js +46 -0
- package/dist/src/data/sources/urlSource.d.ts +16 -0
- package/dist/src/data/sources/urlSource.d.ts.map +1 -0
- package/dist/src/data/sources/urlSource.js +74 -0
- package/dist/src/data/transforms/aggregate.d.ts +18 -0
- package/dist/src/data/transforms/aggregate.d.ts.map +1 -0
- package/dist/src/data/transforms/aggregate.js +67 -0
- package/dist/src/data/transforms/clone.d.ts +15 -0
- package/dist/src/data/transforms/clone.d.ts.map +1 -0
- package/dist/src/data/transforms/clone.js +40 -0
- package/dist/src/data/transforms/clone.test.js +11 -0
- package/dist/src/data/transforms/coverage.d.ts +30 -0
- package/dist/src/data/transforms/coverage.d.ts.map +1 -0
- package/dist/src/data/transforms/coverage.js +183 -0
- package/dist/src/data/transforms/coverage.test.js +123 -0
- package/dist/src/data/transforms/filter.d.ts +12 -0
- package/dist/src/data/transforms/filter.d.ts.map +1 -0
- package/dist/src/data/transforms/filter.js +33 -0
- package/dist/src/data/transforms/filter.test.js +18 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts +29 -0
- package/dist/src/data/transforms/filterScoredLabels.d.ts.map +1 -0
- package/dist/src/data/transforms/filterScoredLabels.js +134 -0
- package/dist/src/data/transforms/flatten.d.ts +10 -0
- package/dist/src/data/transforms/flatten.d.ts.map +1 -0
- package/dist/src/data/transforms/flatten.js +68 -0
- package/dist/src/data/transforms/flatten.test.js +93 -0
- package/dist/src/data/transforms/flattenCompressedExons.d.ts +19 -0
- package/dist/src/data/transforms/flattenCompressedExons.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenCompressedExons.js +53 -0
- package/dist/src/data/transforms/flattenDelimited.d.ts +10 -0
- package/dist/src/data/transforms/flattenDelimited.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenDelimited.js +66 -0
- package/dist/src/data/transforms/flattenDelimited.test.js +87 -0
- package/dist/src/data/transforms/flattenSequence.d.ts +11 -0
- package/dist/src/data/transforms/flattenSequence.d.ts.map +1 -0
- package/dist/src/data/transforms/flattenSequence.js +35 -0
- package/dist/src/data/transforms/flattenSequence.test.js +34 -0
- package/dist/src/data/transforms/formula.d.ts +13 -0
- package/dist/src/data/transforms/formula.d.ts.map +1 -0
- package/dist/src/data/transforms/formula.js +35 -0
- package/dist/src/data/transforms/formula.test.js +19 -0
- package/dist/src/data/transforms/identifier.d.ts +40 -0
- package/dist/src/data/transforms/identifier.d.ts.map +1 -0
- package/dist/src/data/transforms/identifier.js +106 -0
- package/dist/src/data/transforms/identifier.test.js +83 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts +10 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.d.ts.map +1 -0
- package/dist/src/data/transforms/linearizeGenomicCoordinate.js +97 -0
- package/dist/src/data/transforms/measureText.d.ts +18 -0
- package/dist/src/data/transforms/measureText.d.ts.map +1 -0
- package/dist/src/data/transforms/measureText.js +42 -0
- package/dist/src/data/transforms/pileup.d.ts +10 -0
- package/dist/src/data/transforms/pileup.d.ts.map +1 -0
- package/dist/src/data/transforms/pileup.js +126 -0
- package/dist/src/data/transforms/pileup.test.js +70 -0
- package/dist/src/data/transforms/project.d.ts +13 -0
- package/dist/src/data/transforms/project.d.ts.map +1 -0
- package/dist/src/data/transforms/project.js +38 -0
- package/dist/src/data/transforms/project.test.js +32 -0
- package/dist/src/data/transforms/regexExtract.d.ts +13 -0
- package/dist/src/data/transforms/regexExtract.d.ts.map +1 -0
- package/dist/src/data/transforms/regexExtract.js +57 -0
- package/dist/src/data/transforms/regexExtract.test.js +67 -0
- package/dist/src/data/transforms/regexFold.d.ts +14 -0
- package/dist/src/data/transforms/regexFold.d.ts.map +1 -0
- package/dist/src/data/transforms/regexFold.js +139 -0
- package/dist/src/data/transforms/regexFold.test.js +160 -0
- package/dist/src/data/transforms/sample.d.ts +42 -0
- package/dist/src/data/transforms/sample.d.ts.map +1 -0
- package/dist/src/data/transforms/sample.js +99 -0
- package/dist/src/data/transforms/sample.test.js +38 -0
- package/dist/src/data/transforms/stack.d.ts +11 -0
- package/dist/src/data/transforms/stack.d.ts.map +1 -0
- package/dist/src/data/transforms/stack.js +134 -0
- package/dist/src/data/transforms/stack.test.js +91 -0
- package/dist/src/data/transforms/transformFactory.d.ts +12 -0
- package/dist/src/data/transforms/transformFactory.d.ts.map +1 -0
- package/dist/src/data/transforms/transformFactory.js +59 -0
- package/dist/src/encoder/accessor.d.ts +15 -0
- package/dist/src/encoder/accessor.d.ts.map +1 -0
- package/dist/src/encoder/accessor.js +76 -0
- package/dist/src/encoder/accessor.test.js +47 -0
- package/dist/src/encoder/encoder.d.ts +144 -0
- package/dist/src/encoder/encoder.d.ts.map +1 -0
- package/dist/src/encoder/encoder.js +400 -0
- package/dist/src/encoder/encoder.test.js +98 -0
- package/dist/src/fonts/Lato-Regular.json +1267 -0
- package/dist/src/fonts/Lato-Regular.png +0 -0
- package/dist/src/fonts/OFL.txt +93 -0
- package/dist/src/fonts/README.md +3 -0
- package/dist/src/fonts/bmFontManager.d.ts +182 -0
- package/dist/src/fonts/bmFontManager.d.ts.map +1 -0
- package/dist/src/fonts/bmFontManager.js +359 -0
- package/dist/src/fonts/bmFontMetrics.d.ts +45 -0
- package/dist/src/fonts/bmFontMetrics.d.ts.map +1 -0
- package/dist/src/fonts/bmFontMetrics.js +108 -0
- package/dist/src/genome/genome.d.ts +172 -0
- package/dist/src/genome/genome.d.ts.map +1 -0
- package/dist/src/genome/genome.js +379 -0
- package/dist/src/genome/genome.test.js +226 -0
- package/dist/src/genome/genomeStore.d.ts +20 -0
- package/dist/src/genome/genomeStore.d.ts.map +1 -0
- package/dist/src/genome/genomeStore.js +54 -0
- package/dist/src/genome/locusFormat.d.ts +14 -0
- package/dist/src/genome/locusFormat.d.ts.map +1 -0
- package/dist/src/genome/locusFormat.js +37 -0
- package/dist/src/genome/scaleIndex.d.ts +6 -0
- package/dist/src/genome/scaleIndex.d.ts.map +1 -0
- package/dist/src/genome/scaleIndex.js +165 -0
- package/dist/src/genome/scaleIndex.test.js +78 -0
- package/dist/src/genome/scaleLocus.d.ts +3 -0
- package/dist/src/genome/scaleLocus.d.ts.map +1 -0
- package/dist/src/genome/scaleLocus.js +101 -0
- package/dist/src/genome/scaleLocus.test.js +4 -0
- package/dist/src/genomeSpy.d.ts +141 -0
- package/dist/src/genomeSpy.d.ts.map +1 -0
- package/dist/src/genomeSpy.js +788 -0
- package/dist/src/gl/arrayBuilder.d.ts +71 -0
- package/dist/src/gl/arrayBuilder.d.ts.map +1 -0
- package/dist/src/gl/arrayBuilder.js +199 -0
- package/dist/src/gl/dataToVertices.d.ts +194 -0
- package/dist/src/gl/dataToVertices.d.ts.map +1 -0
- package/dist/src/gl/dataToVertices.js +639 -0
- package/dist/src/gl/includes/common.glsl.js +2 -0
- package/dist/src/gl/includes/picking.fragment.glsl.js +2 -0
- package/dist/src/gl/includes/picking.vertex.glsl.js +2 -0
- package/dist/src/gl/includes/sampleFacet.glsl.js +2 -0
- package/dist/src/gl/includes/scales.glsl.js +2 -0
- package/dist/src/gl/link.fragment.glsl.js +2 -0
- package/dist/src/gl/link.vertex.glsl.js +2 -0
- package/dist/src/gl/point.fragment.glsl.js +2 -0
- package/dist/src/gl/point.vertex.glsl.js +2 -0
- package/dist/src/gl/rect.fragment.glsl.js +2 -0
- package/dist/src/gl/rect.vertex.glsl.js +2 -0
- package/dist/src/gl/rule.fragment.glsl.js +2 -0
- package/dist/src/gl/rule.vertex.glsl.js +2 -0
- package/dist/src/gl/text.fragment.glsl.js +2 -0
- package/dist/src/gl/text.vertex.glsl.js +2 -0
- package/dist/src/gl/webGLHelper.d.ts +118 -0
- package/dist/src/gl/webGLHelper.d.ts.map +1 -0
- package/dist/src/gl/webGLHelper.js +513 -0
- package/dist/src/img/bowtie.svg +1 -0
- package/dist/src/img/genomespy-favicon.svg +34 -0
- package/dist/src/index.d.ts +15 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.html +11 -0
- package/dist/src/index.js +129 -0
- package/dist/src/marks/link.d.ts +11 -0
- package/dist/src/marks/link.d.ts.map +1 -0
- package/dist/src/marks/link.js +175 -0
- package/dist/src/marks/mark.d.ts +226 -0
- package/dist/src/marks/mark.d.ts.map +1 -0
- package/dist/src/marks/mark.js +1004 -0
- package/dist/src/marks/markUtils.d.ts +23 -0
- package/dist/src/marks/markUtils.d.ts.map +1 -0
- package/dist/src/marks/markUtils.js +125 -0
- package/dist/src/marks/pointMark.d.ts +11 -0
- package/dist/src/marks/pointMark.d.ts.map +1 -0
- package/dist/src/marks/pointMark.js +251 -0
- package/dist/src/marks/rectMark.d.ts +18 -0
- package/dist/src/marks/rectMark.d.ts.map +1 -0
- package/dist/src/marks/rectMark.js +255 -0
- package/dist/src/marks/rule.d.ts +6 -0
- package/dist/src/marks/rule.d.ts.map +1 -0
- package/dist/src/marks/rule.js +250 -0
- package/dist/src/marks/text.d.ts +13 -0
- package/dist/src/marks/text.d.ts.map +1 -0
- package/dist/src/marks/text.js +279 -0
- package/dist/src/scale/colorUtils.d.ts +34 -0
- package/dist/src/scale/colorUtils.d.ts.map +1 -0
- package/dist/src/scale/colorUtils.js +184 -0
- package/dist/src/scale/glslScaleGenerator.d.ts +45 -0
- package/dist/src/scale/glslScaleGenerator.d.ts.map +1 -0
- package/dist/src/scale/glslScaleGenerator.js +506 -0
- package/dist/src/scale/scale.d.ts +10 -0
- package/dist/src/scale/scale.d.ts.map +1 -0
- package/dist/src/scale/scale.js +456 -0
- package/dist/src/scale/scale.test.js +324 -0
- package/dist/src/scale/ticks.d.ts +47 -0
- package/dist/src/scale/ticks.d.ts.map +1 -0
- package/dist/src/scale/ticks.js +203 -0
- package/dist/src/scale/ticks.test.js +40 -0
- package/dist/src/singlePageApp.d.ts +2 -0
- package/dist/src/singlePageApp.d.ts.map +1 -0
- package/dist/src/singlePageApp.js +13 -0
- package/dist/src/spec/axis.d.ts +402 -0
- package/dist/src/spec/channel.d.ts +440 -0
- package/dist/src/spec/data.d.ts +370 -0
- package/dist/src/spec/font.d.ts +15 -0
- package/dist/src/spec/genome.d.ts +35 -0
- package/dist/src/spec/mark.d.ts +435 -0
- package/dist/src/spec/root.d.ts +22 -0
- package/dist/src/spec/sampleView.d.ts +185 -0
- package/dist/src/spec/scale.d.ts +273 -0
- package/dist/src/spec/title.d.ts +102 -0
- package/dist/src/spec/tooltip.d.ts +9 -0
- package/dist/src/spec/transform.d.ts +504 -0
- package/dist/src/spec/view.d.ts +214 -0
- package/dist/src/styles/genome-spy.css.d.ts +3 -0
- package/dist/src/styles/genome-spy.css.d.ts.map +1 -0
- package/dist/src/styles/genome-spy.css.js +114 -0
- package/dist/src/styles/genome-spy.scss +153 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts +2 -0
- package/dist/src/tooltip/dataTooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/dataTooltipHandler.js +64 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts +2 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/refseqGeneTooltipHandler.js +78 -0
- package/dist/src/tooltip/tooltipHandler.d.ts +9 -0
- package/dist/src/tooltip/tooltipHandler.d.ts.map +1 -0
- package/dist/src/tooltip/tooltipHandler.ts +12 -0
- package/dist/src/types/bmFont.d.ts +58 -0
- package/dist/src/types/embedApi.d.ts +67 -0
- package/dist/src/types/encoder.d.ts +84 -0
- package/dist/src/types/flowBatch.d.ts +40 -0
- package/dist/src/types/rendering.d.ts +65 -0
- package/dist/src/types/scaleResolutionApi.d.ts +40 -0
- package/dist/src/types/viewContext.d.ts +85 -0
- package/dist/src/utils/addBaseUrl.d.ts +6 -0
- package/dist/src/utils/addBaseUrl.d.ts.map +1 -0
- package/dist/src/utils/addBaseUrl.js +19 -0
- package/dist/src/utils/addBaseUrl.test.js +22 -0
- package/dist/src/utils/animator.d.ts +41 -0
- package/dist/src/utils/animator.d.ts.map +1 -0
- package/dist/src/utils/animator.js +83 -0
- package/dist/src/utils/arrayUtils.d.ts +34 -0
- package/dist/src/utils/arrayUtils.d.ts.map +1 -0
- package/dist/src/utils/arrayUtils.js +61 -0
- package/dist/src/utils/binnedIndex.d.ts +23 -0
- package/dist/src/utils/binnedIndex.d.ts.map +1 -0
- package/dist/src/utils/binnedIndex.js +167 -0
- package/dist/src/utils/binnedIndex.test.js +155 -0
- package/dist/src/utils/clamp.d.ts +7 -0
- package/dist/src/utils/clamp.d.ts.map +1 -0
- package/dist/src/utils/clamp.js +8 -0
- package/dist/src/utils/cloner.d.ts +16 -0
- package/dist/src/utils/cloner.d.ts.map +1 -0
- package/dist/src/utils/cloner.js +34 -0
- package/dist/src/utils/cloner.test.js +24 -0
- package/dist/src/utils/coalesce.d.ts +6 -0
- package/dist/src/utils/coalesce.d.ts.map +1 -0
- package/dist/src/utils/coalesce.js +11 -0
- package/dist/src/utils/coalesce.test.js +16 -0
- package/dist/src/utils/concatIterables.d.ts +8 -0
- package/dist/src/utils/concatIterables.d.ts.map +1 -0
- package/dist/src/utils/concatIterables.js +26 -0
- package/dist/src/utils/concatIterables.test.js +8 -0
- package/dist/src/utils/debounce.d.ts +8 -0
- package/dist/src/utils/debounce.d.ts.map +1 -0
- package/dist/src/utils/debounce.js +37 -0
- package/dist/src/utils/domainArray.d.ts +61 -0
- package/dist/src/utils/domainArray.d.ts.map +1 -0
- package/dist/src/utils/domainArray.js +216 -0
- package/dist/src/utils/domainArray.test.js +130 -0
- package/dist/src/utils/eerp.d.ts +12 -0
- package/dist/src/utils/eerp.d.ts.map +1 -0
- package/dist/src/utils/eerp.js +13 -0
- package/dist/src/utils/expression.d.ts +9 -0
- package/dist/src/utils/expression.d.ts.map +1 -0
- package/dist/src/utils/expression.js +32 -0
- package/dist/src/utils/field.d.ts +17 -0
- package/dist/src/utils/field.d.ts.map +1 -0
- package/dist/src/utils/field.js +28 -0
- package/dist/src/utils/formatObject.d.ts +7 -0
- package/dist/src/utils/formatObject.d.ts.map +1 -0
- package/dist/src/utils/formatObject.js +37 -0
- package/dist/src/utils/indexer.d.ts +16 -0
- package/dist/src/utils/indexer.d.ts.map +1 -0
- package/dist/src/utils/indexer.js +43 -0
- package/dist/src/utils/indexer.test.js +47 -0
- package/dist/src/utils/inertia.d.ts +42 -0
- package/dist/src/utils/inertia.d.ts.map +1 -0
- package/dist/src/utils/inertia.js +124 -0
- package/dist/src/utils/interactionEvent.d.ts +26 -0
- package/dist/src/utils/interactionEvent.d.ts.map +1 -0
- package/dist/src/utils/interactionEvent.js +33 -0
- package/dist/src/utils/iterateNestedMaps.d.ts +11 -0
- package/dist/src/utils/iterateNestedMaps.d.ts.map +1 -0
- package/dist/src/utils/iterateNestedMaps.js +21 -0
- package/dist/src/utils/iterateNestedMaps.test.js +33 -0
- package/dist/src/utils/kWayMerge.d.ts +9 -0
- package/dist/src/utils/kWayMerge.d.ts.map +1 -0
- package/dist/src/utils/kWayMerge.js +42 -0
- package/dist/src/utils/kWayMerge.test.js +26 -0
- package/dist/src/utils/layout/flexLayout.d.ts +182 -0
- package/dist/src/utils/layout/flexLayout.d.ts.map +1 -0
- package/dist/src/utils/layout/flexLayout.js +381 -0
- package/dist/src/utils/layout/flexLayout.test.js +323 -0
- package/dist/src/utils/layout/grid.d.ts +29 -0
- package/dist/src/utils/layout/grid.d.ts.map +1 -0
- package/dist/src/utils/layout/grid.js +95 -0
- package/dist/src/utils/layout/grid.test.js +71 -0
- package/dist/src/utils/layout/padding.d.ts +83 -0
- package/dist/src/utils/layout/padding.d.ts.map +1 -0
- package/dist/src/utils/layout/padding.js +155 -0
- package/dist/src/utils/layout/point.d.ts +16 -0
- package/dist/src/utils/layout/point.d.ts.map +1 -0
- package/dist/src/utils/layout/point.js +23 -0
- package/dist/src/utils/layout/rectangle.d.ts +142 -0
- package/dist/src/utils/layout/rectangle.d.ts.map +1 -0
- package/dist/src/utils/layout/rectangle.js +296 -0
- package/dist/src/utils/layout/rectangle.test.js +172 -0
- package/dist/src/utils/mergeObjects.d.ts +15 -0
- package/dist/src/utils/mergeObjects.d.ts.map +1 -0
- package/dist/src/utils/mergeObjects.js +99 -0
- package/dist/src/utils/mergeObjects.test.js +42 -0
- package/dist/src/utils/numberExtractor.d.ts +9 -0
- package/dist/src/utils/numberExtractor.d.ts.map +1 -0
- package/dist/src/utils/numberExtractor.js +24 -0
- package/dist/src/utils/numberExtractor.test.js +6 -0
- package/dist/src/utils/point.d.ts +9 -0
- package/dist/src/utils/point.d.ts.map +1 -0
- package/dist/src/utils/point.js +14 -0
- package/dist/src/utils/propertyCacher.d.ts +30 -0
- package/dist/src/utils/propertyCacher.d.ts.map +1 -0
- package/dist/src/utils/propertyCacher.js +70 -0
- package/dist/src/utils/propertyCacher.test.js +85 -0
- package/dist/src/utils/propertyCoalescer.d.ts +15 -0
- package/dist/src/utils/propertyCoalescer.d.ts.map +1 -0
- package/dist/src/utils/propertyCoalescer.js +42 -0
- package/dist/src/utils/propertyCoalescer.test.js +22 -0
- package/dist/src/utils/reservationMap.d.ts +42 -0
- package/dist/src/utils/reservationMap.d.ts.map +1 -0
- package/dist/src/utils/reservationMap.js +103 -0
- package/dist/src/utils/reservationMap.test.js +20 -0
- package/dist/src/utils/scaleNull.d.ts +13 -0
- package/dist/src/utils/scaleNull.d.ts.map +1 -0
- package/dist/src/utils/scaleNull.js +21 -0
- package/dist/src/utils/setOperations.d.ts +31 -0
- package/dist/src/utils/setOperations.d.ts.map +1 -0
- package/dist/src/utils/setOperations.js +75 -0
- package/dist/src/utils/smoothstep.d.ts +7 -0
- package/dist/src/utils/smoothstep.d.ts.map +1 -0
- package/dist/src/utils/smoothstep.js +10 -0
- package/dist/src/utils/throttle.d.ts +8 -0
- package/dist/src/utils/throttle.d.ts.map +1 -0
- package/dist/src/utils/throttle.js +34 -0
- package/dist/src/utils/topK.d.ts +22 -0
- package/dist/src/utils/topK.d.ts.map +1 -0
- package/dist/src/utils/topK.js +76 -0
- package/dist/src/utils/topK.test.js +64 -0
- package/dist/src/utils/transition.d.ts +44 -0
- package/dist/src/utils/transition.d.ts.map +1 -0
- package/dist/src/utils/transition.js +74 -0
- package/dist/src/utils/trees.d.ts +56 -0
- package/dist/src/utils/trees.d.ts.map +1 -0
- package/dist/src/utils/trees.js +92 -0
- package/dist/src/utils/trees.test.js +130 -0
- package/dist/src/utils/ui/tooltip.d.ts +50 -0
- package/dist/src/utils/ui/tooltip.d.ts.map +1 -0
- package/dist/src/utils/ui/tooltip.js +189 -0
- package/dist/src/utils/url.d.ts +9 -0
- package/dist/src/utils/url.d.ts.map +1 -0
- package/dist/src/utils/url.js +22 -0
- package/dist/src/utils/variableTools.d.ts +14 -0
- package/dist/src/utils/variableTools.d.ts.map +1 -0
- package/dist/src/utils/variableTools.js +24 -0
- package/dist/src/utils/variableTools.test.js +13 -0
- package/dist/src/view/axisGridView.d.ts +39 -0
- package/dist/src/view/axisGridView.d.ts.map +1 -0
- package/dist/src/view/axisGridView.js +246 -0
- package/dist/src/view/axisResolution.d.ts +24 -0
- package/dist/src/view/axisResolution.d.ts.map +1 -0
- package/dist/src/view/axisResolution.js +141 -0
- package/dist/src/view/axisResolution.test.js +201 -0
- package/dist/src/view/axisView.d.ts +49 -0
- package/dist/src/view/axisView.d.ts.map +1 -0
- package/dist/src/view/axisView.js +629 -0
- package/dist/src/view/concatView.d.ts +16 -0
- package/dist/src/view/concatView.d.ts.map +1 -0
- package/dist/src/view/concatView.js +84 -0
- package/dist/src/view/containerView.d.ts +43 -0
- package/dist/src/view/containerView.d.ts.map +1 -0
- package/dist/src/view/containerView.js +137 -0
- package/dist/src/view/facetView.d.ts +71 -0
- package/dist/src/view/facetView.d.ts.map +1 -0
- package/dist/src/view/facetView.js +492 -0
- package/dist/src/view/flowBuilder.d.ts +37 -0
- package/dist/src/view/flowBuilder.d.ts.map +1 -0
- package/dist/src/view/flowBuilder.js +383 -0
- package/dist/src/view/flowBuilder.test.js +125 -0
- package/dist/src/view/gridView.d.ts +111 -0
- package/dist/src/view/gridView.d.ts.map +1 -0
- package/dist/src/view/gridView.js +1086 -0
- package/dist/src/view/implicitRootView.d.ts +9 -0
- package/dist/src/view/implicitRootView.d.ts.map +1 -0
- package/dist/src/view/implicitRootView.js +23 -0
- package/dist/src/view/importView.d.ts +17 -0
- package/dist/src/view/importView.d.ts.map +1 -0
- package/dist/src/view/importView.js +22 -0
- package/dist/src/view/layerView.d.ts +25 -0
- package/dist/src/view/layerView.d.ts.map +1 -0
- package/dist/src/view/layerView.js +77 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts +30 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/bufferedViewRenderingContext.js +175 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts +14 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/compositeViewRenderingContext.js +51 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts +51 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/debuggingViewRenderingContext.js +94 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts +60 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/layoutRecorderViewRenderingContext.js +128 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts +19 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/simpleViewRenderingContext.js +64 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts +22 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/svgViewRenderingContext.js +125 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts +33 -0
- package/dist/src/view/renderingContext/viewRenderingContext.d.ts.map +1 -0
- package/dist/src/view/renderingContext/viewRenderingContext.js +41 -0
- package/dist/src/view/scaleResolution.d.ts +170 -0
- package/dist/src/view/scaleResolution.d.ts.map +1 -0
- package/dist/src/view/scaleResolution.js +874 -0
- package/dist/src/view/scaleResolution.test.js +658 -0
- package/dist/src/view/testUtils.d.ts +30 -0
- package/dist/src/view/testUtils.d.ts.map +1 -0
- package/dist/src/view/testUtils.js +101 -0
- package/dist/src/view/title.d.ts +6 -0
- package/dist/src/view/title.d.ts.map +1 -0
- package/dist/src/view/title.js +165 -0
- package/dist/src/view/unitView.d.ts +93 -0
- package/dist/src/view/unitView.d.ts.map +1 -0
- package/dist/src/view/unitView.js +345 -0
- package/dist/src/view/view.d.ts +291 -0
- package/dist/src/view/view.d.ts.map +1 -0
- package/dist/src/view/view.js +691 -0
- package/dist/src/view/view.test.js +214 -0
- package/dist/src/view/viewFactory.d.ts +76 -0
- package/dist/src/view/viewFactory.d.ts.map +1 -0
- package/dist/src/view/viewFactory.js +178 -0
- package/dist/src/view/viewFactory.test.js +17 -0
- package/dist/src/view/viewUtils.d.ts +90 -0
- package/dist/src/view/viewUtils.d.ts.map +1 -0
- package/dist/src/view/viewUtils.js +326 -0
- package/dist/src/view/zoom.d.ts +23 -0
- package/dist/src/view/zoom.d.ts.map +1 -0
- package/dist/src/view/zoom.js +89 -0
- package/package.json +17 -12
- package/dist/style.css +0 -1
|
@@ -0,0 +1,639 @@
|
|
|
1
|
+
import { InternMap } from "internmap";
|
|
2
|
+
import { format } from "d3-format";
|
|
3
|
+
import { isString } from "vega-util";
|
|
4
|
+
import ArrayBuilder from "./arrayBuilder";
|
|
5
|
+
import { SDF_PADDING } from "../fonts/bmFontMetrics";
|
|
6
|
+
import { createBinningRangeIndexer } from "../utils/binnedIndex";
|
|
7
|
+
import { isValueDef } from "../encoder/encoder";
|
|
8
|
+
import {
|
|
9
|
+
isHighPrecisionScale,
|
|
10
|
+
splitHighPrecision,
|
|
11
|
+
} from "../scale/glslScaleGenerator";
|
|
12
|
+
import { isContinuous } from "vega-scale";
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* @typedef {object} RangeEntry Represents a location of a vertex subset
|
|
16
|
+
* @prop {number} offset in vertices
|
|
17
|
+
* @prop {number} count in vertices
|
|
18
|
+
* @prop {import("../utils/binnedIndex").Lookup} xIndex
|
|
19
|
+
*/
|
|
20
|
+
export class GeometryBuilder {
|
|
21
|
+
/**
|
|
22
|
+
* @typedef {import("./arrayBuilder").ConverterMetadata} Converter
|
|
23
|
+
* @typedef {import("../types/encoder").Encoder} Encoder
|
|
24
|
+
*/
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* @param {object} object
|
|
28
|
+
* @param {Record<string, Encoder>} object.encoders
|
|
29
|
+
* @param {string[]} [object.attributes]
|
|
30
|
+
* @param {number} [object.numVertices] If the number of data items is known, a
|
|
31
|
+
* preallocated TypedArray is used
|
|
32
|
+
*/
|
|
33
|
+
constructor({ encoders, numVertices = undefined, attributes = [] }) {
|
|
34
|
+
this.encoders = encoders;
|
|
35
|
+
|
|
36
|
+
// Encoders for variable channels
|
|
37
|
+
this.variableEncoders = Object.fromEntries(
|
|
38
|
+
Object.entries(encoders).filter(
|
|
39
|
+
([channel, e]) =>
|
|
40
|
+
attributes.includes(channel) && e && e.scale && !e.constant
|
|
41
|
+
)
|
|
42
|
+
);
|
|
43
|
+
|
|
44
|
+
this.allocatedVertices = numVertices;
|
|
45
|
+
|
|
46
|
+
this.variableBuilder = new ArrayBuilder(numVertices);
|
|
47
|
+
|
|
48
|
+
// Create converters and updaters for all variable channels.
|
|
49
|
+
// TODO: If more than one channels use the same field with the same data type, convert the field only once.
|
|
50
|
+
|
|
51
|
+
for (const [channel, ce] of Object.entries(this.variableEncoders)) {
|
|
52
|
+
const accessor = ce.accessor;
|
|
53
|
+
|
|
54
|
+
const doubleArray = [0, 0];
|
|
55
|
+
const hp = isHighPrecisionScale(ce.scale.type);
|
|
56
|
+
|
|
57
|
+
const indexer = ce.indexer;
|
|
58
|
+
|
|
59
|
+
/**
|
|
60
|
+
* Discrete variables both numeric and strings must be "indexed",
|
|
61
|
+
* 64 bit floats must be converted to vec2.
|
|
62
|
+
* 32 bit continuous variables go to GPU as is.
|
|
63
|
+
*
|
|
64
|
+
* @type {function(any):(number | number[])}
|
|
65
|
+
*/
|
|
66
|
+
const f = indexer
|
|
67
|
+
? (d) => indexer(accessor(d))
|
|
68
|
+
: hp
|
|
69
|
+
? (d) => splitHighPrecision(accessor(d), doubleArray)
|
|
70
|
+
: accessor;
|
|
71
|
+
|
|
72
|
+
this.variableBuilder.addConverter(channel, {
|
|
73
|
+
f,
|
|
74
|
+
numComponents: hp ? 2 : 1,
|
|
75
|
+
arrayReference: hp ? doubleArray : undefined,
|
|
76
|
+
});
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
this.lastOffset = 0;
|
|
80
|
+
|
|
81
|
+
/** @type {Map<any, RangeEntry>} keep track of facet locations within the vertex array */
|
|
82
|
+
this.rangeMap = new InternMap([], JSON.stringify);
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/**
|
|
86
|
+
* Must be called at the end of `addBatch`
|
|
87
|
+
*
|
|
88
|
+
* @param {any} key
|
|
89
|
+
*/
|
|
90
|
+
registerBatch(key) {
|
|
91
|
+
const offset = this.lastOffset;
|
|
92
|
+
const index = this.variableBuilder.vertexCount;
|
|
93
|
+
const size = index - offset;
|
|
94
|
+
if (size) {
|
|
95
|
+
this.rangeMap.set(key, {
|
|
96
|
+
offset,
|
|
97
|
+
count: size,
|
|
98
|
+
xIndex: this.xIndexer?.getIndex(),
|
|
99
|
+
});
|
|
100
|
+
}
|
|
101
|
+
this.lastOffset = index;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
/**
|
|
105
|
+
* @param {Map<any, object[]>} batches
|
|
106
|
+
*/
|
|
107
|
+
addBatches(batches) {
|
|
108
|
+
for (const [key, data] of batches) {
|
|
109
|
+
this.addBatch(key, data);
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
|
|
113
|
+
/**
|
|
114
|
+
* @param {any} key The facet id, for example
|
|
115
|
+
* @param {object[]} data
|
|
116
|
+
*/
|
|
117
|
+
addBatch(key, data, lo = 0, hi = data.length) {
|
|
118
|
+
this.prepareXIndexer(data, lo, hi);
|
|
119
|
+
|
|
120
|
+
for (let i = lo; i < hi; i++) {
|
|
121
|
+
const d = data[i];
|
|
122
|
+
this.variableBuilder.pushFromDatum(d);
|
|
123
|
+
this.addToXIndex(d);
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
this.registerBatch(key);
|
|
127
|
+
}
|
|
128
|
+
|
|
129
|
+
/**
|
|
130
|
+
* @param {import("../data/flowNode").Data} data Domain, but specified using datums
|
|
131
|
+
* @param {number} [lo]
|
|
132
|
+
* @param {number} [hi]
|
|
133
|
+
*/
|
|
134
|
+
prepareXIndexer(data, lo = 0, hi = lo + data.length) {
|
|
135
|
+
const disable = () => {
|
|
136
|
+
/**
|
|
137
|
+
* @param {import("../data/flowNode").Datum} datum
|
|
138
|
+
*/
|
|
139
|
+
this.addToXIndex = (datum) => {
|
|
140
|
+
// nop
|
|
141
|
+
};
|
|
142
|
+
this.xIndexer = undefined;
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
if (!data.length || hi - lo < 0) {
|
|
146
|
+
disable();
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
/** @param {Encoder} encoder */
|
|
151
|
+
const getContinuousEncoder = (encoder) =>
|
|
152
|
+
encoder && isContinuous(encoder.scale?.type) && encoder;
|
|
153
|
+
|
|
154
|
+
const xe = getContinuousEncoder(this.variableEncoders.x);
|
|
155
|
+
const x2e = getContinuousEncoder(this.variableEncoders.x2);
|
|
156
|
+
|
|
157
|
+
if (xe) {
|
|
158
|
+
const xa = xe.accessor;
|
|
159
|
+
const x2a = x2e ? x2e.accessor : xa;
|
|
160
|
+
|
|
161
|
+
/** @type {[number, number]} */
|
|
162
|
+
const dataDomain = [xa(data[lo]), x2a(data[hi - 1])];
|
|
163
|
+
|
|
164
|
+
// No indexer for point domains that have zero extent
|
|
165
|
+
if (dataDomain[1] > dataDomain[0]) {
|
|
166
|
+
this.xIndexer = createBinningRangeIndexer(
|
|
167
|
+
50,
|
|
168
|
+
dataDomain,
|
|
169
|
+
xa,
|
|
170
|
+
x2a
|
|
171
|
+
);
|
|
172
|
+
|
|
173
|
+
let lastVertexCount = this.variableBuilder.vertexCount;
|
|
174
|
+
|
|
175
|
+
/**
|
|
176
|
+
* @param {any} datum
|
|
177
|
+
*/
|
|
178
|
+
this.addToXIndex = (datum) => {
|
|
179
|
+
let currentVertexCount = this.variableBuilder.vertexCount;
|
|
180
|
+
this.xIndexer(datum, lastVertexCount, currentVertexCount);
|
|
181
|
+
lastVertexCount = currentVertexCount;
|
|
182
|
+
};
|
|
183
|
+
} else {
|
|
184
|
+
disable();
|
|
185
|
+
}
|
|
186
|
+
} else {
|
|
187
|
+
disable();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
190
|
+
|
|
191
|
+
/**
|
|
192
|
+
* Add the datum to an index, which allows for efficient rendering of ranges
|
|
193
|
+
* on the x axis. Must be called after a datum has been pushed to the ArrayBuilder.
|
|
194
|
+
*
|
|
195
|
+
* @param {import("../data/flowNode").Datum} datum
|
|
196
|
+
*/
|
|
197
|
+
addToXIndex(datum) {
|
|
198
|
+
//
|
|
199
|
+
}
|
|
200
|
+
|
|
201
|
+
toArrays() {
|
|
202
|
+
return {
|
|
203
|
+
/** @type {Record<string, {data: number[] | Float32Array, numComponents: number, divisor?: number}>} */
|
|
204
|
+
arrays: this.variableBuilder.arrays,
|
|
205
|
+
/** Number of vertices used */
|
|
206
|
+
vertexCount: this.variableBuilder.vertexCount,
|
|
207
|
+
/** Number of vertices allocated in buffers */
|
|
208
|
+
allocatedVertices: this.allocatedVertices,
|
|
209
|
+
rangeMap: this.rangeMap,
|
|
210
|
+
};
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export class RectVertexBuilder extends GeometryBuilder {
|
|
215
|
+
/**
|
|
216
|
+
*
|
|
217
|
+
* @param {Object} object
|
|
218
|
+
* @param {Record<string, Encoder>} object.encoders
|
|
219
|
+
* @param {string[]} object.attributes
|
|
220
|
+
* @param {number} [object.tessellationThreshold]
|
|
221
|
+
* If the rect is wider than the threshold, tessellate it into pieces
|
|
222
|
+
* @param {number[]} [object.visibleRange]
|
|
223
|
+
* @param {number} [object.numItems] Number of data items
|
|
224
|
+
*/
|
|
225
|
+
constructor({
|
|
226
|
+
encoders,
|
|
227
|
+
attributes,
|
|
228
|
+
tessellationThreshold = Infinity,
|
|
229
|
+
visibleRange = [-Infinity, Infinity],
|
|
230
|
+
numItems,
|
|
231
|
+
}) {
|
|
232
|
+
super({
|
|
233
|
+
encoders,
|
|
234
|
+
attributes,
|
|
235
|
+
numVertices:
|
|
236
|
+
tessellationThreshold == Infinity ? numItems * 6 : undefined,
|
|
237
|
+
});
|
|
238
|
+
|
|
239
|
+
this.visibleRange = visibleRange;
|
|
240
|
+
|
|
241
|
+
this.tessellationThreshold = tessellationThreshold || Infinity;
|
|
242
|
+
|
|
243
|
+
this.updateFrac = this.variableBuilder.createUpdater("frac", 2);
|
|
244
|
+
}
|
|
245
|
+
|
|
246
|
+
/**
|
|
247
|
+
*
|
|
248
|
+
* @param {any} key
|
|
249
|
+
* @param {object[]} data
|
|
250
|
+
*/
|
|
251
|
+
addBatch(key, data, lo = 0, hi = data.length) {
|
|
252
|
+
if (hi <= lo) {
|
|
253
|
+
return;
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
const e =
|
|
257
|
+
/** @type {Object.<string, import("../types/encoder").NumberEncoder>} */ (
|
|
258
|
+
this.encoders
|
|
259
|
+
);
|
|
260
|
+
const [lower, upper] = this.visibleRange;
|
|
261
|
+
|
|
262
|
+
/**
|
|
263
|
+
* @param {import("../types/encoder").Encoder} encoder
|
|
264
|
+
*/
|
|
265
|
+
const a = (encoder) => encoder.accessor || ((x) => 0);
|
|
266
|
+
|
|
267
|
+
const xAccessor = a(e.x);
|
|
268
|
+
const x2Accessor = a(e.x2);
|
|
269
|
+
|
|
270
|
+
this.prepareXIndexer(data, lo, hi);
|
|
271
|
+
|
|
272
|
+
const frac = [0, 0];
|
|
273
|
+
this.updateFrac(frac);
|
|
274
|
+
|
|
275
|
+
for (let i = lo; i < hi; i++) {
|
|
276
|
+
const d = data[i];
|
|
277
|
+
|
|
278
|
+
let x = xAccessor(d),
|
|
279
|
+
x2 = x2Accessor(d);
|
|
280
|
+
|
|
281
|
+
if (x > x2) {
|
|
282
|
+
[x, x2] = [x2, x];
|
|
283
|
+
}
|
|
284
|
+
|
|
285
|
+
// Skip rects that fall outside the visible range. TODO: Optimize by using binary search / interval tree
|
|
286
|
+
if (x2 < lower || x > upper) {
|
|
287
|
+
continue;
|
|
288
|
+
}
|
|
289
|
+
|
|
290
|
+
// Truncate to prevent tessellation of parts that are outside the viewport
|
|
291
|
+
if (x < lower) x = lower;
|
|
292
|
+
if (x2 > upper) x2 = upper;
|
|
293
|
+
|
|
294
|
+
// Start a new segment.
|
|
295
|
+
this.variableBuilder.updateFromDatum(d);
|
|
296
|
+
|
|
297
|
+
frac[0] = 0;
|
|
298
|
+
frac[1] = 0;
|
|
299
|
+
|
|
300
|
+
// Tessellate segments
|
|
301
|
+
const tileCount = 1;
|
|
302
|
+
// width < Infinity
|
|
303
|
+
// ? Math.ceil(width / this.tessellationThreshold)
|
|
304
|
+
// : 1;
|
|
305
|
+
|
|
306
|
+
// Duplicate the first vertex to produce degenerate triangles
|
|
307
|
+
this.variableBuilder.pushAll();
|
|
308
|
+
|
|
309
|
+
for (let i = 0; i <= tileCount; i++) {
|
|
310
|
+
frac[0] = i / tileCount;
|
|
311
|
+
frac[1] = 0;
|
|
312
|
+
this.variableBuilder.pushAll();
|
|
313
|
+
frac[1] = 1;
|
|
314
|
+
this.variableBuilder.pushAll();
|
|
315
|
+
}
|
|
316
|
+
|
|
317
|
+
// Duplicate the last vertex to produce a degenerate triangle between the segments
|
|
318
|
+
this.variableBuilder.pushAll();
|
|
319
|
+
this.addToXIndex(d);
|
|
320
|
+
}
|
|
321
|
+
|
|
322
|
+
this.registerBatch(key);
|
|
323
|
+
}
|
|
324
|
+
}
|
|
325
|
+
|
|
326
|
+
export class RuleVertexBuilder extends GeometryBuilder {
|
|
327
|
+
/**
|
|
328
|
+
*
|
|
329
|
+
* @param {Object} object
|
|
330
|
+
* @param {Record<string, Encoder>} object.encoders
|
|
331
|
+
* @param {string[]} object.attributes
|
|
332
|
+
* @param {number} [object.tessellationThreshold]
|
|
333
|
+
* If the rule is wider than the threshold, tessellate it into pieces
|
|
334
|
+
* @param {number[]} [object.visibleRange]
|
|
335
|
+
* @param {number} [object.numItems] Number of data items
|
|
336
|
+
*/
|
|
337
|
+
constructor({
|
|
338
|
+
encoders,
|
|
339
|
+
attributes,
|
|
340
|
+
tessellationThreshold = Infinity,
|
|
341
|
+
visibleRange = [-Infinity, Infinity],
|
|
342
|
+
numItems,
|
|
343
|
+
}) {
|
|
344
|
+
super({
|
|
345
|
+
encoders,
|
|
346
|
+
attributes,
|
|
347
|
+
numVertices:
|
|
348
|
+
tessellationThreshold == Infinity ? numItems * 6 : undefined,
|
|
349
|
+
});
|
|
350
|
+
|
|
351
|
+
this.visibleRange = visibleRange;
|
|
352
|
+
|
|
353
|
+
this.tessellationThreshold = tessellationThreshold || Infinity;
|
|
354
|
+
|
|
355
|
+
this.updateSide = this.variableBuilder.createUpdater("side", 1);
|
|
356
|
+
this.updatePos = this.variableBuilder.createUpdater("pos", 1);
|
|
357
|
+
}
|
|
358
|
+
|
|
359
|
+
/* eslint-disable complexity */
|
|
360
|
+
/**
|
|
361
|
+
*
|
|
362
|
+
* @param {any} key
|
|
363
|
+
* @param {object[]} data
|
|
364
|
+
*/
|
|
365
|
+
addBatch(key, data, lo = 0, hi = data.length) {
|
|
366
|
+
//const [lower, upper] = this.visibleRange; // TODO
|
|
367
|
+
|
|
368
|
+
this.prepareXIndexer(data, lo, hi);
|
|
369
|
+
|
|
370
|
+
for (let i = lo; i < hi; i++) {
|
|
371
|
+
const d = data[i];
|
|
372
|
+
|
|
373
|
+
// Start a new rule. Duplicate the first vertex to produce degenerate triangles
|
|
374
|
+
this.variableBuilder.updateFromDatum(d);
|
|
375
|
+
this.updateSide(-0.5);
|
|
376
|
+
this.updatePos(0);
|
|
377
|
+
this.variableBuilder.pushAll();
|
|
378
|
+
|
|
379
|
+
// Tesselate segments
|
|
380
|
+
const tileCount = 1;
|
|
381
|
+
// width < Infinity
|
|
382
|
+
// ? Math.ceil(width / this.tessellationThreshold)
|
|
383
|
+
// : 1;
|
|
384
|
+
for (let i = 0; i <= tileCount; i++) {
|
|
385
|
+
this.updatePos(i / tileCount);
|
|
386
|
+
this.updateSide(-0.5);
|
|
387
|
+
this.variableBuilder.pushAll();
|
|
388
|
+
this.updateSide(0.5);
|
|
389
|
+
this.variableBuilder.pushAll();
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
// Duplicate the last vertex to produce a degenerate triangle between the rules
|
|
393
|
+
this.variableBuilder.pushAll();
|
|
394
|
+
this.addToXIndex(d);
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
this.registerBatch(key);
|
|
398
|
+
}
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
export class PointVertexBuilder extends GeometryBuilder {
|
|
402
|
+
/**
|
|
403
|
+
*
|
|
404
|
+
* @param {object} object
|
|
405
|
+
* @param {Record<string, Encoder>} object.encoders
|
|
406
|
+
* @param {string[]} object.attributes
|
|
407
|
+
* @param {number} [object.numItems] Number of points if known, uses TypedArray
|
|
408
|
+
*/
|
|
409
|
+
constructor({ encoders, attributes, numItems = undefined }) {
|
|
410
|
+
super({
|
|
411
|
+
encoders,
|
|
412
|
+
attributes,
|
|
413
|
+
numVertices: numItems,
|
|
414
|
+
});
|
|
415
|
+
}
|
|
416
|
+
}
|
|
417
|
+
|
|
418
|
+
export class ConnectionVertexBuilder extends GeometryBuilder {
|
|
419
|
+
/**
|
|
420
|
+
* @param {object} object
|
|
421
|
+
* @param {Record<string, Encoder>} object.encoders
|
|
422
|
+
* @param {string[]} object.attributes
|
|
423
|
+
* @param {number} [object.numItems ] Number of points if known, uses TypedArray
|
|
424
|
+
*/
|
|
425
|
+
constructor({ encoders, attributes, numItems = undefined }) {
|
|
426
|
+
super({
|
|
427
|
+
encoders,
|
|
428
|
+
attributes,
|
|
429
|
+
numVertices: numItems,
|
|
430
|
+
});
|
|
431
|
+
}
|
|
432
|
+
|
|
433
|
+
toArrays() {
|
|
434
|
+
const arrays = this.variableBuilder.arrays;
|
|
435
|
+
|
|
436
|
+
// Prepare for instanced rendering
|
|
437
|
+
for (let a of Object.values(arrays)) {
|
|
438
|
+
a.divisor = 1;
|
|
439
|
+
}
|
|
440
|
+
|
|
441
|
+
return super.toArrays();
|
|
442
|
+
}
|
|
443
|
+
}
|
|
444
|
+
|
|
445
|
+
export class TextVertexBuilder extends GeometryBuilder {
|
|
446
|
+
/**
|
|
447
|
+
*
|
|
448
|
+
* @param {object} object
|
|
449
|
+
* @param {Record<string, Encoder>} object.encoders
|
|
450
|
+
* @param {string[]} object.attributes
|
|
451
|
+
* @param {import("../fonts/bmFontMetrics").BMFontMetrics} object.fontMetrics
|
|
452
|
+
* @param {Record<string, any>} object.properties
|
|
453
|
+
* @param {number} [object.numCharacters] number of characters
|
|
454
|
+
* @param {boolean} [object.logoLetters]
|
|
455
|
+
*/
|
|
456
|
+
constructor({
|
|
457
|
+
encoders,
|
|
458
|
+
attributes,
|
|
459
|
+
fontMetrics,
|
|
460
|
+
properties,
|
|
461
|
+
numCharacters = undefined,
|
|
462
|
+
}) {
|
|
463
|
+
super({
|
|
464
|
+
encoders,
|
|
465
|
+
attributes,
|
|
466
|
+
numVertices: numCharacters * 6, // six vertices per quad (character)
|
|
467
|
+
});
|
|
468
|
+
|
|
469
|
+
this.metadata = fontMetrics;
|
|
470
|
+
this.metrics = fontMetrics;
|
|
471
|
+
|
|
472
|
+
this.properties = properties;
|
|
473
|
+
|
|
474
|
+
const e = encoders;
|
|
475
|
+
|
|
476
|
+
const channelDef =
|
|
477
|
+
/** @type {import("../spec/channel").TextDef<string>} */ (
|
|
478
|
+
e.text.channelDef
|
|
479
|
+
);
|
|
480
|
+
/** @type {(value: any) => string} */
|
|
481
|
+
this.numberFormat =
|
|
482
|
+
!isValueDef(channelDef) &&
|
|
483
|
+
"format" in channelDef &&
|
|
484
|
+
channelDef.format
|
|
485
|
+
? format(channelDef.format)
|
|
486
|
+
: (d) => d;
|
|
487
|
+
|
|
488
|
+
this.updateVertexCoord = this.variableBuilder.createUpdater(
|
|
489
|
+
"vertexCoord",
|
|
490
|
+
2
|
|
491
|
+
);
|
|
492
|
+
this.updateTextureCoord = this.variableBuilder.createUpdater(
|
|
493
|
+
"textureCoord",
|
|
494
|
+
2
|
|
495
|
+
);
|
|
496
|
+
|
|
497
|
+
this.updateWidth = this.variableBuilder.createUpdater("width", 1);
|
|
498
|
+
}
|
|
499
|
+
|
|
500
|
+
/**
|
|
501
|
+
*
|
|
502
|
+
* @param {any} key
|
|
503
|
+
* @param {object[]} data
|
|
504
|
+
*/
|
|
505
|
+
addBatch(key, data, lo = 0, hi = data.length) {
|
|
506
|
+
const align = this.properties.align || "left";
|
|
507
|
+
const logoLetters = this.properties.logoLetters ?? false;
|
|
508
|
+
|
|
509
|
+
const base = this.metadata.common.base;
|
|
510
|
+
const scale = this.metadata.common.scaleH; // Assume square textures
|
|
511
|
+
|
|
512
|
+
let baseline = -SDF_PADDING;
|
|
513
|
+
switch (this.properties.baseline) {
|
|
514
|
+
case "top":
|
|
515
|
+
baseline += this.metrics.capHeight;
|
|
516
|
+
break;
|
|
517
|
+
case "middle":
|
|
518
|
+
baseline += this.metrics.capHeight / 2;
|
|
519
|
+
break;
|
|
520
|
+
case "bottom":
|
|
521
|
+
baseline -= this.metrics.descent;
|
|
522
|
+
break;
|
|
523
|
+
default:
|
|
524
|
+
// alphabetic
|
|
525
|
+
}
|
|
526
|
+
|
|
527
|
+
const accessor = this.encoders.text.accessor || this.encoders.text; // accessor or constant value
|
|
528
|
+
|
|
529
|
+
const vertexCoord = [0, 0];
|
|
530
|
+
this.updateVertexCoord(vertexCoord);
|
|
531
|
+
const textureCoord = [0, 0];
|
|
532
|
+
this.updateTextureCoord(textureCoord);
|
|
533
|
+
|
|
534
|
+
this.prepareXIndexer(data, lo, hi);
|
|
535
|
+
|
|
536
|
+
for (let i = lo; i < hi; i++) {
|
|
537
|
+
const d = data[i];
|
|
538
|
+
|
|
539
|
+
const value = this.numberFormat(accessor(d));
|
|
540
|
+
const str = isString(value)
|
|
541
|
+
? value
|
|
542
|
+
: value === null
|
|
543
|
+
? ""
|
|
544
|
+
: "" + value;
|
|
545
|
+
if (str.length == 0) continue;
|
|
546
|
+
|
|
547
|
+
this.variableBuilder.updateFromDatum(d);
|
|
548
|
+
|
|
549
|
+
const textWidth = logoLetters
|
|
550
|
+
? str.length
|
|
551
|
+
: this.metrics.measureWidth(str);
|
|
552
|
+
|
|
553
|
+
this.updateWidth(textWidth); // TODO: Check if one letter space should be reduced
|
|
554
|
+
|
|
555
|
+
let x =
|
|
556
|
+
align == "right"
|
|
557
|
+
? -textWidth
|
|
558
|
+
: align == "center"
|
|
559
|
+
? -textWidth / 2
|
|
560
|
+
: 0;
|
|
561
|
+
|
|
562
|
+
if (!logoLetters) {
|
|
563
|
+
const firstChar = this.metrics.getCharByCode(str.charCodeAt(0));
|
|
564
|
+
x -= (firstChar.width - firstChar.xadvance) / base / 2; // TODO: Fix, this is a bit off..
|
|
565
|
+
}
|
|
566
|
+
|
|
567
|
+
let bottom = -0.5,
|
|
568
|
+
height = 1,
|
|
569
|
+
normalWidth = 1;
|
|
570
|
+
|
|
571
|
+
for (let i = 0; i < str.length; i++) {
|
|
572
|
+
const c = this.metrics.getCharByCode(str.charCodeAt(i));
|
|
573
|
+
|
|
574
|
+
const advance = logoLetters ? 1 : c.xadvance / base;
|
|
575
|
+
|
|
576
|
+
if (c.id == 32) {
|
|
577
|
+
x += advance;
|
|
578
|
+
continue;
|
|
579
|
+
}
|
|
580
|
+
|
|
581
|
+
if (!logoLetters) {
|
|
582
|
+
height = c.height / base;
|
|
583
|
+
bottom = -(c.height + c.yoffset + baseline) / base;
|
|
584
|
+
normalWidth = c.width / base;
|
|
585
|
+
} else {
|
|
586
|
+
normalWidth = (c.width + SDF_PADDING * 2) / c.width;
|
|
587
|
+
x = -normalWidth / 2;
|
|
588
|
+
height = (c.height + SDF_PADDING * 2) / c.height;
|
|
589
|
+
bottom = -0.5 - SDF_PADDING / c.height;
|
|
590
|
+
}
|
|
591
|
+
|
|
592
|
+
const tx = c.x;
|
|
593
|
+
const ty = c.y;
|
|
594
|
+
|
|
595
|
+
vertexCoord[0] = x;
|
|
596
|
+
vertexCoord[1] = bottom + height;
|
|
597
|
+
textureCoord[0] = tx / scale;
|
|
598
|
+
textureCoord[1] = ty / scale;
|
|
599
|
+
this.variableBuilder.pushAll();
|
|
600
|
+
|
|
601
|
+
vertexCoord[0] = x + normalWidth;
|
|
602
|
+
vertexCoord[1] = bottom + height;
|
|
603
|
+
textureCoord[0] = (tx + c.width) / scale;
|
|
604
|
+
textureCoord[1] = ty / scale;
|
|
605
|
+
this.variableBuilder.pushAll();
|
|
606
|
+
|
|
607
|
+
vertexCoord[0] = x;
|
|
608
|
+
vertexCoord[1] = bottom;
|
|
609
|
+
textureCoord[0] = tx / scale;
|
|
610
|
+
textureCoord[1] = (ty + c.height) / scale;
|
|
611
|
+
this.variableBuilder.pushAll();
|
|
612
|
+
|
|
613
|
+
vertexCoord[0] = x + normalWidth;
|
|
614
|
+
vertexCoord[1] = bottom + height;
|
|
615
|
+
textureCoord[0] = (tx + c.width) / scale;
|
|
616
|
+
textureCoord[1] = ty / scale;
|
|
617
|
+
this.variableBuilder.pushAll();
|
|
618
|
+
|
|
619
|
+
vertexCoord[0] = x;
|
|
620
|
+
vertexCoord[1] = bottom;
|
|
621
|
+
textureCoord[0] = tx / scale;
|
|
622
|
+
textureCoord[1] = (ty + c.height) / scale;
|
|
623
|
+
this.variableBuilder.pushAll();
|
|
624
|
+
|
|
625
|
+
vertexCoord[0] = x + normalWidth;
|
|
626
|
+
vertexCoord[1] = bottom;
|
|
627
|
+
textureCoord[0] = (tx + c.width) / scale;
|
|
628
|
+
textureCoord[1] = (ty + c.height) / scale;
|
|
629
|
+
this.variableBuilder.pushAll();
|
|
630
|
+
|
|
631
|
+
x += advance;
|
|
632
|
+
}
|
|
633
|
+
|
|
634
|
+
this.addToXIndex(d);
|
|
635
|
+
}
|
|
636
|
+
|
|
637
|
+
this.registerBatch(key);
|
|
638
|
+
}
|
|
639
|
+
}
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "#define PI 3.141593\nuniform View{mediump vec2 uViewOffset;mediump vec2 uViewScale;mediump vec2 uViewportSize;lowp float uDevicePixelRatio;lowp float uViewOpacity;bool uPickingEnabled;};/***Maps a coordinate on the unit scale to a normalized device coordinate.*(0,0)is at the bottom left corner.*/vec4 unitToNdc(vec2 coord){return vec4((coord*uViewScale+uViewOffset)*2.0-1.0,0.0,1.0);}vec4 unitToNdc(float x,float y){return unitToNdc(vec2(x,y));}vec4 pixelsToNdc(vec2 coord){return unitToNdc(coord/uViewportSize);}vec4 pixelsToNdc(float x,float y){return pixelsToNdc(vec2(x,y));}float linearstep(float edge0,float edge1,float x){return clamp((x-edge0)/(edge1-edge0),0.0,1.0);}/***Specialized linearstep for doing antialiasing*/float distanceToRatio(float d){return clamp(d*uDevicePixelRatio+0.5,0.0,1.0);}vec4 distanceToColor(float d,vec4 fill,vec4 stroke,float halfStrokeWidth){if(halfStrokeWidth>0.0){float sd=abs(d)-halfStrokeWidth;return mix(stroke,d<=0.0 ? fill : vec4(0.0),distanceToRatio(sd));}else{return fill*distanceToRatio(-d);}}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "/**Based on concepts presented at:*https:*https:*/out highp vec4 vPickingColor;/***Passes the unique id to the fragment shader as a color if picking is enabled.*Returns true if picking is enabled.*/bool setupPicking(){if(uPickingEnabled){\n#ifdef uniqueId_DEFINED\nint id=int(getScaled_uniqueId());vPickingColor=vec4(ivec4(id>>0,id>>8,id>>16,0xFF)&0xFF)/float(0xFF);\n#else\nvPickingColor=vec4(1.0);\n#endif\nreturn true;}return false;}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "/***Describes where a sample facet should be shown. Interpolating between the*current and target positions/heights allows for transitioning between facet*configurations.*/struct SampleFacetPosition{float pos;float height;float targetPos;float targetHeight;};/***Trasition fraction[0,1]between the current and target configurations.*/uniform float uTransitionOffset;\n#if !defined(SAMPLE_FACET_UNIFORM) && !defined(SAMPLE_FACET_TEXTURE)\nSampleFacetPosition getSampleFacetPos(){return SampleFacetPosition(0.0,1.0,0.0,1.0);}\n#elif defined(SAMPLE_FACET_UNIFORM)\n/***Location and height of the band on the Y axis on a normalized[0,1]scale.*Elements: curr pos,curr height,target pos,target height*/uniform vec4 uSampleFacet;SampleFacetPosition getSampleFacetPos(){return SampleFacetPosition(1.0-uSampleFacet.x-uSampleFacet.y,uSampleFacet.y,1.0-uSampleFacet.z-uSampleFacet.w,uSampleFacet.w);}\n#elif defined(SAMPLE_FACET_TEXTURE)\nuniform sampler2D uSampleFacetTexture;SampleFacetPosition getSampleFacetPos(){vec4 texel=texelFetch(uSampleFacetTexture,ivec2(int(attr_facetIndex),0),0);return SampleFacetPosition(1.0-texel.r-texel.g,texel.g,1.0-texel.r-texel.g,texel.g);}\n#endif\nbool isFacetedSamples(SampleFacetPosition facetPos){return facetPos!=SampleFacetPosition(0.0,1.0,0.0,1.0);}bool isFacetedSamples(){return isFacetedSamples(getSampleFacetPos());}bool isInTransit(){return uTransitionOffset>0.0;}float getTransitionFraction(float xPos){return smoothstep(0.0,0.7+uTransitionOffset,(xPos-uTransitionOffset)*2.0);}vec2 applySampleFacet(vec2 pos){SampleFacetPosition facetPos=getSampleFacetPos();if(!isFacetedSamples(facetPos)){return pos;}else if(isInTransit()){vec2 interpolated=mix(vec2(facetPos.pos,facetPos.height),vec2(facetPos.targetPos,facetPos.targetHeight),getTransitionFraction(pos.x));return vec2(pos.x,interpolated[0]+pos.y*interpolated[1]);}else{return vec2(pos.x,facetPos.pos+pos.y*facetPos.height);}}float getSampleFacetHeight(vec2 pos){SampleFacetPosition facetPos=getSampleFacetPos();if(!isFacetedSamples(facetPos)){return 1.0;}else if(isInTransit()){return mix(facetPos.height,facetPos.targetHeight,getTransitionFraction(pos.x));}else{return facetPos.height;}}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "const float inf=1.0/0.0;vec3 getDiscreteColor(sampler2D s,int index){return texelFetch(s,ivec2(index % textureSize(s,0).x,0),0).rgb;}vec3 getInterpolatedColor(sampler2D s,float unitValue){return texture(s,vec2(unitValue,0.0)).rgb;}float clampToRange(float value,vec2 range){return clamp(value,min(range[0],range[1]),max(range[0],range[1]));}float scaleIdentity(float value){return value;}float scaleLinear(float value,vec2 domain,vec2 range){float domainSpan=domain[1]-domain[0];float rangeSpan=range[1]-range[0];return(value-domain[0])/domainSpan*rangeSpan+range[0];}float scaleLog(float value,vec2 domain,vec2 range,float base){return scaleLinear(log(value)/log(base),log(domain)/log(base),range);}float symlog(float value,float constant){return sign(value)*log(abs(value/constant)+1.0);}float scaleSymlog(float value,vec2 domain,vec2 range,float constant){return scaleLinear(symlog(value,constant),vec2(symlog(domain[0],constant),symlog(domain[1],constant)),range);}float scalePow(float value,vec2 domain,vec2 range,float exponent){return scaleLinear(pow(abs(value),exponent)*sign(value),pow(abs(domain),vec2(exponent))*sign(domain),range);}float scaleBand(float value,vec2 domainExtent,vec2 range,float paddingInner,float paddingOuter,float align,float band){float start=range[0];float stop=range[1];float rangeSpan=stop-start;float n=domainExtent[1]-domainExtent[0];paddingInner=int(n)>1 ? paddingInner : 0.0;float step=rangeSpan/max(1.0,n-paddingInner+paddingOuter*2.0);start+=(rangeSpan-step*(n-paddingInner))*align;float bandwidth=step*(1.0-paddingInner);return start+(value-domainExtent[0])*step+bandwidth*band;}float scaleBandHp(vec2 value,vec3 domainExtent,vec2 range,float paddingInner,float paddingOuter,float align,float band){float start=range[0];float stop=range[1];float rangeSpan=stop-start;vec2 domainStart=domainExtent.xy;float n=domainExtent[2];float step=rangeSpan/max(1.0,n-paddingInner+paddingOuter*2.0);start+=(rangeSpan-step*(n-paddingInner))*align;float bandwidth=step*(1.0-paddingInner);float hi=max(value[0]-domainStart[0],-inf);float lo=max(value[1]-domainStart[1],-inf);return dot(vec4(start,hi,lo,bandwidth),vec4(1.0,step,step,band));}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "in lowp vec4 vColor;in float vSize;in float vNormalLengthInPixels;out lowp vec4 fragColor;void main(void){float dpr=uDevicePixelRatio;float distance=abs(vNormalLengthInPixels);float opacity=clamp(((vSize/2.0-distance)*dpr),0.0,1.0);fragColor=vColor*opacity;if(uPickingEnabled){fragColor=vPickingColor;}}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "uniform float uSagittaScaleFactor;uniform float uMinSagittaLength;in vec2 strip;out vec4 vColor;out float vSize;out float vNormalLengthInPixels;void main(void){float pixelSize=1.0/uDevicePixelRatio;float opacity=getScaled_opacity()*uViewOpacity;vec2 a=vec2(getScaled_x(),getScaled_y())*uViewportSize;vec2 b=vec2(getScaled_x2(),getScaled_y2())*uViewportSize;vec2 chordVector=b-a;vec2 unitChordVector=normalize(chordVector);vec2 chordNormal=vec2(-unitChordVector.y,unitChordVector.x);float sagitta=max(length(chordVector)/2.0*uSagittaScaleFactor,uMinSagittaLength);bool compress=false;if(compress){float maxSagittaLen=length(chordNormal*uViewportSize);float maxChordLen=length(unitChordVector*uViewportSize);float threshold=maxSagittaLen*0.5;if(sagitta>threshold){float m=(maxSagittaLen-threshold)/(maxChordLen-threshold);sagitta=(sagitta-threshold)*m+threshold;}}vec2 controlOffset=chordNormal*sagitta/0.75;vec2 p1=a;vec2 p2=a+controlOffset;vec2 p3=b+controlOffset;vec2 p4=b;float t=smoothstep(0.0,1.0,strip.x);vec2 C1=p4-3.0*p3+3.0*p2-p1;vec2 C2=3.0*p3-6.0*p2+3.0*p1;vec2 C3=3.0*p2-3.0*p1;vec2 C4=p1;vec2 p;if(t==0.0){p=p1;}else if(t==1.0){p=p4;}else{p=C1*t*t*t+C2*t*t+C3*t+C4;}vec2 tangent=normalize(3.0*C1*t*t+2.0*C2*t+C3);vec2 normal=vec2(-tangent.y,tangent.x);\n#ifdef size2_DEFINED\nfloat mixedSize=mix(getScaled_size(),getScaled_size2(),t);\n#else\nfloat mixedSize=getScaled_size();\n#endif\nif(mixedSize<pixelSize){opacity*=mixedSize/pixelSize;mixedSize=pixelSize;}float paddedSize=mixedSize+pixelSize;vNormalLengthInPixels=strip.y*paddedSize;p+=normal*vNormalLengthInPixels;gl_Position=pixelsToNdc(p);\n#ifdef color2_DEFINED\nvec3 color=mix(getScaled_color(),getScaled_color2(),t);\n#else\nvec3 color=getScaled_color();\n#endif\nvColor=vec4(color*opacity,opacity);vSize=paddedSize;setupPicking();}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "const lowp vec4 white=vec4(1.0);const lowp vec4 black=vec4(0.0,0.0,0.0,1.0);uniform bool uInwardStroke;uniform float uGradientStrength;in float vRadius;in float vRadiusWithPadding;in lowp vec4 vFillColor;in lowp vec4 vStrokeColor;in lowp float vShape;in lowp float vHalfStrokeWidth;in mat2 vRotationMatrix;out lowp vec4 fragColor;const float CIRCLE=0.0;const float SQUARE=1.0;const float TRIANGLE_UP=2.0;const float CROSS=3.0;const float DIAMOND=4.0;const float TRIANGLE_DOWN=5.0;const float TRIANGLE_RIGHT=6.0;const float TRIANGLE_LEFT=7.0;float circle(vec2 p,float r){return length(p)-r;}float square(vec2 p,float r){p=abs(p);return max(p.x,p.y)-r;}float equilateralTriangle(vec2 p,float r,bool flip,bool swap){if(swap){p.xy=p.yx;}if(flip){p.y=-p.y;}float k=sqrt(3.0);float kr=k*r;p.y-=kr/2.0;return max((abs(p.x)*k+p.y)/2.0,-p.y-kr);}float crossShape(vec2 p,float r){p=abs(p);vec2 b=vec2(0.4,1.0)*r;vec2 v=abs(p)-b.xy;vec2 h=abs(p)-b.yx;return min(max(v.x,v.y),max(h.x,h.y));}float diamond(vec2 p,float r){p=abs(p);return(max(abs(p.x-p.y),abs(p.x+p.y))-r)/sqrt(2.0);}void main(){float d;vec2 p=vRotationMatrix*(2.0*gl_PointCoord-1.0)*vRadiusWithPadding;float r=vRadius;if(vShape==CIRCLE){d=circle(p,r);}else if(vShape==SQUARE){d=square(p,r);}else if(vShape==TRIANGLE_UP){d=equilateralTriangle(p,r,true,false);}else if(vShape==CROSS){d=crossShape(p,r);}else if(vShape==DIAMOND){d=diamond(p,r);}else if(vShape==TRIANGLE_DOWN){d=equilateralTriangle(p,r,false,false);}else if(vShape==TRIANGLE_RIGHT){d=equilateralTriangle(p,r,false,true);}else if(vShape==TRIANGLE_LEFT){d=equilateralTriangle(p,r,true,true);}else{d=0.0;}if(!uPickingEnabled){lowp vec4 fillColor=mix(vFillColor,white,-d*uGradientStrength/vRadius);fragColor=distanceToColor(d+(uInwardStroke ? vHalfStrokeWidth : 0.0),fillColor,vStrokeColor,vHalfStrokeWidth);}else if(d-vHalfStrokeWidth<=0.0){fragColor=vPickingColor;}else{discard;}}";
|
|
2
|
+
export default shader;
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
const shader = "/***The stroke should only grow inwards,e.g,the diameter/outline is not affected by the stroke width.*Thus,a point that has a zero size has no visible stroke. This allows strokes to be used with*geometric zoom,etc.*/uniform bool uInwardStroke;uniform lowp float uMaxRelativePointDiameter;uniform float uScaleFactor;uniform float uMaxPointSize;uniform float uZoomLevel;uniform float uSemanticThreshold;out float vRadius;out float vRadiusWithPadding;out lowp vec4 vFillColor;out lowp vec4 vStrokeColor;out lowp float vShape;out lowp float vHalfStrokeWidth;out mat2 vRotationMatrix;float computeSemanticThresholdFactor(){return getScaled_semanticScore()>=uSemanticThreshold ? 1.0 : 0.0;}/***Computes a scaling factor for the points in a sample-faceted view.*/float getDownscaleFactor(vec2 pos){if(!isFacetedSamples()){return 1.0;}float sampleFacetHeight=getSampleFacetHeight(pos);float maxPointDiameter=sqrt(uMaxPointSize);float factor=sampleFacetHeight*uViewportSize.y*uMaxRelativePointDiameter;return clamp(0.0,maxPointDiameter,factor)/maxPointDiameter;}vec2 getDxDy(){\n#if defined(dx_DEFINED) || defined(dy_DEFINED)\nreturn vec2(getScaled_dx(),getScaled_dy())/uViewportSize;\n#else\nreturn vec2(0.0,0.0);\n#endif\n}void main(void){float semanticThresholdFactor=computeSemanticThresholdFactor();if(semanticThresholdFactor<=0.0){gl_PointSize=0.0;gl_Position=vec4(100.0,0.0,0.0,0.0);return;}float size=getScaled_size();vec2 pos=vec2(getScaled_x(),getScaled_y())+getDxDy();gl_Position=unitToNdc(applySampleFacet(pos));float strokeWidth=getScaled_strokeWidth();float diameter=sqrt(size)*uScaleFactor*semanticThresholdFactor*getDownscaleFactor(pos);float opacity=uViewOpacity;if(strokeWidth<=0.0||uInwardStroke){float minDiameter=1.0/uDevicePixelRatio;if(diameter<minDiameter){opacity*=pow(diameter/minDiameter,2.5);diameter=minDiameter;}}float fillOpa=getScaled_fillOpacity()*opacity;float strokeOpa=getScaled_strokeOpacity()*opacity;vShape=getScaled_shape();bool circle=vShape==0.0;float angleInDegrees=getScaled_angle();float angle=-angleInDegrees*PI/180.0;float sinTheta=sin(angle);float cosTheta=cos(angle);vRotationMatrix=mat2(cosTheta,sinTheta,-sinTheta,cosTheta);float roomForRotation=circle ? 1.0 : sin(mod(angle,PI/2.0)+PI/4.0)/sin(PI/4.0);float aaPadding=1.0/uDevicePixelRatio;float rotationPadding=(diameter*roomForRotation)-diameter;float strokePadding=uInwardStroke ? 0.0 : strokeWidth*(circle ? 1.0 : sqrt(3.0));float padding=rotationPadding+strokePadding+aaPadding;gl_PointSize=(diameter+padding)*uDevicePixelRatio;vRadius=diameter/2.0;vRadiusWithPadding=vRadius+padding/2.0;vHalfStrokeWidth=strokeWidth/2.0;vFillColor=vec4(getScaled_fill()*fillOpa,fillOpa);vStrokeColor=vec4(getScaled_stroke()*strokeOpa,strokeOpa);setupPicking();}";
|
|
2
|
+
export default shader;
|